Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

как в SendMessage передать строку? [D7, XP]


Страницы:   1 2

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 зачем придумали?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо