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

Вниз

подскажите с приемом, что-то совсем затупил   Найти похожие ветки 

 
Vlad Oshin ©   (2008-10-13 10:47) [0]

Суть в следующем - программа должна получать сообщение с именем действия и указателем на процедуру.
И потом этот список действий показать, а если куда кликнут - то запустить соотв. код

 TActionList2 = packed record
   ActionName:array of string;
   ActionAct:array of ???; //pointer tprocedure
 end;

var
 fMessage: TActionList2;
begin
..делаем где-то, посылаем главному окну
 setlength(fMessage.ActionName,1);
 fMessage.ActionName[0]:="qqqqqqqq";
 setlength(fMessage.ActionAct,1);
 fMessage.ActionAct[0]:= //ShowDocument(0);
 Application.MainForm.Dispatch(fMessage);

ну и некая процедура
procedure ShowDocument(M:byte=1);
begin
m:=m;
end;

что-то не мугу сообразить как..
выходные очень тяжелые выдались..


 
jack128_   (2008-10-13 10:52) [1]


>  fMessage.ActionAct[0]:= //ShowDocument(0);

в Delphi < 2009 только созданием отдельной процедуры

procedure ShowDocument0;
begin
 ShowDocument(0);
end;

TActionList2 = packed record
  ActionName:array of string;
  ActionAct:array of TProcedure;
end;

fMessage.ActionAct[0]:= ShowDocument0;


в 2009 мона анонимные функции использовать...


 
tesseract ©   (2008-10-13 10:54) [2]

А не по ссылке следует передать? Только там с областью видимости смотри аккуратней.


 
Сергей М. ©   (2008-10-13 10:55) [3]

Фигня какая-то ...

Метод TObject.Dispatch требует в кач-ве параметра структуру типа TMessage, а не какую-то там выдуманную с большого бодуна TActionList2


 
Vlad Oshin ©   (2008-10-13 10:58) [4]

спасибо


 
jack128_   (2008-10-13 11:06) [5]


> Метод TObject.Dispatch требует в кач-ве параметра структуру
> типа TMessage, а

не совсем. Метод Dispatch требует, чтобы в первых 2х байтах переданного ему параметра был идентификатор сообщения. Остальное - не важно.

Вот цитата из System.pas

{ TObject.Dispatch accepts any data type as its Message parameter.  The
 first 2 bytes of the data are taken as the message id to search for
 in the object"s message methods.  TDispatchMessage is an example of
 such a structure with a word field for the message id.
}
 TDispatchMessage = record
   MsgID: Word;
 end;

Но вообще ты прав, структуру TActionList2 нужно переделывать...


 
Сергей М. ©   (2008-10-13 11:08) [6]


> jack128_   (13.10.08 11:06) [5]


Угу.


 
oxffff ©   (2008-10-13 11:15) [7]

Сергей М. ©   (13.10.08 10:55) [3]
jack128_   (13.10.08 11:06) [5]

А причем здесь вообще Dispatch, если у автора "указателем на процедуру"? Dispatch требует индекс.


 
jack128_   (2008-10-13 11:18) [8]


> А причем здесь вообще Dispatch,

диспатч - в коде автора написан:
>  Application.MainForm.Dispatch(fMessage);



> Dispatch требует индекс.

ну я Сергей и я как раз на это и указали:  
> Метод Dispatch требует, чтобы в первых 2х байтах переданного
> ему параметра был идентификатор сообщения
:-)


 
oxffff ©   (2008-10-13 11:20) [9]

Если у автора идентичные контракты процедур, то голову нечего ломать.
Если разные, тогда TypeInfo в руки + ObjAuto


 
oxffff ©   (2008-10-13 11:22) [10]


> jack128_   (13.10.08 11:18) [8]


А почему вы вообще сделали вывод, что Dispatch идет от Tobject?
Может вполне может быть reintroduce :)


 
Сергей М. ©   (2008-10-13 11:46) [11]


> oxffff ©   (13.10.08 11:22) [10]



> Может вполне может быть reintroduce


imho, надо быть шибко больным на голову, чтобы так извращаться)


 
Vlad Oshin ©   (2008-10-13 11:56) [12]

Всем спасибо, все получилось

структура:
 TActionList2 = packed record
   Msg: Cardinal;
   Code:byte;
   ActionName:array of string;
   ActionAct:array of tMethod;//TProcedure;
 end;

засылается:
var
 fMessage: TActionList2;
 M:tMethod;
begin
 fMessage.Msg:=NQM_INVALIDATE_ACTION;
 fmessage.code:=1;
 setlength(fMessage.ActionName,1);
 fMessage.ActionName[0]:="Группа Документ";
 setlength(fMessage.ActionAct,1);
 m.Code:= @SD;
 m.Data:=self;
 fMessage.ActionAct[0]:= M;
 Application.MainForm.Dispatch(fMessage);

обрабатывается:
   NQM_INVALIDATE_ACTION:
   begin
     if TActionList2(Message).code=1 then
     begin
         plcAction.Groups.Clear;
         plcAction.Groups.Add;
         plcAction.Groups[0].Caption:=TActionList2(Message).ActionName[0];
         M:=TActionList2(Message).ActionAct[0];
         plcAction.Groups[0].OnClick:=tNotifyEvent(M);

но что-то так сегодня со скрипом все идет.. просто стыдно..


 
jack128_   (2008-10-13 13:38) [13]


> А почему вы вообще сделали вывод, что Dispatch идет от Tobject?
>
> Может вполне может быть reintroduce :)

Опять же из кода:

>  Application.MainForm.Dispatch(fMessage);

Не, ну конечно Application - может быть не Forms.Application и свойство/поле, метод MainForm может возвращать не TForm.. Всё может быть.. Но я предположил, что имеется в виду именно Forms.Application... Может и зря, конечно ;-)


> imho, надо быть шибко больным на голову, чтобы так извращаться)

из реального кода, от чела который на работу устраивался:

destructor TSameObject.Free; reintroduce; overload;


>    ActionAct:array of tMethod;//TProcedure;
а почему TMethod, а не TNotifyEvent  ??  ИЛи методы имеют разную сигнатуру, в зависимости от TActionList2.Code  ???


 
Vlad Oshin ©   (2008-10-13 13:51) [14]


> а почему TMethod, а не TNotifyEvent  ??  ИЛи методы имеют
> разную сигнатуру, в зависимости от TActionList2.Code  ??
> ?

потом, возможно, да



Страницы: 1 вся ветка

Текущий архив: 2008.12.14;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.024 c
15-1223635750
Добежал
2008-10-10 14:49
2008.12.14
Ошибка в SQLite


2-1225983644
barbaroska
2008-11-06 18:00
2008.12.14
Помогите с алгоритмом


1-1204398745
Igit
2008-03-01 22:12
2008.12.14
Delphi и FLASH


2-1226072058
jonin
2008-11-07 18:34
2008.12.14
быки и коровы


15-1223904876
dr_creigan
2008-10-13 17:34
2008.12.14
проблемы с вистой