![]() |
MDIChild variabel durch TStringList.Objects erstellen
Hallo liebe Community,
ich habe in meiner MDI-Anwendung zur Zeit ganze vier verschiedene Arten von MDIChild-Fenstern. Also der schnellste (und schlechteste) Weg wäre wohl einfach für folgendes Problem "haufenweise" if bzw case-Abfragen zu erstellen. Bisher werden meine "Childs" durch eine solche Procedure erstellt:
Delphi-Quellcode:
Da sich aber auf dem Hauptformular "globale" Toolbuttons wie "Neu", "Öffnen", etc. befinden, die, je nachdem was in "SelTableBox.Text" befindet, das jeweilige Clientfenster starten sollen und ich nicht mit if Abfragen was konstruieren moechte, brauche ich eure Hilfe!
procedure TMainForm.CreateTableChild;
var Child: TForm; begin { Neues untergeordnetes MDI-Fenster erzeugen } ClearQuery; FQueryFrom := SelTableBox.Text; CreateQuery; Child := TTableForm.Create(Application); Child.Caption := SelTableBox.Text; end; Nun habe ich versucht eine Referenzliste meiner Childformulare zu erstellen, siehe folgendes:
Delphi-Quellcode:
Ein letzer Blick auf meine Funktion fuer den "Öffnen"-Toolbutton:
procedure TMainForm.FormCreate(Sender: TObject);
begin RelFormList := TStringList.Create; with RelFormList do begin AddObject('Classes',ClassDataForm); AddObject('Pupils',PupilDataForm); ....
Delphi-Quellcode:
Also was muss ich fuer
procedure TMainForm.InsertNewExecute(Sender: TObject);
var Child: TForm; RelFormIndex : Integer; begin RelFormIndex := RelFormList.Indexof(SelTableBox.Text); if RelFormIndex = -1 then abort; { Neues untergeordnetes MDI-Fenster erzeugen } ClearQuery; FQueryFrom := SelTableBox.Text; CreateQuery; ///// HIER LIEGT DER FEHLER 'Zuviele Parameter' //////////////// Child := RelFormList.Objects[RelFormIndex].Create(Application); ////////////////////////////////////////////////////////////// Child.Caption := SelTableBox.Text; ... Child := RelFormList.Objects[RelFormIndex].Create(Application) einsetzen, damit das ganze funktioniert? Sry, mein Verständnis für das Thema 'Objekte' entwickelt sich gerade erst... Fuer andere Lösungswege bin ich natürlich genauso offen! Genau aus diesem Grund habe ich mein Problem etwas ausführlicher als vielleicht nötig beschrieben. Danke MfG Robert |
Re: MDIChild variabel durch TStringList.Objects erstellen
Hi,
mit AddObject kannst du nur Objects, aber keine Classes speichern. Aber wenn du die Klassen der Formulare registrierst, kannst du es über den Namen machen:
Delphi-Quellcode:
wichtig im ClientForm:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure Button1Click(Sender: TObject); private FFormList: TStringList; { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation uses Unit2; {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin FFormList:= TStringList.Create; // ClassName von ClientForm FFormList.Add('TFRMClient'); end; procedure TForm1.FormDestroy(Sender: TObject); begin FFormList.Free; end; procedure TForm1.Button1Click(Sender: TObject); Var AForm: TForm; begin AForm := TFormClass(FindClass(FFormList[0])).Create(Application); AForm.Show; end; end.
Delphi-Quellcode:
ich hoffe, es hilft dir weiter...
initialization
RegisterClass(TFRMClient); Cu, Frank |
Re: MDIChild variabel durch TStringList.Objects erstellen
Hallo Robert,
vielleicht kannst Du Deine Forms auch in einer TObjectList verwalten:
Delphi-Quellcode:
Finde ich etwas übersichtlicher als in der TStringList...
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, contnrs; type TForms = class(TObjectList) function GetItem(index : integer) : TForm; procedure SetItem(index : integer; Form : TForm); public function add(Form : TForm) : integer; property Items[idx : integer] : TForm read GetItem write SetItem; default; end; TForm1 = class(TForm) Button1: TButton; Button2: TButton; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; FForms : TForms; implementation {$R *.dfm} function TForms.GetItem(index : integer) : TForm; begin result := TForm(inherited GetItem(index)); end; procedure TForms.SetItem(index:integer; Form : TForm); begin inherited SetItem(index,Form); end; function TForms.add(Form : TForm) : integer; begin result := inherited Add(Form); end; procedure TForm1.Button1Click(Sender: TObject); begin FForms.add(TForm1.Create(Form1)); FForms.Items[FForms.Count-1].Caption := 'ChildForm' + IntToStr(FForms.Count); FForms.Items[FForms.Count-1].Left := (FForms.Items[FForms.Count-1].Left + FForms.Count*10); FForms.Items[FForms.Count-1].Show; end; procedure TForm1.Button2Click(Sender: TObject); begin //hier wird nur die Liste erstellt, später muß die auch wieder freigegeben werden! FForms := TForms.Create; Button2.Enabled := false; end; Grüße, Messie |
Re: MDIChild variabel durch TStringList.Objects erstellen
Ja, wunderbar! :cheers:
Habe die Methoden von dataspider eingesetzt und nun klappt es. Leider geht durch die Verwendung der einfachen StringList die Verweisfunktionalität verloren. In meinem (nicht funktionierenden) Quelltext hatte ich durch AddObject('Classes',ClassDataForm) einen Verweis zwischen 'Classes' und 'ClassDataForm' hergestellt. Dadurch konnte ich durch das Auslesen von SelTableBox.Text(Welches von einer Abfrage nach allen vorkommenden SQL-Tabellen ener DB gefüllt wird) automatisch beim Drücken der New-Taste das passende Formular öffnen. Werde mich zu Hause nochmal ranseztzen, freue mich natürlich auch auf Vorschläge :mrgreen: Gibt es für das Ganze noch eine elegantere Möglichkeit? Gruss Robert |
Re: MDIChild variabel durch TStringList.Objects erstellen
Ich hätte die Meldung vom Board, dass es mittlerweile neue Antworten gibt, nicht ignorieren sollen :stupid:
Ich werde mit Hilfe der Delphi-Hilfe den zweiten Post nachvollziehen und dann morgen schreiben was ich nicht verstanden hab. Sollte das zu viel sein, schreibe ich einfach was ich verstanden habe ( :kotz: kleiner Scherz am Rande) Gruss Robert |
Re: MDIChild variabel durch TStringList.Objects erstellen
Hallo,
leider konnte ich mich nicht dran halten gestern zu antworten, da sich mein Laptop vorgestern Abend mit einem Bluescreen "Kernel_data_inpage_error" in der Datei ftdisk.sys verabschiedet hat und nicht mehr booten wollte. Also nach einer Neuinstallation bin ich wieder da. Ich warte gerade noch auf mein SP2, danach werde ich dann auch wieder Delphi installieren und dann endlich weiter arbeiten können. Ich habe die zweite Antwort wohl soweit nachvollzogen. Ich werde mal versuchen, meine Anforderungen da mit einzubauen! Gruss Robert |
Re: MDIChild variabel durch TStringList.Objects erstellen
Hallo allerseits!
Ich bin nun auf eine recht simple Art umgestiegen und zwar mit Hilfe eines TValueListEditors:
Delphi-Quellcode:
procedure TMainForm.FormCreate(Sender: TObject);
begin RelFormValueList := TValueListEditor.Create(Self); with RelFormValueList do begin InsertRow('Class','TClassDataForm',True); InsertRow('Pupil','TPupilDataForm',True); InsertRow('Latecomer','TLateComDataForm',True); end;
Delphi-Quellcode:
Somit habe ich eine Verknüpfung zB mit dem Text 'Class' und dem entsprechenden Formular!
Child := TFormClass(FindClass(RelFormValueList.Values[SelTableBox.Text])).Create(Application);
Child.Caption := SelTableBox.Text; Irgendwelche Verbesserungsvorschläge? Ich fand die ObjectList recht interessant - hab aber keine Lösung erfunden wie ich dort meine Anforderungen hätte einbauen können Gruss Robert |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:02 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz