Dynamisch erzeugtes formular - Eintrag in der taskbar?
-
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?
-
das DynamicArray habe ich in der haupt form (Main) klasse unter public deklariert da ich noch aus anderen formularen drauf zugreifen muss. liegt das irgendwie daran? wo sollte ich das dynamische array am besten deklarieren?
-
anscheinend liegt es tatsächlich dran da vorher die deklaration des dynamischen array ja in der haupt klasse vo TMain war und bei zerstörung dies konflikte gibt? jedenfalls habe ich das array nun in einem header global (ausserhalb der klasse jedoch)) deklariert. also genau im header von unit4 unten vor extern PACKAGE....
ist das richtig so? jetzt muss ich aber schauen welchen header ich dann wo nicht mehr inkludieren muss weil beim linken sagt der compiler mir nun das dass array mehrfach definiert ist. dies liegt wohl eben daran das nun irgendwie mit der header einbindung konflikte entstehen...

-
hm so klappt das auch nicht.
es müsste doch möglich sein das ganze richtig zu deklarieren ohne das ich zugriffsverletzungen bekomme?
-
ich verzweifle gleich. habe glaube ich den fehler bezüglich der verletzung wenn der indy komponente etwas zugewiesen wurde, jedoch keine lösung.
ich kann UserId, Password und Host zuweisen ohne das nach dem zerstören der instanzen etwas verletzt wird. Wenn ich aber noch Port von TIdPOP3 etwas zuweise, dann kommt diese schutzverletzung. Ist diese zeile auskommentiert und die anderen drei (user, pass, host) nicht, klappt es. die grosse frage ist nun WARUM?

das kanns doch echt nicht sein. ur weil Port ein typ int verlangt oder wie? hmmm.
-
hello
hab leider wieder ein problem. diesmal mit dem löschen einer position im DynamicArray. Das hinzufügen und somit auch das inkrementieren des array ist keine sache. Jedoch ist das löschen und somit ein dekrementieren ein problem da ich nebenbei von einer TListBox Count arbeite und das dann synchron stimmen muss. ich dachte eigentlich das dies so gehen müsste:ListBox1->Items->Delete(i); delete Window[i]; Window.Length--; //dekrementieren damit die grösse wieder mit Count von TListBox stimmtnach ein-zweimal hinzufügen und löschen in/aus der listbox, krieg ich jedoch eine zugriffsverletzung. ich denke mal das liegt daran das ich nicht ohne weiteres das array dekrementieren und inkremetieren kann da es nicht wie TListBox Add() und Delete() funktioniert. Denke TListBox passt die Items (position) sowie Count von alleine dann an, was beim array mit inkrementieren und dekrementieren wohl nicht der fall ist. wie löse ich das korrekt?