Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Zugriffsverletzung (https://www.delphipraxis.net/80643-zugriffsverletzung.html)

MiChiJong 12. Nov 2006 23:25


Zugriffsverletzung
 
Hallo miteinander,

Habe folgende Prozedur programmiert:
Delphi-Quellcode:
procedure TForm1.verschiebeTeilnehmer(tempzahl:String);
var
name: TNamenArray;
x: Integer;
temp: String;
begin
ShowMessage('Verschiebe T.');

//erniedrige Tempzahl um 1 (neuer Wert)
temp:=InttoStr(Strtoint(tempzahl)-1);
//Einlesen des Arrays mit den Editfeldnamen
name:=setArrays();
for x := 0 to 12 do
  begin
     TEdit(FindComponent(name[x] + tempzahl)).Top:=TEdit(FindComponent(name[x] + tempzahl)).Top-20;
     TEdit(FindComponent(name[x] + tempzahl)).Name:=name[x] + temp;
  end;
  //Positionsänderung der Checkboxen, Comboboxen und des Löschbuttons
  TCheckBox(FindComponent('mitglied' + tempzahl)).Top:=TCheckBox(FindComponent('mitglied' + tempzahl)).Top-20;
  TComboBox(FindComponent('kurs' + tempzahl)).Top:=TComboBox(FindComponent('kurs' + tempzahl)).Top-20;
  TComboBox(FindComponent('sportart' + tempzahl)).Top:=TComboBox(FindComponent('sportart' + tempzahl)).Top-20;
  TButton(FindComponent('loeschen' + tempzahl)).Top:=TButton(FindComponent('loeschen' + tempzahl)).Top-20;
  //Umbennen der Checkboxen, Comboboxen und des Löschbuttons
  TCheckBox(FindComponent('mitglied' + tempzahl)).Name:='mitglied' + temp;
  TComboBox(FindComponent('kurs' + tempzahl)).Name:='kurs' + temp;
  TComboBox(FindComponent('sportart' + tempzahl)).Name:='sportart' + temp;
  TButton(FindComponent('loeschen' + tempzahl)).Name:='loeschen' + temp;
Diese Funktion soll nichts anderes machen, als eine Reihe bei einer Reihe von zuvor definierter Elemente die Position und den Namen zu ändern, jedoch tritt immer mal wieder, (Mir kommt es zufällig vor) eine Warnung mit einem Zugriffsfehler auf.

Woran kann dies liegen. Wäre euch echt sehr dankbar, wenn ihr mir dambei weiterhelfen könnte.

Gruß Michael

mkinzler 13. Nov 2006 06:36

Re: Zugriffsverletzung
 
Ich würde die Komponent-Referenzen in einem Array verwalten und statt harten Casts wiche verwenden.

Cöster 13. Nov 2006 13:17

Re: Zugriffsverletzung
 
Was hat eine Zugriffsverletzung eigentlich mit der Art des Castings zu tun? Ich hatte so ein Problem nämlich auch mal, allerdings wurde es da behoben, als ich Soft Cast durch Hard Cast ersetzt hatte.

MiChiJong 13. Nov 2006 13:22

Re: Zugriffsverletzung
 
Die Frage stelle ich mir auch. Normalerweise sollte es sowohl mit hard- als auch softcast funktionieren. Bzw. macht dies erstmal keinen Unterschied und ist daher Geschmackssache.

DGL-luke 13. Nov 2006 13:39

Re: Zugriffsverletzung
 
Naja, ein Softcast schreit auf jeden fall sobald du einen zugriffsfehler machst.

SirThornberry 13. Nov 2006 13:47

Re: Zugriffsverletzung
 
Es hat nichts mit der Frage zu tun aber folgendes würde ändern da sonst 3 mal nach der Komponente gesucht wird (3 Schleifendurchläufe wo jedes mal die "Name"-Strings verglichen werden)
Delphi-Quellcode:
TEdit(FindComponent(name[x] + tempzahl)).Top:=TEdit(FindComponent(name[x] + tempzahl)).Top-20;
TEdit(FindComponent(name[x] + tempzahl)).Name:=name[x] + temp;
Delphi-Quellcode:
var
  lEdit: TEdit;
[...]
lEdit := TEdit(FindComponent(name[x] + tempzahl));
lEdit.Top := lEdit.Top - 20;
lEdit.Name := name[x] + temp;
Für die AV hab ich folgende Vermutung.
Ich gehe davon aus das du zur Designzeit die Komponenten erzeugst.
Wenn du dann einen Button namens "Button2" hast kannst du im Quelltext per "Button2." auf die Eigenschaften und methoden zugreifen. Wenn du jedoch den Namen von "Button2" änderst kannst du nicht mehr über "Button2." auf die Eigenschaften und Methoden zugreifen weil "Button2" dann "nil" ist.
Button2 ist also keine Referenz auf die Instanz sondern etwas besonderes.
Ich vermute also das du dann noch irgendwo auf "Button2" zugreifst nach dem du den Namen geändert hast.

Cöster 13. Nov 2006 14:09

Re: Zugriffsverletzung
 
Zitat:

Zitat von DGL-luke
Naja, ein Softcast schreit auf jeden fall sobald du einen zugriffsfehler machst.

Aber dann würde der Fehler doch nicht verschwinden, wenn man den Hardcast durch Softcast ersetzt (wie mkinzler gesagt hat), sondern erst Recht auftreten.

mkinzler 13. Nov 2006 14:18

Re: Zugriffsverletzung
 
Zitat:

Aber dann würde der Fehler doch nicht verschwinden, wenn man den Hardcast durch Softcast ersetzt (wie mkinzler gesagt hat), sondern erst Recht auftreten.
Aber an der richtigen Stelle. (Hier wohl egal). Meine Hauptanwort war aber das mit dem Array.


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:59 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz