nazwa array jako zmienna

nazwa array jako zmienna
MR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 119
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ść

Kopiuj
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ć?

_13th_Dragon
  • Rejestracja: dni
  • Ostatnio: dni
2
Kopiuj
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 ...
ZD
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2310
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

Kopiuj
Function CzyIstniejeWTablicy(const arr: Array of string; const str: String);
...
if CzyIstniejeWTablicy(MyArray_imiona,'Ewa') then
woolfik
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1611
2
Kopiuj
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

flowCRANE
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Tuchów
  • Postów: 12269
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):

Kopiuj
type
  TNamedStringCollections = TDictionary<String, TStringList>;
GS
  • Rejestracja: dni
  • Ostatnio: dni
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

flowCRANE
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Tuchów
  • Postów: 12269
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.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.