Neues Fenster zur Laufzeit erstellen
-
Ok, wie kann ich jetzt jedes neu erzeugte Chat Fenster ansprechen. Gib es dafür eine Art Array ? ChatWindow->Name sieht schon mal gut aus, dort kann ich ja den eindeutigen User Name für die neue Form verwenden. Doch wie klappert man am besten Fenster für Fenster ab damit nicht für User "Karl" ein zweites erzeugt wird.
-
Hallo
am besten mit einer Map
#include <Map> std::map<AnsiString, TFormChat *> FormChatForm;wie die Map benutzt wird, kannst du im Forum und Tutorials finden.
bis bald
akari
-
Vielen Dank Akari

-
Und in der erzeugten Form kann ich doch bedenkenlos this-> verwenden, oder gibts da einen Einwand ?
-
Hallo
ja, kannst du, brauchst du aber nicht.
this->Caption = "Test"; Caption = "Test"; // genau daselbebis bald
akari
-
Danke Akari, hab jetzt mal ein bisschen im Forum gesucht aber leider nichts zu diesem Map template gefunden. Kennst du ein Tutorial wo ich damit ein Array aller erzeugten Fenster Captions anlegen kann ?
-
Könntest Du nicht statt dessen mit Screen->FormCount und Screen->Forms arbeiten?
Gruß,
Alexander
-
Spitze Alex ! Super
for (int i = 0;i < Screen->FormCount;i++) { if (Screen->Forms[i]->Caption == "TestWindow ") ShowMessage(""); }Was muss ich deleten wenn ich ein neu erzeugtes Fenster schliesse da er momentan auch reagiert wenn ich das Fenster geschlossen habe ? Da kann man doch bestimmt was über OnClose biegen
-
Ahhhhhhhhh, habs rausgefunden:
void __fastcall TForm4::FormClose(TObject *Sender, TCloseAction &Action) { delete this; }
-
Wenn ich folgendes mache:
for (int i = 0;i < Screen->FormCount;i++) { if (Screen->Forms[i]->Caption == "Searched_Window ") ... ......Wie kann ich den jetzt in die Memo1 Komponente der gesuchten Form zugreifen um dort einen String ein zu tragen

-
Zero01 schrieb:
Wie kann ich den jetzt in die Memo1 Komponente der gesuchten Form zugreifen um dort einen String ein zu tragen

Es ist klar, dass in Screen::Forms keinerlei Informationen über Deine selbstgebastelten Formulare direkt zugänglich sind.
Um das zu realisieren musst Du halt einen cast machen. Wenn Du mal verrätst, was Du eigentlich erreichen will, könnte
man sich aber mal Gedanken darüber machen, ob es einen anderen Weg gibt.Gruß,
Alexander
-
Ich denke hier wäre dann wohl ein Array dieser Forms besser (dann braucht man keinen cast).
-
Hallo
Wenn Du mal verrätst, was Du eigentlich erreichen will, könnte
man sich aber mal Gedanken darüber machen, ob es einen anderen Weg gibt.Deshalb eigenen Container (std::map), dann wird auch die Suche für dich übernommen.
Für Infos über map siehe z.B.
http://www.cppreference.com/bis bald
akari
-
@akari
Für die std::map sollte man aber #include<map> machen.
Bei deinen Post ist es #include<Map>
-
akari schrieb:
Deshalb eigenen Container (std::map), dann wird auch die Suche für dich übernommen.
Eigentlich dachte ich "eine Ebene höher". Es führen bekanntlich viele Wege zum Ziel und vielleicht gibt
es einen Weg das Speichern von Formularen oder Durchgehen der Formulare, Verwendung von maps o.ä. komplett
zu vermeiden.
Nebenbei, wenn Du Formulare verschiedenen Typs in eine map wirfst, musst Du doch wohl auch casten, oder?Gruß,
Alexander
-
Hallo
Eigentlich dachte ich "eine Ebene höher".
Und an was genau dachtest du da?
Ich selber würde jedem User in ein struct/class aufnehmen, der neben den Namen und Verbindungsdaten u.a. auch einen Pointer auf das eventuell vorhandene Chat-Fenster enthält. Aber auch das würde ich in einen Standard-Container packen.bis bald
akari
-
akari schrieb:
Und an was genau dachtest du da?
Da habe ich mich vielleicht nicht ganz klar ausgedrückt. Ich meinte, dass man vielleicht genauer beschreiben sollte,
was eigentlich das Ziel ist.
Aber die Idee mit einem eigenen Struct geht schon in die Richtung, die ich wahrscheinlich auch einschlagen würde.
So wie ich mich kenne, würde ich vermutlich irgendeinen MVC-ähnlichen Ansatz mit Klassen und Observer-Pattern etc.
wählen. Die Daten in Formularen zu speichern und direkt über Memos, Edits u.ä. zu ändern würde ich wahrscheinlich
vermeiden.Gruß,
Alexander
-
Beispiel:
Im Header der Form1:
TForm4 *ChatWindow;Erzeugt wird dies mit:
void __fastcall TForm1::ChatUDP1DataReceived(TComponent *Sender, int NumberBytes, AnsiString FromIP, int Port) { if (NumberBytes>-1 && NumberBytes<1024) { char Buff[1024]; int j,i,Size,lenght; String received_buff,from_user,message; ChatUDP1->ReadBuffer(Buff, 1024, j); Buff[j]=0; received_buff = String(Buff); bool istrue = false; if(received_buff.SubString(1,2) == "M:") { received_buff = received_buff.SubString(3,received_buff.Length()); //M: ausschneiden int a = received_buff.LastDelimiter(":") + 1; from_user = received_buff.SubString(a,received_buff.Length()); // Von User message = received_buff.SubString(1,a - 2); // Nachricht int screenform; for (int i = 0;i < Screen->FormCount;i++) { if (Screen->Forms[i]->Caption == from_user) { screenform = i; istrue = true; } } if (istrue == false) { ChatWindow = new TForm4(Form1); if(ChatWindow) { ChatWindow->Memo3->Lines->AddStrings(userlist); //unsichtbare Form ChatWindow->Caption = from_user; ChatWindow->Label1->Caption = nickname +" "; ChatWindow->Label2->Caption = from_user; ChatWindow->Memo1->Lines->Add(from_user + ": " + message); ChatWindow->Show(); } } else { } } } }Wie ihr seht ist der else Zweig noch leer. Ich möchte sobald ein Fenster eines Users offen steht, das seine ankommende Nachricht darin (Memo1) Eingetragen wird. Wenn ein Fenster von einem gewissen User nicht offen ist wird es erzeugt wie man oben schön sieht.
Das ganze Problem ist nur das jede ankommende Message in ein eindeutiges User Fenster geschrieben wird und wenn dies nicht existiert wird es erzeugt. Es funzt alles bestens bis auf die Zuweißung in eine spezielles Fenster. Das bestes Beispiel für den Mechanismus ist ICQ, IRC privat chat, Trillian.Wie kann ich das am besten lösen

-
Hallo
das einfachste wäre (was auch schon mal genannt wurde) ein cast
ChatWindow = dynamic_cast<TChatForm *> (Screen->Forms[screenform]); if (ChatForm != NULL) { // Text in ChatForm anzeigen }allerdings ist das nicht sehr sauber und effizient.
Wenn du besser arbeiten willst, must du dich mit den Vorschlägen oben beschäftigen.bis bald
akari
-
Vielen Dank !
Aber was ist an dem Cast so verwerflich ? bei mir funzt es super. Hab mal einige Situationen durchgespielt