Текущий архив: 2004.02.13;
Скачать: CL | DM;
Вниз
Передача параметров через SendMessage Найти похожие ветки
← →
h0use (2004-02-04 14:08) [0]Есть некий рекорд AMsg, хочется его пердать обработчику сообщения. Пишу примерно так:
Procedure Proc1;
var
AMsg:TAMsgRecord;
begin
...
SendMessage(Self.Handle,WM_MSG_Command,Integer(AMsg),0);
...
end;
Procedure OnProc1(var Msg : TMessage);
var
AMsg:TAMsgRecord;
begin
AMsg:=Pointer(Msg.WParam);
...
end;
И конечно это не работает, в чем вилы, как правильно передавать указатель?
← →
Тимохов (2004-02-04 14:10) [1]OnProc1 - это что?
← →
Тимохов (2004-02-04 14:10) [2]TAMsgRecord - это что?
← →
MBo (2004-02-04 14:12) [3]1. как объявлено TAMsgRecord?
2. в любом случае у тебя это локальная переменная процедуры
← →
h0use (2004-02-04 14:15) [4]
procedure OnProc1(var Msg : TMessage); message WM_MSG_Command;
TAMsgRecord = record
F1:Word;
F2:Word;
F3:Word;
F4:String[255];
end;
← →
h0use (2004-02-04 14:17) [5]
> 2. в любом случае у тебя это локальная переменная процедуры
Тогда как мне передать запись в моем случае из онлй процедуры в другую, не объявляя глобальных переменных?
← →
MBo (2004-02-04 14:19) [6]PAMsgRecord=^TAMsgRecord;
var PAmsg:PAMsgRecord;
New(PAmsg);
SendMessage(Self.Handle,WM_MSG_Command,Integer(PMsg),0);
В приемнике
сделать Delete
Но это плохой путь.
← →
Тимохов (2004-02-04 14:22) [7]Procedure Proc1;
var
AMsg:TAMsgRecord;
p: pointer;
begin
getmem(p, sizeof(TAMsgRecord));
...
move(amsg, p^, sizeof(TAMsgRecord))
...
SendMessage(Self.Handle,WM_MSG_Command,Integer(p),0);
...
end;
Procedure OnProc1(var Msg : TMessage);
var
AMsg:TAMsgRecord;
p: poiner;
begin
p := pointer(Msg.WParam)
move(p^, amsg, sizeof(TAMsgRecord));
freemem(p, sizeof(TAMsgRecord));
end;
Только надо понимать, что это будет работать, если в записи не будет длинных строк, дин. массивов и интерфейсов.
Писал тут - посему возможны ошибки.
← →
Opuhshii (2004-02-04 14:23) [8]WM_COPYDATA
← →
Тимохов (2004-02-04 14:24) [9]Согласен в 6 - его путь лучше.
Но в целом оба пути плохи, имхо.
← →
Reindeer Moss Eater (2004-02-04 14:29) [10]2. в любом случае у тебя это локальная переменная процедуры
Так это не мешает при SendMessage.
Эта переменная никуда не денется из стека пока не выйдем из процедуры.
А из процедуры не выйдем пока не вернемся из sendmеssage.
А из Sendmessage не вернемся пока сообщение не будет обработано.
← →
Юрий Зотов (2004-02-04 14:31) [11]> MBo © (04.02.04 14:19) [6]
Зачем New и Delete? Это же SendMessage, поэтому вполне годится и локальная переменная. Управление вернется в точку вызова и при выходе из процедуры все спокойно уничтожится.
> h0use © (04.02.04 14:08)
У Вас почти правильно, только передавать надо адрес. Операция взятия адреса обозначается @
Procedure Proc1;
var
AMsg: TAMsgRecord;
begin
...
SendMessage(Handle, WM_MSG_Command, Integer( @AMsg), 0);
...
end;
Procedure OnProc1(var Msg: TMessage);
begin
with TAMsgRecord(Pointer(Msg.WParam)^) do
begin
...
end
end;
← →
alex_*** (2004-02-04 14:31) [12]мессаг передается синхронно - можно и адрес структуры передать. На мой взгляд ничего страшного. Главное не запоминать его внутри в статических переменных. а для универсальности - [8]
← →
MBo (2004-02-04 14:35) [13]>Это же SendMessage
Логично ;)
← →
Тимохов (2004-02-04 14:36) [14]Можно, конечно передавать прямо адрес.
Но тогда имхо около sendmessage надо поставить очень приметный комментарий, чтобы случайно не поменять на postmessage - мало ли кто будет потом проект поддерживать.
Страницы: 1 вся ветка
Текущий архив: 2004.02.13;
Скачать: CL | DM;
Память: 0.47 MB
Время: 0.009 c