SetLength
frickle
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ż:
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.