Registriert seit: 10. Feb 2014
Ort: Wackersdorf, Bayern
642 Beiträge
Delphi 10.1 Berlin Professional
|
(Formular-)Handling größerer Projekte
11. Mär 2015, 11:42
Hallo DP-Gemeinde,
wenn eine App nur ein oder wenige Fenster hat, ist die Sache ja ziemlich einfach. Da kann man mit der Delphi-Automatik (Erzeugen der Formulare in der dpr) gut leben. Etwas anders sieht es aus, wenn die App größer wird. Hier gibt es wohl sehr unterschiedliche Ansichten, Meinungen und Praktiken. Das bringt mich zu der Frage, ob denn meine Praxis was taugt und ob man vielleicht daran noch etwas optimieren könnte?
Hintergrund meiner Frage ist auch: Ich bin gelerter Elektriker der sich das Programmieren im Selbststudium angeeignet hat. Ich hab also noch keine Uni von innen gesehen. Manchmal stelle ich mir darum die Frage, ob das was ich mache auch Stand der Technik ist. Weil, für Optimierungen muss man(n) bekanntlich immer ein offenes Ohr haben.
Generell erzeuge ich in der dpr nur die Datenmodule und das Hauptformular:
Delphi-Quellcode:
{------------------------------------------------------------------------------}
{-} {$I Project1.inc} {--------------------------------------------------------}
{------------------------------------------------------------------------------}
program Project1;
uses
{$IFDEF DEBUG}
FastMM4,
{$ENDIF}
Vcl.Forms,
uMainForm in ' uMainForm.pas' {FrmMainForm},
uClientForm1 in ' uClientForm1.pas' {FrmClient1},
uClientForm2 in ' uClientForm2.pas' {FrmClient2},
uMainData in ' uMainData.pas' {MainData: TDataModule};
{$R *.res}
begin
{$IFDEF DEBUG}
ReportMemoryLeaksOnShutdown := True;
{$ENDIF}
Application.Initialize;
Application.MainFormOnTaskbar := True;
Application.CreateForm(TMainData, MainData);
Application.CreateForm(TFrmMainForm, FrmMainForm);
Application.Run;
end.
Die INC sieht so aus:
Delphi-Quellcode:
{------ Standard-Compiler-Optionen --------------------------------------------}
{-----} {$A+,B+,C+,E-,F-,G+,H+,J+,K-,M-,N+,O+,P+,S-,T-,U-,V+,W-,X+,Y-,Z1} {----}
{$IFDEF DEBUG} {$DEFINE TEST} {$ENDIF}
{- Range-Check und Debug-Info wahlweise beim Testen ein/aus -------------------}
{$IFDEF TEST} {$DEFINE UseRangeCheck} {$DEFINE CreateDebugInfo} {$ENDIF}
{$IFDEF UseRangeCheck}
{$Q+,R+}
{$ELSE}
{$Q-,R-}
{$ENDIF UseRangeCheck}
{$IFDEF CreateDebugInfo}
{$D+ L+}
{$OPTIMIZATION ON}
{$DEBUGINFO ON}
{$LOCALSYMBOLS ON}
{$REFERENCEINFO ON}
{$DEFINITIONINFO ON}
{$ASSERTIONS ON}
{$ELSE}
{$OPTIMIZATION ON}
{$DEBUGINFO OFF}
{$LOCALSYMBOLS OFF}
{$REFERENCEINFO OFF}
{$DEFINITIONINFO OFF}
{$ASSERTIONS OFF}
{$ENDIF CreateDebugInfo}
Das Hauptformular:
Delphi-Quellcode:
{------------------------------------------------------------------------------}
{-} {$I Project1.inc} {--------------------------------------------------------}
{------------------------------------------------------------------------------}
unit uMainForm;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
type
TFrmMainForm = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;
var
FrmMainForm: TFrmMainForm;
implementation
{$R *.dfm}
uses uClientForm1, uClientForm2;
procedure TFrmMainForm.Button1Click(Sender: TObject);
begin
FrmClient1_Show;
end;
procedure TFrmMainForm.Button2Click(Sender: TObject);
begin
case FrmClient2_ShowModal of
mrOk : ShowMessage(' OK');
mrCancel : ShowMessage(' Cancel');
end;
end;
end.
Normales Formular (ist bei etwa 8 Formularen ein MDI-Formular)
Delphi-Quellcode:
{------------------------------------------------------------------------------}
{-} {$I Project1.inc} {--------------------------------------------------------}
{------------------------------------------------------------------------------}
unit uClientForm1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs;
type
TFrmClient1 = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;
var
FrmClient1: TFrmClient1 = nil;
FrmClient1Active: boolean = false;
procedure FrmClient1_Show;
implementation
{$R *.dfm}
procedure FrmClient1_Show;
begin
if not FrmClient1Active
then FrmClient1 := TFrmClient1.Create(Application);
FrmClient1.Show;
end;
procedure TFrmClient1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
FrmClient1Active := false;
end;
procedure TFrmClient1.FormCreate(Sender: TObject);
begin
FrmClient1Active := true;
end;
end.
Modale Formulare:
Delphi-Quellcode:
{------------------------------------------------------------------------------}
{-} {$I Project1.inc} {--------------------------------------------------------}
{------------------------------------------------------------------------------}
unit uClientForm2;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs;
type
TFrmClient2 = class(TForm)
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;
function FrmClient2_ShowModal: integer;
implementation
{$R *.dfm}
function FrmClient2_ShowModal: integer;
begin
with TFrmClient2.Create(Application) do
try
Result := ShowModal;
finally
Release;
end;
end;
end.
Detail-Fragen:
1) Gibt es hinsichtlich einer optimalen Exe-Größe bei der Include-Datei noch Optimierungsmöglichkeiten?
2) Bei den normalen und MDI-Fenstern würde ich gerne die globalen Variablen lokal machen, also im implemantation-Teil, damit der versehentliche Zugriff aus dem Hauptformular bzw. auch anderen Formularen (wenn ein untergeordnetes Formular wiederum ein weiteres Formular aufruft) ausgeschlossen ist. Ich habe es testweise mal probiert und keine Nebenwirkungen festgestellt.
oder
3) Macht es Sinn, die Boolean-Variablen weg zu lassen, und stattdessen auf NIL zu prüfen? Wenn ja, wie geht das zuverlässig? Stichwort mögliche Exceptions beim Anzeigen oder Schließen.
Ich möchte in jedem Fall wie bisher den Speicher beim Beenden eines Formulares wieder frei geben denn es befinden sich insgesamt über 100 Formulare im Projekt.
Vielen Dank schon mal für eure Anregungen.
Gruss Otto PS: Sorry wenn ich manchmal banale Fragen stelle. Ich bin Hobby-Programmierer und nicht zu faul die SuFu zu benutzen
|