-
Прошу прощения за долгое отсутствие - проблемы с Интернетом (я из глубинки).
Почитал ваши ответы, товарищи, и решил применить вариант с записями (спасибо пользователю han_malign!). Как-то надежнее выглядит. В компоненте сделаю что-то наподобие макросов для ListView: несколько публичных свойств и никаких проблем. А то все равно так и не разобрался с указателями и строками.
Пользователю Sha: ну Вы и написали в [6]! Такое не сразу осознаешь. Это же где такому учат? Или Вы по книгам изучали?
Большое спасибо всем откликнувшимся!
-
оно то работает конечно, но в современном делфи есть все средства, чтобы сделать по феншую, например, через TEncoding.Unicode.GetBytes. по поводу синхронности - не уверен, что WM_COPYDATA вообще заработает через PostMessage, но и пробовать не нужно, отсылайте через SendMessage, как и велит документация - все будет синхронно.
но, в твоем случае, правильно использовать WM_SETTEXT + PChar + SendMessage и не изобретать велосипед.
> А то все равно так и не разобрался с указателями и строками.
без этого про сообщения можно забыть, почти весь Win32 завязан на указателях.
-
> не уверен, что WM_COPYDATA вообще заработает через PostMessage
Меня, видимо, не правильно поняли (или я не толком не описал свой вопрос). Мне нужно иметь возможность установки/получения значения текстового поля (тип String), находящегося "внутри" компонента. Компонент самописный, все работы с ним ведутся в пределах одной формы. Поэтому WM_COPYDATA не подойдет в моем случае.
> но, в твоем случае, правильно использовать WM_SETTEXT + > PChar + SendMessage и не изобретать велосипед. >
Хорошая идея! Я сразу про это сообщение подумал (до того, как задать вопрос), но потом решил, что универсальное название сообщения (WM_SETTEXT) как-то слишком туманно выглядит. И решил реализовать схожий функционал через свое сообщение))
> без этого про сообщения можно забыть, почти весь Win32 завязан > на указателях.
Второй день уже читаю статьи на Королевстве и в блогах разных программистов. Вроде все толком пишут, вроде понятно. Пробую на практике - и не понимаю: что, куда и как. Надо еще времени уделить этой сфере.
-
Простейший пример посылки сообщений из формы cамой себе:
unit PostStringForm;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
const WM_MYDATA= WM_USER+100; MyPostAsInteger = $52983698; MyPostAsString = $23984729;
type TForm1 = class(TForm) Memo1: TMemo; Edit1: TEdit; Button1: TButton; Button2: TButton; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private procedure WMMyData(var M: TMessage); message WM_MYDATA; public { Public declarations } end;
var Form1: TForm1;
implementation
{$R *.dfm}
function PostInteger(handle: HWND; data: integer): boolean; begin; Result:=PostMessage(handle, WM_MYDATA, MyPostAsInteger, LPARAM(data)); end;
function PostString(handle: HWND; const data: string): boolean; var s: string; begin; s:=data; Result:=PostMessage(handle, WM_MYDATA, MyPostAsString, LPARAM(pointer(s))); if Result then pointer(s):=nil; end;
function LParamToString(lp: LPARAM): string; begin; Result:=''; LPARAM(Result):=LP; end;
procedure TForm1.WMMyData(var M: TMessage); var s: string; begin; M.Result:=1; if M.WParam=MyPostAsInteger then s:=IntToStr(M.LParam) else if M.WParam=MyPostAsString then s:=LParamToString(M.LParam) else M.Result:=0;
if M.Result=0 then Memo1.Lines.Add('неизвестный тип: ' + IntToHex(M.WParam, 8)) else Memo1.Lines.Add('принято: ' + s); end;
procedure TForm1.Button1Click(Sender: TObject); var i: integer; begin; i:=Random(100); if PostInteger(Handle, i) then Memo1.Lines.Add('послано: ' + IntToStr(i)); end;
procedure TForm1.Button2Click(Sender: TObject); var s: string; begin; s:=Edit1.Text; if PostString(Handle, s) then Memo1.Lines.Add('послано: ' + s); end;
end.
|