AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Rückgabewert von Sendmessage setzen
Thema durchsuchen
Ansicht
Themen-Optionen

Rückgabewert von Sendmessage setzen

Ein Thema von VizeTE · begonnen am 18. Apr 2006 · letzter Beitrag vom 18. Apr 2006
Antwort Antwort
VizeTE

Registriert seit: 31. Dez 2002
178 Beiträge
 
Delphi 5 Enterprise
 
#1

Rückgabewert von Sendmessage setzen

  Alt 18. Apr 2006, 08:51
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;
  Mit Zitat antworten Zitat
xaromz

Registriert seit: 18. Mär 2005
1.682 Beiträge
 
Delphi 2006 Enterprise
 
#2

Re: Rückgabewert von Sendmessage setzen

  Alt 18. Apr 2006, 09:13
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
  Mit Zitat antworten Zitat
VizeTE

Registriert seit: 31. Dez 2002
178 Beiträge
 
Delphi 5 Enterprise
 
#3

Re: Rückgabewert von Sendmessage setzen

  Alt 18. Apr 2006, 09:50
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.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#4

Re: Rückgabewert von Sendmessage setzen

  Alt 18. Apr 2006, 09:52
SendMessage(Application.Handle, MYMESSAGEID, Integer(@MsgRecord), 0)
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#5

Re: Rückgabewert von Sendmessage setzen

  Alt 18. Apr 2006, 09:53
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
  if SendMessage(Application.Handle, MYMESSAGEID, 0, 0) <> 0 then Sollte das nicht funktionieren dann Application.MainForm.Handle benutzen.
  Mit Zitat antworten Zitat
VizeTE

Registriert seit: 31. Dez 2002
178 Beiträge
 
Delphi 5 Enterprise
 
#6

Re: Rückgabewert von Sendmessage setzen

  Alt 18. Apr 2006, 11:16
Zitat von Luckie:
SendMessage(Application.Handle, MYMESSAGEID, Integer(@MsgRecord), 0)
So einfach - darauf hätte ich auch selber kommen können!

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!
  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 12:34 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