Einzelnen Beitrag anzeigen

TStringlist

Registriert seit: 1. Dez 2003
360 Beiträge
 
Turbo Delphi für Win32
 
#10

Re: Daten per Message übertragen (WM_COPYDATA?)

  Alt 6. Jul 2006, 21:13
Zitat von DGL-luke:
SO, eine Frage hätt ich da noch: Bring ich ohne unschöne Trickserei (immerhin gibt es ja CopyDataStruct.cbData ) einen string/PChar/array of char von beliebiger Länge in das Struct?
Die dabei mögliche Länge scheint nicht limitiert zu sein. In einem kleinen WM_CopyData-TestProg jedenfalls konnte ich seinerzeit locker den Inhalt eines TMemoryStreams versenden bzw. empfangen. Im Detail war das dann wieder der Inhalt eines RichEdit-Controls mit eben auch durchaus mehr als 255 (etc.) Characters:


Delphi-Quellcode:
// Sende-Proc in einem "Prog A"
procedure TForm1.SendTextViaWMCopyData(Sender: TObject);
var AStream : TMemoryStream;
    ACopyDataStruct : TCopyDataStruct;
begin
  AStream := TMemoryStream.Create;
  RichEdit1.Lines.SaveToStream(AStream);

  with ACopyDataStruct do begin
    dwData := 0;
    cbData := AStream.Size;
    lpData := AStream.Memory;
  end;

  SendMessage(FindWindow(Nil,'Prog B'), WM_CopyData, Handle, integer(@ACopyDataStruct));
  AStream.Free;
end;


// Empfangs-Proc in einem "Prog B"
procedure TForm1.GetTextViaWMCopyData(var AMsg : TMessage);
type PCopyDataStruct = ^TCopyDataStruct;
var AStream : TMemoryStream;
begin
  AStream := TMemoryStream.Create;
  AStream.Write(PCopyDataStruct(AMsg.LParam).lpData^,PCopyDataStruct(AMsg.LParam).cbData);
  AStream.Position := 0;
  RichEdit2.Lines.LoadFromStream(AStream);
  AStream.Free;
end;
edit: die Empfangs-Proc ist natürlich eine Botschaftsbehandlungsroutine für WM_COPYDATA-Messages (die also auch entsprechend im Deklarationsteil der Form so zu deklarieren ist).
MfG (& Thx ggf.)
  Mit Zitat antworten Zitat