Page 1 of 1

Коллстак

Posted: 18.11.2014 20:36
by Az_Rieil
К примеру у меня есть массив (синтаксис опускаю, забыл немного )
array of array of record
functionName : string
arguments : Array of ?? ( опять же как )

И через цикл последовательно вызывать функции передавая аргументы.
Кто-то может дать такой пример?

Re: Коллстак

Posted: 19.11.2014 16:06
by Vizit0r
странно, вроде отвечал, а ответа нет.
По вопросу не ясно ничего - напиши лучше словами, что ты хочешь получить. Твой псевдокод понимаю совсем не способствует.

Re: Коллстак

Posted: 19.11.2014 16:44
by drabadan

Re: Коллстак

Posted: 19.11.2014 17:14
by drabadan
паренек видать об этом спрашивал...

8000й нах!


типа так?

Code: Select all

program ProceduresTest;

var
 ArrayOfProc : Array of String;
 i : Integer;
 
procedure One;
begin;
end;

procedure Two;
begin
end;

procedure Three;
begin
end;


procedure CallProcedures(ProcName : String);
begin
 case ProcName of 
  'One' : One;
  'Two' : Two;
  'Three' : Three;
 end;
end;

begin
 ArrayOfProc := ['One', 'Two', 'Three'];
 
 for i := 0 to Length(ArrayOfProc)-1 do
  CallProcedures(ArrayOfProc[i]);
end.

Re: Коллстак

Posted: 19.11.2014 19:48
by Az_Rieil
оо да.
только как быть с аргументами?
и есть альтернативы без сравнения по строкам, более компактная?

Re: Коллстак

Posted: 19.11.2014 22:15
by drabadan
Az_Rieil wrote:оо да.
только как быть с аргументами?
и есть альтернативы без сравнения по строкам, более компактная?

типа того? я не компилил, но идея думаю понятна. У меня ограниченное очень познания в программировании, я даю как сам бы делал! Если бы кто-то у кого есть мозги показал как правильно, мне бы самому было интересно!

Code: Select all

program TestProcedures;

type
 TArgs = record
  fWord : Word;
  fWords : Array of Word;
  fCardinal : Cardinal;
  fCardinals : Array of Cardinals;
  fString : String;
  fStrings : Array of String;
 end;

type
 TMyProc = record
  ProcName : String;
  ProcArgs : TArgs;
 end;
 
 var
  MyProcs : Array of TMyProc; 
  i : Integer;
 
 procedure One(Args : TArgs);
 begin
 end;
 
 procedure Two(Args : TArgs);
 begin
 end;
 
 
procedure CallProc(Proc: TMyProc);
begin
 case Proc.Name of
  'One' :
   begin
    MyProc.ProcName := 'One';
	MyProc.ProcArgs.fWord := $1111;
	MyProc.ProcArgs.fCardinals := [$0000000, $0000001, $000000002];
	
	One(MyProc.Args);
   end;
  'Two' :
   begin
    MyProc.ProcName := 'Two';
	MyProc.ProcArgs.fWord := $1222;
	MyProc.ProcArgs.fStrings := ['Stealth', 'Client', 'is', 'the Best'];
	
	Two(MyProc.Args);
   end;
end;

procedure AddProc(Name : String);
begin
 SetLength(MyProcs, Length(MyProcs)+1);
 MyProcs[High(MyProcs)].ProcName := Name;
end;


begin
 AddProc('One');
 AddProc('Two');
 

 for i := 0 to Length(MyProcs)-1 do
  CallProc(MyProcs[i]);
end.

Re: Коллстак

Posted: 20.11.2014 11:22
by Vizit0r
если мне не изменяет склероз, ПС не умеет передавать строки в case
Delphi точно не умеет. Там это обходится непростым путем, но в ПС так не выйдет.

Re: Коллстак

Posted: 20.11.2014 13:04
by drabadan
Vizit0r wrote:если мне не изменяет склероз, ПС не умеет передавать строки в case
Delphi точно не умеет. Там это обходится непростым путем, но в ПС так не выйдет.
отлично работает, или ты не об етом?

Code: Select all

procedure Traveler(Destination : String);
begin
 case Destination of
  'Arenas' : MoveTo(3638, 1298, 6); 
  'Dressing Square' : 
   begin
    MoveTo(3772, 1273, 0);
    NewMoveXY(3651, 1299, true, 0, true); 
   end;
  'Quatro Arena' : MoveTo(3726, 1367, 4);
 end;
end;

Re: Коллстак

Posted: 21.11.2014 14:36
by Vizit0r
хм. Круто, хочу чтобы так же просто было в дельфах :)
Сейчас для строк приходится городить конструкции вида

Code: Select all

type
  TGumpNumElement = (gne_noclose,
                     gne_nodispose,
                     gne_nomove,
                     gne_noresize,
                     gne_group,
.....
);

    case TGumpNumElement(GetEnumValue(TypeInfo(TGumpNumElement), 'gne_'
                                      +LowerCase(CommandName))) of
      gne_noclose   : fNoClose := true;
      gne_nodispose : fNoDispose := true;
и т.д.