AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi MDIChild variabel durch TStringList.Objects erstellen
Thema durchsuchen
Ansicht
Themen-Optionen

MDIChild variabel durch TStringList.Objects erstellen

Ein Thema von robroy85 · begonnen am 20. Mär 2006 · letzter Beitrag vom 30. Mär 2006
Antwort Antwort
robroy85

Registriert seit: 6. Nov 2004
Ort: Norderstedt
42 Beiträge
 
#1

MDIChild variabel durch TStringList.Objects erstellen

  Alt 20. Mär 2006, 14:36
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
  Mit Zitat antworten Zitat
Benutzerbild von dataspider
dataspider

Registriert seit: 9. Nov 2003
Ort: 04539 Groitzsch
1.351 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: MDIChild variabel durch TStringList.Objects erstellen

  Alt 20. Mär 2006, 16:37
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
Frank Reim
  Mit Zitat antworten Zitat
messie

Registriert seit: 2. Mär 2005
Ort: Göttingen
1.592 Beiträge
 
Delphi 2009 Professional
 
#3

Re: MDIChild variabel durch TStringList.Objects erstellen

  Alt 20. Mär 2006, 17:34
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
  Mit Zitat antworten Zitat
robroy85

Registriert seit: 6. Nov 2004
Ort: Norderstedt
42 Beiträge
 
#4

Re: MDIChild variabel durch TStringList.Objects erstellen

  Alt 20. Mär 2006, 17:39
Ja, wunderbar!

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


Gibt es für das Ganze noch eine elegantere Möglichkeit?

Gruss Robert
  Mit Zitat antworten Zitat
robroy85

Registriert seit: 6. Nov 2004
Ort: Norderstedt
42 Beiträge
 
#5

Re: MDIChild variabel durch TStringList.Objects erstellen

  Alt 20. Mär 2006, 17:50
Ich hätte die Meldung vom Board, dass es mittlerweile neue Antworten gibt, nicht ignorieren sollen
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 ( kleiner Scherz am Rande)

Gruss Robert
  Mit Zitat antworten Zitat
robroy85

Registriert seit: 6. Nov 2004
Ort: Norderstedt
42 Beiträge
 
#6

Re: MDIChild variabel durch TStringList.Objects erstellen

  Alt 22. Mär 2006, 10:09
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
  Mit Zitat antworten Zitat
robroy85

Registriert seit: 6. Nov 2004
Ort: Norderstedt
42 Beiträge
 
#7

Re: MDIChild variabel durch TStringList.Objects erstellen

  Alt 30. Mär 2006, 19:55
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
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:38 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