Moduły » System

SetLength

  • 2010-10-31 18:27
  • 3 komentarze
  • 715 odsłon
  • Oceń ten tekst jako pierwszy
SetLength
Moduł: System

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 komentarze

TomRiddle 2011-04-11 09:25

A jak tego używać w tablicy dwuwymiarowej?

Komorkowy_dzony 2007-03-27 20:52

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.

Adam Boduch 2006-01-11 13:12

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