Конференция "Начинающим" » Послать строку в сообщении [D2005, XP]
 
  • Илья_666 (12.11.18 17:52) [20]
    Прошу прощения за долгое отсутствие - проблемы с Интернетом (я из глубинки).

    Почитал ваши ответы, товарищи, и решил применить вариант с записями (спасибо пользователю han_malign!). Как-то надежнее выглядит. В компоненте сделаю что-то наподобие макросов для ListView: несколько публичных свойств и никаких проблем. А то все равно так и не разобрался с указателями и строками.

    Пользователю Sha: ну Вы и написали в [6]! Такое не сразу осознаешь. Это же где такому учат? Или Вы по книгам изучали?

    Большое спасибо всем откликнувшимся!
  • Eraser © (13.11.18 19:05) [21]
    оно то работает конечно, но в современном делфи есть все средства, чтобы сделать по феншую, например, через TEncoding.Unicode.GetBytes.
    по поводу синхронности - не уверен, что WM_COPYDATA вообще заработает через PostMessage, но и пробовать не нужно, отсылайте через SendMessage, как и велит документация - все будет синхронно.

    но, в твоем случае, правильно использовать WM_SETTEXT + PChar + SendMessage и не изобретать велосипед.


    >  А то все равно так и не разобрался с указателями и строками.

    без этого про сообщения можно забыть, почти весь Win32 завязан на указателях.
  • Илья_666 (14.11.18 16:37) [22]

    > не уверен, что WM_COPYDATA вообще заработает через PostMessage

    Меня, видимо, не правильно поняли (или я не толком не описал свой вопрос). Мне нужно иметь возможность установки/получения значения текстового поля (тип String), находящегося "внутри" компонента. Компонент самописный, все работы с ним ведутся в пределах одной формы. Поэтому WM_COPYDATA не подойдет в моем случае.


    > но, в твоем случае, правильно использовать WM_SETTEXT +
    > PChar + SendMessage и не изобретать велосипед.
    >

    Хорошая идея! Я сразу про это сообщение подумал (до того, как задать вопрос), но потом решил, что универсальное название сообщения (WM_SETTEXT) как-то слишком туманно выглядит. И решил реализовать схожий функционал через свое сообщение))


    > без этого про сообщения можно забыть, почти весь Win32 завязан
    > на указателях.

    Второй день уже читаю статьи на Королевстве и в блогах разных программистов. Вроде все толком пишут, вроде понятно. Пробую на практике - и не понимаю: что, куда и как. Надо еще времени уделить этой сфере.
  • Sha © (14.11.18 21:03) [23]
    Простейший пример посылки сообщений из формы 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.
 
Конференция "Начинающим" » Послать строку в сообщении [D2005, XP]
Есть новые Нет новых   [118230   +21][b:0][p:0]