Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Проблема с Exception [D7, WinXP]


Страницы:   1 2

Franzy ©   (2006-08-14 23:56:00) 

Даже не знаю, как сформулировать вопрос... попробую описать ситуацию :) Итак, юзер на форме должен ввести некоторые данные и нажать на кнопку, чтобы эти данные были обработаны. В обработчике кнопки в начало помещаю блок TRY ... EXCEPT ... END. Между TRY и EXCEPT считываю данные из полей в переменные. При этом могут возникнуть исключения, если данные не соответствуют типу. В этом случае в блоке EXCEPT вывожу ругательное сообщение и ставлю "exit", чтобы выйти из процедуры и дать юзверю поправить данные на форме.
В общем-то это почти работает, за одним исключением. Если был Exception, то блок EXCEPT выполняется после этого при каждом нажатии кнопки, даже если все данные валидны. То есть еxception как бы остается в памяти.
Вопрос:как его оттуда убрать?
З.Ы. Раньше я в таких случаях скорпулезно проверял все данные на валидность с помощью if... Теперь захотелось так попробовать - полей слишком много, долго возиться.


Германн   (2006-08-15 01:40:00) [21]

Пардон. Не заметил, что файловая переменная тут локальная. :(


Franzy   (2006-08-15 01:40:00) [22]

2DiamondShark
А куда тогда вставлять сообщение об ошибке? Не в finally же? Оно же ВСЕГДА выполняет? А exit куда?


Германн   (2006-08-15 01:38:00) [23]


> DiamondShark ©   (15.08.06 01:30) [10]
>
>
> >  Если был Exception, то блок EXCEPT выполняется после
> этого
> > при каждом нажатии кнопки,
>
> Естественно. Файлы-то не закрываются.


Цитата из хелпа:
procedure Reset(var F [: File; RecSize: Word ] );

Description

Reset opens the existing external file with the name assigned to F using the mode specified by the global FileMode variable. An error results if no existing external file of the given name exists or if the file can’t be opened with the current file mode. If F is already open, it is first closed and then reopened.


Германн   (2006-08-15 01:35:00) [24]

В детали не вдавался, но ИМХО, режет глаз нумерация динамических массивов начиная с 1. Некошерно это как-то.


DiamondShark   (2006-08-15 01:33:00) [25]

//load data
AssignFile(f,edit1.text);
Reset(f);
try
Readln(f,n_nodes);
SetLength(nodes,n_nodes+1);
for i:=1 to n_nodes do
 begin
   for j:=1 to DN do read(f,nodes[i,j]);
   readln(f);
 end;
finally
  closefile(f);
end;

AssignFile(f,edit2.text);
Reset(f);
try
Readln(f,n_elems);
SetLength(elems,n_elems+1);
for i:=1 to n_elems do
 begin
   for j:=1 to DE do read(f,elems[i,j]);
   readln(f);
 end;
finally
closefile(f);
end;


DiamondShark   (2006-08-15 01:30:00) [26]


>  Если был Exception, то блок EXCEPT выполняется после этого
> при каждом нажатии кнопки,

Естественно. Файлы-то не закрываются.


Franzy   (2006-08-15 01:26:00) [27]

------------------------------------------------------------
Вот, здесь можно взять все исходники проги (она уже работает, не считая этой досадной мелочи :)): " http://franzy.hotbox.ru/GridQuality.rar" В архиве прилагаются файлы тестовых 2D- и 3D-сеток.


Franzy   (2006-08-15 00:51:00) [28]

Даю код :) Если интересно - это утилита для оценки качества треугольных и тетраэдрических сеток.
----------------------
unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, ComCtrls, ExtCtrls, Grids, ValEdit, Gauges,Math, Spin,
 ExtDlgs;

type
 TForm1 = class(TForm)
   PageControl1: TPageControl;
   TabSheet1: TTabSheet;
   TabSheet2: TTabSheet;
   OpenDialog1: TOpenDialog;
   Edit2: TEdit;
   Edit1: TEdit;
   Button1: TButton;
   Button2: TButton;
   Label1: TLabel;
   Label2: TLabel;
   RadioGroup1: TRadioGroup;
   Button3: TButton;
   Label3: TLabel;
   ValueListEditor1: TValueListEditor;
   TabSheet3: TTabSheet;
   Gauge1: TGauge;
   Label4: TLabel;
   RadioGroup2: TRadioGroup;
   Panel1: TPanel;
   Image1: TImage;
   Button4: TButton;
   SpinEdit1: TSpinEdit;
   Label5: TLabel;
   Label6: TLabel;
   Label7: TLabel;
   Label8: TLabel;
   Button5: TButton;
   SavePictureDialog1: TSavePictureDialog;
   Label9: TLabel;
   Label10: TLabel;
   procedure Button1Click(Sender: TObject);
   procedure Button2Click(Sender: TObject);
   procedure Button3Click(Sender: TObject);
   procedure FormClose(Sender: TObject; var Action: TCloseAction);
   procedure Button4Click(Sender: TObject);
   procedure Button5Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

 Telem = array [1..4] of longint;
 Tnode = array [1..3] of double;
var
 Form1: TForm1;

 nodes : array of TNode;
 elems  : array of Telem;
 vols, ax : array of double;
 n_nodes, n_elems : longint; //number of elems and nodes
 DE, DN, DR : byte; //dimensions number
 BESTAX : double;
 n_ribs: longint;
 maxrib,minrib,avrib,minvol, maxvol,avvol,minax,maxax,avax: double;
 hist : array [1..250] of longint;

implementation

{$R *.dfm}

//Вот эта процедура

procedure TForm1.Button3Click(Sender: TObject);
var i,j,k :longint;
   f: textfile;
   t : textfile;
   v,r,rm,a : double;
   ribs: array[1..4,1..4] of double;

begin
 //params

 form1.Gauge1.Progress:=0;
 Case RadioGroup1.itemindex of
 0: begin
      DE :=3;
      DN :=2;
      DR :=3;
      BESTAX:=sqrt(3);
    end;
 1: begin
      DE :=4;
      DN :=3;
      Dr :=6;
      BESTAX:=sqrt(2)/12;
    end;
 End;

TRY
 AssignFile(t,'log.txt');
 Rewrite(t);

 //load data
 AssignFile(f,edit1.text);
 Reset(f);
 Readln(f,n_nodes);
 SetLength(nodes,n_nodes+1);
 for i:=1 to n_nodes do
  begin
    for j:=1 to DN do read(f,nodes[i,j]);
    readln(f);
  end;
 closefile(f);

 AssignFile(f,edit2.text);
 Reset(f);
 Readln(f,n_elems);
 SetLength(elems,n_elems+1);
 for i:=1 to n_elems do
  begin
    for j:=1 to DE do read(f,elems[i,j]);
    readln(f);
  end;
 closefile(f);

 EXCEPT
   Showmessage('Ошибка ввода-вывода! Убедитесь, что файлы имеют нужный формат и что выбран соответсвующий тип элемента!');
   exit

 END;

 SetLength(ax,n_elems+1);
 SetLength(vols,n_elems+1);
.....


tesseract   (2006-08-15 00:41:00) [29]

> [4] Чапаев ©   (15.08.06 00:13)


телепатор работает в силу локальных настроек.

Если автор считает, что Exception находиться в памяти............


Плохиш   (2006-08-15 00:30:00) [30]


> Franzy   (14.08.06 23:56)  
> Даже не знаю, как сформулировать вопрос

Почему тогда задаёшь вопрос не в паравильной конференции?

> Чапаев ©   (15.08.06 00:07) [2]
> Anatoly Podgoretsky ©   (15.08.06 00:18) [5]

Всё б вам чужой код тырить.


Anatoly Podgoretsky   (2006-08-15 00:18:00) [31]

Код давай


Чапаев   (2006-08-15 00:13:00) [32]

> [3] tesseract ©   (15.08.06 00:11)
> > Теперь захотелось так попробовать - полей слишком много,
> > долго возиться.
> создай процедуры для проверки на нумерабельность, назначать
> по onchange.

Ну, о нумерабельности речь ведь не шла.


tesseract   (2006-08-15 00:11:00) [33]

> Теперь захотелось так попробовать - полей слишком много,
> долго возиться.

создай процедуры для проверки на нумерабельность, назначать по onchange.


Чапаев   (2006-08-15 00:07:00) [34]

код приведи


Zeqfreed   (2006-08-14 23:58:00) [35]

> [0] Franzy   (14.08.06 23:56)

Ошибка в коде.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо