nazwa array jako zmienna

0

Mam kilka tablic array of string które są różnej długości
I chciałbym zrobić jedną funkcję, która w nazwie przyjmuje nazwę takiej tablicy jako string i wartość i sprawdza czy w takiej tablicy istnieje taka wartość

const 
  MyArray_elementy  : array  [0..2] of string = ('element 1','element 2','element 3');
  MyArray_imiona    : array  [0..3] of string = ('Adam','Ewa','Zosia','Kamil');

Function CzyIstniejeWTablicy(nazwa_tablicy, poszukiwana_wartosc : string):Boolean
var i:byte;
begin
  tutaj trzeba jakoś znaleźć tę tablicę po jej nazwie  

  tutaj będzie pętla po tablicy
end


if CzyIstniejeWTablicy('MyArray_imiona','Ewa') then

Wiem, że zamiast podawać tę tablicę jako string, lepiej od raz podać jej nazwę, problem w tym, że ja te dwie wartości muszę zapisać a później je odczytać i wtedy już mam je w stringu.
Da się tak zrobić?

2
type TMyArray:array[0..2] of String;

function CzyIstniejeWTablicy(const nazwa_tablicy:TMyArray;poszukiwana_wartosc:string):Boolean;
var I:Integer;
var Str:String;
begin
  for I:=Low(nazwa_tablicy) to High(nazwa_tablicy) do
  begin
    if nazwa_tablicy[i]=poszukiwana_wartosc then
    begin
      Result:=true;
      Exit;
    end;
  end;
  Result:=false;
end;

if CzyIstniejeWTablicy(MyArray_elementy,'Ewa') then ...
3

@_13th_Dragon:

Sądzę, że kolega jakiś XY wymyśla, tylko jaki ... słownik TDictionary ???

@My Razem:

Przeczuwam, że zaplatałeś się w myśleniu o języku, i chodzi od coś w rodzaju

Function CzyIstniejeWTablicy(const arr: Array of string; const str: String);
...
if CzyIstniejeWTablicy(MyArray_imiona,'Ewa') then
2
unit Unit1;

interface

uses
  Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, System.Generics.Collections;

type
  TTypeArrayOfString =  array  [0..3] of string;
  TMyDictArray = TDictionary<string,TTypeArrayOfString>;
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  strict private
    dict: TMyDictArray;
  private
    const
        MyArray_elementy  : TTypeArrayOfString = ('element 1','element 2','element 3','');
        MyArray_imiona    : TTypeArrayOfString = ('Adam','Ewa','Zosia','Kamil');
  public
    constructor Create(AOwner: TComponent);  override;
    destructor Destroy(); override;
  end;

var
  Form1: TForm1;

implementation


{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin

    dict.AddOrSetValue('MyArray_elementy',MyArray_elementy);
    dict.AddOrSetValue('MyArray_imiona',MyArray_imiona);

end;

procedure TForm1.Button2Click(Sender: TObject);
var
  d: TTypeArrayOfString;
  I: Integer;
begin
    dict.TryGetValue('MyArray_imiona',d);
    for I := 0 to Length(d) -1 do
        if d[i] = 'Ewa' then
            ShowMessage('HURRA');
end;

constructor TForm1.Create(AOwner: TComponent);
begin
    inherited Create(AOwner);
    dict := TMyDictArray.Create();
end;

destructor TForm1.Destroy;
begin
    dict.Free();
    inherited;
end;

end.

chociaż tu aż prosi się o TStringList i IndexOf lub IndexOfValue :) ale skoro pytacz chce na arrayach to ma

3

Myślę, że autorowi chodzi o to, aby użyć nazwy zmiennej jak ciągu znaków i na jej podstawie wybrać którąś tablicę do przeszukania. Odpowiedź jest prosta — tak się nie da. Zmienne nie posiadają nazw, które można by użyć z poziomu kodu tak jak zwykłe łańcuchy. I nie, RTTI też nie pomoże, bo ono dotyczy typów danych, nie identyfikatorów.

Jeśli chcesz identyfikować jakieś kolekcje łańcuchów na podstawie nazwy, to trzymaj je w obiektach typu TStringList, natomiast wszystkie listy trzymaj np. w słowniku, w którym kluczem jest nazwa kolekcji, a wartością referencja listy. Coś na kształt poniższego (pisane z palca):

type
  TNamedStringCollections = TDictionary<String, TStringList>;
1

I chciałbym zrobić jedną funkcję, która w nazwie przyjmuje nazwę takiej tablicy jako string

Tak się nie da. Twoja nazwa tablicy istnieje tylko w kodzie źródłowym

2

Zawsze można też rozszerzyć klasę TStringList i dodać do niej pole przechowujące nazwę listy (oraz właściwość). Można też nadpisać sobie metody, tak aby nazwa z dodatkowego pola była respektowana (np. przez metody LoadFromFile i SaveToFile). To pozwoli używać luźnych TStringList, bez wrzucania ich do słownika/mapy.

Możliwości jest od uja, przy czym najgorszą z nich jest zabawa dynamicznymi macierzami.

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