Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.11.07;
Скачать: CL | DM;

Вниз

что-то с 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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.01 c
6-1229087355
Ст
2008-12-12 16:09
2010.11.07
Tcpserver узнать ip клиента


2-1281765808
Fr
2010-08-14 10:03
2010.11.07
Ping хоста


15-1279916973
Юрий
2010-07-24 00:29
2010.11.07
С днем рождения ! 24 июля 2010 суббота


2-1281621980
DROWSY
2010-08-12 18:06
2010.11.07
Рабочие наборы данных.


4-1240991885
Zalum
2009-04-29 11:58
2010.11.07
Передать работающему приложению параметры