Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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
2-1225904136
TRSteep
2008-11-05 19:55
2008.12.14
Алгоритм Blowfish


15-1223451509
DeadMeat
2008-10-08 11:38
2008.12.14
Data Explorer и MSAccess


9-1176042275
Cerberus
2007-04-08 18:24
2008.12.14
Что лучше для создания 3д моделей Maya или 3D Max


2-1225439961
abhtr
2008-10-31 10:59
2008.12.14
Режим редактирования ячейки DBGrid-a


15-1223518108
Slider007
2008-10-09 06:08
2008.12.14
С днем рождения ! 9 октября 2008 четверг





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