AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Fehlermeldung unerklärlich

Ein Thema von Naryxus · begonnen am 30. Sep 2011 · letzter Beitrag vom 4. Okt 2011
Antwort Antwort
Seite 1 von 3  1 23      
Naryxus

Registriert seit: 30. Sep 2011
6 Beiträge
 
#1

Fehlermeldung unerklärlich

  Alt 30. Sep 2011, 11:32
Hallo, ich habe ein größeres Problem bei dem ich einfach keine Lösung finde.
Erst mal allgemein: Ich habe...
  • eine ListView mit verschiedenen Elementen
  • eine Groupbox, die noch leer ist

Bei Klick auf ein Element der ListView (gelöst durch das Event "OnClick") soll genau dieses Element in der Groupbox als Label angezeigt werden (also die Caption des Elements). Dies habe ich durch folgende Prozedur gelöst:
Delphi-Quellcode:
procedure TForm1.ListView1Click(Sender: TObject);
var MyLabel:TLabel;
var labelname:string;
begin
  if(form1.ListView1.ItemFocused.Caption<>'') then //Prüfung ob ein Element angeklickt wurde
  begin
    MyLabel:=TLabel.Create(Form1);
    with MyLabel do begin
      Caption:=form1.Listview1.ItemFocused.Caption;
      labelname:=form1.Listview1.ItemFocused.Caption;
      Delete(labelname, 2, 1); //Bearbeitung der Caption für den Namen, da Sondezeichen enthalten
      name:='Label'+labelname;
      left:=10;
      top:=labelvar*20; //globale Variable, um die Labels untereinander anzuzeigen
      visible:=true;
      parent:=groupbox3;
      onClick:=loesche; //Prozedur, zu der ich noch komme
    end;
    labelvar:=labelvar+1;
    form1.ListView1.ItemFocused.Delete;
  end
end;
Mit dieser Prozedur wird also ein Label mit der Caption des Elements erzeugt und das Element selbst in der ListView gelöscht. Soweit funktioniert auch alles.

Probleme gibts jetzt aber bei der Prozedur zum Löschen der Labels. Allgemein soll die Prozedur beim Klicken auf das Label das Element der ListView wieder hinzugefügt werden und das Label wieder gelöscht werden. Das läuft durch folgende Prozedur:

Delphi-Quellcode:
procedure TForm1.loesche (Sender: TObject);
var fahrzeug, listenfahrzeug:string;
var listitem:TListItem;
var fahrzeugliste:array[0..5] of integer;
var i:integer;
begin
  fahrzeug:=(Sender as TLabel).Caption; //Caption des angeklickten Labels herausfinden
  listitem:=form1.ListView1.Items.Add; //Hinzufügen des Elements in die ListView
  listitem.Caption:=fahrzeug; //Caption des Labels als Caption des neuen Elements
  for i:=1 to form1.ListView1.Items.Count do begin //Im folgenden Block werden alle Elemente der ListView in einem Array gespeichert
    listenfahrzeug:=form1.ListView1.TopItem.Caption;
    delete(listenfahrzeug, 1, 2);
    fahrzeugliste[i]:=strtoint(listenfahrzeug);
    form1.Edit12.Text:=form1.Edit12.Text+listenfahrzeug+', ';
    form1.listview1.topitem.Delete;
  end;
  for x:=2 to i-1 do begin //Hier wird das Array dann sortiert von klein nach groß
    z:=fahrzeugliste[x];
    y:=x;
    while(y>1) and (fahrzeugliste[y-1]>z) do begin
      fahrzeugliste[y]:=fahrzeugliste[y-1];
      dec(y);
    end;
    fahrzeugliste[y]:=z;
  end;
  for x:=1 to i-1 do begin //Hier wird dann das geordnete Array wieder in die ListView eingefügt
    listitem:=form1.ListView1.Items.Add;
    listitem.Caption:='1/'+inttostr(fahrzeugliste[x]);
  end;
  (Sender as TLabel).Destroy; //Zuletzt wird dann das angeklickte Label wieder gelöscht
end;
Die Prozedur funktioniert an sich auch wunderbar, die ListView wird sortiert und richtig angezeigt.
Folgende Situationen habe ich durchgespielt:
  • ein Label wird gelöscht (funktioniert)
  • zwei Labels werden der Groupbox hinzugefügt und dann jeweils wieder gelöscht (funktioniert)

So weit, so gut. Füge ich jetzt aber drei Elemente der Groupbox hinzu, entstehen folgende Situationen:
  1. Löschen des ersten Labels (funktioniert)
  2. Anschließendes Anklicken des zweiten Labels (funktioniert nicht)
    1loesch2klick.jpg
  3. Anschließendes Anklicken des dritten Labels (funktioniert nicht)
    1loesch3klick.jpg

Genauso setzt sich das dann auch bei mehreren Elementen fort. Genauso auch, wenn man das erste Label nicht löscht, sondern gleich das zweite, dritte oder vierte Label anklickt.
Ich habe schon vermutet, dass es sich um irgendein Problem mit dem Namen des Labels handelt, wenn man mehr als ein Label erstellt. Allerdings müsste man dann noch die Anomalie bei zwei Labels erklären, dort funktioniert es nämlich, egal in welcher Reihenfolge man diese Labels anklickt, sie werden gelöscht und der ListView hinzugefügt.

Ich hoffe, ich konnte mein Problem einigermaßen klar darstellen und hoffe auf eure Hilfe,

mit freundlichen Grüßen, Naryxus
  Mit Zitat antworten Zitat
Alaitoc

Registriert seit: 24. Okt 2008
263 Beiträge
 
Delphi 7 Enterprise
 
#2

AW: Fehlermeldung unerklärlich

  Alt 30. Sep 2011, 11:45
Nun ich gehe einfach mal davon aus das du per OnClick auf das Label, dass Label löscht?
Edit: Gerade gesehen das du das wirklich tust. Daher solltest du das anders lösen, am Besten indem
du das Element vormerkst für die Freigabe und es dann erst freigegeben wird sobald der Zugriff nicht mehr vorhanden ist.
Da gibt es mehrere Möglichkeiten.

Das Problem ist, wenn ein Objekt per Event sich selbst löschen will...dann gibt es Zugriffsverletzungen weil
du versuchst etwas freizugeben obwohl du noch innerhalb des Events auf das Label zugreifst.

Außerdem bitte FreeAndNil() benutzen anstatt Destroy() und auch Überprüfen ob das Element überhaupt existiert mit Assigned().

MfG Alaitoc

Edit: Willkommen in der Delphi-Praixs!

Geändert von Alaitoc (30. Sep 2011 um 11:50 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.487 Beiträge
 
Delphi 7 Enterprise
 
#3

AW: Fehlermeldung unerklärlich

  Alt 30. Sep 2011, 11:53
Damit hat das nichts zu tun. Sondern eher hiermit:
for i:=1 to form1.ListView1.Items.Count do begin Bitte prüfe diese Schleife. Und debugge im Einzelschritt.
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.336 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Fehlermeldung unerklärlich

  Alt 30. Sep 2011, 11:57
Erst einmal herzlich willkommen.

Es ist etwas schwierig, die Abschnitte schnell zu durchblicken.
Mal ein paar Hinweise:

- Die Schleifen müssen ggf. von 0 bis Count-1 laufen.
- Du musst nicht vor jeden Variable "var" deklarieren.
- Du musst in einer Methode von Form1 nicht noch einmal "Form1."MyComponent schreiben.
- "(Sender as TLabel)" kannst Du auch einmalig einer Variable UseLabel zuweisen und damit arbeiten (das liest sich oft besser).
- Setze einen Haltepunkt und arbeite den Quelltext schrittweise ab (incl. Nutzung der überwachten Ausdrücke)

Dann solltest Du auf dem richtigen Weg sein.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Alaitoc

Registriert seit: 24. Okt 2008
263 Beiträge
 
Delphi 7 Enterprise
 
#5

AW: Fehlermeldung unerklärlich

  Alt 30. Sep 2011, 11:59
Sollte es da nicht auch zu Problemen kommen wenn ein Objekt sich selbst zerstört...? :/
Auch wenn es hier wirklich grad an was anderem liegt...

MfG Alaitoc
  Mit Zitat antworten Zitat
Naryxus

Registriert seit: 30. Sep 2011
6 Beiträge
 
#6

AW: Fehlermeldung unerklärlich

  Alt 30. Sep 2011, 12:02
Danke erst einmal für die schnellen Antworten.

Zitat:
Das Problem ist, wenn ein Objekt per Event sich selbst löschen will...dann gibt es Zugriffsverletzungen weil
du versuchst etwas freizugeben obwohl du noch innerhalb des Events auf das Label zugreifst.
Scheint für mich logisch, allerdings frage ich mich dann, warum das dann bei einem oder zwei Labels funktioniert, aber dann bei mehreren nicht mehr.

Zitat:
Damit hat das nichts zu tun. Sondern eher hiermit:
for i:=1 to form1.ListView1.Items.Count do begin Bitte prüfe diese Schleife. Und debugge im Einzelschritt.
Die Sache ist ja die, dass die Schleife eigentlich gar nichts mit der Löschung des Labels zu tun hat. Sie dient ja letztendlich nur zur Sortierung der ListView. Ich habe mal den kompletten Array-Sortierungsbereich auskommentiert und das Problem tritt immer noch auf.
  Mit Zitat antworten Zitat
Alaitoc

Registriert seit: 24. Okt 2008
263 Beiträge
 
Delphi 7 Enterprise
 
#7

AW: Fehlermeldung unerklärlich

  Alt 30. Sep 2011, 12:05
Zitat:
- Setze einen Haltepunkt und arbeite den Quelltext schrittweise ab (incl. Nutzung der überwachten Ausdrücke)
Ist wahrscheinlich der beste Tipp um dem Problem auf die Spur zu kommen. Geh einfach mal mit dem Debugger jeden einzelnen Punkt durch. Dann sollte sich schnell der Fehler herauskristalisieren.

MfG Alaitoc
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.487 Beiträge
 
Delphi 7 Enterprise
 
#8

AW: Fehlermeldung unerklärlich

  Alt 30. Sep 2011, 12:07
Am Label-Löschen liegt es nicht. Folgender Source funktioniert:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  MyLabel : TLabel;
  LabelName : string;
begin
  MyLabel:=TLabel.Create(Form1);
  with MyLabel do begin
    Caption:= DateTimeToStr(Now);
    labelname:= 'Label'+IntToStr(labelvar);
    Delete(labelname, 2, 1); //Bearbeitung der Caption für den Namen, da Sondezeichen enthalten
    name:='Label'+labelname;
    left:=10;
    top:=labelvar*20; //globale Variable, um die Labels untereinander anzuzeigen
    visible:=true;
    parent:=Form1;
    onClick:=loesche; //Prozedur, zu der ich noch komme
  end;
  labelvar:=labelvar+1;
end;

procedure TForm1.Loesche(Sender: TObject);
begin
  (Sender as TLabel).Destroy; //Zuletzt wird dann das angeklickte Label wieder gelöscht
end;
Bitte nimm doch den Vorschlag an, im Einzelschritt zu debuggen. Programmierer die nicht debuggen kommen in die Hölle (Steve McConnell)
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.537 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: Fehlermeldung unerklärlich

  Alt 30. Sep 2011, 12:08
Bitte nicht Destroy direkt aufrufen, sondern stattdessen Free verwenden. Aber das nur am Rande.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.336 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: Fehlermeldung unerklärlich

  Alt 30. Sep 2011, 12:11
Sollte es da nicht auch zu Problemen kommen wenn ein Objekt sich selbst zerstört...? :/
Auch wenn es hier wirklich grad an was anderem liegt...
MfG Alaitoc
Das muss nicht unbedingt problematisch sein. Zum Zeitpunkt der Click-Behandlung existiert das Objekt ja noch.
Nun wird es in der Click-Behandlung freigeben. Wenn darauf danach nicht mehr (innerhalb des Objektes und außerhalb darauf zugegriffen wird), macht das keine Probleme.
Und selbst wenn noch ein Zugriff auf die Speicherstelle erfolgt, liegen dort noch die bisherigen Objektdaten.
Ob es ein Problem gibt hängt dann letztlich von der genauen Implementierung ab.

Die Sache ist ja die, dass die Schleife eigentlich gar nichts mit der Löschung des Labels zu tun hat. Sie dient ja letztendlich nur zur Sortierung der ListView. Ich habe mal den kompletten Array-Sortierungsbereich auskommentiert und das Problem tritt immer noch auf.
Geh ein Problem nach dem anderen an und debugge schrittweise.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)

Geändert von stahli (30. Sep 2011 um 12:56 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 03:00 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