Einzelnen Beitrag anzeigen

mm1256

Registriert seit: 10. Feb 2014
Ort: Wackersdorf, Bayern
640 Beiträge
 
Delphi 10.1 Berlin Professional
 
#1

(Formular-)Handling größerer Projekte

  Alt 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
Wenn du mit Gott reden willst, dann bete.
Wenn du ihn treffen willst, schreib bei Tempo 220 eine SMS
  Mit Zitat antworten Zitat