Форум: "Начинающим";
Текущий архив: 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.54 MB
Время: 0.072 c