SetLength


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ż:

Informacje
Ostatnia modyfikacja 11-01-2006 13:11 Ostatni autor Adam Boduch
Ilość wyświetleń 11404 Wersja 2
Komentarz
Komorkowy_dzony dnia 27-03-2007 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 dnia 11-01-2006 13:12
Stosujemy reguły ustalone w tekście "Zasady redagowania artykułów". Polecam zajrzeć do Pomocy.

Katalog
Copyright © 2000-2006 by Coyote Group 0.9.3-pre3
Czas generowania strony: 0.0564 sek. (zapytań SQL: 11)