dovresti innanzitutto prevedere una procedure in cui racchiudere tutti i controlli di tipo business-logic
la procedure è comoda perchè sposti in blocco i controlli a seconda delle prove che vuoi fare
in questa procedure puoi usare sia:
- una serie di "IF"
- un try/except per intercettare le raise come ti ha suggerito stilgar
Esempio.
da qualche parte dichiara:
MyException = class(exception);
// test before post exceptions
MyException_BeforePost_Field_123 = class(MyException);
MyException_BeforePost_Field_456 = class(MyException);
poi nella procedura di test:
try
if Field_123_IsRequired and (tbTable1Field_123.AsString = '') then
raise MyException_BeforePost_Field_123.Create('il campo 123 bla bla bla')
if Field_456_IsRequired and (tbTable1Field_456.AsString = '') then
raise MyException_BeforePost_Field_456.Create('il campo 456 bla bla bla')
except
on e: MyException_BeforePost_Field_123 do
begin
ShowMessage(e.Message);
Field_123.SetFocus;
...
...
end;
on e: MyException_BeforePost_Field_456 do
begin
ShowMessage(e.Message);
Field_456.SetFocus;
...
...
end;
on e: Exception do begin
tutte le altre eccezioni
end;
end;
Edit:
è solo uno spunto (e scritto di getto, speriamo bene :P ), poi dipende molto da come hai messo in piedi l'applicazione
Su cosa?
Sulla gestione delle eccezioni? :o
Guarda che rischi di trovarti del codice del tipo:
program ....
begin
try
...
except
on E : Exception do
writln("Sono andato in errore:", E.message);
end;
end.
Con gente che si lamenta che si scassa tutto sul write ... ;) (Nell'esempio do per scontato che sia un'applicazione GUI e non consolle ;) )
Ho datto una prova al volo.
procedure TForm1.RacesBeforePost(DataSet: TDataSet);
begin
if edtRaceName.text = '' then
DataSet.Cancel;
end;
A me non da errore....e si comporta come mi aspettavo... annulla le modifiche... :(
edit:
anche il db navigator non ha comportamenti sballati.
Sto usando una connessione MySQL ... ma credo non centri molto il cambio di connettore....
Allora....la richiesta si evolve ;)
procedure TForm1.RacesBeforePost(DataSet: TDataSet);
var
tempValue : array of String;
begin
SetLength(tempValue,3);
tempValue[0] := edtRaceName.field.AsString;
tempValue[1] := edtRaceMiddleAge.field.AsString;
tempValue[2] := edtSizeSelector.field.AsString;
if edtRaceName.Text = '' then
begin
DataSet.Cancel;
DataSet.Insert;
edtRaceName.field.AsString := tempValue[0];
edtRaceMiddleAge.field.AsString := tempValue[1];
edtSizeSelector.field.AsString := tempValue[2];
edtRaceName.SetFocus;
end;
SetLength(tempValue,0);
end;