Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   [решено] Работа с txt в форме (http://forum.oszone.net/showthread.php?t=200056)

-Marshall- 21-02-2011 00:18 1618009

Работа с txt в форме
 
Здравствуйте. Надеюсь на вашу помощь.
Требуется создать визуальную программу, которая считывает строки из указанного файла и выводит на экран. Надо сделать так, чтоб эти поля можно было редактировать, удалять, добавлять и сохранять результаты операций.
Вот сам текстовый файл. Структура записи: номер рейса, пункт назначения, время вылета, время прибытия, количество свободных мест в салоне.
Код:

8;"Запорожье - Вена";8.12.2010 18:45:00;8.12.2010 23:00:00;12
48;"Пекин - Москва";9.12.2010 23:00:00;10.12.2010 3:00:00;3
415;"Вильнюс - Оттава";9.12.2010 23:00:00;10.12.2010 23:30:00;4

На другом форуме написали эту самую структуру.
Вот структура:
Код:

typedef struct
{
  int number;  //номер
  AnsiString fromCity; //откуда
  AnsiString toCity;    //куда
  TDateTime flyOutDateTime;  //время и дата вылета
  TDateTime arriveDateTime;  //время и дата прилета
  int freePlace;  //свободные места
}Trip;

И сказали, что дальше требуется считывать файл и парсить его по полям.
Файл считываю так:
Код:

TStringList *Lst = new TStringList;
Lst->LoadFromFile("D:\\airplane.txt");

А что дальше делать не имею понятия..

Drongo 21-02-2011 01:33 1618043

Всё очень просто, проверку я не указываю, но этот способ работает при условии что все поля заполнены или имеют хотя бы умолчальные данные. Далее, разбиваем каждую строку по разделиютелю, тут у нас это точка с запятой и обращаемся к элементам списка. Вместо ListBox можно подставлять свои переменные для хранения значений.

Код:

//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  TSysCharSet chSplash;
  chSplash<<' ';
  TStringList *lst = new TStringList();
  TStringList *TokenList = new TStringList();
  lst->LoadFromFile("D:\\airplane.txt");

  for(int i = 2; i < lst->Count; i++){
      ExtractStrings(chSplash, chSplash, lst->Strings[i].c_str(), TokenList);
      ListBox2->Items->Add(TokenList->Strings[0]);
      ListBox3->Items->Add(TokenList->Strings[1]);
      ListBox4->Items->Add(TokenList->Strings[2]);
      ListBox5->Items->Add(TokenList->Strings[3]);
      ListBox6->Items->Add(TokenList->Strings[4]);
      TokenList->Clear();
    }
  delete lst;
  delete TokenList;
}
//---------------------------------------------------------------------------


-Marshall- 21-02-2011 20:16 1618617

Спасибо, Drongo, вы очень помогли. Реализовал вывод в TEdit'ах, правда много кода вышло, не знаю, как реализовать так, чтобы можно было видеть объект класса TEdit из функции.
Не подскажите теперь как реализовать запись из TEdit в файл.



Вот реализовал на событии onClick в кнопке вывод в цикле объектов класса TEdit и заполнил поля, теперь же требуется после редактирования полей, по нажатию на другую кнопку запись в тот же файл.

Если я правильно думаю, то тут через конкатенацию строк это делать. Записывать строки в объект типа TStringList и через функцию SaveToFile сохранять?

Drongo 21-02-2011 22:33 1618710

Цитата:

Цитата -Marshall-
Если я правильно думаю, то тут через конкатенацию строк это делать. Записывать строки в объект типа TStringList и через функцию SaveToFile сохранять? »

Думаю, да, главное незабывайте разделителем отмечать данные.

Drongo 22-02-2011 20:34 1619432

Я попробовал ещё решить задачку через StringGrid. Проект прикрепляю. Среда Borland C++ Builder 6.0

El Scorpio 24-02-2011 07:14 1620431

Цитата:

Цитата -Marshall-
Вот сам текстовый файл. Структура записи: номер рейса, пункт назначения, время вылета, время прибытия, количество свободных мест в салоне. »

Можно уточнить. Требуется именно такая структура записи?

Быть может, можно использовать структуру INI-файла?
Тогда будет достаточно открыть его объектом класса TIniFile и считывать/записывать нужные значения, просто указывая имя нужного раздела

-Marshall- 24-02-2011 13:13 1620654

Drongo, а я все через TEdit'ы делал, я даже не видел этого компонента :) Спасибо вам)
El Scorpio, да, требуется именно txt, я сначала делал вообще через БД, но сказали, что слишком все просто.

-Marshall- 27-02-2011 15:50 1623015

Не подскажите, как можно вывести на StringGrid строки, которые были выделены в ListBox'e?
Код:

void TModules::task1(void)
{
        Form5 = new TForm5(Form1);
        TSysCharSet chSplash;
        chSplash << ';';
        TStringList *lst = new TStringList();
        TStringList *TokenList = new TStringList();
        lst->LoadFromFile("D:\\airplane.txt");

        for(int i = 0; i < lst->Count; i++)
        {
                ExtractStrings(chSplash, chSplash, lst->Strings[i].c_str(), TokenList);
                Form5->ListBox1->Items->Add(TokenList->Strings[1]);
                TokenList->Clear();
        }
        delete lst;
        delete TokenList;
        Form5->ShowModal();
}

А вот вывести не понимаю как.

Код:

void TModules::task1_get(void)
{
        if (Form1->StringGrid1->Visible != true)
        {
                Form1->StringGrid1->Visible = true;
                //TStringList *list = new TStringList();
                for (int i = 0; i < Form5->ListBox1->SelCount; i++)
                {
                        for (int j = 0; j < Form1->StringGrid1->RowCount; j++)
                        {
                                Form1->StringGrid1->Cells[j][i] = Form5->ListBox1->Items->Strings[i];
                        }
                }
                Form5->Close();
                row_count();
        }
        else
        {
                for (int i = 0; i < Form1->StringGrid1->RowCount; i++)
                {
                        ((TPublicGrid*)Form1->StringGrid1)->DeleteRow(Form1->StringGrid1->Row);
                        Form1->StringGrid1->Rows[i]->Clear();
                }
                for (int i = 0; i < Form5->ListBox1->SelCount; i++)
                {
                        for (int j = 0; j < Form1->StringGrid1->RowCount; j++)
                        {
                                Form1->StringGrid1->Cells[i][j] = Form5->ListBox1->Items->Strings[i];
                        }
                }
                Form5->Close();
                row_count();
        }
}


-Marshall- 27-02-2011 23:42 1623315

Вот что получилось, но данный код работает, если выделять с первого элемента, а требуется произвольное выделение в ListBox'e
Код:

void TModules::task1_get(void)
{
        if (Form1->StringGrid1->Visible != true)
        {
                Form1->StringGrid1->Visible = true;
                Form1->StringGrid1->ColCount = 2;
                Form1->StringGrid1->RowCount = Form5->ListBox1->SelCount;
                Form1->StringGrid1->DefaultColWidth = 377;
                for (int n = 0; n < Form5->ListBox1->Items->Count; n++)
                {
                        if (Form5->ListBox1->Selected[n])
                        {
                                Form1->StringGrid1->Cells[0][n] = Form5->ListBox1->Items->Strings[n];
                        }
                }
                Form5->Close();
                row_count();
        }
}


-Marshall- 28-02-2011 18:53 1623898

:help: Помогите, пожалуйста
Вот выбираю данные в листбоксе


Вот вывод в СтрингГрид:



Т.е. количество строк устанавливается равным количеству выделенных значений в ListBox'e, но вывод в StringGrid происходит в ячейки неправильно, учитываются и пустые поля. Делал уже и условие, но без толку.

Drongo 03-03-2011 13:33 1626262

Вложений: 1
Я попробовал так, введя счётчик для столбцов, в вашем случае n равна строке и само собой что пустая строка отсчитывается
Код:

//---------------------------------------------------------------------------
void __fastcall TForm1::Button4Click(TObject *Sender)
{
  int count = 0;
  for(int i = 0; i < ListBox1->Items->Count; i++){
      if(ListBox1->Selected[i])
        StringGrid1->Cells[0][count++] = ListBox1->Items->Strings[i];
    }
}
//---------------------------------------------------------------------------



Время: 15:13.

Время: 15:13.
© OSzone.net 2001-