Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Загрузка из файла в StringGrid 
:(
    Опции темы
docwar
Дата 24.9.2006, 14:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 24.9.2006

Репутация: нет
Всего: нет



Привет!
Есть файл с данными, разделяемыми спец. символом "=". Надо загрузить данные опять же в StringGrid в соответствующие столбцы и колонки.
Файл выглядит примерно так:
Цитата
Привет!=Помогите=пожалуйста
Сам=не=справлюсь!


Сохраняю так:
Код
void __fastcall TForm1::Button2Click(TObject *Sender)
{
if(SaveDialog1->Execute()){
        TStringList *pStrings = new TStringList;
                for(int i=1; i <= StringGrid1->RowCount; i++)
                {
                pStrings->Add(StringGrid1->Cells[0][i] + "=" + StringGrid1->Cells[1][i] + "=" + StringGrid1->Cells[2][i]);
               }
        pStrings->SaveToFile(SaveDialog1->FileName);
        delete pStrings;
        }
}

PM MAIL   Вверх
stmamont
Дата 24.9.2006, 22:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 343
Регистрация: 13.3.2004
Где: влг

Репутация: 3
Всего: 3



Что то типа этого я бы сделал:
Код

    // Не проверял. возможно ошибки в константах
                TStrings Strings;
    Strings.LoadFromFile("File.cfg");
    for(int i = 0 ; i < Strings.Count ; ++ i)
    {
        TString Str = Strings.Strings[i];

        for(int x = 0 ; x < 3 ; ++ x)
        {
            StringGrid1[x][i] = Str.SubString(0 , Str.AnsiPos("="));
            Str = Str.SubString(Str.AnsiPos("=") + 1 , Str.Length() - Str.AnsiPos("=") + 2);
        }
    }


Хотя скажу что это не по человечески помоему.


--------------------
user posted image
PM MAIL ICQ   Вверх
docwar
Дата 25.9.2006, 10:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 24.9.2006

Репутация: нет
Всего: нет



  [C++ Error] Unit1.cpp(20): E2352 Cannot create instance of abstract class 'TStrings'
  [C++ Error] Unit1.cpp(20): E2353 Class 'TStrings' is abstract because of '_fastcall TStrings::Get(int) = 0'
  [C++ Error] Unit1.cpp(20): E2459 VCL style classes must be constructed using operator new
  [C++ Error] Unit1.cpp(24): E2451 Undefined symbol 'TString'
  [C++ Error] Unit1.cpp(24): E2379 Statement missing ;
  [C++ Error] Unit1.cpp(28): E2015 Ambiguity between 'TComponent::operator IInterfaceComponentReference *()' and 'TComponent::operator IInterface *()'
  [C++ Error] Unit1.cpp(28): E2451 Undefined symbol 'Str'


:'(
PM MAIL   Вверх
ИванМ
Дата 27.9.2006, 19:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1260
Регистрация: 19.6.2006
Где: СПб

Репутация: 5
Всего: 23



Не так все просто, товарищи.

Код

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    TStringList *pStrings = new TStringList;
    pStrings->LoadFromFile(OpenDialog1->FileName);

    char DecChar='=';

    for(int i=0;i<pStrings->Count;i++)
    {
        String str=pStrings->Strings[i];
        int ncol=0;
        for(int n=1;n<=str.Length();n++)
        {
            if(n==str.Length())
            {
                StringGrid1->Cells[ncol][i]=str;
                break;
            }
            else if(str[n]==DecChar)
            {
                StringGrid1->Cells[ncol][i]=str.SubString(1,n-1);
                ncol++;
                str.Delete(1,n);
                if(n==str.Length())
                {
                    StringGrid1->Cells[ncol][i]=str;
                    break;
                }
                n=0;
            }
        }
    }

    delete pStrings;
}


И ничего лишнего здесь нет.
А если вместо "=" сделаешь ";", то получится упрощенный обработчик csv-формата. Уже что-то полезное.

PM MAIL   Вверх
docwar
Дата 27.9.2006, 19:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 24.9.2006

Репутация: нет
Всего: нет



ИванМ, а как сделать, чтобы и первая строка загружалась?
PM MAIL   Вверх
ИванМ
Дата 27.9.2006, 20:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1260
Регистрация: 19.6.2006
Где: СПб

Репутация: 5
Всего: 23



В смысле?
У меня все строки загружаются. Не понял.
PM MAIL   Вверх
Vyacheslav
Дата 28.9.2006, 11:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 47
Всего: 59



Ну вообще то у StringList есть такие свойства, как Names и Values
Цитата

Indicates the name part of strings with the form Name=Value.

__property AnsiString Names[int Index] = {read=GetName};

Description

When the list of strings for the TStrings object includes strings of the form Name=Value, read Names to access the name part of a string. Names is the name part of the string at the position indicated by Index. Index gives the position of the string, where 0 is the first string, 1 is the second string, and so on. If the string at the specified position is not of the form Name=Value, Names returns an empty string.

Strings of the form Name=Value are commonly found in .ini files. For example, here are a few strings taken from a typical .ini file:

DisplayGrid=1

SnapToGrid=1
GridSizeX=8
GridSizeY=8

The Name that identifies the string is to the left of the equal sign (=), and the current Value of the Name identifier is on the right side. There should be no spaces present before or after the equal sign.


Цитата

Represents the value part of a string associated with a given Name, on strings with the form Name=Value.

__property AnsiString Values[AnsiString Name] = {read=GetValue, write=SetValue};

Description

When the list of strings for the TStrings object includes strings of the form Name=Value, use Values to get or set the value part of a string associated with a specific name part. If the list does not contain any strings of the proper Name=Value form, or if none of those strings matches the Name index, Values returns an empty string.

Note:    The Name index is case-insensitive. That is, Values is the value part for the first occurrence of Name or an equivalent string that differs only in case. 

Strings of the form Name=Value are commonly found in .ini files. For example, here are a few strings taken from a typical .ini file:

DisplayGrid=1

SnapToGrid=1
GridSizeX=8
GridSizeY=8

The Name that identifies the string is to the left of the equal sign (=), and the current Value of the Name identifier is on the right side. There should be no spaces present before or after the equal sign.






--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
Romikgy
Дата 28.9.2006, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 11
Всего: 146



Код

void __fastcall TForm1::BitBtn1Click(TObject *Sender)
{
  TStringList* sl1;
  int i;
TStringList* sl= new TStringList();
sl->LoadFromFile("sg.txt");
for (i=0;i<sl->Count;i++)
{
 sl1=new TStringList();
  sl1->Delimiter='=';
  sl1->DelimitedText=sl->Strings[i];
  StringGrid1->Rows[i]->Assign(sl1);
 sl1->Free();
 sl1=NULL;
}

sl->Free();
}

Код

файл sg.txt
Привет!=Помогите=пожалуйста
Сам=не=справлюсь!

юзайте smile


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
docwar
Дата 28.9.2006, 19:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 24.9.2006

Репутация: нет
Всего: нет



Спасибо большое за ответы! smile smile

ИванМ, Romikgy, а... ну не загружается первая строка... smile
Вот код формы:
Код
#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
StringGrid1->ColCount = 8;
StringGrid1->RowCount = 12;
StringGrid1->Cells[0][0] = "...";       // opianiya
...                                                     // zagolovkov
StringGrid1->Cells[7][0] = "...";       // tablici
StringGrid1->FixedCols = 0;
StringGrid1->DefaultDrawing = false;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::StringGrid1DrawCell(TObject *Sender, int ACol,    //centrirovanie zgolovkov tablici
      int ARow, TRect &Rect, TGridDrawState State)
{
TStringGrid *Grid = (TStringGrid *)Sender;
AnsiString nameCol = Grid->Cells[ACol][ARow];
int Align;
if(!ARow){
Align = DT_CENTER | DT_VCENTER | DT_SINGLELINE;
Grid->Canvas->Brush->Color = clBtnFace;
}
else
{
Align = DT_LEFT | DT_VCENTER | DT_SINGLELINE;
Grid->Canvas->Brush->Color = clWhite;
}
Grid->Canvas->FillRect(Rect);
TRect r = Rect;
DrawText(Grid->Canvas->Handle,nameCol.c_str(),nameCol.Length(),&r,Align);

}
//---------------------------------------------------------------------------
void __fastcall TForm1::N3Click(TObject *Sender)
{
if(OpenDialog1->Execute())
{
//TStringList *pStrings = new TStringList;
TStringList* sl1;
  int i;
TStringList* sl= new TStringList();
sl->LoadFromFile(OpenDialog1->FileName);
//sl->LoadFromFile("kjk.txt");
for (i=0;i<sl->Count;i++)
{
 sl1=new TStringList();
  sl1->Delimiter='=';
  sl1->DelimitedText=sl->Strings[i];
  StringGrid1->Rows[i]->Assign(sl1);
 sl1->Free();
 sl1=NULL;
}

sl->Free();
}
}

PM MAIL   Вверх
Romikgy
Дата 29.9.2006, 08:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 11
Всего: 146



Цитата(docwar @  28.9.2006,  18:51 Найти цитируемый пост)
ну не загружается первая строка...

в исходном файле нет первевода строки в начале?


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
docwar
Дата 29.9.2006, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 24.9.2006

Репутация: нет
Всего: нет



Цитата
[C++ Error] = Unit1.cpp(71):= E2316 'EditMode'= is not a =member of ='TStringGrid'
[C++ Error] = Unit1.cpp(72):= E2451 Undefined= symbol ='property'
[C++ Error] = Unit1.cpp(72):= E2379 Statement= missing ;

Это содержимое файла, который я открываю в проге. smile
PM MAIL   Вверх
Romikgy
Дата 29.9.2006, 22:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 11
Всего: 146



Код

{
  TStringList* sl1;
  int i;
TStringList* sl= new TStringList();
sl->LoadFromFile("c:\\sg.txt");
StringGrid1->RowCount=sl->Count;
for (i=0;i<sl->Count;i++)
{
 sl1=new TStringList();
  sl1->Text=StringReplace(sl->Strings[i],"=","\n",(TReplaceFlags()<<rfReplaceAll));
  if (StringGrid1->ColCount<sl1->Count)
  StringGrid1->ColCount=sl1->Count;
  StringGrid1->Rows[i]->Assign(sl1);
 sl1->Free();
 sl1=NULL;
}
sl->Free();
for (i=0;i<StringGrid1->ColCount;i++)
StringGrid1->ColWidths[i]=
StringGrid1->Width/StringGrid1->ColCount;
}



--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
docwar
Дата 30.9.2006, 08:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 24.9.2006

Репутация: нет
Всего: нет



Romikgy, спасибо большое! smile
Но у меня опять проблема... текст добавляется прямо в заголовок таблицы...
PM MAIL   Вверх
Romikgy
Дата 30.9.2006, 11:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 11
Всего: 146



Цитата(Romikgy @  29.9.2006,  21:43 Найти цитируемый пост)
StringGrid1->RowCount=sl->Count;

StringGrid1->RowCount=sl->Count+1;
Цитата(Romikgy @  29.9.2006,  21:43 Найти цитируемый пост)
StringGrid1->Rows[i]->Assign(sl1);

StringGrid1->Rows[i+1]->Assign(sl1);


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
docwar
Дата 30.9.2006, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 24.9.2006

Репутация: нет
Всего: нет



Отлично! smile Спасибо!
Только почему скроулинг добавляется горизонтальный?  smile   Т.е. последняя колонка у меня широкая, открываю файл и она становится шириной как все + остается промежуток до конца таблицы, который и прокручивается.....
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0803 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.