Forum in READ ONLY mode! All questions and discussions on Discord official server, invite link: https://discord.gg/VxsGzJ7

Коллстак

тут можно задать вопрос по скриптингу
Post Reply
Az_Rieil
Neophyte
Neophyte
Posts: 34
Joined: 21.05.2014 17:18

Коллстак

Post by Az_Rieil »

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

И через цикл последовательно вызывать функции передавая аргументы.
Кто-то может дать такой пример?
User avatar
Vizit0r
Developer
Developer
Posts: 3958
Joined: 24.03.2005 17:05
Contact:

Re: Коллстак

Post by Vizit0r »

странно, вроде отвечал, а ответа нет.
По вопросу не ясно ничего - напиши лучше словами, что ты хочешь получить. Твой псевдокод понимаю совсем не способствует.
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
drabadan
Expert
Expert
Posts: 730
Joined: 13.12.2012 17:35
Contact:

Re: Коллстак

Post 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.
Az_Rieil
Neophyte
Neophyte
Posts: 34
Joined: 21.05.2014 17:18

Re: Коллстак

Post by Az_Rieil »

оо да.
только как быть с аргументами?
и есть альтернативы без сравнения по строкам, более компактная?
drabadan
Expert
Expert
Posts: 730
Joined: 13.12.2012 17:35
Contact:

Re: Коллстак

Post 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.
User avatar
Vizit0r
Developer
Developer
Posts: 3958
Joined: 24.03.2005 17:05
Contact:

Re: Коллстак

Post by Vizit0r »

если мне не изменяет склероз, ПС не умеет передавать строки в case
Delphi точно не умеет. Там это обходится непростым путем, но в ПС так не выйдет.
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
drabadan
Expert
Expert
Posts: 730
Joined: 13.12.2012 17:35
Contact:

Re: Коллстак

Post 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;
User avatar
Vizit0r
Developer
Developer
Posts: 3958
Joined: 24.03.2005 17:05
Contact:

Re: Коллстак

Post 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;
и т.д.
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
Post Reply