Dynamisch erzeugtes formular - Eintrag in der taskbar?
-
Danke Jansen das klappt soweit. Habe im header folgenden code:
virtual void __fastcall CreateParams(TCreateParams &Params) { TForm::CreateParams(Params); Params.ExStyle |= WS_EX_APPWINDOW; }nun habe ich jedoch zwei probleme. und zwar:
1. Wen ich das haupt formular also die anwendung minimiere, dann werden auch alle anderen fenster minimiert. Wie kann ich das verhindern?
2. Die fenster kann man über die taskbar nicht minimieren. Weder mit einem links klick noch mit einem rechts klick da dort kein system menu erscheint. Wie kann man das "korrekt" machen?
-
-
Gar nicht. Du kannst allenfalls das Hauptformular verstecken und eines der Zusatzfenster als Pseudo-Hauptfenster verwenden.
-
Kann ich nicht nachvollziehen, die Zusatzfenster lassen sich hier problemlos über die TaskBar minimieren, maximieren und schliessen.
Eine "korrekte" Lösung gibt es hier sowieso nicht, da du dich nicht an die Standards hältst.
-
-
hello again..
das mit dem punkt eins stimmt. habe bemerkt das eine komponente da probleme macht. wenn ich diese entferne dann klappt es mit dem minimieren etc.
was den punkt zwei betrifft, dies müsste doch irgendwie gehen. der microsoft msn messenger kann dies ja auch irgendwie. oder wie meinst du das genau mit deiner aussage? ich müsste ja ausserdem eine art OMinimize event haben damit ich dieses event behandlen kann oder nicht? wenn ich beim msn messenger das hauptfenster durch klicken auf "_" minimiere, dann geht eben nur dieses hauptfenster minimiert. das selbe auch wenn ich den msn messenger über die taskbar minimiere.
-
oh habe nun die punkte vertauscht

2. geht nun und 1. nicht..
-
Ich habe den MSN Messenger nie beutzt, bezweifle aber, dass er mit dem BCB bzw. der VCL programmiert wurde.
-
das wird wohl so sein

dann müsste dies jedoch mit der winapi irgendwie machbar sein. wäre es möglich und sinnvoll das du den thread ins WinAPI forum verschiebst?
-
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?