Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Auf Variable in einem MDI-Fenster zugreifen?


Holg_i - Do 29.04.10 10:54
Titel: Auf Variable in einem MDI-Fenster zugreifen?
Nun ich mal wieder mit einer Frage.


Wie ich auf ein MDI-Form zugreife beziehungsweise auf dessen Objekte ist mir nun klar.


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:
procedure TForm1.Auslesen(Sender: TObject);

var Le, To,I: Integer;
    AForm: TForm;
    Eingabe1, FensterName: ShortString;
    MyInteger: Array[0..10of Integer;

begin

     ....
     ....
 
     AForm:=MdiChildren[i];

     // Zugriff auf MDI direkt
     FensterName:=AForm.Caption; 
     Le:=AForm.Left;
     To:=AForm.Top;
  
     // Zugriff auf Objekte im MDI
     Eingabe1:=TEdit(AForm.FindComponent('Eingabe1')).Text;


    // Zugriff auf Array im MDI 
    For I:=0 to 10 do
    Begin
         MyInteger[I]:=AForm.DasArray[I]; // das geht ja nicht *grrrr*
    end;
end;


Und da stellt sich meine Frage. Wo deklariere ich DasArray im MDI so das es nur das MDI und das übergeordnete MDI-Fenster kennt. Und wie greife ich vom übergeordneten MDI-Fenster darauf zu.


Jemand eine Idee????


elundril - Do 29.04.10 11:47

Ich nehm an das du das Array als private-Variable definiert hast. bzw hoff ich es das es so ist. dementsprechend kannst du dir ne Function definieren die einfach das Array als Rückgabewert hat. also


Delphi-Quelltext
1:
2:
3:
4:
function TfrmChild.getArray(): Array of integer;
begin
  result := DasArray;
end;


und im anderen Formular dann:


Delphi-Quelltext
1:
MyInteger := AForm.getArray();                    


sollte eigentlich so funktionieren.

lg elundril


Tryer - Do 29.04.10 11:52

1.:

Delphi-Quelltext
1:
2:
var
  aForm: TMyMDIForm;

2.: Auszulesende Eigenschaften als (ReadOnly)Property zu Verfügung stellen

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
type
  TMyMDIForm = class(TForm)
  ..
  private
    FMyArray: array of Integer;
  protected
    function GetEingabe1: string;
    function GetMyArrayItem(Index: Integer): Integer;
  public
    property Eingabe1: string read GetEingabe1;
    property MyArrayItems[Index: Integer]: Integer read GetMyArrayItem;
  end;


SvenAbeln - Do 29.04.10 11:53

Ausserdem musst du noch auf die richtige Klasse casten, denn TForm kennt das Array natürlich nicht.

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
procedure TForm1.Auslesen(Sender: TObject);
var Le, To,I: Integer;
    AForm: TfrmChild;
begin
[..]
  if MdiChildren[i] is TfrmChild then
  begin
    AForm:=MdiChildren[i] as TfrmChild;
[..]


Holg_i - Do 29.04.10 12:19

Ich hätte eventuell noch aufzeigen sollen das ich Delphi4 besitze... also nix mit TfrmChild


Tryer - Do 29.04.10 12:25

Für Copy&Paste-Lösungen hast Du halt zu wenige Informationeen geliefert :D
Überleg mal von welchem Typ dein MDI-Child ist, und ob es nicht Sinn macht diesen Typ dann auch da einzusetzen.


Holg_i - Do 29.04.10 12:32

Neee ich suche keine Copy&Past-Lösung halt ansätze wie ich ran gehen könnte.
Ich könnte mir ein TString basteln.. der ist dan ein Objekt und auf diesen könnte ich zugreifen.
Ist aber nicht die feine Englische-Art.

Also überlege ich mal.

Mein MDI ist vom Type TForm

TForm kennt natürlich nur die Typen die in Im deklariert sind und sich selber schon klar. Und weil ich mit diesen überlegungen nicht weiter komme.. befragte ich das Forum.


Tryer - Do 29.04.10 12:39

user profile iconHolg_i hat folgendes geschrieben Zum zitierten Posting springen:
Mein MDI ist vom Type TForm

Dann gibt es da auch kein TEdit oder sonstwas. TForm ist einfach nur ein "leeres Fenster". Deswegen hast Du bestimmt auch eine Klasse type <HierNameEinsetzen> = class(TForm) erstellt. Hergeleitet von TForm, aber mit weiteren Eigenschaften ergänzt.

PS: Dir fehlen die Grundlagen, Du solltest Dich mal nach einigen Tutorials umsehen.


Holg_i - Do 29.04.10 12:51

Das hilft nun ernorm weiter......

Welche Tutorials die mir in meinem Problem weiter helfen könnten hättest du als vorschlag?

Tedit kennt es da wie ich Tippte:

Zitat:
TForm kennt natürlich nur die Typen die in im deklariert sind




Delphi-Quelltext
1:
2:
3:
4:
5:
6:
type
  TForm2 = class(TForm)
    Eingabe1: TEdit;
    ...
    ...
    ...


Wie getippt kann ich ja auf Eingabe1 klasse zugreifen


Delphi-Quelltext
1:
        Eingabe1:=TEdit(AForm.FindComponent('Eingabe1')).Text;                    



Mir geht es nun um ein Array welches ich auch benutze


Delphi-Quelltext
1:
        DasArray: Arry[0..10of Integer;                    


Wie auch getippt könnte ich mir nun eine Memo erstellen dieses unsichtbar machen und darin die 10 Integer verwalten und darauf zugreifen. Aber das ist doch keine Art :lol:

So versuche ich mit hilfe des Forums für mich und anderen die hier mal lesen eine Lösung zu finden.

Dein Lösung= Lest mehr


Tryer - Do 29.04.10 13:05

user profile iconHolg_i hat folgendes geschrieben Zum zitierten Posting springen:

Delphi-Quelltext
1:
2:
type
  TForm2 = class(TForm)


<HierNameEinsetzen> ?

TEdit "kennt" nicht das Formular sondern die Unit, da unter "uses" eine Unit eingebunden ist in der die Klasse(der Typ) TEdit deklariert ist. Das Formular kennt die Instanz "Eingabe1" vom Typ "TEdit".
Was ist eine Klasse, was ist eine Instanz.. die Grundlagen der objektorientierten Programmierung fehlen noch. Du klickst auf "Datei - Neu - Formular", aber Du hast noch nicht verstanden was Du da tust (Erstellen einer neuen Klasse, abgeleitet von TForm). Das ganze "FindComponent" brauchst Du nicht wenn Du einfach mit Deinem selbsterstellten(!) Formulartyp arbeitest.


SvenAbeln - Do 29.04.10 13:06

Da der Code von deinem MDI Fenster nicht bekannt war, hatte user profile iconelundril einfach TfrmChild genommen.
Wenn du nun in TForm1.Auslesen dein MDIChild auf TForm2 castest, kannst du auf alle Eigenschaften zugreifen und brauchst auch dein Edit nicht mit FindComponent suchen.


Holg_i - Do 29.04.10 13:11

user profile iconSvenAbeln hat folgendes geschrieben Zum zitierten Posting springen:
Da der Code von deinem MDI Fenster nicht bekannt war, hatte user profile iconelundril einfach TfrmChild genommen.
Wenn du nun in TForm1.Auslesen dein MDIChild auf TForm2 castest, kannst du auf alle Eigenschaften zugreifen und brauchst auch dein Edit nicht mit FindComponent suchen.


Stehe ich heute auf dem Schlauch???


Also:


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:
procedure TForm1.Auslesen(Sender: TObject);

var Le, To,I: Integer;
    AForm: TForm;
    Eingabe1, FensterName: ShortString;
    MyInteger: Array[0..10of Integer;

begin

     ....
     ....
 
     AForm:=MdiChildren[i];

     // Zugriff auf MDI direkt
     FensterName:=AForm.Caption; 
     Le:=AForm.Left;
     To:=AForm.Top;
  
     // Zugriff auf Objekte im MDI
     Eingabe1:=TEdit(AForm.FindComponent('Eingabe1')).Text;


    // Zugriff auf Array im MDI 
    For I:=0 to 10 do
    Begin
         MyInteger[I]:=AForm.DasArray[I]; // das geht ja nicht *grrrr*
    end;
end;


Der oben getippte Quelltext ist aus dem fsMDIForm also dem Hauptfenster. Er liest in diesem Beispiel aus dem MDI die Überschrift, linke und obere Ecke aus, sowie den Text der im MDI unter dem TEdit mit Namen Eingabe1 steht. Nun möchte ich auch noch das Array welches im MDI deklariert ist auslesen. ( Später auch beschreiben was mit dem TEdit ja auch gut geht )



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:
procedure TForm1.Einlesen(Sender: TObject);

var I: Integer;
    AForm: TForm;
    MyInteger: Array[0..10of Integer;

begin

     ....
     ....
 
     AForm:=MdiChildren[i];

     // Zugriff auf MDI direkt
     AForm.Caption:='Ein gutes Fenster'
     AForm.Left:=50;
     AForm.Top:=100;
  
     // Zugriff auf Objekte im MDI
     TEdit(AForm.FindComponent('Eingabe1')).Text:='Ein Text im Eingabefeld des MDI';


    // Zugriff auf Array im MDI 
    For I:=0 to 10 do
    Begin
         AForm.DasArray[I]:=random(12); // das geht ja nicht *grrrr*
    end;
end;


SvenAbeln - Do 29.04.10 13:45

Hier dann mal die nötigen Änderungen:

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:
32:
33:
Implementation
  uses .... , Unit2;

[..]

procedure TForm1.Auslesen(Sender: TObject);
var Le, To,I: Integer;
    AForm: TForm2;
    Eingabe1, FensterName: ShortString;
    MyInteger: Array[0..10of Integer;
begin
     ....
     ....   
   if MdiChildren[i] is TForm2 then        // prüfen ob MDIChild[i] wirklich ein TForm2 ist
   begin
     AForm:=MdiChildren[i] as TForm2;      // auf TForm2 casten

     // Zugriff auf MDI direkt
     FensterName:=AForm.Caption; 
     Le:=AForm.Left;
     To:=AForm.Top;
  
     // Zugriff auf Objekte im MDI
     Eingabe1:=AForm.Eingabe2.Text;


     // Zugriff auf Array im MDI 
     For I:=0 to 10 do
     Begin
       MyInteger[I]:=AForm.DasArray[I]; // das geht ja nicht *grrrr*
     end;
   end;
end;


Holg_i - Do 29.04.10 14:18

@SvenAbeln & @Tryer

Danke euch für die Hilfe... Habe echt auf dem Schlauch gestanden und bin schon lange am umsetzen.

Klar ist mir nun da ich von TForm abgleitet habe und nicht von TForm2 das ich nix von TForm2 kennen konnte und daher auch mit FindComponent suchen musste.

Die Antwort ist also ganz kurz nicht von TForm ableiten sondern von dem jeweiligen MDI in diesem Fall TForm2.....

Ja so ist es und ich habe mich durch TfrmChild verwirren lassen und dachte da total falsch... Sorry.