SetLength

frickle
SetLength
Moduł: System
```delphi procedure SetLength(var S; NewLength: Integer); ```

Procedura SetLength jak sama jej nazwa wskazuje służy do ustalania długości. Generalnie można nią ustawiać długość tablic dynamicznych (czyli takich które nie posiadają z góry ustalonej ilości pól) oraz zmiennych typu String czyli łańcuchów znaków.

Przykład:

var
 MojaTablica : array of integer; //zauważ że nie deklarujemy ilości pól
 i : integer; // pomocnicza zmienna do przykładu
begin
 SetLength(MojaTablica,100); //od teraz MojaTablica ma 100 elementów
 //a teraz przykładowe przypisanie wartości do pól
 for i:= 1 to 100 do
  begin
   MojaTablica[i-1] := i; // jako index podajemy i-1 ponieważ są one liczone od zera
  end;
end;

Jeżeli dane zawarte w tablicy są nam już niepotrzebne, możemy wyzerować ilość pól tablicy. Pamięć przydzielona tablicy zostanie zwolniona ale uwaga: wszystkie dane zawarte w tablicy zostaną utracone!!! Przykład:

SetLength(MojaTablica,0);

Często pojawia się też potrzeba dopisania jednej pozycji do tablicy. Przy umiejętnym połączeniu instrukcji SetLength() z funkcją High możemy nie głowić się ile pól już znajduje się w tablicy i bezpiecznie dodać jedno.

procedure DodajElementDoTablicy(ElementDoDodania : integer);
begin
 SetLength(MojaTablica,high(MojaTablica)+2);
 // przy funkcji high dodajemy 2, ponieważ zwraca ona wartość ostatniego indeksu
 // czyli pomniejsza ilość elementów o 1, a my chcąc powiększyć o 1 musimy dodać 2
 MojaTablica[high(MojaTablica)] := ElementDoDodania;
 // Tutaj jako indeks podajemy wartość zwróconą przez funkcję high ponieważ
 // Tablica już została powiększona i interesuje nas ostatni indeks
end;

W ten sam sposób możemy usunąć ostatni element tablicy pomijając "dwójkę" w instrukcji:

SetLength(MojaTablica,high(mojaTablica);

Ponieważ funkcja High zwraca indeks ostatniego elementu, to jest on o 1 mniejszy od ilości elementów. Przy takim zastosowaniu, tablica zostanie pomniejszona o jeden element.

Taki sam mechanizm obowiązuje przy ustalaniu długości zmiennych typu string jednak stosowanie tej instrukcji do tego typu ma raczej ograniczone zastosowanie.

Zobacz też:

3 komentarzy

A jak tego używać w tablicy dwuwymiarowej?

a ja nie widzę tutaj kopiowania elemntów tablicy bo setlength przecież usuwa indeksy i trzeba je od nowa przypisać, chyba ze nowsze wersje delphi to omijaja

procedure dodaj_rekord(var baza : tPLIK_BAZYDANYCH; rekord : trekord);
var
TEMP : tPLIK_BAZYDANYCH;
i:integer;
begin
setlength(TEMP.DANE,baza.zasieg+1);
for i:=0 to high(baza.dane) do temp.dane[i] := baza.dane[i]; //jak cos to to musze rozbudowac jak nie bedzie dzialalo
temp.dane[high(temp.dane)] := rekord;

setlength(baza.DANE,length(temp.dane));

for i:=0 to high(temp.dane) do baza.dane[i] := temp.dane[i];

baza.zasieg := length(baza.DANE);

end;

tak poprawnie się dodaje.

Stosujemy reguły ustalone w tekście "Zasady redagowania artykułów". Polecam zajrzeć do Pomocy.