Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Rückgabewert von Sendmessage setzen (https://www.delphipraxis.net/67647-rueckgabewert-von-sendmessage-setzen.html)

VizeTE 18. Apr 2006 07:51


Rückgabewert von Sendmessage setzen
 
Hallo,

ich möchte ein Message aus einem Dialog meines Programms an meine Hauptform senden und dann auf dessen Abarbeitung warten damit ich je nach Erfolg oder Mißerfolg entsprechend reagieren kann.

Ich hatte vor einiger Zeit bereits schon mal ein ähnliches Problem das ich jedoch nicht lösen konnte:(der alte Thread)

Damals hatte ich mich so beholfen, daß ich auf diese Message wiederrum mit einer Message geantwortet habe und dann einen Result-Code in den wParam schrieb. Jetzt stehe ich wieder vor dem gleichen Problem und würde dies gern ohne eine Antwort-Message lösen. Vielleicht hat ja jetzt jemand einen Tipp für mich.

In dem alten Thread wurde mir gesagt, daß ich beim abarbeiten der Message eine Record gibt, der ein Feld "Result" beinhaltet. Diesen sollte ich entsprechend setzen. Ein solches Feld habe ich nicht gefunden.
Hier mein Code:

Die Message an das Haupt-Formular sollte etwa so aussehen:

Delphi-Quellcode:
if not SendMessage(Application.Handle, MYMESSAGEID, Id, Mode) then
begin
  //Fehlerbehandlung
end;
Auf dem Haupt-Formular habe ich Application-Events-Komponente hinzugefügt und werte dort die entsprechende Message aus:

Delphi-Quellcode:
procedure TMainForm.ApplicationEventsMessage(var Msg: tagMSG; var Handled: Boolean);
begin
  case Msg.Message of
    MYMESSAGEID: begin
                   ...
                   Msg.Result := true; //Msg hat jedoch kein Feld "Result"
                   Handled   := true;
                 end;
  end;
end;

xaromz 18. Apr 2006 08:13

Re: Rückgabewert von Sendmessage setzen
 
Hallo,

mit Records funktioniert das so:
Delphi-Quellcode:
type // Record definieren
  TMsgRecord = record
    Daten: Integer;
    NochMehrDaten: Integer;
    Ergebnis: Integer;
  end;
  PMsgRecord = ^TMessageRecord // Einen Pointer definieren
Delphi-Quellcode:
procedure Send;
var
  MsgRecord: TMsgRecord;
begin
  MsgRecord.Daten := 12345;
  MsgRecord.NochMehrDaten := 98765;
  MsgRecord.Ergebnis := 0;

  // Message senden, wParam = Pointer auf Record
  if not SendMessage(Application.Handle, MYMESSAGEID, @MsgRecord, 0) then
  begin
    //Fehlerbehandlung
  end else
  begin
    // Erfolg, Ergebnis steht in MsgRecord.Ergebnis
  end;
end;
Delphi-Quellcode:
procedure TMainForm.ApplicationEventsMessage(var Msg: tagMSG; var Handled: Boolean);
var
  MsgRecord: PMsgRecord;
begin
  case Msg.Message of
    MYMESSAGEID:
    begin
      MsgRecord := PMsgRecord(Msg.wParam); // Record holen
      ...
      MsgRecord.Ergebnis := 1; // Erfolg
      Handled   := true;
    end;
  end;
end;
Gruß
xaromz

VizeTE 18. Apr 2006 08:50

Re: Rückgabewert von Sendmessage setzen
 
Leider bekomme ich das noch nicht so hin.

Bei folgender Methode bekomme ich den Fehler:
Inkompatible Typen: 'Integer' und 'Pointer'

Delphi-Quellcode:
procedure Send;
var
  MsgRecord: TMsgRecord;
begin
  ...
  // Message senden, wParam = Pointer auf Record
  if not SendMessage(Application.Handle, MYMESSAGEID, @MsgRecord, 0) then
  begin
  ...
end;
Ich merke da sind bei mir wohl noch beträchtlich Lücken, was Pointer angeht. :roll:

Luckie 18. Apr 2006 08:52

Re: Rückgabewert von Sendmessage setzen
 
Delphi-Quellcode:
SendMessage(Application.Handle, MYMESSAGEID, Integer(@MsgRecord), 0)

Robert Marquardt 18. Apr 2006 08:53

Re: Rückgabewert von Sendmessage setzen
 
Das macht man mit einer message-Methode.
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TForm1 = class(TForm)
  private
    procedure MyMessage(var Message: TMessage); message MYMESSAGEID;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.MyMessage(var Message: TMessage);
begin
  Message.Result := 0;
end;

end.
Auf Sendeseite ist es
Delphi-Quellcode:
  if SendMessage(Application.Handle, MYMESSAGEID, 0, 0) <> 0 then
Sollte das nicht funktionieren dann Application.MainForm.Handle benutzen.

VizeTE 18. Apr 2006 10:16

Re: Rückgabewert von Sendmessage setzen
 
Zitat:

Zitat von Luckie
Delphi-Quellcode:
SendMessage(Application.Handle, MYMESSAGEID, Integer(@MsgRecord), 0)

So einfach - darauf hätte ich auch selber kommen können! :wall:

Zitat:

Zitat von Robert Marquardt
Das macht man mit einer message-Methode.

Super, das ist genau die Lösung, die ich ursprünglich angedacht hatte. Mit der Application-Events-Komponente funktioniert das auch nicht da sie keine SendMessage-Nachrichten verarbeiten kann. Nur Postmessage wird von ihr behandelt.

Die Lösung von xaromz ist aber auch sehr interessant falls mal die Parameter von Post/Sendmessage nicht ausreichen.

Vielen Dank für eure schnelle Hilfe!


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