Главная страница
    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.47 MB
Время: 0.009 c
14-39023
Valerian
2004-01-26 08:47
2004.02.13
Не могу установить некоторые программы и игры


8-38977
Gabriel
2003-10-12 22:51
2004.02.13
avi - dll


14-38999
syte_ser78
2004-01-22 09:00
2004.02.13
Siemens A50


3-38671
denis24
2004-01-24 15:13
2004.02.13
удаление из бд


1-38896
M!h
2004-02-04 15:13
2004.02.13
COM-технология





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский