Autor Beitrag
Holg_i
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 79



BeitragVerfasst: Do 29.04.10 10:54 
Nun ich mal wieder mit einer Frage.


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

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3747
Erhaltene Danke: 123

Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
BeitragVerfasst: 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

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


und im anderen Formular dann:

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


sollte eigentlich so funktionieren.

lg elundril

_________________
This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
Tryer
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 226
Erhaltene Danke: 7



BeitragVerfasst: Do 29.04.10 11:52 
1.:
ausblenden Delphi-Quelltext
1:
2:
var
  aForm: TMyMDIForm;

2.: Auszulesende Eigenschaften als (ReadOnly)Property zu Verfügung stellen
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 334
Erhaltene Danke: 3



BeitragVerfasst: Do 29.04.10 11:53 
Ausserdem musst du noch auf die richtige Klasse casten, denn TForm kennt das Array natürlich nicht.
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 79



BeitragVerfasst: Do 29.04.10 12:19 
Ich hätte eventuell noch aufzeigen sollen das ich Delphi4 besitze... also nix mit TfrmChild
Tryer
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 226
Erhaltene Danke: 7



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 79



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 226
Erhaltene Danke: 7



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 79



BeitragVerfasst: 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



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


Wie getippt kann ich ja auf Eingabe1 klasse zugreifen

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



Mir geht es nun um ein Array welches ich auch benutze

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 226
Erhaltene Danke: 7



BeitragVerfasst: Do 29.04.10 13:05 
user profile iconHolg_i hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 334
Erhaltene Danke: 3



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 79



BeitragVerfasst: 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:

ausblenden 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 )


ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 334
Erhaltene Danke: 3



BeitragVerfasst: Do 29.04.10 13:45 
Hier dann mal die nötigen Änderungen:
ausblenden volle Höhe 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 79



BeitragVerfasst: 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.