Показать полную графическую версию : [решено] Работа с txt в форме
-Marshall-
21-02-2011, 00:18
Здравствуйте. Надеюсь на вашу помощь.
Требуется создать визуальную программу, которая считывает строки из указанного файла и выводит на экран. Надо сделать так, чтоб эти поля можно было редактировать, удалять, добавлять и сохранять результаты операций.
Вот сам текстовый файл. Структура записи: номер рейса, пункт назначения, время вылета, время прибытия, количество свободных мест в салоне.
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");
А что дальше делать не имею понятия..
Всё очень просто, проверку я не указываю, но этот способ работает при условии что все поля заполнены или имеют хотя бы умолчальные данные. Далее, разбиваем каждую строку по разделиютелю, тут у нас это точка с запятой и обращаемся к элементам списка. Вместо 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
Спасибо, Drongo, вы очень помогли. Реализовал вывод в TEdit'ах, правда много кода вышло, не знаю, как реализовать так, чтобы можно было видеть объект класса TEdit из функции.
Не подскажите теперь как реализовать запись из TEdit в файл.
http://s2.ipicture.ru/uploads/20110221/thumbs/pir1xa2M.png (http://s2.ipicture.ru/Gallery/Viewfull/3671040.html)
Вот реализовал на событии onClick в кнопке вывод в цикле объектов класса TEdit и заполнил поля, теперь же требуется после редактирования полей, по нажатию на другую кнопку запись в тот же файл.
Если я правильно думаю, то тут через конкатенацию строк это делать. Записывать строки в объект типа TStringList и через функцию SaveToFile сохранять?
Если я правильно думаю, то тут через конкатенацию строк это делать. Записывать строки в объект типа TStringList и через функцию SaveToFile сохранять? »Думаю, да, главное незабывайте разделителем отмечать данные.
Я попробовал ещё решить задачку через StringGrid. Проект прикрепляю. Среда Borland C++ Builder 6.0
El Scorpio
24-02-2011, 07:14
Вот сам текстовый файл. Структура записи: номер рейса, пункт назначения, время вылета, время прибытия, количество свободных мест в салоне. »
Можно уточнить. Требуется именно такая структура записи?
Быть может, можно использовать структуру INI-файла?
Тогда будет достаточно открыть его объектом класса TIniFile и считывать/записывать нужные значения, просто указывая имя нужного раздела
-Marshall-
24-02-2011, 13:13
Drongo, а я все через TEdit'ы делал, я даже не видел этого компонента :) Спасибо вам)
El Scorpio, да, требуется именно txt, я сначала делал вообще через БД, но сказали, что слишком все просто.
-Marshall-
27-02-2011, 15:50
Не подскажите, как можно вывести на 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
Вот что получилось, но данный код работает, если выделять с первого элемента, а требуется произвольное выделение в 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
:help: Помогите, пожалуйста
Вот выбираю данные в листбоксе
http://s1.ipicture.ru/uploads/20110228/thumbs/QmvkmIu4.png (http://s1.ipicture.ru/Gallery/Viewfull/3775262.html)
Вот вывод в СтрингГрид:
http://s1.ipicture.ru/uploads/20110228/B3VZ9ZcD.png (http://s1.ipicture.ru/Gallery/Viewfull/3775280.html)
Т.е. количество строк устанавливается равным количеству выделенных значений в ListBox'e, но вывод в StringGrid происходит в ячейки неправильно, учитываются и пустые поля. Делал уже и условие, но без толку.
Я попробовал так, введя счётчик для столбцов, в вашем случае 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];
}
}
//---------------------------------------------------------------------------
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.