Форум: "Прочее";
Текущий архив: 2008.12.14;
Скачать: [xml.tar.bz2];
Внизподскажите с приемом, что-то совсем затупил Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.007 c