![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() Здравствуйте уважаемые софорумцы.
Сижу не один час и не могу понять: в чём проблема моей программы. Мне поставлена задача создать БД без БД, т.е. использовать файл записи. Непосредственно перейдём к самой программе. Запись в файл записи проходит нормально. Проверял. Но при выводе информации в StringGrid начинается просто хардкор: Нужно прописать процедуру, чтобы выводились определённые записи с определёнными характеристиками. Процедура есть, но её работа не является корректной. Пожалуйста, Помогите !!! ---------------------------- Спасибо большое за помощь Последний раз редактировалось mad-d, 15.12.2013 в 13:25. |
#2
|
|||
|
|||
![]() Описание типа записи (record), код процедур записи в файл и чтения, а так же заполнения строки, в студию. Только эти куски кода. Разбираться в проекте лень.
|
#3
|
||||
|
||||
![]() Цитата:
![]() Так фильтры не пишут (пытаясь перебрать все возможные варианты). Проверяй, вот так вроде правильно работает: Код:
procedure TForm1.BitBtn1Click(Sender: TObject); {Выполнение поиска по ф. записи при определённых условиях/предпочтениям} var i, n1, n2: Integer; begin for i := 1 to StringGrid1.RowCount do begin StringGrid1.Rows[i].Clear; end; StringGrid1.RowCount := 2; AssignFile(F, 'CARS.txt'); Reset(F); try n1:=0; n2:=0; while not Eof(F) do begin Read(F, Cars); Inc(n1); if ( (ComboBox1.Text = 'Все марки') or (ComboBox1.Text = Cars.mark) ) and // Проверяем марку ( (RadioGroup1.ItemIndex = 2 {Все авто}) or (RadioGroup1.ItemIndex = Cars.sost) ) and // Проверяем состояние авто ( (ComboBox2.Text = 'Любой') or (ComboBox2.Text = Cars.privod) ) and // Проверяем привод ( (ComboBox3.Text = 'Все') or (ComboBox3.Text = Cars.kp) ) and // Проверяем тип коробки передач ( StrToInt(Cars.prob) >= StrToInt(Edit3.Text) ) and // Проверяем диапазон побега ( StrToInt(Cars.prob) <= StrToInt(Edit4.Text) ) and ( StrToInt(Cars.price) >= StrToInt(Edit1.Text) ) and // Проверяем диапазон цен ( StrToInt(Cars.price) <= StrToInt(Edit2.Text) ) then begin OUTINFO(Cars, StringGrid1); // Если все проверки прошли только тогда отображаем эту запись Inc(n2); end; end; ShowMessageFmt('Отобрано %d из %d', [n2, n1]); finally CloseFile(F); end; end; p.s. Ещё непонятно почему в записи пробег и цена в виде строк, а не чисел. Ну и компоненты желательно переименовать по смыслу. |
Этот пользователь сказал Спасибо poli-smen за это полезное сообщение: | ||
mad-d (16.12.2013)
|
#4
|
|||
|
|||
![]() Спасибо большое. Скорее всего у меня не получалось организовать процедуру поиска в результате нерациональности моих записей.
Еще раз, БОЛЬШОЕ СПАСИБО ! Выручили =) ![]() P.S. А можно ли как-нибудь реализовать процедуру редактирования и удаления отдельных записей в файле. Если есть мысли, то поделитесь =) Буду нереально рад Последний раз редактировалось mad-d, 16.12.2013 в 16:55. |
#5
|
||||
|
||||
![]() Цитата:
Удаление записи: если нужно удалить последнюю запись, то всё просто - перемещаемся к ней с помощью Seek и обрезаем файл с помощью Truncate. Если же нужно удалить не последнюю запись, то чуть сложнее: перемещаемся к последней записи с помощью Seek, читаем содержимое в переменную-запись (Cars: TCar) с помощью Read, перемещаемся с помощью Seek к записи которую нужно удалить и записываем в эту запись содержимое переменной-записи (Cars: TCar) с помощью Write, потом опять перемещаемся к последней записи с помощью Seek и обрезаем файл с помощью Truncate. p.s. Количество записей которые уже есть в файле можно узнать с помощью FileSize. Если от этого числа отнять единицу, то получим номер последней записи, если это не отрицательное число, то указывая его в процедуре Seek можем переместиться к последней записи. |
#6
|
|||
|
|||
![]() Спасибо за помощь =)
|