Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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


Донат для форума - использовать для поднятия настроения себе и модераторам

А ещё здесь можно купить рекламу за 15 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru

Ответ
 
Опции темы
Старый 17.05.2019, 08:45   #1
Rilpack
Пользователь
 
Регистрация: 14.05.2019
Сообщений: 23
Репутация: 10
По умолчанию Проблема с загрузкой файла в 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, 09:58   #2
evg_m
Профессионал
 
Регистрация: 20.04.2008
Сообщений: 4,880
Репутация: 2195
По умолчанию

Цитата:
чтобы программа не ломалась
это называется 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 в 10:26. Причина: спасибо сергей. а то бы и не заметил.
evg_m вне форума   Ответить с цитированием
Старый 17.05.2019, 10:24   #3
Serge_Bliznykov
МегаМодератор
СуперМодератор
 
Регистрация: 09.01.2008
Сообщений: 25,417
Репутация: 5596
По умолчанию

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

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

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

Цитата:
Сообщение от 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, 14:56   #6
evg_m
Профессионал
 
Регистрация: 20.04.2008
Сообщений: 4,880
Репутация: 2195
По умолчанию

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

Цитата:
Сообщение от 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, 12:56   #8
Serge_Bliznykov
МегаМодератор
СуперМодератор
 
Регистрация: 09.01.2008
Сообщений: 25,417
Репутация: 5596
По умолчанию

Цитата:
Сообщение от Rilpack Посмотреть сообщение
Код:

for kol:=1 to n+1 do
          for row:=1 to n do

                reset(f);

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

Вы имеете в виду вот так?
Код:

{---Êíîïêà "Çàãðóçêà"---}
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, 18:43   #10
Serge_Bliznykov
МегаМодератор
СуперМодератор
 
Регистрация: 09.01.2008
Сообщений: 25,417
Репутация: 5596
По умолчанию

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

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

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


12:06.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.

Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru