Wywołanie procedury na podstawie zawartości zmiennej

0

Witam!

Jest sobie kod:

program jakisprogram;

uses a,b,c,...,z;

Var
  zmienna:string;

Procedure pierwsza;
Begin
  //kod
End;

Procedure druga;
Begin
  //kod
End;

Begin
  zmienna:='pierwsza';
  zmienna; //powinno wywołać procedurę "pierwsza"
  zmienna:='druga';
  zmienna; //powinno wywołać procedurę "druga"
End.

Pytanie brzmi następująco: czy da się bez większego kombinowania, mieszania w to delphi oraz "ficzerów" z lazarusa, uruchomić procedurę której nazwa jest zawarta w zmiennej?

0

Chyba mam dejavu. Przecież niedawno @Integers pytał tutaj o coś identycznego w Delphi. Poszukaj sobie wątków w tym dziale, których jest On autorem.

0
Sharkson napisał(a):

Pytanie brzmi następująco: czy da się bez większego kombinowania, mieszania w to delphi oraz "ficzerów" z lazarusa, uruchomić procedurę której nazwa jest zawarta w zmiennej?

1

można np użyć Tablice asocjacyjne w Delphi by ztablicować wskaźniki na procedury i wywoływać je w zależności od nazwy.

2
Sharkson napisał(a):
Sharkson napisał(a):

Pytanie brzmi następująco: czy da się bez większego kombinowania, mieszania w to delphi oraz "ficzerów" z lazarusa, uruchomić procedurę której nazwa jest zawarta w zmiennej?

Odpowiedź brzmi NIE

0

Ciągle ktoś o takie coś pyta i w przypadku Twojego programu, odpowiedź brzmi nie; Jeżeli chciałbyć uruchomić metodę należącą do rekordu lub klasy - można to wykonać za pomocą RTTI; Zobacz na poniższe linki:

0

Dziękuję za odpowiedzi. A jest może w takim razie możliwość przekazania pewnej funkcji informacji jaką procedurę uruchomić? Jeśli nie w postaci zmiennej to może bezpośrednio? Wcześniej rzeźbiłem w php'ie. Tak, wiem, że to dwa różne światy, wiele przyzwyczajeń zostało.

0

Ty chyba chcesz wywoływać funkcję przez tzw. nazwę,
co występuje chyba w językach 4-tgo poziomu, np. cliper, czy inne takie... siki weroniki.

W językach uniwersalnych raczej nie ma czegoś takiego, chociaż akurat free pascal ma metody dynamiczne przez numery, oraz nazwy - stringi...

4
Sharkson napisał(a)

A jest może w takim razie możliwość przekazania pewnej funkcji informacji jaką procedurę uruchomić?

Tak - wystarczy wskaźnik na taką procedurę i znajomość ewentualnych parametrów i ich typów; Przykład masz poniżej:

type
  TNumberProc = procedure(ANumber: Integer);

  procedure Even(ANumber: Integer);
  begin
    Write('Number ', ANumber, ' is even');
  end;

  procedure Odd(ANumber: Integer);
  begin
    Write('Number ', ANumber, ' is odd');
  end;

  procedure ShowNumberInfo(ANumberProc: TNumberProc; ANumber: Integer);
  begin
    ANumberProc(ANumber);
  end;

var
  spRandom: TNumberProc;
  intRandom: Integer;
begin
  Randomize();
  intRandom := Random(1000);

  if intRandom and 1 = 0 then
    spRandom := @Even
  else
    spRandom := @Odd;

  ShowNumberInfo(spRandom, intRandom);
  ReadLn;
end.

Wskaźnik spRandom zostaje ustawiony na odpowiednią procedurę, według parzystości wylosowanej liczby; Następnie zostaje on przekazany wraz ze zmienną intRandom do procedury ShowNumberInfo, w której to procedura zostaje wywołana i do której zostaje przekazany parametr ANumber;

Ewentualnie możesz posłużyć się tablicą ze wskaźnikami na procedury, np.:

type
  TNumberProc = procedure(ANumber: Integer);

  procedure Even(ANumber: Integer);
  begin
    Write('Number ', ANumber, ' is even');
  end;

  procedure Odd(ANumber: Integer);
  begin
    Write('Number ', ANumber, ' is odd');
  end;

  procedure ShowNumberInfo(ANumberProc: TNumberProc; ANumber: Integer);
  begin
    ANumberProc(ANumber);
  end;

const
  NUMBER_PROCS: array [Boolean] of TNumberProc = (@Odd, @Even);
var
  spRandom: TNumberProc;
  intRandom: Integer;
begin
  Randomize();

  intRandom := Random(1000);
  spRandom := NUMBER_PROCS[intRandom and 1 = 0];

  ShowNumberInfo(spRandom, intRandom);
  ReadLn;
end.

1 użytkowników online, w tym zalogowanych: 0, gości: 1