Dynamisch erzeugtes formular - Eintrag in der taskbar?
-
In diesem Fall würde ich vorschlagen, dass du dort einen neuen Thread beginnst. Zum einen dürften die Bezüge auf Forms, Komponenten etc. im WinAPI-Forum eher für Verwirrung sorgen, zum anderen hat das ja nicht mehr viel mit dem ursprünglichen Thema des Threads zu tun.
-
hmm nu habe ich ein anderes problem. ich möchte das pro benutzer die in einer listbox stehen jeweils ein fenster erzeugt wird und nur dann wenn es noch nicht besteht. wenn es bereits erzeugt wurde dann soll es in den vordergrund kommen. soweit habe ich das glaub lösen können. jedoch ist das problem das ich irgendwie pro benutzer ein eigenes objekt brauche....
void __fastcall TMain::UserListDblClick(TObject *Sender) { //EINE NEUE CHAT SESSION STARTEN...... String windowName = "Chat mit: " + UserList->Items->Strings[UserList->ItemIndex]; if(FindWindow(NULL, windowName.c_str())) { Chat->WindowState = wsNormal; } else { Chat = new TChatWnd(this); Chat->Caption = "Chat mit: " + UserList->Items->Strings[UserList->ItemIndex]; Chat->Show(); } }weil so wird sonst immer das objekt Chat erzeugt. da aber für jeden user ein eigenes nötig wäre gibt es so probleme da es sich ja stehts um das gleiche objekt handelt...
das zweite problem was ich nicht lösen kann ist, wie ich text in ein memo kriege. das fenster wird eben dynamisch erzeugt und dann weis ich nach dem ich mit FindWindow das fenster gefunden habe, nicht, wie ich dort ins memo text übergeben kann.
-
Hallo
weil so wird sonst immer das objekt Chat erzeugt. da aber für jeden user ein eigenes nötig wäre gibt es so probleme da es sich ja stehts um das gleiche objekt handelt...
Du darfst ja auch nicht die einzelnen Fenster in einem einzigen Pointer speichern.
Am einfachsten nimmst du DynamicArray, um jedes einzelne Fenster in einer List zu haben.
Am cleversten ist es aber, sowieso alle Userdaten in einen Struct/Class zu speichern, aus dem dann eine Dynamische Liste mit allen aktiven Usern erstellt wird. Und dann hat auch jeder einzelne Usereintrag ein Pointer auf ein Chatfenster, der entweder gültig oder NULL ist.
Ich glaub da war vor einiger Zeit bereits ein Thread zu genau den selben Thema, must mal suchen.das zweite problem was ich nicht lösen kann ist, wie ich text in ein memo kriege. das fenster wird eben dynamisch erzeugt und dann weis ich nach dem ich mit FindWindow das fenster gefunden habe, nicht, wie ich dort ins memo text übergeben kann.
Diese Frage erübrigt sich, wenn du die Fenster nicht suchen läßt, sondern mit ordentlichen Pointern merkst. Dann kannst du auch direkt auf die Controls zugreifen.
bis bald
akari
-
das klingt einfacher als es ist

leider sind pointer noch eine thematik für mich. könntest du nicht ein mini beispiel machen an dem ich mich orientieren kann?
-
Hallo
jawohl, hier ist der Thread den ich meine (2min Suchzeit mit Suchwort "chat"
)/Edit : Dann ließ dir ein Tut (siehe diese Seite im Menü oben rechts) über C++ Grundlagen durch, zum Thema Pointer und Instanzen. Ohne diese Wissen wirst du hier nicht weiterkommen.
bis bald
akari
-
hm das mit dem DynamicArray versteh ich nicht.
das müsste dann i der artDynamicArray<TChatWindow> Window;sein oder? Und wie dann? Wie weise ich dem array nun immer eine neue (sofern nötig) instanz von TChatWindow (also das chat fenster) zu?
- wenn schon erzeugt dann nur im array suchen
- wenn noch keine instanz erzeugt wurde (wenn eine nachricht kommt oder der benutzer einem schreiben will) wie dann?
- etc.?

eine neue klasse brauche ich nicht wirklich oder? ich kann ja alles in die TChatWindow klasse packen da ja dann jede instanz alle daten für sich selbst nutzen kann sowie das fenster eben...

-
Hallo
Window.Length++; Window[Windowm.Length -1] = new TChatWindow(NULL);analog kannst du das letzte Fenster löschen (!) und die Stelle im Array löschen
ansosnten verhält sich DynamicArray wie ein normales Array.
bis bald
akari
-
habe das versucht aber kriege da fehler.
[C++ Fehler] Unit1.cpp(70): E2285 Keine Übereinstimmung für 'TChatWnd::TChatWnd()' gefunden
[C++ Fehler] sysdyn.h(285): E2328 Operatoren dürfen keine Argumente mit voreingestellten Werten haben
[C++ Fehler] sysdyn.h(347): E2285 Keine Übereinstimmung für 'TChatWnd::TChatWnd()' gefundenausserdem wäre dies dann für das erstellen einer neuen instanz oder? woher weis ich aber ob für den benutzer bereits eine instanz erstellt wurde und im array ist?
und wie greife ich auf die elemente zu? ich kann ja über das DynamicArray (hier Window) nicht wie auf eine TForm zugreifen. sprich Caption, Show() etc..

-
Hallo
habe das versucht aber kriege da fehler.
schau dir mein Beispiel noch mal genau an. da ist noch was in dem TChatWindow()-Aufruf
ausserdem wäre dies dann für das erstellen einer neuen instanz oder?
Es ist genau das.
woher weis ich aber ob für den benutzer bereits eine instanz erstellt wurde und im array ist?
Vorher durchiterieren und überprüfen. Oder du schaust dir nochmal den anderen Thread an und nimmst std::map. Aber ich glaub damit hast du noch mehr Probleme.
und wie greife ich auf die elemente zu? ich kann ja über das DynamicArray (hier Window) nicht wie auf eine TForm zugreifen. sprich Caption, Show()
Wie gesagt, ist eben ein Array
Window[0]->Show();// Show() des ersten Fensters im Array wird ausgeführtbis bald
akari
-
akari danke mal...

aber: ich habe dich schon verstanden, das es wie ein array läuft etc. ich war auch so schlau und habe bereits versucht Window[0]->Show(); etc. auszuführen. Der witz ist aber das keine elemente oder methoden wie Show() etc. existieren. jedenfalls nicht in dem DynamicArray Window. das ganze was du mir hier erklährst macht für mich totalen sinn. Jedoch nicht weil ich über Window auf nichts zugreifen kann...

habe nun hier mal eine lösung wo ich denke das du das inetwa so gedacht hast..:
void __fastcall TMain::OnlineUserDblClick(TObject *Sender) { bool isCreated = false; for(int i = 0; i < Window.Length; i++) { if(Window[i]->Caption == "Chat mit: benutzername_aus_der_listbox") { isCreated = true; Window[i]->FormState = wsNormal; //<< -- setze die instanz bzw. das Fester in den vordergrund.... break; } } if(!isCreated) { Window[Window.Length] = new TChatWnd(NULL); Window.Length++; } }
-
schau dir mein Beispiel noch mal genau an. da ist noch was in dem TChatWindow()-Aufruf
das NULL habe ich schon drin. sieht nur im fehler leer aus

-
ach moment... es liegt daran das ich hier ja garkein verweisoperator (->) nutzen kann da ja Window nicht dynamisch erzeugt wird. sehe ich das richtig? jedenfalls klappt es so:
void __fastcall TMain::OnlineUserDblClick(TObject *Sender) { bool isCreated = false; for(int i = 0; i < Window.Length; i++) { if(Window[i].Caption == "Chat mit: benutzername_aus_der_listbox") { isCreated = true; Window[i].WindowState = wsNormal; //<< -- setze die instanz bzw. das Fester in den vordergrund.... break; } } if(!isCreated) { Window[Window.Length] = new TChatWnd(NULL); Window.Length++; } }einen fehler habe ich jedoch immer noch.
[C++ Fehler] Unit1.cpp(56): E2285 Keine Übereinstimmung für 'TChatWnd::operator =(TChatWnd *)' gefunden

-
Hallo
DynamicArray<TChatWindow *> Window;bis bald
akari
-
cool danke nun klappt glaub alles. eine frage noch:
um das DynamicArray bzw. auch alle instanzen in diesem array zu zerstören muss ich lediglich bei OnClose oder so Length auf 0 setzen, richtig?
-
Hallo
nein. Du must alle Einträge durchlaufen und manuell die Instanzen mit delete löschen. Aßerdem ist der Destruktor des Hauptforms besser als OnClose
bis bald akari
-
so?
for(int i = 0; i < ChatWindow.Length; i++) { delete ChatWindow[i]; } ChatWindow.Length = 0;
-
Hallo
ja.
bis bald
akari
-
hallo akari leider muss ich nochmals stören

kann es sein das für weitere komponenten die nicht BCB standard sind (z.B. die indy oder so) die auch auf der form sitzen von der eine instanz erzeugt wird, eine eigene aufräumarbeit vorgenommen werden muss? mir ist eben aufgefallen das sobald ich eine indy komponente auf der form habe, vonder eine instanz ins dynamische array geklatscht wird und am ende beim beenden der anwendung, in der schleife versucht wird alle instanzen zu zerstören, das ich dann eine zugriffsverletzung an der addresse FFFFFFA kriege.
ich erzeuge normal die instanz und weise dann gleich der indy komponente werte zu. ist die indy komponente zwar auf der form, jedoch weise ich ihr keine werte zu, dann geht das zerstören fehlerfrei...

-
Hallo
dann liegt es eher daran, das die Indy-Komponente noch etwas ausführen will.
Um welche handelt es sich denn? Vielleicht must diese Komponente im Destruktor des Forms erstmal ausschalten?bis bald
akari
-
um die TIdPOP3 jedoch ist diese nicht verbunden oder jegliches. nur werte wurden übergeben (userid, password etc.). any idea?