Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.06.08;
Скачать: CL | DM;

Вниз

как в SendMessage передать строку?   Найти похожие ветки 

 
tytus   (2008-05-15 12:00) [0]

Добрый день всем. Есть такой код:
const  CX_MYMESSAGE  = WM_USER+40;
...
 private
   procedure CXMYMESSAGE(var Message: TMessage);message CX_MYMESSAGE;


...

procedure TMainFm.CXMYMESSAGE(var Message: TMessage);
begin
 Message.WParam:=Integer(PChar(Edit1.Text));
end;


теперь как получить текст из едита используя SendMessage?

SendMessage(MainFm.Handle,CX_MY_MESSAGE,????,0);


 
Игорь Шевченко ©   (2008-05-15 12:18) [1]


> procedure TMainFm.CXMYMESSAGE(var Message: TMessage);
> begin
>  Message.WParam:=Integer(PChar(Edit1.Text));
> end;


Фигня


 
tytus   (2008-05-15 12:29) [2]

>Игорь Шевченко ©   (15.05.08 12:18) [1]
согласен ..
вот такой код работает:

type
 PMyStr = ^TMyStr;
 TMyStr = record
   MyLen:integer;
   MyStr:PAnsiChar;
 end;


...

procedure TMainFm.CXCLIENTIP(var Message: TMessage);
begin
PMyStr(Message.WParam)^.MyLen:=Length(Edit1.Text);
PMyStr(Message.WParam)^.MyStr:=PChar(Edit1.Text);
Message.Result:=1;
end;


procedure TMainFm.Edit1KeyDown(Sender: TObject; var Key: Word;
 Shift: TShiftState);
var
 s:string;
 MyStr:PMyStr;
 len:integer;
begin
if Key=VK_RETURN then
begin
 GetMem(MyStr,SizeOf(TMyStr));
 ZeroMemory(MyStr,SizeOf(TMyStr));
 try
   SendMessage(Handle,CX_CLIENTIP,Integer(MyStr),0);
   len:=MyStr.MyLen;
   s:=StrPas(MyStr.MyStr);
 finally
   FreeMem(MyStr);
 end;
 RE1.Lines.Add(s);
end;
end;


 
Хитрий Лис   (2008-05-15 12:44) [3]

А в чём тайный смысл ? может поделитесь к чему всё это ?


 
tytus   (2008-05-15 12:46) [4]

>Хитрий Лис   (15.05.08 12:44) [3]

смысл тут прост:
 захотелось мне в сообщении передать строку...


 
Игорь Шевченко ©   (2008-05-15 12:56) [5]

tytus   (15.05.08 12:29) [2]

Ты чего вообще хочешь добиться ?
Изменять параметры сообщения в его обработчике - это настолько бессмысленно, что даже не комментируется


 
tytus   (2008-05-15 13:02) [6]

>Игорь Шевченко ©   (15.05.08 12:56) [5]

а ответа так и нет....


 
Reindeer Moss Eater ©   (2008-05-15 13:10) [7]

Привел указатель на строку к интегеру при отправке.
Приведи интегер к указателю на строку при приеме (если сама строка еще жива).
Какие проблемы-то?


 
Игорь Шевченко ©   (2008-05-15 13:24) [8]


> а ответа так и нет....


До тех пор, пока ты не ответишь на вопрос в [5], его и не будет


 
tytus   (2008-05-15 13:30) [9]

>Reindeer Moss Eater ©   (15.05.08 13:10) [7]
Привел указатель на строку к интегеру при отправке.

SendMessage(Handle,CX_CLIENTIP,Integer(PChar(s)),0);
так?

Приведи интегер к указателю на строку при приеме

Message.WParam:=...??? - что-то не "въезжаю"


 
Reindeer Moss Eater ©   (2008-05-15 13:36) [10]

Про присвоение тебе никто ничего не говорил (только спрашивали)
А говорили тебе про приведение.


 
Reindeer Moss Eater ©   (2008-05-15 13:39) [11]

Message.WParam:=...??? - что-то не "въезжаю"

А PChar к интегеру ты наверное так делал?
Pchar(MyString) := Msg.WParam;

Не так?
Тогда зачем вот эта дурь: Message.WParam:=
?


 
Игорь Шевченко ©   (2008-05-15 13:46) [12]


> Тогда зачем вот эта дурь


Коммутативность оператора присваивания


 
Slym ©   (2008-05-15 13:50) [13]

procedure TMainFm.CXMYMESSAGE(var Message: TMessage);
begin
 with Message do
 begin
   Result:=Length(Edit1.Text);
   if LParam<Result then exit;
   Move(PChar(Edit1.Text)^,PChar(WParam)^,Result);
 end;
end;

procedure TMainFm.FormCreate(Sender: TObject);
var S:string;
begin
 SetLength(S,SendMessage(Handle,CX_MY_MESSAGE,0,0));
 SendMessage(Handle,CX_MY_MESSAGE,PChar(S),Length(S));
end;


 
Slym ©   (2008-05-15 13:51) [14]

Slym ©   (15.05.08 13:50) [13]
procedure TMainFm.FormCreate(Sender: TObject);
var S:string;
begin
SetLength(S,SendMessage(Handle,CX_MY_MESSAGE,0,0));
SetLength(S,SendMessage(Handle,CX_MY_MESSAGE,PChar(S),Length(S)));
end;


 
Игорь Шевченко ©   (2008-05-15 13:57) [15]

Slym ©   (15.05.08 13:50) [13]
Slym ©   (15.05.08 13:51) [14]

Чего сказать-то хотел ?


 
tytus   (2008-05-15 14:03) [16]

>Игорь Шевченко ©   (15.05.08 13:57) [15]

человек ответил на мой вопрос.

>Slym ©   (15.05.08 13:50) [13]

так тоже работает.
Move  я делал, только забыл установить размер S перед этим.
Для чнго собственно  и служит if LParam<Result then exit;
для чего и потребовалось два раза SendMessage

по поводу Игорь Шевченко ©   (15.05.08 12:56) [5]
тоже согласен.

Всем спасибо.


 
Slym ©   (2008-05-15 14:04) [17]

Игорь Шевченко ©   (15.05.08 13:57) [15]
это типа ответ :) на сабж... конечно спорно его применение, но ответ :)
можно не городить отсебятины и сделать так:
SetLength(S,1024);
SetLength(S,SendMessage(Edit1.Handle,WM_GETTEXT,Length(S),PChar(S)));

или так
s:=Edit1.Text
почему автору не подходит последний вариант я низнаю :)


 
Игорь Шевченко ©   (2008-05-15 14:06) [18]

tytus   (15.05.08 14:03) [16]

читай http://ln.com.ua/~openxs/articles/smart-questions-ru.html,
учись правильно задавать вопросы


 
Slym ©   (2008-05-15 14:09) [19]

1. tytus   (15.05.08 14:03) [16]
Move  я делал, только забыл установить размер S перед этим

о... это плохо... это очень плохо!
2. tytus   (15.05.08 14:03) [16]
Для чнго собственно  и служит if LParam<Result then exit;

чтоб не сmoveить больше чем под него место выделено и если этого не сделать goto 1;
3. tytus   (15.05.08 14:03) [16]
для чего и потребовалось два раза SendMessage

первый раз узнаем необходимую длинну, и растягиваем S
второй раз чтоб S заполнить


 
Reindeer Moss Eater ©   (2008-05-15 14:17) [20]

первый раз узнаем необходимую длинну
А StrLen зачем придумали?


 
Slym ©   (2008-05-15 14:21) [21]

Reindeer Moss Eater ©   (15.05.08 14:17) [20]
низнаю зачем... но определение длинны строки по поиску #0 мне не нравится: лишние CPU% на поиск и невозможность передать этот самый #0 в сообщении


 
Renegat   (2008-05-15 14:36) [22]

А вот тут как раз ИМХО и ст0ит использовать стандартное системное сообщение WM_COPYDATA. Не стоит изобретать велосипедов, когда один из них уже реализован средствами системы. Читаем МСДН, заполняем правильно структуру, постим сообщение. Вуаля!


 
Игорь Шевченко ©   (2008-05-15 14:43) [23]

Slym ©   (15.05.08 14:21) [21]


> лишние CPU% на поиск


Я конечно все понимаю, а ничего, что два SetLength подряд ?

Renegat   (15.05.08 14:36) [22]


> А вот тут как раз ИМХО


Твое ИМХО неверно, строка передается в одном процессе, изобретать велосипед с WM_COPYDATA вовсе ни к чему.

кстати, из старого проекта:

в датамодуле:
     if Assigned(Application.MainForm) then
       SendMessage (Application.MainForm.Handle, WM_SHOWSTATUS, 0,
                  LPARAM(PChar("Подключение к базе данных ...")));


в форме:
...
   procedure WMShowStatus (var Message : TMessage); message WM_SHOWSTATUS;
...
procedure TfMain.WMShowStatus(var Message: TMessage);
begin
 if Message.LParam = 0 then
   ClearStatus
 else
   SetStatus (PChar(Message.LParam));
end;


И не жужжит


 
Reindeer Moss Eater ©   (2008-05-15 15:12) [24]

Один сендмессадж и один СтрНью (на случай скорой смерти оригинальной стрки)

и все.


 
Игорь Шевченко ©   (2008-05-15 15:16) [25]

Reindeer Moss Eater ©   (15.05.08 15:12) [24]

Прости, но управление не вернется в программу, пока SendMessage не отработает, то есть при его обработке строка гарантировано будет живее всех живых


 
Reindeer Moss Eater ©   (2008-05-15 15:23) [26]

Это так. Но:

procedure test;
var localstring : string;
begin
sendmessage(handle,....
end;

А в целевое окно например не знает, что это была локальная переменная.


 
Сергей М. ©   (2008-05-15 15:33) [27]


> tytus


Ты вообще окну какого процесса намериваешься передавать такого рода сообщение - текущего или другого ?


 
Игорь Шевченко ©   (2008-05-15 15:37) [28]

Reindeer Moss Eater ©   (15.05.08 15:23) [26]


> procedure test;
> var localstring : string;
> begin
> sendmessage(handle,....
> end;



> А в целевое окно например не знает, что это была локальная
> переменная.


И в чем проблема ?
Если ты вместо SendMessage вызовешь какую-нибудь процедуру, куда в качестве параметра будет передана строка, она, процедура, тоже не будет знать о том, что это локальная переменная. Если все передается в рамках одного процесса, то без разницы, локальная она или нет. Разница будет для PostMessage.


 
Renegat   (2008-05-15 15:44) [29]

> [27] Сергей М. ©   (15.05.08 15:33)

Вот и я об этом подумал. Если ничего другого кроме SendMessage не остаётся, то окно явно чужое.
Однако из авторитетных источников ([23]) было получено опровержение...
Но если передаём в пределах своего процесса - то зачем такие навороты?


 
Reindeer Moss Eater ©   (2008-05-15 15:44) [30]

так нам-то нежна не процедура, нам тут сендмессадж понадобилсо.


 
Reindeer Moss Eater ©   (2008-05-15 15:47) [31]

то зачем такие навороты?

Да разные ситуации бывают.
Например иногда хочется абсолютной независимости модулей. Никто ни у кого в юзесах не сидит, а данными модули обмениваются. Посредством сообщений.
Это только один из примеров.


 
Игорь Шевченко ©   (2008-05-15 15:52) [32]

Renegat   (15.05.08 15:44) [29]


> Но если передаём в пределах своего процесса - то зачем такие
> навороты?


А как ? Явно вызывать методы чужого класса ?


 
Renegat   (2008-05-15 15:59) [33]

> А как ? Явно вызывать методы чужого класса ?

Ну а почему бы нет? Или же менять поля класса.
ChuzhoyClass1.BufText:="какой-нибудь там текст";

Не знаю, может быть, это и не комильфо, но почему бы этим не воспользоваться, раз можно?


 
Сергей М. ©   (2008-05-15 16:01) [34]


> если передаём в пределах своего процесса - то зачем такие
> навороты?


Какие ? Ты о чем ?


 
tytus   (2008-05-15 16:19) [35]

>Сергей М. ©   (15.05.08 16:01) [34]
процессы разные.
SendMessage вызываем в RemoteDataModule, а обработка - в потоке основоного приложения.


 
Игорь Шевченко ©   (2008-05-15 16:23) [36]

Renegat   (15.05.08 15:59) [33]


> Ну а почему бы нет? Или же менять поля класса.
> ChuzhoyClass1.BufText:="какой-нибудь там текст";
>
> Не знаю, может быть, это и не комильфо, но почему бы этим
> не воспользоваться, раз можно?


Зачем связывать классы заранее, если их можно не связывать ? Если мне нужно послать сообщение куче окон, я их просто посылаю, не думая о том, как реализована обработка этих сообщений в каждом из окон (а она может быть организована по-разному).

Эт называется полиморфизьм.


 
Сергей М. ©   (2008-05-15 16:26) [37]


> tytus   (15.05.08 16:19) [35]


В огороде бузина, а в Киеве дядька ..

Модули замесил в одну кашу с потоками


 
Игорь Шевченко ©   (2008-05-15 16:31) [38]


> процессы разные.


Тогда WM_COPYDATA

Ты прочитай наконец http://ln.com.ua/~openxs/articles/smart-questions-ru.html
Партизан.


 
Leonid Troyanovsky ©   (2008-05-15 23:20) [39]


> tytus   (15.05.08 12:00)  

> теперь как получить текст из едита используя SendMessage?


function GetWndText(AHwnd: HWND): String;
var
 cb : Longint;
begin
 Result := "";
 cb := SendMessage(AHwnd, WM_GETTEXTLENGTH, 0, 0);
 if cb = 0 then
   Exit;
 SetLength(Result, cb);
 SendMessage(AHwnd, WM_GETTEXT, cb+1, LParam(PChar(Result)));
end;

--
Regards, LVT.



Страницы: 1 вся ветка

Текущий архив: 2008.06.08;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.023 c
2-1210748961
dima
2008-05-14 11:09
2008.06.08
SkinCrafter


2-1211196897
Сергей
2008-05-19 15:34
2008.06.08
Подскажите, как вырезать часть строки до слеша?


15-1208981134
@!!ex_
2008-04-24 00:05
2008.06.08
Кому не лень - помогите.


15-1209188736
Kolan
2008-04-26 09:45
2008.06.08
Как управляться с билдами проектов?


15-1209503846
i
2008-04-30 01:17
2008.06.08
компилятор Delphi2007 быстрее Delphi7 или нет?