Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
15-1280407604
__REA
2010-07-29 16:46
2010.11.07
NMEA


15-1279704739
12
2010-07-21 13:32
2010.11.07
О танках мнение.


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


8-1180443656
borodaj
2007-05-29 17:00
2010.11.07
еще вопрос по изображениям )


6-1229185383
ASMiD
2008-12-13 19:23
2010.11.07
компонент для чтения с FTP сервера для Delphi7





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