Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Dynamisch erzeugtes Frame freigeben ... (https://www.delphipraxis.net/56195-dynamisch-erzeugtes-frame-freigeben.html)

RudiV 2. Nov 2005 08:34


Dynamisch erzeugtes Frame freigeben ...
 
Hallo,

folgendes Szenario habe ich zu lösen:
in einem Form gibt es links einen Treeview mit vielen Einträgen.
Wenn ein Eintrag davon gewählt wird, soll rechts daneben ein zugeordetes Frame angezeigt werden.
In diesem Frame hat der Benutzer verschiedene Möglichkeiten wie z.B. Anmelden an Datenbank, Suche nach Kunden/Personen ...

Und nun zum eigentlichen Problem:
Wenn nun etwa das Frame für das Login im Main-form geladen ist, und der Benutzer gibt seine Anmeldedaten ein und klickt auf einen Butten "Anmelden" soll nach korrekter Eingabe der Anmeldedaten ein neues Frame (z.B. die Kundensuche) geladen und natürlich das Frame "Login" entfernt/gelöscht werden. Dabei tritt aber immer eine Zugriffsverletzung auf, weil ich im Event des Buttons "Anmelden" das selbe Frame natürlich nicht mit Free löschen kann.

Delphi-Quellcode:
procedure Tfr_login.Button1Click(Sender: TObject);
begin
 //prüfe Logindaten ....
 if login = true then begin
   //Lade neues Frame (Kundensuche)
   Free;
 end;
end;
Hat jemand dazu eine Idee, einen Vorschlag?
Liege ich mit einem Frame hier vielleicht falsch?

Vielen Dank für Eure Unterstützung und Grüße aus Wien
Rudi

Hinweis dazu: da es eine komplexe Anwendung ist/wird und viele verschiedene Eingabemasken bzw. Anzeigen gibt habe ich absichtlich keine PageControl-Komponente verwendet.

[edit=Admin]Code in Delphi-Tags gesetzt. Künftig bitte selber machen, Danke. :-) Mfg, Daniel[/edit]

sh17 2. Nov 2005 08:58

Re: Dynamisch erzeugtes Frame freigeben ...
 
1. Du legst Dir eine Variable

Delphi-Quellcode:
CurrentFrame : TTntFrame;
an zentraler Stelle an (im Hauptformular oder einer gemeinsamen Unit)

2 .Du legst im Hauptformular ein Panel als Container für die Frames an.

3. Die TreeView-Click-Funktion:

Delphi-Quellcode:
procedure TDPR00001Form1.MenuTreeClick(Sender: TObject);
begin
  if CurrentFrame <> nil then begin
    CurrentFrame.Free;
    CurrentFrame := nil;
  end;

  if MenuTree.Selected.Text = _('Logintabelle') then begin TDPR001Frame1.ShowFrame(Panel1); exit; end;
  if MenuTree.Selected.Text = _('Sprache') then begin TDPR001Frame14.ShowFrame(Panel1); exit; end;
...
end;
4. Jedes Frame verfügt über eine statische ShowMethode:

Delphi-Quellcode:
  public
    class procedure ShowFrame(_Parent : TWinControl);
  end;

...

class procedure TDPR001Frame4.ShowFrame(_Parent: TWinControl);
begin
  DPR00001Form1.CurrentFrame := TDPR001Frame4.Create(_Parent);
  with TDPR001Frame4(DPR00001Form1.CurrentFrame) do
  begin
    Parent := _Parent;
    Align := alClient;
  end;
end;
5. Schliesen des Frames vom Frame aus:

Delphi-Quellcode:
procedure TDPR001Frame4.ButtonFrameCloseClick(Sender: TObject);
begin
  PostMessage(Application.MainForm.Handle,WM_USER+3333,0,0);
end;
6. Das Gegenstück im Hauptformular

Delphi-Quellcode:
    procedure OnCloseFrame(var _Msg : TMessage); message WM_USER+3333;

...

procedure TDPR00001Form1.OnCloseFrame(var _Msg: TMessage);
begin
  if CurrentFrame <> nil then
  begin
    CurrentFrame.Free;
    CurrentFrame := nil;
  end;
end;

sh17 2. Nov 2005 09:00

Re: Dynamisch erzeugtes Frame freigeben ...
 
Achso, nicht wundern. Ich nutze die Tnt-Controls

Musst alles wieder durch normale Controls ersetzen

RudiV 2. Nov 2005 11:35

Re: Dynamisch erzeugtes Frame freigeben ...
 
Wow, das ging aber flott :)
Danke schön, werd mich dann gleich darüber stürzen!


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:15 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