Fordi jeg er meget krakilsk har jeg valgt at rette yderligere så det ligner den den kode jeg bedst kan lide.
1. Alle tekststrenge er flyttet ud som konstanter. God praksis og hvis konsekvent brugt kan man spare SameText (eller AnsiSameText) som sikkert er tunge.
2. If's erstattes med Exceptions. Hvorfor? Egentlig synes jeg koden bliver lidt lettere at overskue. Jeg ved godt at det er en forklædt "Goto" men try-finally og try-except virker godt sammen.
3. Min egen valideringsexception fanges, mens andre kan føres videre til en "on e: exception" hvis man ønsker det (prøv i øvrigt:
http://www.madshi.net)
4. Jeg bruger Release i stedet for Free på forme. Release sørger for at afslutte alle ventende messages på formen inden den frigives. Derved reducere risikoen for "freak" exceptions.
5. Formene frigives når de kan. Væk er de nestede try-finally
6. Bruger self i stedet for application. Det er den rigtige måde at gøre det på: Man bibeholder hierarkiet af ejerskaber og kan bruge formens position-property til at placere den eksempelvis centreret i forhold til ejeren.
7. Sålænge der ikke er nestede "with" kan jeg godt leve med objektinstanserne er lidt sværere at debugge.
const
rcADMIN = 'ADMIN';
rcNOTADMIN = 'NOTADMIN';
type
EPasswordError = class(Exception);
procedure TfrmMain.mmBehandlingerClick(Sender: TObject);
var
resultcode: string;
begin
try
with TfrmPasscheck.Create(self) do
try
resultcode := frmPasscheck.execute(RegBaseInfo.gsAdminPass);
finally
Release;
end;
if SameText(resultcode,rcNOTADMIN) then
raise EPasswordError.Create('Adgangskoden er forkert! Du har muligvis ikke adgang til den valgte programdel.');
if SameText(resultcode,rcADMIN) then
begin
with TfrmBehandlinger.Create(self) do
try
execute();
finally
Release;
end;
end;
except
on e: EPasswordError do
MessageDlg(e.Message, mtError, [mbOK], 0);
end;
end;
Martin: Jeg tror du misforstår Tolderlund mht. := nul. Med følgende konstruktion giver det fin logik at sætte form2 = nil:
begin
form1 := TForm1.Create(self);
form2 := nil;
try
...
form2 := TForm2.Create(self);
...
finally
form1.Release;
if assigned(form2) then
form2.release;
end;
end;