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..10] of Integer;
begin
.... .... AForm:=MdiChildren[i];
FensterName:=AForm.Caption; Le:=AForm.Left; To:=AForm.Top; Eingabe1:=TEdit(AForm.FindComponent('Eingabe1')).Text;
For I:=0 to 10 do Begin MyInteger[I]:=AForm.DasArray[I]; 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
Holg_i hat folgendes geschrieben : |
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..10] of 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
Holg_i hat folgendes geschrieben : |
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
elundril 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
SvenAbeln hat folgendes geschrieben : |
Da der Code von deinem MDI Fenster nicht bekannt war, hatte elundril 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..10] of Integer;
begin
.... .... AForm:=MdiChildren[i];
FensterName:=AForm.Caption; Le:=AForm.Left; To:=AForm.Top; Eingabe1:=TEdit(AForm.FindComponent('Eingabe1')).Text;
For I:=0 to 10 do Begin MyInteger[I]:=AForm.DasArray[I]; 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..10] of Integer;
begin
.... .... AForm:=MdiChildren[i];
AForm.Caption:='Ein gutes Fenster'; AForm.Left:=50; AForm.Top:=100; TEdit(AForm.FindComponent('Eingabe1')).Text:='Ein Text im Eingabefeld des MDI';
For I:=0 to 10 do Begin AForm.DasArray[I]:=random(12); 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..10] of Integer; begin .... .... if MdiChildren[i] is TForm2 then begin AForm:=MdiChildren[i] as TForm2; FensterName:=AForm.Caption; Le:=AForm.Left; To:=AForm.Top; Eingabe1:=AForm.Eingabe2.Text;
For I:=0 to 10 do Begin MyInteger[I]:=AForm.DasArray[I]; 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.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!