Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.05.2019, 07:45   #1
Rilpack
Пользователь
 
Регистрация: 14.05.2019
Сообщений: 25
По умолчанию Проблема с загрузкой файла в StringGrid (Delphi 7)

Если в файле есть ошибка(или опечатка), то как сделать, чтобы программа не ломалась при загрузке файла-ошибки. Сам код загрузки:
Код:
{---Кнопка "Загрузка"---}
procedure TForm1.N4Click(Sender: TObject);
var f:textfile;
    k,n,kol,row:integer;
begin
  if OpenDialog1.Execute then
  begin
    assignfile(f,OpenDialog1.Filename);
    reset(f);
    readln(f,n);
    Edit1.Text:=IntToStr(n);
    {----------}
  StringGrid1.ColCount:=n+2;
  StringGrid1.RowCount:=n+1;
  row:=0;
  for kol:=1 to n do
  begin
    StringGrid1.Cells[kol,row]:='K(x'+IntToStr(kol)+')';
  end;
    StringGrid1.Cells[n+1,0]:='Св.члены';
    kol:=0;
    for row:=1 to n do
      StringGrid1.Cells[kol,row]:=IntToStr(row);
      begin
        StringGrid2.ColCount:=2;
        StringGrid2.RowCount:=n;
        for row:=0 to n do
        begin
          StringGrid2.Cells[kol,row]:='X'+IntToStr(row+1);
        end;
      end;
      StringGrid1.Options:=StringGrid1.Options+[goEditing];
    {----------}
    for kol:=1 to n do
      for row:=1 to n do
      begin
        read(f,k);
        StringGrid1.Cells[kol,row]:=IntToStr(k);
      end;
    closefile(f);
  end;
end;
Rilpack вне форума Ответить с цитированием
Старый 17.05.2019, 08:58   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
чтобы программа не ломалась
это называется Exception и для этого есть
Код:
try
.... // чтобы ни сломалось ЗДЕСЬ
except
end;
// здесь работа "начнется" после "слома" ЕСЛИ ... ( как же без ложки дегтя)
и будет продолжена если полученных на аварийном участке данных будет достаточно
а еще есть
Код:
try
...
finally
end;
а еще ЭТО try... есть в любом учебнике.
P.S. и еще ПРОВЕРЯТЬ и еще раз проверять ВХОДНЫЕ данные.

P.P.S. Inttostr и много других функций имеют "безаварийные" версии IntTostrDef задание значения default в случае каких-либо неполадок.
P.P.S. StrtoInt и много других функций имеют "безаварийные" версии StrtointDef задание значения default в случае каких-либо неполадок.
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 17.05.2019 в 09:26. Причина: спасибо сергей. а то бы и не заметил.
evg_m вне форума Ответить с цитированием
Старый 17.05.2019, 09:24   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
Inttostr и много других функций имеют "безаварийные" версии IntTostrDef задание значения default в случае каких-либо неполадок.
не всегда приемлимо.
Иногда лучше использовать версии с проверкой
TryStrToInt()

в остальном полностью согласен.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 17.05.2019, 12:47   #4
Rilpack
Пользователь
 
Регистрация: 14.05.2019
Сообщений: 25
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
это называется Exception и для этого есть
А если попробовать условием сделать и чтобы выходило сообщение "загружаемый файл имеет ошибки"? Я проверил Exception, примерно, то, что я и хотел, но лучше было бы, если программа не загружала файл и сразу бы выводило сообщение, что в данном файле есть ошибки.
Rilpack вне форума Ответить с цитированием
Старый 17.05.2019, 13:17   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Rilpack Посмотреть сообщение
Я проверил Exception, примерно, то, что я и хотел, но лучше было бы, если программа не загружала файл
файл для проверки всё равно нужно открывать и читать, чтобы определить есть в нём ошибки или нет.

поэтому, можно так:
Код:
  if OpenDialog1.Execute then
  begin
    try
      try
        assignfile(f,OpenDialog1.Filename);
        reset(f);
        readln(f,n);
        for kol:=1 to n do
          for row:=1 to n do
                read(f,k);

        // если всё прошло удачно, то теперь можно читать заново
        reset(f);
        readln(f,n);

        <.....  чтение уже в StringGrid ...........>

      except
         Application.MessageBox('Файл не корректен', 'Ошибка', MB_OK or MB_ICONERROR);
         Exit;   
      end;
    finally
	Closefile(f);
    end;
Цитата:
Код:
        for kol:=1 to n do
          for row:=1 to n do
так это же матрица коэффициентов. А свободные члены где читаются?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 17.05.2019, 13:56   #6
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
если программа не загружала файл и сразу бы выводило сообщение, что в данном файле есть ошибки.
а еще лучше если бы при этом она (программа) еще и говорила что и почему не нравится.
  • неверное число (и где в какой строке файла в каком столбце)
  • пропущен элемент.( и какой по счету)
  • не хватает строк, столбцов.
  • ...
короче все, чтобы можно было НЕ просматривать(и анализировать на ошибочность) весь файл, а быстренько найти нужное место и исправить .
Но вот беда для того чтобы все это узнать, надо попытаться прочитать файл.
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 19.05.2019, 06:32   #7
Rilpack
Пользователь
 
Регистрация: 14.05.2019
Сообщений: 25
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
файл для проверки всё равно нужно открывать и читать, чтобы определить есть в нём ошибки или нет.

поэтому, можно так:
Код:
  if OpenDialog1.Execute then
  begin
    try
      try
        assignfile(f,OpenDialog1.Filename);
        reset(f);
        readln(f,n);
        for kol:=1 to n do
          for row:=1 to n do
                read(f,k);

        // если всё прошло удачно, то теперь можно читать заново
        reset(f);
        readln(f,n);

        <.....  чтение уже в StringGrid ...........>

      except
         Application.MessageBox('Файл не корректен', 'Ошибка', MB_OK or MB_ICONERROR);
         Exit;   
      end;
    finally
	Closefile(f);
    end;

так это же матрица коэффициентов. А свободные члены где читаются?
Извините меня, за мою глупость, но я правда недопонимаю немного. Вроде сдела, как вы и написали, но все равно обращается к переменной K
Код:
{---Êíîïêà "Çàãðóçêà"---}
procedure TForm1.N4Click(Sender: TObject);
var f:textfile;
    k,n,kol,row:integer;
begin
  try
    try
    if OpenDialog1.Execute then
    begin
      assignfile(f,OpenDialog1.Filename);
      reset(f);
      readln(f,n);
      Edit1.Text:=IntToStr(n);
      for kol:=1 to n+1 do
          for row:=1 to n do

                reset(f);
        readln(f,n);

    {----------}
    StringGrid1.ColCount:=n+2;
    StringGrid1.RowCount:=n+1;
    row:=0;
    for kol:=1 to n do
    begin
      StringGrid1.Cells[kol,row]:='K(x'+IntToStr(kol)+')';
    end;
    StringGrid1.Cells[n+1,0]:='Ñâ.÷ëåíû';
    kol:=0;
    for row:=1 to n do
      StringGrid1.Cells[kol,row]:=IntToStr(row);
      begin
        StringGrid2.ColCount:=2;
        StringGrid2.RowCount:=n;
        for row:=0 to n do
        begin
          StringGrid2.Cells[kol,row]:='X'+IntToStr(row+1);
        end;
      end;
      StringGrid1.Options:=StringGrid1.Options+[goEditing];
      end;
    {----------}
    for kol:=1 to n do
      for row:=1 to n do
      begin
        read(f,k);
        StringGrid1.Cells[kol,row]:=IntToStr(k);
      end;
    except
         Application.MessageBox('Ôàéë íå êîððåêòåí', 'Îøèáêà', MB_OK or MB_ICONERROR);
         Exit;   
    end;
    finally
	  closefile(f);
    end;
end;
Rilpack вне форума Ответить с цитированием
Старый 19.05.2019, 11:56   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Rilpack Посмотреть сообщение
Код:
for kol:=1 to n+1 do
          for row:=1 to n do

                reset(f);
простите, а где Вы у меня увидели этот бред?!!!
Вы в цикле многократно сбрасывает файл на начало! Зачем?!
Куда делась строчка read(f,k); ?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 19.05.2019, 17:16   #9
Rilpack
Пользователь
 
Регистрация: 14.05.2019
Сообщений: 25
По умолчанию

Вы имеете в виду вот так?
Код:
{---Êíîïêà "Çàãðóçêà"---}
procedure TForm1.N4Click(Sender: TObject);
var f:textfile;
    k,n,kol,row:integer;
begin
if OpenDialog1.Execute then
  begin
    try
      try
        assignfile(f,OpenDialog1.Filename);
        reset(f);
        readln(f,n);
        for kol:=1 to n do
          for row:=1 to n do
                read(f,k);
    {----------}
    StringGrid1.ColCount:=n+2;
    StringGrid1.RowCount:=n+1;
    row:=0;
    for kol:=1 to n do
    begin
      StringGrid1.Cells[kol,row]:='K(x'+IntToStr(kol)+')';
    end;
    StringGrid1.Cells[n+1,0]:='Ñâ.÷ëåíû';
    kol:=0;
    for row:=1 to n do
      StringGrid1.Cells[kol,row]:=IntToStr(row);
      begin
        StringGrid2.ColCount:=2;
        StringGrid2.RowCount:=n;
        for row:=0 to n do
        begin
          StringGrid2.Cells[kol,row]:='X'+IntToStr(row+1);
        end;
      end;
      StringGrid1.Options:=StringGrid1.Options+[goEditing];
    {----------}
    reset(f);
        readln(f,n);
            for kol:=1 to n do
      for row:=1 to n do
      begin
        read(f,k);
        StringGrid1.Cells[kol,row]:=IntToStr(k);
      end;
    except
         Application.MessageBox('Ôàéë íå êîððåêòåí', 'Îøèáêà', MB_OK or MB_ICONERROR);
         Exit;   
    end;
    finally
    closefile(f);
    end;
end;
end;
Rilpack вне форума Ответить с цитированием
Старый 19.05.2019, 17:43   #10
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Rilpack Посмотреть сообщение
Вы имеете в виду вот так?
да.
в этом коде я ошибок не увидел.
Работает?
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема со StringGrid (Delphi) Rilpack Помощь студентам 2 14.05.2019 16:44
Проблема с загрузкой файла plg Timurkh77 Gamedev - cоздание игр: Unity, OpenGL, DirectX 23 17.01.2019 19:39
C# Тестирование Блокнота. Проблема с загрузкой из файла .csv StudentTestC# Помощь студентам 3 05.03.2015 12:30
Проблема с загрузкой параметров из ini-файла Nomad Помощь студентам 6 03.08.2009 16:04