Autor Beitrag
matze
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 4613
Erhaltene Danke: 24

XP home, prof
Delphi 2009 Prof,
BeitragVerfasst: Mo 01.11.04 20:25 
Hallo !
Ich habe folgendes Problem:

Ich habe eine Routine, die dynamisch recht viele kompos erzeugt. das sind unter anderem panels auf denen images liegen. Um diese images mit neuen bilder zu laden muss ich blöderweise die images erst freigeben und dann neu erstellen. da ich ein verschwinden und dann wieder neu erscheien der kompos vermeiden will, habe ich mir gedacht, ich lege erst ein array mit den alten kompos an, erstelle dann die neuen drüber, und nehme dann die alten kompos aus dem array und lösche sie.
so weit so schlecht: mein code:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
var compoloop:integer;
    old_compos : Array of Tcomponent;

for compoloop := 0 to componentcount - 1 do begin
   if TComponent(components[compoloop]).tag = 1 then begin
      setlength (old_compos,length (old_compos)+1);
      old_compos[high(old_compos)] := TComponent(components[compoloop]);
   end;
end;
dieser code lädt alle "alten" kompos in das array. löschen will ich die dann mit:
ausblenden Delphi-Quelltext
1:
2:
3:
for compoloop := 0 to length(old_compos)-1 do begin
   TComponent (old_compos[compoloop]).free;
end;
Da löscht er aber nur die erste Kompo und bringt dann ne Zugriffsverletztung.

Was habe ich denn da verbockt ??

_________________
In the beginning was the word.
And the word was content-type: text/plain.
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Mo 01.11.04 23:01 
Tipp: Nimm die TObjectList und setz die Eigenschaft OwnsObjects im Constructor auf True. Dann verwaltet die Object-List die Objekte für dich und gibt diese beim Löschen aus der Liste automatisch frei.

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
matze Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 4613
Erhaltene Danke: 24

XP home, prof
Delphi 2009 Prof,
BeitragVerfasst: Di 02.11.04 09:46 
cool. danke für den tipp.

_________________
In the beginning was the word.
And the word was content-type: text/plain.
Pille
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 105

Windows 7
DelphiXE Prof.
BeitragVerfasst: Di 02.11.04 12:52 
matze hat folgendes geschrieben:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
var compoloop:integer;
    old_compos : Array of Tcomponent;

for compoloop := 0 to length(old_compos)-1 do begin
   TComponent (old_compos[compoloop]).free;
end;
Da löscht er aber nur die erste Kompo und bringt dann ne Zugriffsverletztung.

Was habe ich denn da verbockt ??


Die Schleife muss von oben nach unten laufen, da beimn Löschen der ersten Komponente alle nachfolgenden einen Platz nach vorne rücken. Irgendwann landet dein Zähler dann hinter dem letzten Eintrag.

ausblenden Delphi-Quelltext
1:
2:
3:
for compoloop := length(old_compos)-1 downto 0 do begin
   TComponent (old_compos[compoloop]).free;
end;


mfg Pille
matze Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 4613
Erhaltene Danke: 24

XP home, prof
Delphi 2009 Prof,
BeitragVerfasst: Di 02.11.04 16:27 
NEIIIIIIIIIIIIIN :autsch:

_________________
In the beginning was the word.
And the word was content-type: text/plain.