![]() |
senden eines Strings per SendMessage
Hallo wiedermal,
Also ich möchte aus einer Unit, welche meine Fehlerbehandlung beinhaltet einen String an meine LoaderUnit senden. Hab auch eine eigentlich sehr schöne Variante von Luckie gefunden ![]() die FehlerUnit
Delphi-Quellcode:
hier die wichtigen Teile der LoaderUnit
type TDatenaustausch = record
dwData, cdData: integer; lpData: string; end; ... function TFehler.AusFehlercode_Fehlermeldung_auslesen: string; var Datenaustausch: TDatenaustausch; Handle: THandle; begin try case iFehlercode of ///////////////////////////////////////////////////////////////////////////////////// // Systemnachrichten // ///////////////////////////////////////////////////////////////////////////////////// 0 : result := 'Initialisierung abgeschlossen.'; ///////////////////////////////////////////////////////////////////////////////////// // Verschiebetisch-Fehler // ///////////////////////////////////////////////////////////////////////////////////// 100 : result := 'Kommunikation mit Verschiebetisch wird aufgebaut'; 101 : result := 'Die DLL der Verschiebetische ("MMC.DLL") konnte nicht gefunden werden.'; 102 : result := 'Es ist ein Fehler beim Zugriff auf die Verschiebetisch-DLL aufgetreten.'; 103 : result := 'Es konnte kein DLL-Handle für die Verschiebetisch-DLL gefunden werden.'; 104 : result := 'Es ist ein Fehler beim Laden der Funktionen aus der Verschiebetisch-DLL aufgetreten.'; 105 : result := 'Es konnte keine Kommunikationschnittstelle für die Verschiebetische gefunden werden.'; 106 : result := 'Es ist ein Fehler beim Verbindungsaufbau mit den Verschiebetischen aufgetreten.'; 107 : result := 'Verschiebetische sind nicht Verfügbar.'; 108 : result := 'Bei der Verfügbarkeitsprüfung für die Verschiebetische sind Fehler gefunden worden.'; 109 : result := 'Verschiebetische konnten nicht intialisiert werden.'; 110 : result := 'Bei der Initialisierung der Verschiebetische ist ein Fehler aufgetaucht.'; // Die weiteren Fehlermeldungen werden eingeführt, wenn alle Geräte initialisiert sind // und auch die Protokollierung erfolgt. ///////////////////////////////////////////////////////////////////////////////////// // Piezo-Verschiebetisch-Fehler // ///////////////////////////////////////////////////////////////////////////////////// 200 : result := 'Kommunikation mit Piezoverschiebetisch wird aufgebaut'; 201 : result := 'Die DLL des Piezotisch ("E816_DLL.dll") konnte nicht gefunden werden.'; 202 : result := 'Es ist ein Fehler beim Zugriff auf die Piezotisch-DLL aufgetreten.'; 203 : result := 'Es konnte kein DLL-Handle für die Piezotisch-DLL gefunden werden.'; 204 : result := 'Es ist ein Fehler beim Laden der Funktionen aus der Piezotisch-DLL aufgetreten.'; 205 : result := 'Es konnte keine Kommunikationschnittstelle für den Piezotisch gefunden werden.'; 206 : result := 'Es ist ein Fehler beim Verbindungsaufbau mit dem Piezotisch aufgetreten.'; 207 : result := 'Piezotisch ist nicht Verfügbar.'; 208 : result := 'Bei der Verfügbarkeitsprüfung für den Piezotisch sind Fehler gefunden worden.'; 209 : result := 'Piezotisch konnte nicht intialisiert werden.'; 210 : result := 'Bei der Initialisierung des Piezotisch ist ein Fehler aufgetaucht.'; // Die weiteren Fehlermeldungen werden eingeführt, wenn alle Geräte initialisiert sind // und auch die Protokollierung erfolgt. ///////////////////////////////////////////////////////////////////////////////////// // ControlerBoard-Fehler // ///////////////////////////////////////////////////////////////////////////////////// 300 : result := 'Kommunikation mit ControlerBoard wird aufgebaut'; 301 : result := 'Die DLL des ControlerBoards ("K8055D.DLL") konnte nicht gefunden werden.'; 302 : result := 'Es ist ein Fehler beim Zugriff auf die ControlerBoard-DLL aufgetreten.'; 303 : result := 'Es konnte kein DLL-Handle für die ControlerBoard-DLL gefunden werden.'; 304 : result := 'Es ist ein Fehler beim Laden der Funktionen aus der ControlerBoard-DLL aufgetreten.'; 305 : result := 'ControlerBoard konnte nicht intialisiert werden.'; 306 : result := 'Bei der Initialisierung des ControlerBoard ist ein Fehler aufgetaucht.'; // Die weiteren Fehlermeldungen werden eingeführt, wenn alle Geräte initialisiert sind // und auch die Protokollierung erfolgt. end; except result := 'Es ist ein unbekannter Fehler aufgetreten!'; end; with Datenaustausch do begin dwData := 0; cdData := Length(result) + 1; lpData := result; end; SendMessage(LoaderForm.Handle, WM_COPYDATA, Longint(Handle), Longint(@Datenaustausch)); // <-- hier sollte der Datenaustausch stattfinden, dies funzt auch end; ...
Delphi-Quellcode:
const Nachricht_erhalten = WM_COPYDATA;
type TLoaderForm = class(TForm) ... private { Private-Deklarationen } procedure Nachricht_anzeigen(var MSG: TWMCopyData);message Nachricht_erhalten; public { Public-Deklarationen } end; ... procedure TLoaderForm.Nachricht_anzeigen(var MSG: TWMCopyData); var Datenaustausch: TDatenaustausch; begin HilfsLabel.Caption := String(PChar(Msg.CopyDataStruct.lpData)); // <--- hier sollte der Datenaustausch ankommen AnzeigeLabel.Left := round((LoaderForm.Width-HilfsLabel.Width)/2); AnzeigeLabel.Caption := HilfsLabel.Caption; end; ... |
Re: senden eines Strings per SendMessage
Also erstmal die gute Nachricht, der Datenaustausch findetstatt. Habe durch eine einfache Änderung jetzt das gewünschte Ergebnis, kann mir aber selber nicht erklären, woran dies liegt. Habe meine LoaderUnit wie folgt abgeändert:
Delphi-Quellcode:
Kann vieleicht jemand dazu etwas sagen, warum dies so sein muss?
procedure TLoaderForm.Nachricht_anzeigen(var MSG: TWMCopyData);
var Datenaustausch: TDatenaustausch; begin HilfsLabel.Caption := String(PChar(Msg.CopyDataStruct.lpData)); // <--- hier sollte der Datenaustausch ankommen, funkt auch AnzeigeLabel.Left := round((LoaderForm.Width-HilfsLabel.Width)/2); AnzeigeLabel.Caption := HilfsLabel.Caption; Self.Refresh; // <--- hier die Neuerung, gefunden mehr intuitiv aus Threats, die die Splashs behandeln. end; |
Re: senden eines Strings per SendMessage
Hallo BAMatze,
also ich muss zwar ein bisschen die Kristalkugel bemühen :glaskugel: aber ich denke, dass geht i. O. da ich Deine Probleme hier ja über die letzten Tage mit verfolgt habe. Ich gehe mal davon aus, das Dein Splash wie in den anderen Threads beschrieben alles abarbeitet. Dies geschieht quasi mit Vollauslastung. Eine Änderung eines Captions sorgt nur dafür, dass eine Botschaft in die Warteschlange kommt mit dem Auftrag das Label neu zu zeichnen. Diese Message wird ggf. nicht abgearbeitet. Dein Refresh sorgt jetzt quasi manuell für das Neuzeichnen. Ich hoffe, dass bringt dich etwas weiter :-) Gruß, Chris |
Re: senden eines Strings per SendMessage
Jupp hat mich schon ziemlich weit gebracht, zumindest verstehe ich den Zusammenhang in Verbindung mit den Threats für Splashs. Hab jetzt auch die Umgestaltung des Programmes abgeschlossen, was nach deinem (@Chris) und dem Beitrag von jaenicke in diesem Beitrag
![]() Dank euch nochmal, mache Schluss für heute. Arbeitstag wieder geschafft :hello: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:02 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz