Dynamische Formulare einzeln ansteuern

Alcatraz

Grünschnabel
Hi!

Ich möchte einen Instant Messenger programmieren, und nun habe ich ein Problem um die Chatfenster, die ich mehrmals aufgerufen habe einzeln anzusteuern:

Code:
  frmMsg:=TfrmMsg.Create(frmMsg);
  frmMsg.Caption:=lbuseronline.items[lbuseronline.itemindex];
  frmMsg.show;

Die frmMsg wird von einem frmMain aufgerufen, wo sich die Socket-Komponenten befinden.
Ich möchte einzelne Felder der frmMsg ansteuern (ein redMain -> RichEdit).
Die Felder, die sich bilden heissen "frmMsg_1", "frmMsg_2" und so weiter.

Gibt es eine Möglichkeit diese dynamisch anzusteuern, um z.B. etwas ins RichEdit zu schreiben.

Code:
'frmMsg_'+inttostr(1).redMain.lines.Append('TEST');

Funktionniert nicht :confused:

Danke im Voraus für Hilfe.
Oder hat jemand eine andere Idee, wie man das realisieren könnte

mfG;
~ The Alcatraz ~
 
Hi

Du kannst direkt auf die TComponent's eines Components zugreifen.

Schau mal in der Hilfe unter TComponent.FindComponent
TComponent.Components

Sowie unter TForm.Parent (übergeordnetes Fenster)

TApplication.MainForm (oberstes Fenster)

Damit solltest Du weiter kommen

Gruß vop
 
das funktionniert alles nicht.
ich glaube, du hast meine frage nicht richtig verstanden.
Oder ich deine antwort nicht.

Ich will auf eine Komponente auf einem Formular aufrufen, welches mehrere male kréiert wurde. Und zwar auf EINEM bestimmtenen dieser offenen formulare.

mfG;
~ The Alcatraz ~
 
Hi also ich habe dich so verstanden:

Du hast (z.b.) drei Fenster erzeugt, die alle vom Typ TfrmMsg sind.

Nun möchtest du bspw. vom zweiten Fenster den Wert einer seiner Komponenten ändern.

RedMain.Lines.Append('irgendwas');

Soweit klar.

Was Dir nur noch fehlt ist der Zugriff auf das richtige Fenster. Diese sind allesamt Kindelemente des Hauptfensters Application.MainForm und damit (glaube ich) in der Komponentenliste dieses Fenster zu finden.

Was Du brauchst ist eine Variable vom Typ TFrmMsg, die durch gezielte Auswahl auf das gewünschte Fenster zeigt.

Dann kannst du es einfach ansprechen.

Such doch mal nach dynamischer Fenstererzeugung oder so

vop
 
Ich glaube ich habe da eine gute Idee!

Verwende doch ein Array in deinem Hauptfenster vom Typ TFrmMsg;

MeineFenster : array [0..50] of TFrmMsg;

Später erzeugst Du dynamisch mehrere Forms:

MeineFenster[0]:=TFrmMsg.Create(.....

MeineFenster[27]:=TFrmMsg.Create(.....

anstelle von frmMsg:=....

Dann kannst Du jederzeit auf das Fenster mit
MeineFenster[ Index ].redMain.Lines.Append('blabla');

zugreifen.

Wenn Du dann noch einen Zähler hast, der dir sagt, wievielw Fenster du gerade hast, dann kannst Du prima in einer Schleife alle Fenster durchgehen.

Und das mit den Components vergiß wieder.

vop
 
Hey das klingt super :)

Ich probier das mal.

Vielen Dank erstmal.
Ich halte dich am laufenden.

mfG;
~ The Alcatraz ~
 
Alcatraz hat gesagt.:
Gibt es eine Möglichkeit diese dynamisch anzusteuern, um z.B. etwas ins RichEdit zu schreiben.

Code:
'frmMsg_'+inttostr(1).redMain.lines.Append('TEST');

Ich habs weder ausprobiert noch kann ich sagen, ob es überhaupt funktionieren könnte. Normalerweise kann man aber auf Komponenten über FindComponent zugreifen. Wie das genau geht, steht in der Delphi-Hilfe.
Genrell hätte ich aber auch gedacht, dass das dynamische Erzeugen funktioniert. Welches ist denn der undefinierte Bezeichner?

lg Hellie
 
Zuletzt bearbeitet:
Hey!

Code:
var MessageWindow: array[1..50] of TfrmMsg;
Undefinierter Bezeichner ist angeblich "TfrmMsg".
Wenn ich es LOKAL (in einer Prozedur) deklariere, funktionniert es. (Also: keine Fehlermeldung).

Code:
procedure TfrmMain.Test1Click(Sender: TObject);
  var MessageWindow: array[1..50] of TfrmMsg;
begin
  MessageWindow[1]:=TfrmMsg.Create(frmMsg);
  MessageWindow[1].show;
end;

Jetzt so funktionniert es.

Ich muss das "MessageWindow" aber global dekladieren, sonst funktionniert es nicht :(
Was könnte das sein

mfG;
~ The Alcatraz ~
 
Zuletzt bearbeitet:
Zurück