![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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
|
|||
|
|||
|
Спасибо за помощь =)
|