Jak odwołać się do tablicy po przez jej nazwę ze stringa?

0

Tak jak w pytaniu, Jak odwołać się do tablicy po przez jej nazwę ze stringa i czy to jest wykonywalne poniżej przedstawiam o co dokładnie mi chodzi:

Const
  Tabela1: array[0..1] of string = ('a','b');
Var
  X,Y : integer;
Begin
  For X := 0 to Length('Tabela'+IntToStr(Y))-1 do
    (...)

Procedura Length zwróci mi wartość 7 a ja bym chciał aby zwracała wartość tablicy czyli 2 czy jest to wykonywalne?

0
For X := Low(Tabela1) to High(Tabela1) do 
0

Przede wszystkim poczytaj do czego służy funkcja Length w przypadku łańcuchów tekstu to będziesz wiedział dlaczego zwraca Ci ona w tym przypadku wartość siedem. Do zmiennych można odwołać się tylko po nazwie zmiennej, a iterować po tablicy to da się tak jak napisał @pytek_. Można też oczywiście zrobić jako końcowy warunek pętli for po prostu Length(Tablica) - 1. Natomiast dla komponentów, pod VCL jeżeli to konieczne można się odwołać przez funkcję FindComponent('WartoscWlasnosciName'). A wątek przenoszę do działu Newbie i tam na przyszłośc zadawaj pytania o takie banalne podstawy.

0

Nie wiem jak zrobić, aby string np. 'Tablica1', po jakiejś konwersji czy rzutowaniu, stał się identyfikatorem tablicy Tablica1, ale proponuję użyć tablicy tablic, np.:

Const
  Tabela: array[1..5] of array[0..1] of string = (('a','b'),  //tablica1
                                                  ('c','d'),  //tablica2
                                                  ('e','f'),  //tablica3
                                                  ('g','h'),  //tablica4
                                                  ('i','j')); //tablica5
Var
  X,Y : integer;

  Y:=2; //dozwolone wartości [1..5]
  For X:=0 to Length(Tabela[Y])-1 do
    ShowMessage('Element '+IntToStr(X)+' tablicy'+IntToStr(Y)+' to: "'+Tabela[Y][X]+'"');
 
0

Wiem bardzo dobrze dlaczego Length zwraca mi 7 i znam funkcje Low / High. Tablice wielowymiarowe odpadają, muszę wpaść na inny pomysł jak to rozwiązać.

A pytanie dotyczyło w sumie samego Delphi-ego - byłem ciekaw czy są jakieś wstawki tak aby string czyli 'tablica1' stała się identyfikatorem Tablica1 podczas kompilacji

Const a = 'Tab'; b = 'lica1'; -> a+b -> zamiana na identyfikator Tablica1 ->** Niewykonywalne**

0

Co ty za cuda tworzysz?

0

@Rafał D: jest wykonalne, ale jedyne co przychodzi mi do głowy to takie dwa sposoby pokazane poniżej:
Pod VCL z użyciem formatki.

//...
type
  TMYTable = array[0..1] of string;
  TUseYourBrain = class(TComponent)
  private
    FTable : TMYTable;
  public
    constructor Create(AOwner : TComponent); override;
    property Table : TMyTable read FTable;
  end;

constructor TUseYourBrain.Create;
const
  C_Table : TMYTable = ('a', 'b');
begin
  inherited create(AOwner);
  FTable := C_Table;
end;

procedure TForm1.Button1Click(Sender : TObject);
var
  Foo, Bar : TUseYourBrain;
begin
  Foo := TUseYourBrain.Create(Self);
  Foo.Name := 'Test';
  Bar := TUseYourBrain(FindComponent('Test'));
  if Bar <> nil then
  begin
    Caption := Bar.Table[0];
  end;
  Foo.Free;
end;
//...

Z użyciem modułów VCL, pod aplikacją bez formatki.

//...
{$APPTYPE GUI}

uses
  Classes, Controls, Dialogs, SysUtils;

var
  TablesList : TList;

type
  TMYTable = array[0..1] of string;
  TUseYourBrain = class(TComponent)
  private
    FTable : TMYTable;
  public
    constructor Create(AOwner : TComponent); override;
    property Table : TMyTable read FTable;
  end;

constructor TUseYourBrain.Create;
const
  C_Table : TMYTable = ('a', 'b');
begin
  inherited create(AOwner);
  FTable := C_Table;
  if TablesList = nil then
  begin
    TablesList := TList.Create;
  end;
  TablesList.Add(Self);
end;

function MyFindComponent(AName : string) : TComponent;
var
  I : integer;
begin
  Result := nil;
  for I := 0 to TablesList.Count - 1 do
  begin
    if SameText(TComponent(TablesList[I]).Name, AName) then
    begin
      Result := TablesList[I];
      Break;
    end;
  end;
end;

var
  Foo, Bar : TUseYourBrain;
begin
  Foo := TUseYourBrain.Create(nil);
  Foo.Name := 'Test';
  Bar := TUseYourBrain(MyFindComponent('Test'));
  if Bar <> nil then
  begin
    ShowMessage(Bar.Table[0]);
  end;
  Foo.Free;
end.

Co i tak nie zmienia faktu, że gydbyś bardzo chciał to jednak zrobić tylko w WinAPI to musiał byś raczej samodzielnie zaimplementować jakąś listę lub tablicę z komponentami. W ogóle nie wiem po co takie kombinacje. Przecież można faktycznie trzymać to wszystko w tablicy tablic, tak jak już byłó tutaj wspomniane. Konstruktorzy środowiska nie przewidzieli dla potrzeby tworzenia tablicy znalezienia jej po nazwie. To nazwa zmiennej jest - no właśnie adekwatną nazwą. Dlatego jeżeli coś ma być znajdywane po indeksie to albo tablice albo jakaś lista. A jeśli po nazwie, to raczej chyba takim sposobem, jak pokazałem powyżej. Może ktoś jeszcze coś tutaj lepszego doradzi. Chociaż nie wiem, czy zamiast kodować, nie zawracasz sobie głowy pierdółkami. I czy takie kombinacje są w ogóle tego warte :/

2

Nazwy tablic np. "Tabela1" są usuwane podczas kompilacji i zamieniane na adres - ta informacja jest po prostu gubiona. Może pośrednim rozwiązaniem okażą się tablice asocjacyjne w delphi

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