var array of string - problem z zapamiętaniem

0

Witam!

Miałem procedurkę:

procedure podmien(var S : array of string);
begin
 S[1]:='cos';
 ...
end;

Czyli jej zadaniem jest modyfikowanie tablicy przekazanej jako argument. Było ok. Ale postanowiłem procedurę tę przenieść do mojej klasy i nie chcę już jej przekazywać parametru. Chcę go przekazać przez konstruktor. No i mam problem, jak ją zapamiętać, by z później odwołując się do niej odwoływać się do źródła.

Inaczej mówiąc... oto fragment programu:

var P : array[0..10] of String;

procedure Podmien(var X : array of string);
begin
  X[1]:='XXX';
end;

procedure TfGlowny.Button1Click(Sender: TObject);
begin
  P[1]:='Test';
  Podmien(P);
  ShowMessage(P[1]);
end;

Powyższy przykład działa. Ale chciałbym w procedurze Podmien zapamiętać jakoś adres do tej tablicy w innej zmiennej i tą inną zmienną się posługiwać. Próbowałem tak:

procedure Podmien(var X : array of string);
var T : array of string;
begin
  T:=@X;
  T[1]:='XXX';
end;

ale nie działa :( Pomoże ktoś?

0

Może zamiast wskaźnika posłuż się definicją typu:

type
    P10String = T10String^;

    T10String = array[0..10] of string;

var P : T10String;

procedure Podmien(var X : T10String);
var T:P10String;
begin
  T:=@X;
  T[1]:='XXX';
end;

procedure TfGlowny.Button1Click(Sender: TObject);
begin
  P[1]:='Test';
  Podmien(P);
  ShowMessage(P[1]);
end;

Nie wiem, czy to zadziała, ale wygląda logicznie.

0

Nawet jeśli by zadziałało, to nie rozwiązuje do końca mojego problemu.

Bo ja mam uniwersalną klasę (w oddzielnym pliku z modułem) z której chcĘ korzystać w dowolnym miejscu programu. A w różnych miejscach programu wielkość tablicy którą przekazuję jest inna. W Twoim rozwiązaniu (nawet jeśli działa) musiałbym z góry okreslić wielkość obsługiwanej przez moją klasę tablicy. No a tak nie chcę.

Może ktoś ma inne pomysły?

0

Uzyj tablicy dynamicznej array of string i w create setlength(tablica,liczba);
Do tego w klasie mozesz wstawic taka tablice i po halasie

0

A tak BTW: w jakim właściwie celu chciałeś w procedurze Podmien zastosować inną zmienną?

Twój pomysł daban to chyba też nie to, o co chodzi - nie można przyrównywać tablic dynamicznych.

Mam za to inny pomysł: Użyj klasy TStringList. Można ją przyrównywać (jest klasą, a więc wskaźnikiem). Gdy chcesz dodawać kolejne linijki tekstu robisz po prostu tak:

 

procedure Costam;
var P:TStringList;

begin
     P.Add('text1');
     P.Add('text2');
end;

Czyli program wynikowy wyglądałby tak:


uses Classes;

var P : TStringList;

procedure Podmien(X : TStringList);
var T:TStringList;
      text:string;
begin
  T:=X;
  text:='XXX';
  if T.Count>=1 then T[0]:=text else T.Add(text);
end;

procedure TfGlowny.Button1Click(Sender: TObject);
begin
  P:=TStringList.Create;
  P.Add('Test');
  Podmien(P);
  ShowMessage(P[1]);
  P.Free;
end;

0
type 
  TStringArray = array of string;

procedure Podmien(Arr: TStringArray);
var
  i: Integer;
begin
  for i := Low(Arr) to High(Arr) do
    Arr[i] := xxx;
end;

albo StringList jak zaproponował SeaSoft

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