Вопрос Как преобразовать имя функции в AnyMethod или наоборот?

Статус
В этой теме нельзя размещать новые ответы.

Nemko

Дилетант
Модератор
Камрады, доброго: как реализовать функцию, которая возвращает CallBack в зависимости от версии Inno?
Поясню: в Inno EE для создания CallBack'a отправляется имя процедуры в строковом варианте, в обычной же Inno в виде AnyMethod (похоже на TNotifyEvent).

Хотел для облегчения модулей сделать что-то похожие на:
Код:
function CallBack(NameProc: ???): LongWord;
begin
  #ifndef IS_ENHANCED
    Result:=CreateCallBack(@NameProc: AnyMethod);
  #else
    Result:=CallBackAddr(NameProc: String);
  #endif
end;
З.Ы.: Перепробовал разумные и неразумные версии.
 

Shegorat

Lord of Madness
Администратор
@Nemko, без шаблонов, которых нет в инно - никак. Можно попробовать использовать препроцессор, который будет подставлять нужный метод. Типа такого ( пишу на коленке)
Код:
#define MakeCallback(Method) defined(IS_ENHANCED)  ? CreateCallback(@Method) : CallbackAddr('Method')
 

Andreo Fadio

Старожил
Хотел для облегчения модулей сделать что-то похожие на:
не хватает тогда еще метода через dll, если вдруг кто не на 6 или EE

и опять таки пример не будет работать на 6 расширенной от Leserg (потому как на нее распространяется - IS_ENHANCED)

просто не выйдет :D
 

Edison007

Ветеран
Модератор
а такой велосипед работать не будет?
Код:
#ifndef IS_ENHANCED
function CallBack(NameProc: AnyMethod): LongWord;
#else
function CallBack(NameProc: String): LongWord;
#endif
begin
  #ifndef IS_ENHANCED
    Result:=CreateCallBack(@NameProc: AnyMethod);
  #else
    Result:=CallBackAddr(NameProc: String);
  #endif
end;
Или я чего-то не понимаю?
 

Nemko

Дилетант
Модератор
Edison007, нет, а я уж обрадовался.
Например: создать таймер одной стройкой, а определение версии inno внутри функции:
SetTimer(0, 0, 100, CallBack(???))
Andreo Fadio, знаю о Inno Setup VCL, но пока тут бы понять.

З.Ы.: Директива Override не ясно поможет ли и как реализовать, а Overload не поддерживается.
 
Последнее редактирование:

Shegorat

Lord of Madness
Администратор
@Nemko, попробуй препроцессор, я выше скидывал пример на коленке
 

Nemko

Дилетант
Модератор
Shegorat, [ISPP] Undeclarate indentifier: "Proc". "препроцессор" - несильная сторона моих познаний:
Код:
#define MakeCallback(Method) defined(IS_ENHANCED) ? CreateCallback(@Method) : CallbackAddr('Method')

[Setup]
AppName=Test
AppVersion=1.5
CreateAppDir=no
DisableWelcomePage=False

[Code]
function SetTimer(hWnd, nIDEvent, uElapse, lpTimerFunc: Longword): Longword; external 'SetTimer@user32.dll stdcall';

var
  tick: Integer;

procedure Proc;
begin
  with WizardForm do begin
    Inc(tick);
    Caption:=IntToStr(tick);
  end;
end;

procedure InitializeWizard;
begin
  SetTimer(0, 0, 1000, {#MakeCallback(Proc)});
end;
 

Хамик

Старожил
@Nemko, разве это не то?
code_language.pascal:
[Setup]
AppName=Test
AppVersion=1.5
CreateAppDir=no
DisableWelcomePage=False

[Code]
function SetTimer(hWnd, nIDEvent, uElapse, lpTimerFunc: Longword): Longword; external 'SetTimer@user32.dll stdcall';

var
  tick: Integer;

function CallBack(NameProc: String): LongWord;
begin
  #ifndef IS_ENHANCED
    Result:=CreateCallBack(@NameProc);
  #else
    Result:=CallBackAddr(NameProc);
  #endif
end;

procedure Proc;
begin
  with WizardForm do
  begin
    Caption:=IntToStr(tick);
    tick := tick+1;
  end;
end;

procedure InitializeWizard;
begin
  tick := 1;
  SetTimer(0, 0, 1000, CallBack('Proc'));
end;
На расширенной работает.
 

Nemko

Дилетант
Модератор
Хамик, неа, на обычной версии Inno CreateCallBack функция, String не принимает. Задумка в псевдо-поддержке и подмене.
 

Shegorat

Lord of Madness
Администратор
@Nemko,вроде должно работать
Код:
#define MakeCallback(any Method) defined(IS_ENHANCED) ? "CallbackAddr('" + Method + "')" : "CreateCallback(@" + Method + ")"

[Setup]
AppName=Test
AppVersion=1.5
CreateAppDir=no
DisableWelcomePage=False

[Code]
function SetTimer(hWnd, nIDEvent, uElapse, lpTimerFunc: Longword): Longword; external 'SetTimer@user32.dll stdcall';

var
  tick: Integer;

procedure Proc;
begin
  with WizardForm do begin
    Inc(tick);
    Caption:=IntToStr(tick);
  end;
end;

procedure InitializeWizard;
begin
  SetTimer(0, 0, 1000, {#emit MakeCallback("Proc")});
end;
 

Nemko

Дилетант
Модератор
Shegorat, да на обеих версиях, благодарю, не думал уже, что это возможно вообще.
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху