Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Anwendung mit 'Unterformularen' im Outlook-Stil (https://www.delphipraxis.net/4437-anwendung-mit-unterformularen-im-outlook-stil.html)

APP 29. Apr 2003 11:22


Anwendung mit 'Unterformularen' im Outlook-Stil
 
Hallo,
ich habe dazu im Entwickler-Forum eine Antwort von Hagen Reddmann gefunden die mir sehr gut gefällt.

Allerdings möchte ich diese Funktion erweitern, heute sitze ich aber ziemlich auf der Leitung, vielleicht kann mir jemand helfen:

Delphi-Quellcode:
procedure TOutlookForm.CreateMyFormInplaced;
var
  NewForm: TForm;
begin
// erzeuge das neue Form
  NewForm := TMySubForm.Create(Self);
  NewForm.Visible := False;
  NewForm.BorderStyle := bsNone;
  NewForm.Align := alClient;
  NewForm.Parent := OutlookPanel;
  NewForm.Show;
// tausche aktuelles Form mit dem neuen aus und zerstöre das
// vorherig aktuelle Form
  FCurrentForm.Free;
  FCurrentForm := NewForm;
end;
Ich habe verschiedene Form-Klassen erzeugt (TMyForm1, TMyForm2, TMyForm13,..) die ich nacheinander in das OutlookPanel einbetten möchte.

Nun möcht ich bei der Prozedur
Delphi-Quellcode:
procedure TOutlookForm.CreateMyFormInplaced(<Gewünsche Klasse>);
die jeweilige Klasse meines gewünschten Formulars mitgeben, habe aber im Moment keinen Durchblick :party:

2. Frage:
Das Formular wird mit
Delphi-Quellcode:
NewForm := TMySubForm.Create(Self);
erzeugt und mit
Delphi-Quellcode:
  FCurrentForm.Free;
zerstört, muß ich jetzt vor dem Beenden der Applikation
Delphi-Quellcode:
NewForm
auch noch freigeben oder NIL setzen?


Wie gesagt, heute :party: :party:

APP 30. Apr 2003 12:44

Tja,
nachdem (zumindest bei uns im Ösiland) das Sommerhoch voll zugeschlagen hat,
und niemand mein Problem lösen wollte, habe ich es selbst gemacht :mrgreen: :mrgreen: :mrgreen:

Delphi-Quellcode:
PROCEDURE TfMain.CreateMyFormInplaced(CONST aFormClass: TFormClass; CONST Alignment: TAlign);
VAR
  NewForm                         : Tform;
BEGIN
  IF Assigned(aFormClass) THEN
    BEGIN
      NewForm := aFormClass.Create(Self);
      NewForm.Visible := False;
      NewForm.BorderStyle := bsSingle;
      NewForm.Align := Alignment;
      NewForm.Parent := Panel1;
      NewForm.Show;
      FCurrentForm.Free;
      FCurrentForm := NewForm;
    END;
END;
der Aufruf erfolgt nun so:

Delphi-Quellcode:
PROCEDURE TfMain.Button2Click(Sender: TObject);
BEGIN
  CreateMyFormInplaced(TMySubForm1, alClient);
END;
Aber meine 2. Frage ist noch ausständig, wer weiß was?

Phoenix 30. Apr 2003 12:58

Zitat:

Zitat von APP
Aber meine 2. Frage ist noch ausständig, wer weiß was?

Freigeben kannst Du es nicht mehr. Das Objekt wurde ja anscheinend schon freigegeben, ein weiteres .Free würde also zu einer AccVio führen. Die Variable auf NIL zu setzen gehört sich zwar eigentlich, führt aber meist zu einem Compilierungshinweis von wegen zugewiesener Wert wird nie verwendet.

Es ist also nicht unbedingt notwendig, aber eigentlich ein guter bzw. sauberer Stil.

Christian Seehase 30. Apr 2003 17:05

Moin Armin,

Du kannst Dein CurrentForm auch mit FreeAndNil(...) statt Free freigeben, dann wird intern automatisch := nil hinzugefügt.
Da Du als Owner der Formulare self (also TOutlookForm) angegeben hast, müsstest Du sie noch nicht einmal selber zerstören, dies würde automatisch beim Zerstören des Owners geschehen.
Um Resourcen zu sparen, ist es natürlich von Vorteil es doch selber zu machen.

APP 30. Apr 2003 18:35

Alles klar,
Danke!


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:37 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz