Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2008.06.08;
Скачать: [xml.tar.bz2];

Вниз

как в 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.55 MB
Время: 0.045 c
9-1170551643
TGLCube
2007-02-04 04:14
2008.06.08
Как повернуть матрицу вокруг заданного вектора на определённый


2-1210659659
Михаил (Питер)
2008-05-13 10:20
2008.06.08
Параметры к программе


15-1208888750
TIF
2008-04-22 22:25
2008.06.08
Всё, ухожу в прошлое... Всем пока


3-1199661770
porter
2008-01-07 02:22
2008.06.08
получить несколько столбцов для одного поля


8-1181992036
Michael L Birnov
2007-06-16 15:07
2008.06.08
Прерисовка в канве "моргает"





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский