Delphi-PRAXiS
Seite 1 von 2  1 2      

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 Dynamische Komponenten in MDIChild (https://www.delphipraxis.net/138598-dynamische-komponenten-mdichild.html)

AnyKey 13. Aug 2009 10:15


Dynamische Komponenten in MDIChild
 
Hi,

ich hoffe mal ihr könnt mir bei meinem Problem helfen. Ich will aus der Mainform meiner MDI Anwendung auf einem speziellen MDIChild (dem, welches gerade aktiviert ist) eine Scrollbox und ein StringGrid dynamisch erstellen, da ich es erst zu einem bestimmten Zeitpunkt brauche. Wie kann ich das jetzt machen? Ich habe es folgender maßen versucht:

Delphi-Quellcode:
procedure TfMain.ActLoadKonfigExecute(Sender: TObject);
var Child : TfMDIChild;
begin
  if FileExists(TFileOperations.GetFilePath+'Konfig.xml') then
  begin
    // die GroußBox und somit auch das RichEdit anpassen
    with Child.GroupBox1 do
    begin
      Child.GroupBox1.Align := alNone;
      Child.GroupBox1.Height := 298;
      Child.GroupBox1.Top := 168;
    end;
    // ScrollBox erzeugen
    Child.AScrollBox := TScrollBox.Create(Child);
    with Child.AScrollBox do
    begin
      Name := 'ScrollBox1';
      Parent := Child;
      Left := 0;
      Top := 0;
      Width := 604;
      Height := 153;
      Anchors := [akLeft, akTop, akRight];
      TabOrder := 0;
    end;
    // StringGrid erzeugen
    Child.ASplitGrid := TStringGrid.Create(Child);
    with Child.ASplitGrid do
    begin
      Name := 'StringGrid1';
      Parent := Child.AScrollBox;
      Left := 0;
      Top := 0;
      Width := 0;
      Height := 0;
      Align := alClient;
      FixedCols := 0;
      RowCount := 2;
      Options := [goFixedVertLine, goFixedHorzLine, goVertLine, goHorzLine, goRangeSelect, goColSizing, goEditing];
      TabOrder := 0;
    end;
  end
  else
  begin
    MessageBox(0,'Konfigurationsdatei wurde nicht gefunden!','Datei nicht gefunden',MB_ICONWARNING);
  end;
end;
Das hat nicht funktioniert, also habe ich ganz oben noch dies eingefügt:

Delphi-Quellcode:
Child := TfMDIChild.Create(Child)
jetzt funktioniert zwar das Erzeugen, allerdings macht er dafür ein neues MDIChild auf, er soll die Komponenten aber in dem aktivierten einfügen. Weiß jemand wie ich das machen kann? Wie kann ich herausfinden welches MDIChild gerade aktiviert ist?

Stehe gerade ein wenig auf dem Schlauch....
Danke für eure Hilfe ;)

Gruß
AnyKey

iKilledKenny 13. Aug 2009 11:23

Re: Dynamische Komponenten in MDIChild
 
Über die Property "MdiChildren" kommst du an die ChildForms dran, das aktive Child ist das mit dem Index 0.

AnyKey 14. Aug 2009 07:56

Re: Dynamische Komponenten in MDIChild
 
Hi,

danke für deine Antwort, aber wie genau soll das funktionieren?

anse 14. Aug 2009 09:00

Re: Dynamische Komponenten in MDIChild
 
Delphi-Quellcode:
MainForm.MDIChildren[0]
oder
Delphi-Quellcode:
MainForm.ActiveMDIChild
Aufpassen, beides kann u.U. nil sein! Also vorher testen:
Delphi-Quellcode:
if Assigned(MainForm.ActiveMDIChild) then begin
  Child := MainForm.ActiveMDIChild;
  Child. ...
end;

AnyKey 14. Aug 2009 11:51

Re: Dynamische Komponenten in MDIChild
 
Hi,

ich hab das jetzt so ausprobiert, aber es funktioniert immer noch nicht, ich bekomme den Fehler dass TfMDIChild und TForm zwei inkompatible typen sind... gibt es noch einen anderen weg oder mach ich was falsch??

Gruß
AnyKey

anse 14. Aug 2009 12:08

Re: Dynamische Komponenten in MDIChild
 
Da hier keine Hellseher rumsurfen: Wenn du einen Compiler-Fehler siehst und hier fragst warum das passiert, dann poste bitte auch die betroffene Zeile Quelltext (+ relevantes von drumherum). Ansonsten solltest du das besser im Hellseher-Forum posten :)

AnyKey 14. Aug 2009 12:22

Re: Dynamische Komponenten in MDIChild
 
Haha,

hatte nichts mit hellsehen zu tun.... :gruebel:

ich hab deinen Quelltext genommen und hab als fehler das bekommen was ich geschrieben hab, der rest vom Quelltext steht ja oben.

[Fehler] PrjForm_Main.PAS(217): Inkompatible Typen: 'TfMDIChild' und 'TForm'

das ist der Fehler... glaub nich das dieser satz mehr hilft als der andere von mir.... :P

Child ist vom Typ TfMDIChild, und wenn ich das so mache wie du gesagt hattest (was auch sehr einleuchtend klingt, ich wollte es auch so machen, wusste nur nicht wie... :( ) dann bekomme ich den oben genannten fehler, was auch einleuchtend ist warum er kommt... muss nur wissen wie ich es so machen kann das es funktioniert.

Hoffe mal ihr könnt mir helfen!

Gruß und schon mal ein schönes Wochenende ;)
AnyKey

anse 14. Aug 2009 12:57

Re: Dynamische Komponenten in MDIChild
 
Ich hab einfach keine Lust zum Raten, und irgendwas scheinst du ja offenbar falsch zu machen, deswegen poste bitte den geänderten Quellext und den relevanten Datentyp bzw. die Deklaration von TfMDIChild .

BAMatze 14. Aug 2009 13:14

Re: Dynamische Komponenten in MDIChild
 
Ich glaube das ist ein ziemlich einfacher Fehler, wenn ich das jetzt richtig verstanden habe. Habe auch in meinem Projekt in meiner HauptbedienForm mehrere TForm als MDIChilds. Denke du musst diese auch nur als TForm deklarieren. Hab dir mal meine "Fernsteuer-Procedure" hier angehangen. Die Fehlermeldung sagt ja auch, dass dort irgendwie deine deklaration der Variable nicht stimmen kann. Also musst du ja, um die Fehlermeldung zu beseitigen einfach den Typen ändern.

Delphi-Quellcode:
procedure TBedienForm.Fenstersteuern(Form: TForm);
begin
  if Form = ActiveMDIChild then
    begin
      case Form.WindowState of
        wsNormal: Form.WindowState := wsMinimized;
        wsMinimized: Form.WindowState := wsNormal;
        wsMaximized: Form.WindowState := wsNormal;
      end;
    end
  else
    begin
      Form.BringToFront;
      Form.WindowState := wsNormal;
    end;
end;
[Edit] Ich bin bei der Post davon ausgegangen, dass alles seperate TForm sind mit FormStyle = FSMDIChild. Was für diese Variante spricht, ist die gleiche Ansprache (ActiveMDIChild) in meiner Procedure. Wenn dies nicht hilft, dann könnte eventuell der umgedrehte Fall zutreffen, also einfach in TfMDIChild deklarieren, weiß nur nicht, ob dir dann das ActiveMDIChild hilft, weil das eine Form als Rückgabewert zu haben scheint. [/Edit]

Hoffe das hilft dir etwas
MfG
BAMatze

AnyKey 17. Aug 2009 13:40

Re: Dynamische Komponenten in MDIChild
 
Also, hier noch mal der gesamte Quelltext:

Delphi-Quellcode:
procedure TfMain.ActLoadKonfigExecute(Sender: TObject);
var Child : TfMDIChild;
begin
//  if FileExists(TFileOperations.GetFilePath+'Konfig.xml') then
  begin
    if Assigned(fMain.ActiveMDIChild) then
    begin
      Child := fMain.ActiveMDIChild;
      // die GroußBox und somit auch das RichEdit anpassen
      with Child.GroupBox1 do
      begin
        Child.GroupBox1.Align := alNone;
        Child.GroupBox1.Height := 298;
        Child.GroupBox1.Top := 168;
      end;
      // ScrollBox erzeugen
      Child.AScrollBox := TScrollBox.Create(Child);
      with Child.AScrollBox do
      begin
        Name := 'ScrollBox1';
        Parent := Child;
        Left := 0;
        Top := 0;
        Width := Child.Width - 9;
        Height := 153;
        Anchors := [akLeft, akTop, akRight];
        TabOrder := 0;
      end;
      // StringGrid erzeugen
      Child.ASplitGrid := TStringGrid.Create(Child);
      with Child.ASplitGrid do
      begin
        Name := 'StringGrid1';
        Parent := Child.AScrollBox;
        Left := 0;
        Top := 0;
        Width := 0;
        Height := 0;
        Align := alClient;
        FixedCols := 0;
        RowCount := 2;
        Options := [goFixedVertLine, goFixedHorzLine, goVertLine, goHorzLine, goRangeSelect, goColSizing, goEditing];
        TabOrder := 0;
      end;
    end;
//  end;
//  else
  begin
    MessageBox(0,'Konfigurationsdatei wurde nicht gefunden!','Datei nicht gefunden',MB_ICONWARNING);
  end;
end;
ich habe eine MDI Anwendung als Projekt erstellt, dort gibt es wie gesagt die Klasse TfMDIChild, mit der die Childs erstellt werden. Das Problem ist jetzt, dass wenn ich in nur einem (von vielleicht 4) MDIChild, also dem Aktiven spezielle Komponenten dynamisch erzeugen will, muss ich ja wissen welches Child gerade aktiv ist. Das so zu machen: Child := fMain.ActiveMDIChild; halte ich auch für sinnvoll, soetwas in der art hatte ich mir auch schon überlegt, wusste wie gesagt nur noch nicht wie... Das Problem das jetzt dabei aber entsteht ist, das die Variable Child von eben dem Typ TfMDIChild ist und der Rückgabewert von ActiveMDIChild nunmal TForm als typ hat. Da dies inkompatibel ist kann es ja nicht funktionieren... Also meine frage, wie bekomme ich es doch noch hin das es funktioniert das Aktive Child herauszufinden um meine dynamischen Komponenten auf ihm zu erzeugen?!?!

Gruß und Danke
AnyKey


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:45 Uhr.
Seite 1 von 2  1 2      

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