ProgFehler beim Schliessen
-
...glaube, das die Telnetkomponente einen eigenen Thread erzeugt, kann mich aber irren.
Ja, da gibts ne Eigenschaft ThreadedEvent, die hab ich aber auf "false".
Dann debugge auch mal das Hauptprogramm (Projekt->Quelltext anzeigen)...
Ich habe leider keine Ahnung, was ich da debuggen soll...
//--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop //--------------------------------------------------------------------------- USEFORM("Unit1_UNIGATEClient.cpp", IndyTelnetClient); //--------------------------------------------------------------------------- WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) { try { Application->Initialize(); Application->CreateForm(__classid(TIndyTelnetClient), &IndyTelnetClient); Application->Run(); } catch (Exception &exception) { Application->ShowException(&exception); } catch (...) { try { throw Exception(""); } catch (Exception &exception) { Application->ShowException(&exception); } } return 0; } //---------------------------------------------------------------------------... was meinst Du da mit debuggen? *UnWissendDreinSchau*
Du kannst dir auch mal den Callstack ansehen...
Wo, wie und worauf muss ich achten?
Danke, dass Du dich um Unwissende kümmerst!

-
Starte dein Programm einfach mal mit F10, dann landest du automatisch im Hauptprogramm. Dort steppst du mit F10 weiter, bis dein Programm dann läuft. Wenn du es dann schließt, landest du wieder im Hauptprogramm.
Beim weiteren Debuggen mit F10 wird nun irgendwann die Exception auftreten. Da kannst du mal nachsehen, wo die aufgetreten ist, mit hilfe des Aufrufstacks (Ansicht->Debug-Fenster->Aufruf-Stack).
-
Guten Morgen,
nun bin ich doch Dank Deiner Vorschläge wieder ein kleines Stück weiter gekommen; mühsam 'nährt sich das Eichhörnchen...
Für's durchsteppen sind das bei mir die Tasten F7 (einzeln) und F8 (Routine).Nach Beenden des Hauptprogramms gehts bei mir in der Unit1 weiter, wo eine Disconnect-Methode aufgerufen wird.
Diese gehört zur Telnet-Komponente... Also wird nach Form1-Destroy wohl sicherheitshalber automatisch die Verbindung getrennt.Dafür habe ich jedoch eine Abfrage in FormCloseQuery die, bei bestehender Verbindung eine WarnMeldung zeigt und CanClose auf false setzt:
if (ConStat == true) { MessageBox (void(), "Bitte trennen Sie zuerst die Verbindung!", "Beenden des Client", MB_ICONWARNING | MB_OK | MB_DEFBUTTON1); CanClose = false; }Es ist also gewährleistet, das die Verbindung getrennt wird...
(1) Ist es möglich zu verhindern, dass automatisch ein Disconnect beim Programmende stattfindet? In meiner Disconnect-Behandlungsroutine verändere ich nämlich Eigenschaften von Buttons und Labels.
(2) Auf die kann doch nach dem Form1-Destroy garnicht mehr zugegriffen werden, Richtig?Hier mal die Stelle der Exception (Ausführung von Zeile 4):
void __fastcall TIndyTelnetClient::IdTelnet1Disconnect(TObject *Sender) { Label1->Caption= " nicht verbunden"; Label2->Color= clRed; ... }Nach meiner aufgestellten Theorie frage ich mich (und Euch) allerdings: (3) Warum löst nicht schon Zeile 3 eine exception aus?

Irgendwie ist das mit dem Programmieren als ob man gegen eine Mauer rennt, die dann einstürzt. Natürlich sehr schmerzhaft... Danach kommt man dann 3 Schritte weiter (nicht 1 oder 2), nur um mit Vollgas und unter Schmerzen auf die nächste Mauer zu treffen...

MfG
-
Ich werde das Gefühl nicht los, dass ich mich thematisch dicht an Rob's "Ablauf beim Beenden einer App" bewege... das werde ich mal zusätzlich verfolgen!
-
Hallo,
Ist IdTelnet1Disconnect die Funktion für den Event OnDisconnect?
Wenn das so ist kannst du ja den Event im Destruktor von Form1 aushängen.IdTelnet1->OnDisconnect = 0;Dann wird zwar ein Disconnect ausgeführt, deine Funktion aber nicht mehr aufgerufen.
-
Kolumbus schrieb:
(1) Ist es möglich zu verhindern, dass automatisch ein Disconnect beim Programmende stattfindet? In meiner Disconnect-Behandlungsroutine verändere ich nämlich Eigenschaften von Buttons und Labels.
Da Du die Indy-Komponente offenbar auf dem Formular abgelegt hast, kümmert
sich das Formular um das Freigeben. Beim Zerstören der Komponente wird dann
wahrscheinlich automatisch ein Disconnect() ausgeführt. Wenn Du Dich selbst
ums Zerstören der Indy-Komponente kümmern willst, solltest Du die Komponente
auch selbst im Code erstellen.Kolumbus schrieb:
(2) Auf die kann doch nach dem Form1-Destroy garnicht mehr zugegriffen werden, Richtig?
Davon gehe ich auch mal aus. Wahrscheinlich greift er dann auf irgendwelchen
Datenschrott zu. Das kann in manchen Fällen noch "gut gehen" - insofern, als
das Programm nicht sauber abschmiert. Das kannst Du mal mit CodeGuard überprüfen.Zur Not kannst Du ja auch irgendein Flag verwenden, um zu überprüfen, ob die
Anwendung gerade geschlossen wird. Oder aber den Vorschlag von Braunstein
beherzigen.Gruß
Alexander
-
Ich bin ganz hin und weg.

@Braunstein: Super Sache, das funzt! Ich überblicke wohl noch nicht wie "einfach" manche Probleme zu lösen sind; bin halt Anfänger. Dankeschön!
@A. Kempf:
Wenn Du Dich selbst ums Zerstören der Indy-Komponente kümmern willst, solltest Du die Komponente auch selbst im Code erstellen.
Ich glaub' das ist zuviel Schreibaufwand, dafür das es die Komponente fertig gibt und angesichts der Lsg von Braunstein!?! Trotzdem Danke!
@Burkhi: Vielen Dank auch für Deine guten Tips!
Abschlussfrage: Wie hätte ich diese Lsg auch selbstständig finden können???
MfG
-
Kolumbus schrieb:
Wie hätte ich diese Lsg auch selbstständig finden können???
Du mußt einfach versuchen zu verstehen, wie die Komponenten aufgebaut sind und wie das mit den Events funktioniert. Am Besten wäre es, wenn du mal eine einfache Komponente selber schreibst. Da gibt es auch einen Link im hiesigen Tutorial.
http://bcb-tutorial.c-plusplus.net/komponentenentwicklung/index.htmlSchönen Tag noch

-
THX

MfG
-
Kolumbus schrieb:
Ich glaub' das ist zuviel Schreibaufwand, dafür das es die Komponente fertig gibt
Da hast Du mich gründlich missverstanden. Ich wollte Dir nicht nahelegen,
die Komponente neu zu schreiben. Lediglich die Instanz könntest Du im
Code erstellen (mit new). Dann kannst Du selbst bestimmen, wann das
Objekt zerstört wird - allerdings kannst Du das dann auch leicht vergessen.Gruß
Alexander
-
Alexander Kempf schrieb:
... Lediglich die Instanz könntest Du im Code erstellen ....
Okay, das ist natürlich was Anderes. Auch eine Idee! Danke.
Obwohl es natürlich zu Übungszwecken perfekt wäre die Komponente selbst zu erstellen (auch in Bezug auf Braunsteins letzten Hinweis), soviel Zeit muss man allerdings erstmal haben.
MfG
-
Solche Sachen, wie das ein Disconnect beim Programmende aufgerufen wird, hatte ich schon öfters bei "Fremdkomponenten". Ich finde auch, das das ziemlich fiese Fehler sein können, über die ein Anfänger da stolpern kann. Das heisst aber auch für dich, das nix, was du fertig verwendest, perfekt sein muss.
Ich habe mir angewöhnt, wenn ich Komponenten entwickle, im Destruktor SOFORT alle Zeiger auf die Event-Routinen, die ich ev. durch die Komponente aufrufen könnte, auf 0 zu setzen.Übrigens: F10 ist die Einzelsteptaste beim Visual Studio, hatte ich total verwechselt
