![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Компоненты TOpenDialog и TSaveDialog [D7, XP]
Boortwint © (2010-04-02 13:52:00)Дали мне тут задание задание.
Создать програмулину для работы на автобусной станции.
Суть ее заключается в том, чтобы с помомощью этой программы вбить номер маршрута автобуса, его тип, пункт назначения, время отправления и время прибытия.
Необходимо вывести маршрут, который занимает минимальное время. Отсюда первый вопрос: какой тип данных нужно использовать, чтобы введенное в edit число преобразовывалось во время?. Я использовал DateTime, но число у меня преобразовывалось в дату, т.е., к примеру, 02.04.2010, а оно мне не надо. Нужно время.
Информация должна сохраняться в отдельном txt файле.
Все чего мог я добиться - это создать 2 кнопки: "открытие" и "создание" файла. Необходимо еще придумать как создать кнопку сохранить, но до меня не доходит как это сделать.
Type
Tavt=record //Объявление типа "запись"
Nmar: integer; //номер маршрута
Tipavt: string[20]; //Тип автобуса
Punkt: string[20]; //пункт назначения
VrOtpr: TDateTime; //время отправления
VrPr: TDateTime; //время прибытия
end;
Var
Fz:File of Tavt;
Ft:TextFile;
Avto:array[1..100] of Tavt; //объявления массива типа Tavt
nzap:integer;
FileNameZ, FileNameT : string;
var
Form1: TForm1;
Выше приведены все типы переменных, которые я использовал
Кнопка ввода информации в файл:
procedure TForm1.Button1Click(Sender: TObject);
begin
nzap:=nzap+1;
with Avto[nzap] do begin
Nmar:=StrToInt(Edit1.Text);
Tipavt:=Edit2.Text;
Punkt:=Edit3.Text;
VrOtpr:=StrToInt(Edit4.Text);
VrPr:=StrToInt(Edit5.Text);
Memo1.Lines.Add(IntToStr(Nmar)+' '
+Tipavt+' '
+Punkt+' '
+DateToStr(VrOtpr)+' '
+DateToStr(VrPr));
end;
Write(fz,Avto[nzap]);
Edit1.Text:='';
Edit2.Text:='';
Edit3.Text:='';
Edit4.Text:='';
Edit5.Text:='';
end;
Кнопка создания файла:
procedure TForm1.Button2Click(Sender: TObject);
begin
OpenDialog1.Title :='Создать новый файл';
if OpenDialog1.Execute then /
begin
FileNameZ:= OpenDialog1.FileName;
AssignFile(Fz,FileNameZ); /
Rewrite(Fz);
end;
Кнопка открытия файла
procedure TForm1.Button3Click(Sender: TObject);
begin
if OpenDialog1.Execute then
begin
FileNameZ:= OpenDialog1.FileName; // возвращение имени дискового файла
AssignFile(Fz, FileNameZ); // связывание файловой переменной с именем файла
Reset(Fz); // открытие
end;
while not eof(fz) do begin
nzap:=nzap+1;
Read(fz,Avto[nzap]); // чтение записи из файла
with Avto[nzap] do
Memo1.Lines.Add(IntToStr(Nmar)+' '
+Tipavt+' '
+Punkt+' '
+DateToStr(VrOtpr)+' '
+DateToStr(VrPr));
end;
end;
Возникает вопрос: как сохранять все это дело в файле и как осуществить выборку наименьшего времени пути до пункта назначения. Буду рад любой помощи. Заранее спасибо.
Anatoly Podgoretsky (2010-04-27 13:44:00) [1]
> когда я работал с одномерными массивами, которые содержали
> в себе числовые данные, я тупо сравнивал эти элементы и
> легко получал результат.
> А тут элементы массива содержат сразу несколько элементов,
> причем сравнение необходимо делать по одному из них, то
> есть по переменной vrem.
А надо с многомерными, а так ты загнал себя в угол, теперь выполняй парсинг строки массива, но правильнее - переписать все нафиг.
Плохиш (2010-04-27 13:38:00) [2]Автобусы продолжают бороздить просторы большого театра.
Sha (2010-04-27 13:37:00) [3]> Помогите, плиз. Голова уже пухнет.
Это от разговоров.
Начни думать.
Boortwint (2010-04-27 13:35:00) [4]Вот я и не понимаю как по нему пробежаться. ((
когда я работал с одномерными массивами, которые содержали в себе числовые данные, я тупо сравнивал эти элементы и легко получал результат.
А тут элементы массива содержат сразу несколько элементов, причем сравнение необходимо делать по одному из них, то есть по переменной vrem.
12 (2010-04-27 13:15:00) [5]Vyb уже получили
осталось по нему пробежаться и найти минимум
Boortwint (2010-04-27 13:09:00) [6]Ребят, возникла одна задача:
Есть два массива с данными формата "string"
Avto[nzap]:=(IntToStr(Nmar)+' '
+Tipavt+' '
+Punkt+' '
+TimeToStr(VrOtpr)+' '
+TimeToStr(VrPr)
+TimeToStr(vrem));
где Nmar - номер маршрута
Tipavt - тип автобуса
Punkt - пункт назначения
VrOtpr - время отправления
VrPr - время прибытия
vrem - время пути
Мне необходимо внести в другой массив vyb[k] только строки с определенным номером маршрута с минимальным временем пути.
Для определения Пункта назначения я использовал элемент Edit.
procedure TForm1.Button7Click(Sender: TObject);
var
l: integer;
pun:string; // пункт назначения, который я ввожу в Edit для выборки
begin
k:=0;
pun:=Edit1;
for l:=1 to nzap do
with Avto[nzap] do
if Punkt=pun then
begin
k:=k+1;
Vyb[k]:=(IntToStr(Nmar)+' '
+Tipavt+' '
+Punkt+' '
+TimeToStr(VrOtpr)+' '
+TimeToStr(VrPr)+' '
+TimeToStr(vrem));
end;
end;
в коде есть ошибки, потому что я выбрал его из более объемного кода, который считывает массив из файла и т.д. Это не суть важно.
Выборку по пункту назначения я умею делать, но как из массива Avto[nzap] выбрать маршрут с минимальным временем пути? Я понимаю, что необходимо сделать сравнение всех элементов, НО КАК?
Помогите, плиз. Голова уже пухнет.
MsGuns (2010-04-06 09:18:00) [7]Пипец всем автобусам, пассажирам и заодно дорогам :)
Игорь Шевченко (2010-04-05 19:51:00) [8]отладчик рулез фарева
Dennis I. Komarov (2010-04-05 17:48:00) [9]
> Так сделай, чего же расстраиваться.
А зачем? :)
Сергей М. (2010-04-05 16:55:00) [10]
> Не работает моя теораия.
Так работать-то нечему)
Никакой теории не видать, одни пляски с бубном)
Boortwint (2010-04-05 16:49:00) [11]
> Великий русский сказочник Андерсон
Реально Андерсон)) и Шарль Перро.
Сейчас сделал тоже самое на другом компе. Не работает моя теораия.
Мда
Anatoly Podgoretsky (2010-04-05 16:06:00) [12]> Boortwint (05.04.2010 15:06:17) [17]
Великий русский сказочник Андерсон
12 (2010-04-05 15:15:00) [13]86548783 укуево
надо найти, когда строка получает такое значение.
Как присваиваете очередную запись?
попробуйте в самом начале обнулиться
zeromemory(@Avto, SizeOf(Tavt)*100);
Boortwint (2010-04-05 15:08:00) [14]
> И. Павел
Спасибо, посмотрю.
Boortwint (2010-04-05 15:06:00) [15]Еще нашел баг. Сохранение данных зависит от имени файла, в который они сохраняются.
Например, если обозвать файл "20", то сохранение будет происходить с ошибками, вроде таких, какие описаны моим постом выше.
Если, к примеру "5", то вообще ничего происходить не будет. Ерунда какая-то.
И. Павел (2010-04-05 15:04:00) [16]Вот это почитайте, а потом отладьте программу: посмотрите, какие данные пишутся в файл:
http://www.nmarket.ru/program/delphi/lessons-1/les-26.php
PS:может просто в Кукуево икарусы не ездят :)
Boortwint (2010-04-05 14:57:00) [17]
> как узнали?
Забиваю, к примеру, данные:
1 икарус Кукуево 13:00 15:00
2 Зил Кукуево 13:00 16:00.
Жму "сохранить" и в новом файле появляется что-то типа:
86548783 укуево 13:00 15:00
2 Зил Кукуево 13:00 16:00.
Не могу причину найти.
12 (2010-04-05 14:47:00) [18]
> но сохраняет какую-то кракозябу. Появляются лишние цифры.
>
как узнали?
Putnik (2010-04-05 14:41:00) [19]memo1.lines.savetofile?
Boortwint (2010-04-05 13:15:00) [20]
procedure TForm1.Button5Click(Sender: TObject);
var i:word;
begin
Memo1.Clear;
if SaveDialog1.Execute then // Выполнение стандартного диалога выбора имени файла
begin
FileNameT:=SaveDialog1.FileName; // Возвращение имени дискового файла
AssignFile(Ft, FileNameT); // Связывание файловой переменной Ft c именем файла
Rewrite(Ft); // Открытие нового текстового файла
end;
for i:=1 to nzap do
with Avto[i] do Writeln(ft,
IntToStr(Nmar)+' '
+Tipavt+' '
+Punkt+' '
+TimeToStr(VrOtpr)+' '
+TimeToStr(VrPr));
CloseFile(Ft); // Закрытие текстового файла
end;
Забацал кнопку сохранения. При ее нажатии прога сохраняет содержимое memo1 в отдельный файл. Кнопка, в принципе, работает, но сохраняет какую-то кракозябу. Появляются лишние цифры.
У кого-нибудь есть идеи где я мог напортачить?