![]() |
Fehlermeldung unerklärlich
Liste der Anhänge anzeigen (Anzahl: 2)
Hallo, ich habe ein größeres Problem bei dem ich einfach keine Lösung finde.
Erst mal allgemein: Ich habe...
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:
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.
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; 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:
Die Prozedur funktioniert an sich auch wunderbar, die ListView wird sortiert und richtig angezeigt.
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; Folgende Situationen habe ich durchgespielt:
So weit, so gut. Füge ich jetzt aber drei Elemente der Groupbox hinzu, entstehen folgende Situationen:
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 |
AW: Fehlermeldung unerklärlich
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! :) |
AW: Fehlermeldung unerklärlich
Damit hat das nichts zu tun. Sondern eher hiermit:
Delphi-Quellcode:
Bitte prüfe diese Schleife. Und debugge im Einzelschritt.
for i:=1 to form1.ListView1.Items.Count do begin
|
AW: Fehlermeldung unerklärlich
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. |
AW: Fehlermeldung unerklärlich
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...:oops: MfG Alaitoc |
AW: Fehlermeldung unerklärlich
Danke erst einmal für die schnellen Antworten.
Zitat:
Zitat:
|
AW: Fehlermeldung unerklärlich
Zitat:
MfG Alaitoc |
AW: Fehlermeldung unerklärlich
Am Label-Löschen liegt es nicht. Folgender Source funktioniert:
Delphi-Quellcode:
Bitte nimm doch den Vorschlag an, im Einzelschritt zu debuggen. Programmierer die nicht debuggen kommen in die Hölle (Steve McConnell)
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; |
AW: Fehlermeldung unerklärlich
Bitte nicht Destroy direkt aufrufen, sondern stattdessen Free verwenden. Aber das nur am Rande.
|
AW: Fehlermeldung unerklärlich
Zitat:
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. Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:57 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