Autor Beitrag
Olli_Sahr
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 83


D5 Prof, D7 Architect
BeitragVerfasst: So 12.06.05 19:47 
Hallo!

Habe eine Anwendung mit einem Panel drauf.
Zusätzlich hat die Anwendung noch eine ganze Menge Frames, die alle erst bei Bedarf erzeugt und angezeigt werden sollen.
Dazu habe ich in Delphi 5 auf "Dateo -> Neuer Frame" geklickt und den Frame mal Einstellungen genannt.
In den Projektoptionen wird nur das Hauptformular automatisch erzeugt, die Frames nicht.

Die Typendefinitopn in der unit "fEInstellungen" lautet:

ausblenden Delphi-Quelltext
1:
TfraEinstellungen = class(TFrame)					


Im Hauptformular kann ich den Frame folgendermaßen erzeugen und anzeigen lassen (bei einem ButtonClick):

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
   // FTempFrame ist vom Typ TFrame
   // pnlFames ist das Panel, auf das der Frame drauf soll
   FTempFrame := TfraEinstellungen.Create(pnlFames);
   FTempFrame.parent := pnlFames;
   FTempFrame.Align := alClient;


Das funktioniert.

Ich will jetzt im Hauptformular eine Procedure haben, mit der ich die Frames erzeugen kann.
Dazu will ich als Parametrer den entsprechenden Frame übergeben.
Problem ist: ich müsste da ja einen Typen "TfraEinstellungen, TfraKunde, und so weiter" übergeben.

Ich könnte auch das Createn (erste Zeile) beim Button Click machen und danach die Procedure "ShowFrame", die den Parent und das alignment setzt, aber da habe ich nicht so viel gespart.

Schön wäre eine Funktion, ala "ZeigeFrame(TFraKunde)".

Habe es schon probiert mit einer Funktion, die einen TFrame als Parameter erwartet, aber dann wirft der Compler eine Fehlermeldung (Inkompatible Typen: TFrame und Class Reference).

Ich will auf einige der Frames eine TDataSource Komponente packen.
Auf dem Frame "TFraKunde" zeigt diese Datasource dann auf die Tabelle Kunde, beim Frame "Rechnungen" auf die Tabelle "Rechnungen".

Ich will mit einer zentralen Toolbar (im Hauptformular) bei einem ButtonClick auf die TDataSource des entsprechenden geladenen Frames zugreifen. Also dass ich nur enmal den Button "Datensatz Löschen" brauche und dann auf die DataSource zugreife und da dann lösche.

Wer kann mir bitte helfen?


Danke


OLLI


Moderiert von user profile iconraziel: Topic aus Sonstiges verschoben am So 12.06.2005 um 20:01
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: So 12.06.05 20:07 
Hallo!

user profile iconOlli_Sahr hat folgendes geschrieben:
Schön wäre eine Funktion, ala "ZeigeFrame(TFraKunde)".



Ich gehe von zwei verschiedenen Frames TFrame2 und TFrame3 aus. Die wichtigen Teile habe ich mal markiert.

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
type
  TFrameClass = class of TFrame;

type
  TForm1 = class(TForm)
    {...}
  public
    { Public-Deklarationen }
    procedure createFrame(theClass : TFrameClass);
  end;

{...}implementation{...}

procedure TForm1.createFrame(theClass: TFrameClass);
var
  theFrame : TFrame;
begin
  theFrame := theClass.Create(self);
  theFrame.Parent := self;
  theFrame.Align := alClient;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  createFrame(TFrame2);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  createFrame(TFrame3);
end;


Hoffe, das hilft. :-)

Grüße
Christian

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Olli_Sahr Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 83


D5 Prof, D7 Architect
BeitragVerfasst: So 12.06.05 20:23 
Danke, das hilft.

Ich will mir noch einen Array (oder ein Set, das wäre besser) von frames anlegen, die die Toolbar Einblenden.
Alle Frames, die Daten von Datenbanken anzeigen, sollen die Toolbar einschalten, die anderen nicht.

Bei einem Set kann ich ja fragen:

ausblenden Delphi-Quelltext
1:
if (aFrameClass in FramesMitDateninhalt) then ....					


Leider kann ich kein Set der Frames definieren:

ausblenden Delphi-Quelltext
1:
FramesMitDateninhalt: set of TFrameClass = [TFraKunde, TfraKurse];					


einen Array hingegen schon:

ausblenden Delphi-Quelltext
1:
FramesMitDateninhalt: Array[0..1of TFrameClass = (TFraKunde, TfraKurse);					


Problem bei einem Array: ich kann nicht mit "in" den Array abfragen, sondern müsste eine Funktion "IsFrameInArray" schreiben, die den Array durchgeht.
Das ist an sich kein Problem, aber gibt es auch eine geschicketere Lösung?



Weitere Frage: wie kann ich vom Hauptformular auf einen dieser dynamischen Frames zugreifen und dann in ein Feld, das alle Frames haben, einen Wert schreiben?
Wie ein Edit Feld ?


Danke für Eure Hilfe....



OLLI
Olli_Sahr Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 83


D5 Prof, D7 Architect
BeitragVerfasst: Mo 13.06.05 18:31 
Hallo !

Ich habe das mit dem Set gelöst, indem ich einfach zwei proceduren im Hauptformular einbaue, die von den jeweiligen Frames aufgerufen werden.

Auch das mit dem Feld (das war die Datenbank Komponente "DataSource" habe ich gelöst, indem ich im Hauprformular die Variable

ausblenden Delphi-Quelltext
1:
2:
   public
      FActiveDataSource: TDataSource;


erstellt habe und bei Button Click auf den Frame die DataSource auf dem Frame in diese Variable reinschreibe.
Damit kann ich mit einer zentralen Toolbar die Datensatzoperationen (Neu, Löschen, etc) ausführen.

Jetzt habe ich nur noch ein Problem:


Ein Formular hat ein Event "FormCreate", bei dem ich Dinge ausführen lassen kann, die beim Erzeugen des Formulares ausgeführt werden sollen.
Ich will in meinen Dynamisch erzeigten Frames beim Erzeugen die DataSource zuweisen (das, was ich jetzt per Button mache) und auch die Toolbar dynamisch gestalten (Buttons ein und ausblenden, dazu habe ich im Hauptformular zwei proceduren).

Wie mache ich das?


OLLI