AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein senden eines Strings per SendMessage
Thema durchsuchen
Ansicht
Themen-Optionen

senden eines Strings per SendMessage

Ein Thema von BAMatze · begonnen am 9. Mär 2009 · letzter Beitrag vom 9. Mär 2009
Antwort Antwort
BAMatze

Registriert seit: 18. Aug 2008
Ort: Berlin
759 Beiträge
 
Turbo Delphi für Win32
 
#1

senden eines Strings per SendMessage

  Alt 9. Mär 2009, 14:14
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;
...
  Mit Zitat antworten Zitat
BAMatze

Registriert seit: 18. Aug 2008
Ort: Berlin
759 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: senden eines Strings per SendMessage

  Alt 9. Mär 2009, 14:30
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?
  Mit Zitat antworten Zitat
Benutzerbild von ChrisE
ChrisE

Registriert seit: 15. Feb 2006
Ort: Hechingen
504 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#3

Re: senden eines Strings per SendMessage

  Alt 9. Mär 2009, 15:02
Hallo BAMatze,

also ich muss zwar ein bisschen die Kristalkugel bemühen 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
Christian E.
Es gibt 10 Arten von Menschen, die die Binär lesen können und die die es nicht können

Delphi programming rules
  Mit Zitat antworten Zitat
BAMatze

Registriert seit: 18. Aug 2008
Ort: Berlin
759 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: senden eines Strings per SendMessage

  Alt 9. Mär 2009, 15:13
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
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:02 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