Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi 1400 Ungültiges Fensterhandle u. Leinwand/Bild erlaubt kein (https://www.delphipraxis.net/5592-1400-ungueltiges-fensterhandle-u-leinwand-bild-erlaubt-kein.html)

DataCool 12. Jun 2003 12:37


1400 Ungültiges Fensterhandle u. Leinwand/Bild erlaubt kein
 
Hi Leute,

ich bin gerade dabei eine Anwendung zu Schreiben, bei der einige Threads im Hintergund ablaufen. Die Threads scheinen aber nicht das Problem zu sein, weil die Anwendung die oben genannten Fehler früher nicht gebracht hat, obwohl die Threads auch da schon verwendet wurden.

Das einzige was ich geändert habe, ist das wenn ich auf einem IdTcpServer eine Nachricht empfange dann in meiner GUI-Oberfläche einen MessageDlg anzeige, um dem User frage wie er auf diese Nachricht reagieren soll.

Bei ersten Durchlauf klappt auch alles wunderbar, aber zum zweiten aufruf kommen die oben genannten Fehlermeldungen ?!

Einen Auszug des Sourcecodes kann ich nicht posten, weil ich nicht weiß an welcher Stelle der Fehler genau auftritt !

Kann mir jemand weiterhelfen bzw. sagen in welcher Richtung ich den Fehler zu muss ?

Gruß Data

Motzi 12. Jun 2003 12:40

Probiers mal mit der API-Funktion MessageBox anstatt der VCL-Funktion MessageDlg...

DataCool 12. Jun 2003 15:54

Ich habe jetzt mal was anderes ausprobiert !
Ich habe in der Anwendung eine weitere Form erzeugt, wenn ich jetzt meine Anfrage über Indy bekomme zeige ich diese Form an.

Fast das gleiche Verhalten wie bei der MessageBox.
Beim ersten mal funktioniert als wunderbar.
Beim zweiten Mal wird im Gegensatz zum MessageDlg die Form angezeigt, nur die Buttons auf der Form sind nicht sichtbar und diese modale Form läßt sich nicht über das "X" schliessen. dito shortcuts oder Hotkeys.

Ich hab langsam keine Ahnung woran das liegt;

Beim Suchen hier im Forum habe ich zu "Leinwand/Bild kein nicht zeichnen" zwar was gefunden, aber auch dort wurde keine Lösung gefunden bzw. nur über die Ursache spekuliert.

Gruß Data

Luckie 12. Jun 2003 16:03

Re: 1400 Ungültiges Fensterhandle u. Leinwand/Bild erlaubt k
 
Zitat:

Zitat von DataCool
dann in meiner GUI-Oberfläche einen MessageDlg anzeige, um dem User frage wie er auf diese Nachricht reagieren soll.

Ich hoffe, das machst du in der Synchronize-methode von TThread. "Canvas erlaubt kein zeichen" deutet für mich darauf hin, dass die Ressourcen von einem anderen Thread gerade "gelockt" werden und dann kannst du nicht darauf zugreifen.

DataCool 12. Jun 2003 16:19

Hi Luckie,

ich habe meinen IdTCPServer innerhalb einer Komponente eigenen Komponente diese hat verschiedene Notify-Events, wenn ich jetzt meine Nachricht im OnExecute des IdTCPServer erhalte, rufe ich innerhalb des OnExecute Ereignis der in notifyxz zugewiesene Procedure auf.
Es geht bei der ganzen Geschichte um einen Anruf(VoiceOverIP), wenn jetzt eine Anrufanfrage kommt, möchte ich dem Benutzer die Möglichkeit geben den Anruf anzunehmen bzw. abzulehnen. Deshalb brauche ich einen modalen Dialog, wo der User "La" oder "Nein" drücken kann.

Lange rede kurzer Sinn, der MessageDlg wird aus dem OnExecute-EReignis des IdTcpServer aufgerufen und meines Wissens wird die OnExecute-Methode vom TBaseThread(Indy) mit syncronize aufgerufen.

Data

DataCool 12. Jun 2003 17:18

Wer lesen kann ist klar im Vorteil :wall:

Mein Problem lag darin, das ich im OnExecute-Ereignis des IdTcpServer meine Procedure in der Main-Form aufgerufen habe, wo der MessageDlg bzw. die Form angezeigt wird.

Ich habe mir schon gedacht das das syncronisiert aufgerufen werden muss, aber ich dachte das das automatisch geschiet da die OnExecute-Methode ja selber mit syncronize aufgrufen wird.

Jetzt habe ich aber im AThread: TIdPeerThread den ich als Parameter im OnExecute Ereignis bekomme die Methode AThread.syncronize(...) gefunden :hello:

Und siehe da es geht :mrgreen:

Danke für eure Hilfe/Geduld,

Data

jbg 12. Jun 2003 18:12

Zitat:

Zitat von DataCool
aber ich dachte das das automatisch geschiet da die OnExecute-Methode ja selber mit syncronize aufgrufen wird.

Wo wird OnExecute mit Synchonize aufgerufen? Das wäre ja fatal für einen Server. Wenn der eine Client ihm eine riesige Datei schickt, müssen alle anderen Clients eine Ruhepause einlegen. Aus diesem Grund wird OnExecute nicht mit dem Hauptthread synchronisiert.

Sanchez 12. Jun 2003 19:55

Hallo erstmal,

Ich hatte heute mit den selben Fehlermeldungen zu kämpfen. Die Ursachen sind mir auch klar. Allerdings brauche ich statt dem Dialog ein Formular, das ich im Thread Modal aufrufe.
Rufe ich es mit Synchronize auf werden mir offensichtlich Programmteile blockiert die ich zu der Zeit dringend brauche.

Gibt es eine alternative, Threadsichere Methode Formulare modal zu zeigen?

Ich habe versucht das Fenster mit

Delphi-Quellcode:
ShowWindow(form.handle,SW_SHOW);
Ich weiss ist nicht modal, allerdings gab es dabei den gleichen Effekt den DataCool schon beschrieben hat:

Zitat:

Beim zweiten Mal wird im Gegensatz zum MessageDlg die Form angezeigt, nur die Buttons auf der Form sind nicht sichtbar und diese modale Form läßt sich nicht über das "X" schliessen. dito shortcuts oder Hotkeys
mfg Daniel

DataCool 12. Jun 2003 20:20

Hi,

wozu benutzt Du den Dein Formular ?
Was macht Deon Proggi ?

Welche Prog-Teile die Du unbedingt brauchst werden blockiert ?

Gruß Data

Sanchez 12. Jun 2003 20:36

Mein Prog übernimmt Messwerte von diversen Geräten (u.a. auch Benutzereingabe) und steuert irgendwelche Geräte an.

Geräte, Messwertübernahmen ... sind einstellbar und auf einem Schaubild "designbar". Diese Ansteuerung erfolgt auch automatisch per Script.

Es können mehrere Scripts gleichzeitig ablaufen (dazu der Thread). Ein Script kann auch eine Meldung (in einem modalen Form) ausgeben, das während dem Ablauf erst weggeklickt werden muss. -- hier brauch ich zum ersten mal ein Formular im Thread.
Das Script hat auch einen Befehl zum Messwerte einsammeln um sie an ein Protokoll weiterzugeben. Jetzt kann der Messwert z.B. von einer Benutzereingabe kommen. Also muss der Thread wieder ein Form "aufreissen".

Das ist zwar nicht die ganze Funktion des Progs aber ich hoffe es zeigt das Problem.

Blockiert wird das Form, dass im Hintergrund mit den angeschlossenen Geräten kommuniziert. D.h. es gehen keine Daten raus und auch keine rein. Blöd, wenn ich gerade Messwerte übernehmen will.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:32 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz