Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   senden eines Strings per SendMessage (https://www.delphipraxis.net/130494-senden-eines-strings-per-sendmessage.html)

BAMatze 9. Mär 2009 14:14


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 hier, die ich auch so einbinden konnte, dass das Programm ohne Probleme funktioniert. Leider kommt der String aber anscheinend nicht wirklich an. Wo der Fehler liegt, kann ich derzeit noch nicht sagen, weil, wie gesagt, das Programm funktionstüchtig ist. hier mal die wichtigen Stellen in den beiden Units:


die FehlerUnit
Delphi-Quellcode:
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;
...
hier die wichtigen Teile der LoaderUnit
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;
...

BAMatze 9. Mär 2009 14:30

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:
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;
Kann vieleicht jemand dazu etwas sagen, warum dies so sein muss?

ChrisE 9. Mär 2009 15:02

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

BAMatze 9. Mär 2009 15:13

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 hier nötig war. Die Benutzeroberfläche (Form2) ist jetzt Mainform. Hat zwar einiges an Arbeit gekostet aber hat sich denke ich gelohnt, vorallem weil ich dadurch auch nochmal auf die Threats für Splashs gestoßen bin.

Dank euch nochmal, mache Schluss für heute. Arbeitstag wieder geschafft :hello:


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:23 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