Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.49 MB
Время: 0.032 c
3-38720
First_May
2004-01-22 09:09
2004.02.13
Владелец базы IB


1-38877
Maxim Vetera
2004-02-03 10:15
2004.02.13
Экраная лупа


7-39121
fiatik
2003-11-28 23:17
2004.02.13
Help! Как запросить у компа: какие системе доступны компорты?


14-39079
Rauf
2004-01-25 18:10
2004.02.13
Удаление программы самой из себя!


1-38892
_Dmitry_
2004-02-04 15:42
2004.02.13
Форма внутри потока