Форум: "Начинающим";
Текущий архив: 2010.11.07;
Скачать: [xml.tar.bz2];
Внизчто-то с message происходит, не знаю как и спросить Найти похожие ветки
← →
12 © (2010-08-13 11:09) [0]Есть MDI приложение,
когда у меня в одном окне(ребенке) нечто меняется, оно посылает message главному, главное рассылает всем детям, которые как-то реагируют на него.
т.е.
Произошло изменение, ребенок говоритAMsg.Msg := TU_SubscrChange;
AMsg.Subscr.ID := FSubscriber;
AMsg.Subscr.Name := edtName.Text;
Application.MainForm.Dispatch(AMsg);
в главном в procedure TMainForm.DefaultHandler(var Message);if (TMessage(Message).Msg >= TU_BASIC) and (TMessage(Message).Msg <= TU_LAST) then
begin
case TMessage(Message).Msg of
TU_SubscrChange: begin
ShowMessage(TSubscrNew(Message).Subscr.Name + " main");
for i := 0 to MainForm.MDIChildCount - 1 do MainForm.MDIChildren[i].Dispatch(Message);
...
тут всегда выводится некоторое слово (ShowMessage)
теперь ловим в детях, аналогичная процедура DefaultHandler(var Message);TU_SubscrChange: begin
ShowMessage(TSubscrNew(Message).Subscr.Name + " unit");
тут НЕ всегда выводится слово
все зависит от того поставлен ли комментарий, в определении типа TSubscriber
Когда стоит комментарий - показывается, когда нет - не показывается
так определены типы и константы
const
TU_BASIC = WM_USER + $200;
TU_SubscrNew = TU_BASIC + $11;
type
TSubscriber = packed record
ID: Integer;
//ParentId: Integer; <--- Важно
Name: String;
end;
TSubscrNew = packed record
Msg: Cardinal;
Subscr: TSubscriber;
Result: Longint;
end;
т.е., ребенок послал родителю строку, родитель получил, рассылает всем детям, а те не получают, если в типе стоит комментарий,
и получают, если его нет
что такое может быть?
← →
12 © (2010-08-13 11:11) [1]
> не получают, если в типе стоит комментарий,
> и получают, если его нет
наоборот
← →
12 © (2010-08-13 11:37) [2]да, и
TU_SubscrChange = TU_BASIC + $10;
TU_LAST = TU_BASIC + $FF;
и полностью еслиprocedure TMainForm.DefaultHandler(var Message);
var
j, i: integer;
begin
if (TMessage(Message).Msg >= TU_BASIC) and (TMessage(Message).Msg <= TU_LAST) then
begin
case TMessage(Message).Msg of
TU_ExistsForm: begin // если такое окно найдем, то активируем, а того кто прислал сообщение - замочим
for i := 0 to MainForm.MDIChildCount - 1 do
begin
if (MainForm.MDIChildren[i].Caption = TNameForm(Message).NameForm)
and (MainForm.MDIChildren[i].ClassType = TNameForm(Message).ClasForm) then
begin
MainForm.MDIChildren[i].BringToFront;
for j := 0 to MainForm.MDIChildCount - 1 do
if (MainForm.MDIChildren[j].Handle = TNameForm(Message).Handle) then
MainForm.MDIChildren[j].Close;
end;
end;
end; //TU_ExistsForm
TU_SubscrChange: begin
ShowMessage(TSubscrNew(Message).Subscr.Name + " main");
for i := 0 to MainForm.MDIChildCount - 1 do MainForm.MDIChildren[i].Dispatch(Message);
end;
else begin
for i := 0 to MainForm.MDIChildCount - 1 do MainForm.MDIChildren[i].Dispatch(Message);
end;
end;//case TMessage(Message).Msg of
end;
inherited;
end;
и в дитеprocedure TfrmSubscriber.DefaultHandler(var Message);
begin
if (TMessage(Message).Msg >= TU_BASIC) and (TMessage(Message).Msg <= TU_LAST) then
begin
Case TMessage(Message).Msg of
TU_FileDrop: begin
tvSubscr.BeginDrag(true);
FFileDropped := TFileDrop(Message).FileName;
end;
TU_SubscrChange: begin
ShowMessage(TSubscrNew(Message).Subscr.Name + " unit");
exit; { TODO : потом не забыть снять }
SyncFromMessageEdtSubscr( TSubscrChange(Message).Subscr.ID, TSubscrChange(Message).Subscr.Name);
end;
TU_SubscrNew: begin
ShowMessage(TSubscrNew(Message).Subscr.Name + " unit"); { TODO : потом не забыть снять }
SyncFromMessageNewSubscr( TSubscrNew(Message).Subscr.ID, 0{TSubscrNew(Message).Subscr.ParentId}, TSubscrNew(Message).Subscr.Name);
end;
end;
end;
inherited;
end;
← →
12 © (2010-08-13 13:00) [3]нет предположений?
или
не так спрашиваю?
← →
icWasya © (2010-08-13 16:06) [4]Ну если в процедуре DefaultHandler (var Message) у параметра Message не стоит тип, это ещё не значит, что туда можно подавать всё что угодно.
Если посмотришь модуль Messages.pas - то там много всяких структур для удобства обработки всяких сообщений, но они ВСЕ по размеру равны TMessage = 16 байт. Причём все отличаются только интерпретацией LParam и WParam. А поле Result предназначено для возврата результата обработки сообщения. В закомментированом случае у тебя получается, что SizeOf(TSubscrChange) = 16, и всё должно работать, а если комментарий убрать, то размер будет 20 байт, а Subscr.Name попадёт на место, предназначеное для Result. Что при этом происходит ...
← →
12 © (2010-08-13 16:15) [5]
> если в процедуре DefaultHandler (var Message) у параметра
> Message не стоит тип, это ещё не значит, что туда можно
> подавать всё что угодно.
согласен. Но это самое простое что пришло в голову. Вернее, сплагиатилось из программы, когда писавшейся моим начальником (бывшим)
там даже так было
DepMess.DepartmentInfo := DepartmentInfo;
Application.MainForm.Dispatch(DepMess);
где,
TDepartmentInfo = packed record
Id_Department: integer; // код департамента
clientNick: string; // краткое наименование
clientName: string; // полное наименование
Id_Company: integer; //так надо
end;
и все работало как-то...
← →
12 © (2010-08-13 16:29) [6]кудесник он, наверное, что-ли
начальник то мой старый :)
ладно, просто ID, в принципе, хватит.
Лишний раз БД только напрячь придется
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2010.11.07;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.003 c