![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
как в SendMessage передать строку? [D7, XP]
tytus © (2008-05-15 12:00:00)Добрый день всем. Есть такой код:
const CX_MYMESSAGE = WM_USER+40;
...
private
procedureCXMYMESSAGE(var Message: TMessage); messageCX_MYMESSAGE;
...
procedureTMainFm.CXMYMESSAGE( var Message: TMessage);
begin
Message.WParam:=Integer(PChar(Edit1.Text));
end;
теперь как получить текст из едита используя SendMessage?
SendMessage(MainFm. Handle,CX_MY_MESSAGE,????,0);
Leonid Troyanovsky (2008-05-15 23:20:00) [1]
> 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.
Игорь Шевченко (2008-05-15 16:31:00) [2]
> процессы разные.
Тогда WM_COPYDATA
Ты прочитай наконец http://ln.com.ua/~openxs/articles/smart-questions-ru.html
Партизан.
Сергей М. (2008-05-15 16:26:00) [3]
> tytus (15.05.08 16:19) [35]
В огороде бузина, а в Киеве дядька ..
Модули замесил в одну кашу с потоками
Игорь Шевченко (2008-05-15 16:23:00) [4]Renegat (15.05.08 15:59) [33]
> Ну а почему бы нет? Или же менять поля класса.
> ChuzhoyClass1.BufText:='какой-нибудь там текст';
>
> Не знаю, может быть, это и не комильфо, но почему бы этим
> не воспользоваться, раз можно?
Зачем связывать классы заранее, если их можно не связывать ? Если мне нужно послать сообщение куче окон, я их просто посылаю, не думая о том, как реализована обработка этих сообщений в каждом из окон (а она может быть организована по-разному).
Эт называется полиморфизьм.
tytus (2008-05-15 16:19:00) [5]>Сергей М. © (15.05.08 16:01) [34]
процессы разные.
SendMessage вызываем в RemoteDataModule, а обработка - в потоке основоного приложения.
Сергей М. (2008-05-15 16:01:00) [6]
> если передаём в пределах своего процесса - то зачем такие
> навороты?
Какие ? Ты о чем ?
Renegat (2008-05-15 15:59:00) [7]> А как ? Явно вызывать методы чужого класса ?
Ну а почему бы нет? Или же менять поля класса.
ChuzhoyClass1.BufText:='какой-нибудь там текст';
Не знаю, может быть, это и не комильфо, но почему бы этим не воспользоваться, раз можно?
Игорь Шевченко (2008-05-15 15:52:00) [8]Renegat (15.05.08 15:44) [29]
> Но если передаём в пределах своего процесса - то зачем такие
> навороты?
А как ? Явно вызывать методы чужого класса ?
Reindeer Moss Eater (2008-05-15 15:47:00) [9]то зачем такие навороты?
Да разные ситуации бывают.
Например иногда хочется абсолютной независимости модулей. Никто ни у кого в юзесах не сидит, а данными модули обмениваются. Посредством сообщений.
Это только один из примеров.
Reindeer Moss Eater (2008-05-15 15:44:00) [10]так нам-то нежна не процедура, нам тут сендмессадж понадобилсо.
Renegat (2008-05-15 15:44:00) [11]> [27] Сергей М. © (15.05.08 15:33)
Вот и я об этом подумал. Если ничего другого кроме SendMessage не остаётся, то окно явно чужое.
Однако из авторитетных источников ([23]) было получено опровержение...
Но если передаём в пределах своего процесса - то зачем такие навороты?
Игорь Шевченко (2008-05-15 15:37:00) [12]Reindeer Moss Eater © (15.05.08 15:23) [26]
> procedure test;
> var localstring : string;
> begin
> sendmessage(handle,....
> end;
> А в целевое окно например не знает, что это была локальная
> переменная.
И в чем проблема ?
Если ты вместо SendMessage вызовешь какую-нибудь процедуру, куда в качестве параметра будет передана строка, она, процедура, тоже не будет знать о том, что это локальная переменная. Если все передается в рамках одного процесса, то без разницы, локальная она или нет. Разница будет для PostMessage.
Сергей М. (2008-05-15 15:33:00) [13]
> tytus
Ты вообще окну какогопроцесса намериваешься передавать такого рода сообщение - текущего или другого ?
Reindeer Moss Eater (2008-05-15 15:23:00) [14]Это так. Но:
procedure test;
var localstring : string;
begin
sendmessage(handle,....
end;
А в целевое окно например не знает, что это была локальная переменная.
Игорь Шевченко (2008-05-15 15:16:00) [15]Reindeer Moss Eater © (15.05.08 15:12) [24]
Прости, но управление не вернется в программу, пока SendMessage не отработает, то есть при его обработке строка гарантировано будет живее всех живых
Reindeer Moss Eater (2008-05-15 15:12:00) [16]Один сендмессадж и один СтрНью (на случай скорой смерти оригинальной стрки)
и все.
Игорь Шевченко (2008-05-15 14:43:00) [17]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;
И не жужжит
Renegat (2008-05-15 14:36:00) [18]А вот тут как раз ИМХО и ст0ит использовать стандартное системное сообщение WM_COPYDATA. Не стоит изобретать велосипедов, когда один из них уже реализован средствами системы. Читаем МСДН, заполняем правильно структуру, постим сообщение. Вуаля!
Slym (2008-05-15 14:21:00) [19]Reindeer Moss Eater © (15.05.08 14:17) [20]
низнаю зачем... но определение длинны строки по поиску #0 мне не нравится: лишние CPU% на поиск и невозможность передать этот самый #0 в сообщении
Reindeer Moss Eater (2008-05-15 14:17:00) [20]первый раз узнаем необходимую длинну
А StrLen зачем придумали?