Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi WM_CopyData mit Boolschen Variablen (https://www.delphipraxis.net/31022-wm_copydata-mit-boolschen-variablen.html)

Helmi 2. Okt 2004 22:48


WM_CopyData mit Boolschen Variablen
 
Hallo,

ich hab mir von unseren Freunden, den Schweizern den Code zum Kommunizieren zwischen zwei Applicationen mit WM_CopyData angeschaut.

http://www.swissdelphicenter.ch/de/showcode.php?id=810

Nur wird in diesem Code (der funktioniert, habs getestet :-)) aber ein String übertragen.

Wie kann ich dort z. B. Boolsche Variablen (es reicht auch eine) übertragen?

Was muss man in dem Code umbiegen, damit das geht?

Vielleicht kann mir jemand helfen.

mfg
Helmi

Luckie 2. Okt 2004 22:51

Re: WM_CopyData mit Boolschen Variablen
 
schreib dir einen Record, dem du lpData der TCopyDataStruct übergibst.

jfheins 2. Okt 2004 22:52

Re: WM_CopyData mit Boolschen Variablen
 
oder übertrage einfach einen string true oder false ...

Helmi 2. Okt 2004 22:56

Re: WM_CopyData mit Boolschen Variablen
 
an das hab ich auch schon gedacht

ist wahrscheinlich die einfachste Lösung.

Vor allem weil ich schon den Quellcode dafür hab :-)

cu
Helmi

Helmi 3. Okt 2004 00:01

Re: WM_CopyData mit Boolschen Variablen
 
jetzt muss ich trotzdem nochmal nachfragen:

wie kann ich denn einen Record übertragen?

Ich hab mal folgendes im Sender gemacht:

Code:
type
  CustomRec = record
    S: String[50];
    B: Boolean;
  end;

procedure TForm1.Button1Click(Sender: TObject);
var
  Rec: CustomRec;

begin
  //
  with Rec do
    begin
      S := Edit1.Text;
      B := CheckBox1.Checked;
    end;

  with aCopyData do
    begin
      dwData := 0;
      cbData := sizeof(Rec) + 1;
      lpData := Pointer(Rec);
    end;


  // Fenster anhand des Titelzeilentext suchen
  hTargetWnd := FindWindowEx(0, 0, nil, PChar('Empfänger'));

  If hTargetWnd <> 0 then
    SendMessage(hTargetWnd, WM_COPYDATA, Longint(Handle), Longint(@aCopyData))
  else
    ShowMessage('Kein Empfänger gefunden!');
Das problem hierbei ist bei "lbData := Pointer(Rec)".
Wie kann ich den Rec dort reinbekommen? (blöde Frage ich weiss :-))

und beim Empfänger:

Code:
type
  CustomRec = record
    S: String[50];
    B: Boolean;
  end;

procedure TForm1.WMCopyData(var Msg: TWMCopyData);
var
  sText: array[0..99] of Char;
  Rec: CustomRec;

begin
  // anzuzeigenden Text aus den Parametern generieren
  StrLCopy(sText, Msg.CopyDataStruct.lpData, Msg.CopyDataStruct.cbData);

  // Empfangenen Text ausgeben
  label1.Caption := sText;


{
  with Rec do
    begin
      Label1.Caption := S;
      ALed1.Checked  := B;
    end;
}
end;
Wie kann ich beim Empfänger anstatt dem String (sText) den Rec auslesen?

mfg
Helmi

Luckie 3. Okt 2004 00:36

Re: WM_CopyData mit Boolschen Variablen
 
Übergib einen Zeiger auf den Record:
Delphi-Quellcode:
type
  TMyRec = record;
    ...: ...;
  end;
  PMyRec = ^TMyRec;

Luckie 3. Okt 2004 00:57

Re: WM_CopyData mit Boolschen Variablen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Und hier noch mal ein komplettes Beispiel. Gesendet wird zwar an das eigene Fenster, aber du kannst ja das Handle des gewünschten Fensters angeben.
Delphi-Quellcode:
type
  TMyRecord = packed record
    b: Boolean;
    s: string[255];
  end;
  PMyRecord = ^TMyRecord;

type
  TForm1 = class(TForm)
    Button1: TButton;
    CheckBox1: TCheckBox;
    Edit1: TEdit;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    procedure WMCOPYDATA(var msg: TWMCOPYDATA); message WM_COPYDATA;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.WMCOPYDATA(var msg: TWMCOPYDATA);
var
  MyRecord: PMyRecord;
begin
  MyRecord := msg.CopyDataStruct.lpData;
  CheckBox1.Checked := MyRecord.b;
  Edit1.Text := MyRecord.s;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  MyRecord: PMyRecord;
  cds: TCopyDataStruct;
begin
  GetMem(MyRecord, sizeof(TMyRecord));
  try
    MyRecord.b := True;
    MyRecord.s := 'Hello world';
    cds.dwData := 0;
    cds.cbData := sizeof(TMyRecord);
    cds.lpData := MyRecord;
    SendMessage(Handle, WM_COPYDATA, Handle, Integer(@cds));
  finally
    FreeMem(MyRecord, sizeof(TMyRecord));
  end;
end;
Im Anhang noch mal komplett mit zwei Fenstern.

Helmi 3. Okt 2004 08:22

Re: WM_CopyData mit Boolschen Variablen
 
Danke Luckie für deine Hilfe :-)
und das noch so spät :hello:

aber eine Frage hätt ich noch:

wieso geht das ned:

Code:
  var
  MyRecord: PMyRecord;
begin
  MyRecord := msg.CopyDataStruct.lpData;
 
  with MyRecord do
    begin
      CheckBox1.Checked := b;
      Edit1.Text := s;
    end;
end;
Ich benutz gerne with xxx do und wollt das dort auch benutzen, geht aber ned.
Kann das mit dem Pointer zusammen hängen?

mfg
Helmi

Luckie 3. Okt 2004 10:02

Re: WM_CopyData mit Boolschen Variablen
 
Ich habe den Empfänger eben noch etwas verbessert:
Delphi-Quellcode:
type
  TMyRecord = packed record
    b: Boolean;
    s: string[255];
  end;
  PMyRecord = ^TMyRecord;

procedure TForm1.WMCOPYDATA(var msg: TWMCopyData);
var
  b: Boolean;
  s: String[255];
begin
  b := PMyRecord(msg.CopyDataStruct.lpData)^.b;
  s := PMyRecord(msg.CopyDataStruct.lpData)^.s;
  CheckBox1.Checked := b;
  Edit1.Text := s;
end;
Und für deine neue Frage, solltest du einen neuen Thread erstellen, das hat nichts mehr mit WM_COPYDATA zu tun.

mirage228 3. Okt 2004 10:25

Re: WM_CopyData mit Boolschen Variablen
 
Zitat:

Zitat von Helmi
Ich benutz gerne with xxx do und wollt das dort auch benutzen, geht aber ned.
Kann das mit dem Pointer zusammen hängen?

mfg
Helmi

Hoi,

das geht, soweit ich weiss, so:

Delphi-Quellcode:
with MyRecord^ do
mfG
mirage228


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:32 Uhr.
Seite 1 von 4  1 23     Letzte »    

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