![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблема с Exception [D7, WinXP]
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)
Ошибка в коде.