Autor Beitrag
Frühlingsrolle
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2229
Erhaltene Danke: 415

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: Mo 22.05.17 17:48 
Hallo Forum

Problemstellung:
Interessehalber zu dem Thema hier habe ich etwas getestet und eine Reihe von TImage zur Laufzeit erzeugt.
Einzelne TImage sollen via TPopupMenu entfernt und/oder über einen Button gemeinsam gelöscht werden.
Wird ein einzelnes TImage freigegeben und im Anschluss alle auf einmal, gibt das eine Zugriffsverletzung, je nachdem welches Element zuvor gelöscht wurde, entweder auf die Adresse 0 oder ungleich 0 (FD.....).

Ich kann mit dem Assembler nichts anfangen aber kurz gesagt: Aus einem Array von 5 TImage, wird das 3. Element (einzeln) freigegeben. Im Anschluss sollen alle freigegeben werden, jedoch verschwinden nur die ersten 2 Elemente (3. Element ist bereits weg), Element 4 und 5 verbleiben auf dem Formular.

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
const
  BILDER_MAX = 5;

private
  Bilder: array[0..BILDER_MAX - 1of TImage;
  Bild: TImage;
  procedure BilderMouseDown(Sender: TObject; Button: TMouseButton;
    Shift: TShiftState; X, Y: Integer);

procedure TForm1.BilderErzeugenClick(Sender: TObject);
var
  i: Byte;
begin
  for i := 0 to BILDER_MAX - 1 do
  begin
    Bilder[i] := TImage.Create(self);
    Bilder[i].Top := 0;
    Bilder[i].Left := i * 105;
    Bilder[i].PopupMenu := PopupMenu1;
    Bilder[i].OnMouseDown := BilderMouseDown;
    Bilder[i].Parent := self;
  end;
end;

procedure TForm1.AlleBilderLoeschenClick(Sender: TObject);
var
  i: Byte;
begin
  for i := 0 to BILDER_MAX - 1 do
  begin
    //if Assigned(Bilder[i]) and (Bilder[i] <> nil) then
      FreeAndNil(Bilder[i]);
  end;
end;

procedure TForm1.EinzelnesBildLoeschenClick(Sender: TObject);
begin
  FreeAndNil(Bild);
end;

procedure TForm1.BilderMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  Bild := TImage(Sender);
end;

Am .Owner der TImage's scheint es auch nicht zu liegen. Er kann genauso gut Nil sein, macht keinen Unterschied, also was mache ich falsch?

_________________
„Politicians are put there to give you the idea that you have freedom of choice. You don’t. You have no choice. You have owners. They own you. They own everything." (George Denis Patrick Carlin)
jfheins
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 863
Erhaltene Danke: 142

Win7
VS 2013, VS2015
BeitragVerfasst: Mo 22.05.17 19:02 
Du setzt beim freigeben mit FreeAndnil nur die Variable "Bilder" auf nil. Wenn du bspw. das dritte Bild freigibst, ist Bilder zwar nil, in Bilder[2] steht aber noch der (jetzt ungültige) Verweis.

Baue einfach in die Prozedur EinzelnesBildLoeschenClick noch eine Schleife ein, die den Verweis auch aus dem Array löscht:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
procedure TForm1.EinzelnesBildLoeschenClick(Sender: TObject);
begin
  for i := 0 to High(Bilder)
    if Bilder[i] = Bild
      Bilder[i] = nil;

  FreeAndNil(Bild);
end;

Für diesen Beitrag haben gedankt: Frühlingsrolle
Frühlingsrolle Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2229
Erhaltene Danke: 415

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: Mo 22.05.17 19:25 
Dankeschön jfheins! Das klingt soweit verständlich.

Das Thema hat sich erledigt !!!

_________________
„Politicians are put there to give you the idea that you have freedom of choice. You don’t. You have no choice. You have owners. They own you. They own everything." (George Denis Patrick Carlin)
haentschman
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 285
Erhaltene Danke: 33


DX10 Berlin Professional
BeitragVerfasst: Di 23.05.17 17:32 
Hallöle... :P
Hat das einen tieferen Sinn das du die modernen Features nicht nutzt. :wink:
Anstelle des Array of TImage hätte ich eine TObjectlist<TImage> genommen. Erstens keine Beschränkungen in der Grösse bzw. Grösseneinstellung und keine Probleme mir der Freigabe der Images.
Alle Bilder löschen: entweder DELETE oder CLEAR oder mit der Listenfreigabe der Instanz FREE

...fertsch :P
Frühlingsrolle Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2229
Erhaltene Danke: 415

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: Di 23.05.17 20:13 
Danke für den Hinweis. Der Code soll unter Delphi7 funktionieren. Generics und Co. überlasse ich dem VisualStudio bzw. NET.

_________________
„Politicians are put there to give you the idea that you have freedom of choice. You don’t. You have no choice. You have owners. They own you. They own everything." (George Denis Patrick Carlin)
haentschman
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 285
Erhaltene Danke: 33


DX10 Berlin Professional
BeitragVerfasst: Mi 24.05.17 04:44 
Moin... 8)
Sorry...ich hatte Delphi 10.1 Starter in deinem Profil gelesen. :?
Frühlingsrolle Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2229
Erhaltene Danke: 415

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: Mi 24.05.17 06:38 
Macht nichts. Auch Delphi7 verfügt über eine TObjectList Klasse (uses Contnrs), jedoch ohne den spitzen Klammern, funktioniert dennoch gleich. Hätte man auch in der Testanwendung nutzen können, jedoch wäre es mehr Schreibarbeit gewesen, und auch nur dann vom Vorteil, wenn die Länge/Menge unbekannt wäre.

_________________
„Politicians are put there to give you the idea that you have freedom of choice. You don’t. You have no choice. You have owners. They own you. They own everything." (George Denis Patrick Carlin)