Jak wypisać wartości zawarte w tablicy do TMemo
?
Napisz coś więcej - jakiego typu tablica, czy ilość elementów jest stała, jak chcesz to sformatować w Memo, co zrobić jeśli jakiś element tablicy jest pusty itp.
Zasadniczo to w pętli "przelatujesz" po tablicy, pobierasz po kolei każdy element i dodajesz/wypisujesz go tam, gdzie chcesz ;)
procedure Tmain.Button1Click(Sender: TObject);
var
Tablica: array[0..100] of Integer;
I: Integer;
begin
for I := Low(Tablica) to High(Tablica) do
Tablica[I] := I;
for I := Low(Tablica) to High(Tablica) do
Memo1.Lines.Add(I.ToString);
end;
Tak z ciekawości zaglądnąłem na forum i widzę, że beze mnie to tu cieniutko jest… więc przerywam milczenie. :]
Nie no żartuję, ale Panowie – pętlami to się 20 lat temu robiło… Od dawien dawna klasa TStringList
posiada metodę AddStrings
(sio do dokumentacji), która pozwala dodać do zawartości listy całą zawartość wejściowej macierzy. Przykładu w Delphi nie podam, bo nie mam jak tego sprawdzić, ale w Lazarusie (w trybie zgodności z Delphi) można to zrobić tak:
uses
SysUtils, Classes;
var
List: TStringList;
Values: TArray<String>;
begin
Values := TArray<String>.Create('foo', 'bar', 'bald');
List := TStringList.Create();
List.AddStrings(Values);
{..}
Oczywiście nic nie stoi na przeszkodzie, aby użyć zwykłej macierzy (o statycznym lub dynamicznym rozmiarze) i taką do tej metody przekazać. Tak więc poniższy przykład też powinien działać prawidłowo:
uses
SysUtils, Classes;
type
TValues = array of String;
var
List: TStringList;
Values: TValues;
begin
Values := TValues.Create('foo', 'bar', 'bald');
List := TStringList.Create();
List.AddStrings(Values);
{..}
Od dawna już dla macierzy dostępne są wygodniejsze konstrukcje niż SetLength
i pętle, których należy używać.
Niby się zgadzam, ale nie do końca.
Twój sposób jest OK, ale trzeba tworzyć jakieś nowe byty - Values := TValues.Create('foo', 'bar', 'bald');
.
Z pytania, które OP zadał wynika (a przynajmniej ja tak zrozumiałem), że posiada już jakąś tablicę, którą chce wpisać do kontrolki. Rozwiązanie z przeleceniem przez tablicę jest uniwersalne, niekoniecznie optymalne, ale należy też pamiętać o poziomie osoby pytającej, która niekoniecznie musi rozumieć (a także dostosować do swoich potrzeb) różne "nowoczesne patenty" ;)
Nie trzeba – oba dialekty pozwalają wykorzystać skonkretyzowany typ tablicy w miejscu jej tworzenia, tak jak pokazałem w przykładzie z generycznym TArray
. Przy czym Free Pascal w trybie {$MODE OBJFPC}
nie pozwala na taki zabieg obecnie, ale w najnowszym ”trunku” taka funkcjonalność została dodana, o czym poinformował mnie jeden z deweloperów kompilatora w jednej z dyskusji na temat generyków.
Tyle że różnica polegać będzie na konieczności użycia słówka specialize
:
uses
SysUtils;
var
Values: specialize TArray<String>;
begin
Values := specialize TArray<String>.Create('foo', 'bar', 'bald');
Druga sprawa jest taka, że w normalnych projektach nie powinno się używać takich dzikich typów danych, bo takie rozwiązanie nie jest elastyczne. Ale dla prostych aplikacji testowych taka funkcjonalność jest przydatna.
No, napisałem co miałem napisać – na razie. :D