Jak dodać i usunąć elementy tab dynam

0

Stworzyłem Tablice dynamiczna w taki sposób [nie do konca dobry]
Wiec
var i: byte;
begin
for i:=0 to 3 do { tu zamiast 3 miło bym widział cos innego bardziej zmiennego zalezne od innej procedurki}
begin
SetLength(gracz1,length(gracz1)+1);
gracz1[High(gracz1)]:=Timage.Create(self);
gracz1[i].Parent:=self;
gracz1[i].Picture.LoadFromFile('c:\obraz.jpg');
gracz1[i].Visible:=true;
gracz1[i].Stretch:=true;
end;
No a moim problemem jest aby w czasie działania programu dodac obraz lub go usunąć... Każda nawet najmniejsza pomoc mile widziana. Z góry dziękuje...

0
for i := PozycjaKasowana to Length(Tablica) - 2 do Tablica[i] := Tablica[i+1];
SetLength(Tablica, Length(Tablica) -1);
0

Jeśli kolejność nie jest ważna, to szybciej jest:

Tablica[PozycjaKasowana]:=Tablica[High(Tablica)];
SetLength(Tablica,Pred(Length(Tablica)));

Nie zapomnij oczywiście o zwolnieniu obiektu przedtem :-)

0

Jeśli kolejność nie jest ważna, to szybciej jest:

Tablica[PozycjaKasowana]:=Tablica[High(Tablica)];
SetLength(Tablica,Pred(Length(Tablica)));

Nie zapomnij oczywiście o zwolnieniu obiektu przedtem :-)

Dzieki, bo kolejnosc nie jest akurat u mnie wazna
To jeszcze dwa pytanka:

  1. Jak dodac cos do takiej tablicy??
  2. Co jest lepsze przy zwolnieniu obiektu:
    var i: byte;
    begin
    for i:=0 to 3 do
    gracz1[i]:=nil //to czy to ponizej
    gracz1[i].Free;
    end;
    Zwolnienie obiektu zawsze musi byc nie tylko w dynamicznych tablicach...
0
  1. No jak jak dodać? Przecież dodawałeś w pierwszym poście :
SetLength(gracz1, length(gracz1)+1); //zwiększasz długośc tablicy dynamicznej o 1
gracz1[High(gracz1)]:=Timage.Create(self); //tworzysz w tym miejscu nowy obiekt
//itd itd
  1. Drugi sposób jest jedynie słuszny.
0
  1. Co jest lepsze przy zwolnieniu obiektu:
gracz1[i]:=nil 

//to czy to ponizej

To NIE zwalnia obiektu, tylko zeruje wskaźnik na obiekt. Obiekt zostaje i co gorsza już go nie zwolnisz (bo nie wiesz gdzie jest - wyzerowałeś wskaźnik)

gracz1[i].Free;

To zwalnia (aczkolwiek nie zeruje wskaźnika)
Czasem dobrze jest mieć wyzerowany (=nil) wskaźnik zwolnionego obiektu - można wtedy sprawdzić istnienie obiektu przez

 if gracz[i]=nil

lub if Assigned(gracz[i])

Należy zrobić
```delphi
gracz1[i].Free;
gracz1[i]:=nil;

albo

FreeAndNil(gracz1[i]);
</quote>

1 użytkowników online, w tym zalogowanych: 0, gości: 1