AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi EAccessViolation bei Änderung von dynamischem Array
Thema durchsuchen
Ansicht
Themen-Optionen

EAccessViolation bei Änderung von dynamischem Array

Ein Thema von little_budda · begonnen am 5. Jan 2007 · letzter Beitrag vom 5. Jan 2007
Antwort Antwort
Benutzerbild von little_budda
little_budda

Registriert seit: 5. Mai 2006
Ort: Velbert
246 Beiträge
 
Delphi 2006 Professional
 
#1

EAccessViolation bei Änderung von dynamischem Array

  Alt 5. Jan 2007, 09:19
Hallo,

ich habe zwei dynamische Arrays deklariert
Delphi-Quellcode:
...
  aMyMainImages : array of Timage; // Oberer Symbolteil
  aMyBaseImages : array of Timage; // Unterer Symbolteil
...
Die Länge der Arrays setze ich mit folgendem Code.
Hierbei ist "iAnzAdressen" als Integer deklariert.
Delphi-Quellcode:
      
...
  setlength (aMyBaseImages, 0);
  setlength (aMyBaseImages, iAnzAdressen); // Zuweisen der Arraygrösse
  setlength (aMyMainImages, 0);
  setlength (aMyMainImages, iAnzAdressen); // Zuweisen der Arraygrösse
...
Klappt zuerst gut.
Wenn ich diesen Programmpunkt dann das zweite mal erreiche erhalte ich eine Exeption.
(EAccessViolation ... Zugriffsverletzung bei Adresse xxx ...)

Ich denke meine Frage ist ähnlich in diesem Thread,
aber die Antworten dort bringen mich nicht weiter.

Wenn ich bei Neuzuweisung der Arraygröße den Speicherbereich verändere,
wie kann ich meinem Zeiger dann sagen er soll bitte auch auf den neuen Bereich verweisen?

Oder kann ich ein dynamisches Array nachdem ich es mit eine Größe versehen
(angelegt) habe wieder löschen und neu anlegen?

Gruß Holger.

Holger
Glück findet sich nicht im Code
Gefahren werden ist nur solange schön wie man selbst nicht lenken möchte ...
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: EAccessViolation bei Änderung von dynamischem Array

  Alt 5. Jan 2007, 10:14
Ich glaube, hier stellt sich erstmal die Frage: Was machst du zwischenzeitlich mit deinen arrays?
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#3

Re: EAccessViolation bei Änderung von dynamischem Array

  Alt 5. Jan 2007, 10:19
Zitat von little_budda:
Oder kann ich ein dynamisches Array nachdem ich es mit eine Größe versehen
(angelegt) habe wieder löschen und neu anlegen?
Ja, das kannst du. Eine zuweisung über SetLength reserviert den nötigen Speicher. Jede weitere Zuweisung verkürzt oder verlängert das Array.
aus eigener erfahrung kann ich bestätigen, dass das auch ordentlich klappt. somit muß dein Fehler an einer anderen stelle stecken.

Gruß oki
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#4

Re: EAccessViolation bei Änderung von dynamischem Array

  Alt 5. Jan 2007, 10:22
Ich würde statt array of TImage ganz eindeutig zu der Kontainerklasse TComponentList raten.
Das vereinfacht das Handling und erweitert deine Möglichkeiten.
Du solltest wirklich keinen Gedanken an das dynamische Array mehr verschwenden.

Description

Use a TComponentList to store and maintain a list of components. TComponentList provides properties and methods to add, delete, rearrange, locate, access, and sort components. Like TObject List, TComponentList controls the memory of its components; unless the OwnsObjects property is set to False (or the components are removed with the Extract method), TComponentList frees its components when they are removed from the list or when the TComponentList instance is itself destroyed.

In addition, TComponentList tracks its components. Whenever a component is freed, TComponentList automatically updates itself by deleting the reference to the freed component and packing the list.
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von little_budda
little_budda

Registriert seit: 5. Mai 2006
Ort: Velbert
246 Beiträge
 
Delphi 2006 Professional
 
#5

Re: EAccessViolation bei Änderung von dynamischem Array

  Alt 5. Jan 2007, 11:10
Hallo,

1.
die Idee mit der Komponentenliste ist klasse.

Ich habe die Liste angelegt und meine esrte Grafik zugewiesen.
Delphi-Quellcode:
...
  myMainImage := timage.Create(frm_main);
  iObjectIndex := aMyMainImages2.Add(myMainImage);
...
Wie komme ich denn jetzt an die Eigenschaften meiner Grafik?
Mit folgendem nicht ...
  aMyMainImages2.items[iObjectIndex].left := 23; Könnte ich vielleicht ein Beispiel bekommen?


2.
Das Problem mit dem dynamischen Array habe ich auch mit einem TStringArray noch.
Auch hier bekomme ich eine Exeption wenn ich die Länge das zweite mal zuweise.


Gruß Holger.
Holger
Glück findet sich nicht im Code
Gefahren werden ist nur solange schön wie man selbst nicht lenken möchte ...
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#6

Re: EAccessViolation bei Änderung von dynamischem Array

  Alt 5. Jan 2007, 11:14
Zitat von little_budda:
Wie komme ich denn jetzt an die Eigenschaften meiner Grafik?
Mit folgendem nicht ...
  aMyMainImages2.items[iObjectIndex].left := 23;
Du brauchst den Cast-Operator:
Delphi-Quellcode:
  TImage(aMyMainImages2.items[iObjectIndex]).left := 23;
  // weniger Mutige schreiben
  (aMyMainImages2.items[iObjectIndex] as TImage).left := 23;
Wenn mehrere Aktionen geschehen sollen, dann lohnt sich eine lokale Variable:
Delphi-Quellcode:
var
   actImg : TImage;
begin
   actImg := TImage(aMyMainImages2.items[iObjectIndex]);
   actImg.Left := 23;
   actImg.Top := ...
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von little_budda
little_budda

Registriert seit: 5. Mai 2006
Ort: Velbert
246 Beiträge
 
Delphi 2006 Professional
 
#7

Re: EAccessViolation bei Änderung von dynamischem Array

  Alt 5. Jan 2007, 12:07
Hallo,

Die Variante mit der Komponentenliste ist oberklasse.
Ist auch wesentlich schneller als mit dem TImage-Array.

Mein Problem mit dem TStringArray habe ich auch umschifft.
Ich verwende nun einfach eine StringList.
Die reicht für meine Zwecke auch völlig aus.

Danke.

Gruß Holger.
Holger
Glück findet sich nicht im Code
Gefahren werden ist nur solange schön wie man selbst nicht lenken möchte ...
  Mit Zitat antworten Zitat
Benutzerbild von faux
faux

Registriert seit: 18. Apr 2004
Ort: Linz
2.044 Beiträge
 
Turbo Delphi für Win32
 
#8

Re: EAccessViolation bei Änderung von dynamischem Array

  Alt 5. Jan 2007, 12:19
Zitat von shmia:
Wenn mehrere Aktionen geschehen sollen, dann lohnt sich eine lokale Variable...
...oder ein with-Konstrukt:
Delphi-Quellcode:
with aMyMainImages2.items[iObjectIndex] as TImage do
begin
  Left := 23;
  Top := 12;
end;
Soll nicht heißen, dass eine Variante besser ist, sondern nur eine Alternative.

Grüße
Faux
Faux Manuel
Wer weiß, dass er nichts weiß, weiß mehr, als der der nicht weiß, dass er nichts weiß.
GoTrillian
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:17 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz