Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Файлы в Delphi


Автор: radiokiller 21.4.2011, 20:30
Помогите пожалуйста!
Вот такая задача: Сведения об автомобиле состоят из его марки, номера, фамилии владельца и отметки о прохождении техосмотра. Вывести фамилии владельцев и номера автомобилей определенной марки, не прошедших техосмотр.
Получилась вот такая программа
Код
procedure TForm1.Button1Click(Sender: TObject);
Type Zapis=Record
             Fam:String[50];  {фамилия владельца}
             Marka:String[10];  {марка автомобиля}
             NomAvto:String[10];  {номер автомобиля}
             Tehosm:String[5];  {отметка о техосмотре}
             TrebMarka:String[10]; {требуемая марка}
           End;
Var    NameFile:File of Zapis;
          Stroka:Zapis;
          I:Integer;  {параметр цикла}
          N:Integer;  {количество записей}
begin
   N:=StrToInt(EditN.Text);
   AssignFile(NameFile,'file1.dat');
   Rewrite(NameFile);
   For I := 1 To N Do
     Begin
       Stroka.Fam:=StringGrid1.Cells[0,I-1];
       Stroka.Marka:=StringGrid1.Cells[1,I-1];
       Stroka.NomAvto:=StringGrid1.Cells[2,I-1];
       Stroka.Tehosm:=StringGrid1.Cells[3,I-1];
       Write(NameFile,Stroka);
     End;
   CloseFile(NameFile);
end;

procedure TForm1.Button2Click(Sender: TObject);
 Type  Zapis=Record
              Fam:String[50];
              Marka:String[10];
              NomAvto:String[10];
              Tehosm:String[5];
              TrebMarka:String[10];
            End;
Var   NameFile:File of Zapis;
         Stroka:Zapis;
         I:Integer;
         TrebMarka:String[10];
begin
  Stroka.TrebMarka:=EditTrebMarka.Text;
  AssignFile(NameFile,'file1.dat');
  Reset(NameFile);
  I:=0;
  While Not Eof(NameFile) Do
   Begin
     Read(NameFile,Stroka)
     If ((Stroka.Tehosm='нет*') Or (Stroka.Tehosm='Нет*') And (Stroka.Marka=Stroka.TrebMarka))
        Then
           Begin
             StringGrid1.Cells[0,I]:=Stroka.Fam;
             StringGrid1.Cells[1,I]:=Stroka.NomAvto;
             I:=I+1;
           End;
           CloseFile(NameFile);
   End;
end;
end.

Когда запускаю вылазит ошибка 103,не понимаю в чем дело.может что нибудь посоветуете?

Автор: ~FoX~ 21.4.2011, 21:26
Цитата(radiokiller @  21.4.2011,  21:30 Найти цитируемый пост)
 CloseFile(NameFile);

Вынеси за пределы цикла....
А вообще, давно пора переходить на TFileStream

Автор: radiokiller 21.4.2011, 22:09
ну отсталый я человек!теперь вообще ничего не происходит((программа запускается,жму на button - ноль реакции,даже сообщение об ошибке не выходит!

Автор: ~FoX~ 21.4.2011, 22:26
1. Вынеси описание типа в глобальную секцию...

Код

Type Zapis=Record
             Fam:String[50];  {фамилия владельца}
             Marka:String[10];  {марка автомобиля}
             NomAvto:String[10];  {номер автомобиля}
             Tehosm:String[5];  {отметка о техосмотре}
             TrebMarka:String[10]; {требуемая марка}
           End;
//...........
procedure TForm1.Button1Click(Sender: TObject);
Var    NameFile:File of Zapis;
          Stroka:Zapis;
          I:Integer;  {параметр цикла}
          N:Integer;  {количество записей}
begin
   N:=StrToInt(EditN.Text);
   AssignFile(NameFile,'file1.dat');
   Rewrite(NameFile);
   For I := 1 To N Do
     Begin
       Stroka.Fam:=StringGrid1.Cells[0,I-1];
       Stroka.Marka:=StringGrid1.Cells[1,I-1];
       Stroka.NomAvto:=StringGrid1.Cells[2,I-1];
       Stroka.Tehosm:=StringGrid1.Cells[3,I-1];
       Write(NameFile,Stroka);
     End;
   CloseFile(NameFile);
end;
//..........
procedure TForm1.Button2Click(Sender: TObject);
Var   NameFile:File of Zapis;
         Stroka:Zapis;
         I:Integer;
         TrebMarka:String[10];
begin
  Stroka.TrebMarka:=EditTrebMarka.Text;
  AssignFile(NameFile,'file1.dat');
  Reset(NameFile);
  I:=0;
  While Not Eof(NameFile) Do
   Begin
     Read(NameFile,Stroka)
     If ((Stroka.Tehosm='нет*') Or (Stroka.Tehosm='Нет*') And (Stroka.Marka=Stroka.TrebMarka))
        Then
           Begin
             StringGrid1.Cells[0,I]:=Stroka.Fam;
             StringGrid1.Cells[1,I]:=Stroka.NomAvto;
             I:=I+1;
           End;
           
   End;
   CloseFile(NameFile);
end;


2. Проверь что условие 
Цитата(radiokiller @  21.4.2011,  21:30 Найти цитируемый пост)
 If ((Stroka.Tehosm='нет*') Or (Stroka.Tehosm='Нет*') And (Stroka.Marka=Stroka.TrebMarka))

отрабатывает правильно....

Автор: uwannadie 21.4.2011, 23:56
а еще было бы неплохо свести запись к такому виду:
Код

Type 
   Zapis=Record
      Fam:String[50];  {фамилия владельца}
      Marka:String[10];  {марка автомобиля}
      NomAvto:String[10];  {номер автомобиля}
      Tehosm:Boolean;  {отметка о техосмотре.  | насколько я знаю ТО может либо быть в наличии либо не быть}
      TrebMarka:String[10]; {требуемая марка}
   End;

и тогда проверка как минимум сокращается до 
Код

If (Stroka.Tehosm = False) And (Stroka.Marka = Stroka.TrebMarka)) then

если же не менять, то условие лучше сделать таким:
Код

If (UpperCase(Stroka.Tehosm)='НЕТ*')  And (Stroka.Marka=Stroka.TrebMarka)
//в RAD студиях UpperCase лучше заменить на AnsiUpperCase

Автор: radiokiller 22.4.2011, 18:00
блин,бесполезно((я в отчаянии!даже и не знаю,что еще попробовать

Автор: uwannadie 22.4.2011, 18:20
задам пожалуй глупый вопрос: а у тебя есть в файле данные, удовлетворяющие условиям?
и желательно прикрепи проект и файл с данными

Автор: radiokiller 22.4.2011, 18:32
ну да,естественно!может я кокто не так данные в форму ввожу?

Автор: uwannadie 22.4.2011, 18:34
не скриншот, а дпр+пас+дфм+файл с данными

Автор: radiokiller 22.4.2011, 18:39
ну вот они

Автор: radiokiller 22.4.2011, 18:39
dfm

Автор: radiokiller 22.4.2011, 18:39
pas

Автор: radiokiller 22.4.2011, 18:40
и сам файл

Автор: uwannadie 22.4.2011, 19:09
Ошибка у тебя глупая
пишешь в файл "нет"
а ищешь "нет*"
прикрепил чутка исправленное

Автор: radiokiller 22.4.2011, 19:33
ааа,супер просто,все работает!спасиииибо огромнейшее,человеческое))только вот,извините за надоедливость,а можно сделать так,чтоб выводились только фамилии и номера,а все остальные ячейки становились пустыми??вот так...

Автор: uwannadie 22.4.2011, 19:36
оно так и выводило как бы у тебя в коде

Автор: radiokiller 22.4.2011, 19:46
ну ладно,безумно вам благодарен!!!спасибо за отзывчивость!

Автор: radiokiller 22.4.2011, 22:30
ой,а почему-то он не проверяет третье условие
Цитата

if ((Stroka.Tehosm='нет') Or (Stroka.Tehosm='Нет') And (Stroka.Marka=Stroka.TrebMarka)) then


то есть определенную марку автомобиля((

Автор: northener 23.4.2011, 00:48
Цитата(radiokiller @  22.4.2011,  22:30 Найти цитируемый пост)
ой,а почему-то он не проверяет третье условие

А для этого существует отладчик.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)