Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi MDIChild variabel durch TStringList.Objects erstellen (https://www.delphipraxis.net/65709-mdichild-variabel-durch-tstringlist-objects-erstellen.html)

robroy85 20. Mär 2006 13:36


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:
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;
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!

Nun habe ich versucht eine Referenzliste meiner Childformulare zu erstellen, siehe folgendes:
Delphi-Quellcode:
procedure TMainForm.FormCreate(Sender: TObject);
begin
  RelFormList := TStringList.Create;
  with RelFormList do
  begin
    AddObject('Classes',ClassDataForm);
    AddObject('Pupils',PupilDataForm);
    ....
Ein letzer Blick auf meine Funktion fuer den "Öffnen"-Toolbutton:
Delphi-Quellcode:
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;
...
Also was muss ich fuer
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

dataspider 20. Mär 2006 15:37

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:
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.
wichtig im ClientForm:

Delphi-Quellcode:
initialization
  RegisterClass(TFRMClient);
ich hoffe, es hilft dir weiter...

Cu, Frank

messie 20. Mär 2006 16:34

Re: MDIChild variabel durch TStringList.Objects erstellen
 
Hallo Robert,
vielleicht kannst Du Deine Forms auch in einer TObjectList verwalten:

Delphi-Quellcode:
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;
Finde ich etwas übersichtlicher als in der TStringList...

Grüße, Messie

robroy85 20. Mär 2006 16:39

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

robroy85 20. Mär 2006 16:50

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

robroy85 22. Mär 2006 09:09

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

robroy85 30. Mär 2006 18:55

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:
    Child := TFormClass(FindClass(RelFormValueList.Values[SelTableBox.Text])).Create(Application);
    Child.Caption := SelTableBox.Text;
Somit habe ich eine Verknüpfung zB mit dem Text 'Class' und dem entsprechenden Formular!

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 23:43 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