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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.06.2011, 00:18   #21
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Рекомендую почитать: http://www.transl-gunsmoker.ru/2011/01/2197.html и http://www.delphikingdom.ru/asp/view...#SubHeader_2_6

Применительно к вашему случаю (и моему предыдущему примеру) это должно выглядеть примерно как-то так:
Код:
procedure TForm1.FormCreate(Sender: TObject);
begin
  LoadWorkFiles;
  SelLang;
  Timer1.Enabled:= True;

  // и другие действия
end;

procedure TForm1.LoadWorkFiles;
var
  a,b,c,d, fn: string;
begin
  try
    fn := 'C:\CNC SS v4.02\Config\Auto';
    AssignFile(f, fn);
    Reset(f);
    try
      readln(f,a);
      // Пример проверки на корректность данных в вашем файле
      if a = '' then
        raise EInvalidFileData.Create('Первая строка не может быть пуста');  

      readln(f,b);
      if b = '' then
        raise EInvalidFileData.Create('Вторая строка не может быть пуста');  

      readln(f,c);
      readln(f,d);
    finally
      closefile(f);
    end; 

    ComboBox1.Text:= a;
    ComboBox2.Text:= b;
    ComboBox3.Text:= c;
    ComboBox4.Text:= d;
  except
    on E: Exception do
      raise EInvalidFileData.Create('Файл содержит неверные данные. Возможно, он повреждён и переустановка программы исправит проблему.' + sLineBreak + 'Проблема: ' + E.Message);
  end;
end;
Где EInvalidFileData - определённые вами классы исключений. Это самый простой вариант. Его можно улучшить.

По поводу выделения отдельного метода (LoadWorkFiles) - рекомендую почитать это: http://www.gunsmoker.ru/2011/01/blog-post.html

По поводу отказа от Form1 - см. http://www.gunsmoker.ru/2011/04/blog-post.html

(загрузил, да )
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.

Последний раз редактировалось GunSmoker; 03.06.2011 в 03:59.
GunSmoker вне форума Ответить с цитированием
Старый 03.06.2011, 02:56   #22
Sparkman
220400
Форумчанин
 
Аватар для Sparkman
 
Регистрация: 21.05.2010
Сообщений: 726
По умолчанию

Сколько траев о_О, а нельзя использовать FileExists для проверки существования файлов?
Конструкцию try..except лучше по-моему применять для "черных ящиков" - функций которые возвращают, или могут вернуть, не обрабатываемую ошибку в своем теле.
Cерьёзной помощи не ждите - помогаю в перерывах на "перекур".
Не существует ничего невозможного для человека, который не собирается ничего делать сам.
Не учите человека, если вы не его учитель.
Sparkman вне форума Ответить с цитированием
Старый 03.06.2011, 03:57   #23
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Цитата:
а нельзя использовать FileExists для проверки существования файлов?
Можно.

А с чего ты взял, что отсутствие файла может быть единственной проблемой? Как насчёт: файл есть, но доступ заблокирован? Как насчёт: файл есть, но пустой? Как насчёт: файл есть, не пустой, но в нём неверные данные?

Если не использовать исключения, то код будет выглядеть примерно так:
Код:
fn := 'C:\CNC SS v4.02\Config\Auto';
if not FileExists(fn) then
  Exit;
AssignFile(f, fn);
Reset(f);
if EOF(f) then
begin
  closefile(f);
  exit;
end;
readln(f,a);
if a = '' then
begin
  closefile(f);
  Application.MessageBox('Первая строка не может быть пуста', 'Ошибка', MB_OK or MB_ICONERROR);  
  Exit;
end;
if not EOF(f) then
  readln(f,b)
else
  b := '';
if b = '' then
begin
  closefile(f);
  Application.MessageBox('Вторая строка не может быть пуста', 'Ошибка', MB_OK or MB_ICONERROR);  
  Exit;
end;
if not EOF(f) then
  readln(f,c)
else
  c := '';
if not EOF(f) then
  readln(f,d)
else
  d := '';
closefile(f);

ComboBox1.Text:= a;
ComboBox2.Text:= b;
ComboBox3.Text:= c;
ComboBox4.Text:= d;
Мне одному кажется, что три строчки обработки исключений, одним махом покрывающие все случаи, существенно короче и нагляднее вороха if-в? Рекомендую ещё глянуть: http://www.delphikingdom.ru/asp/view...#SubHeader_1_3

Причём в случае FileExists у вас, кроме того, возникает ситуация условий гонки между проверкой и использованием. Иными словами, FileExists может показать, что файл есть, но до момента его открытия его кто-то удалит. Что, в конечном итоге, оставляет нас с первоначальным вариантом.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 03.06.2011, 09:50   #24
Vova777
Уважаемый
Форумчанин
 
Аватар для Vova777
 
Регистрация: 04.07.2010
Сообщений: 318
По умолчанию

Будем пробовать. GunSmoker наверное наиболее правильный вариант предложил, использовать буду именно его. Если что-то будет не так - напишу об этом.

GunSmoker, благодарю вас за хорошее решение.
даешь высокое напряжение
Vova777 вне форума Ответить с цитированием
Старый 03.06.2011, 10:23   #25
Vova777
Уважаемый
Форумчанин
 
Аватар для Vova777
 
Регистрация: 04.07.2010
Сообщений: 318
По умолчанию

...
try
CopyFile(Pchar(dir + '\Themes\Space\Back5.bmp'), Pchar('C:\CNC SS v4.02\Themes\Space\Back5.bmp'), true);
CopyFile(Pchar(dir + '\Themes\Space\Back9.bmp'), Pchar('C:\CNC SS v4.02\Themes\Space\Back9.bmp'), true);
CopyFile(Pchar(dir + '\Themes\Space\Back.jpg'), Pchar('C:\CNC SS v4.02\Themes\Space\Back.jpg'), true);
CopyFile(Pchar(dir + '\Themes\Space\Config'), Pchar('C:\CNC SS v4.02\Themes\Space\Config'), true);
CopyFile(Pchar(dir + '\Themes\Space\Crystal.bmp'), Pchar('C:\CNC SS v4.02\Themes\Space\Crystal.bmp'), true);
CopyFile(Pchar(dir + '\Themes\Space\Edit.bmp'), Pchar('C:\CNC SS v4.02\Themes\Space\Edit.bmp'), true);
CopyFile(Pchar(dir + '\Themes\Space\SeConfig'), Pchar('C:\CNC SS v4.02\Themes\Space\SeConfig'), true);
except
begin
res:= MessageDlg('Необходимые компоненты не найдены. Установка будет отменена.', mtWarning, [mbOk], 0);
if res = mrOk then
begin
if not MyRemoveDir('C:\CNC SS v4.02') then ShowMessage('Невозможно удалить данный каталог. Попробуйте деинсталлировать его другими способами.');
Application.Terminate;
end;
end;
end;
...

Почему даже если одного файла нет, процедура не прерывается? И не появляется сообщение?
даешь высокое напряжение
Vova777 вне форума Ответить с цитированием
Старый 03.06.2011, 10:36   #26
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

CopyFile возвращает значение, не поднимая исключение в случае аварии
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 03.06.2011, 10:38   #27
Vova777
Уважаемый
Форумчанин
 
Аватар для Vova777
 
Регистрация: 04.07.2010
Сообщений: 318
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
CopyFile возвращает значение, не поднимая исключение в случае аварии
А как обработать ?
даешь высокое напряжение
Vova777 вне форума Ответить с цитированием
Старый 03.06.2011, 10:45   #28
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

если по образцу 21 поста, то примерно так

if not CopyFile(...) then
raise EInvalidFileData.Create('Ошибка копирования файла такого-то');
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 03.06.2011, 10:58   #29
Vova777
Уважаемый
Форумчанин
 
Аватар для Vova777
 
Регистрация: 04.07.2010
Сообщений: 318
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
if not CopyFile(...) then
raise EInvalidFileData.Create('Ошибка копирования файла такого-то');
только так: raise Exception.Create('Ошибка копирования файла такого-то');
даешь высокое напряжение
Vova777 вне форума Ответить с цитированием
Старый 03.06.2011, 13:00   #30
_Engine_
Форумчанин
 
Регистрация: 29.06.2008
Сообщений: 603
По умолчанию

Moжет FileExists'ом проверять наличие файла?
/// уже предлагали
_Engine_ вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обработка исключений Ckomoroh Общие вопросы Delphi 6 21.03.2011 08:52
обработка исключений user666 Помощь студентам 36 27.08.2010 18:00
ошибка при закрытии формы после обработки в потоке furstenberg Общие вопросы Delphi 7 05.07.2010 12:19
Обработка исключений _-Re@l-_ Общие вопросы Delphi 3 17.06.2010 08:53
WebBrowser и ошибка 404, идея ее обработки celovec Работа с сетью в Delphi 3 22.02.2009 19:40