fehler in Delphi 7 bzgl Listbox?!
Hallo Delphianer,
kann es sein, dass es im Delphi einen echt krassen Bug gibt? (wahrscheinlich gibt es sowas, hätte aber nie gedacht, dass ein Amateur wie ich auf sowas stößt) Oder mache ich evtl. einen äußerst dummen Fehler? Folgendes: Habe eine Listbox in einem MP3-Player (ja sowas soll´s geben) in dem Titel stehen, welche dann abgearbeitet werden. Wenn ich jetzt zum Beispiel einen Titel irgendwo in der Liste ganz nach oben setzen will tat ich das immer so:
Delphi-Quellcode:
So hatte ich es geschafft, dass er den Titel in der Liste welchen man sich greift quasi dann an oberste Stelle setzt.
begin
listbox1.Items.Insert(0,listbox1.Items[listbox1.itemindex]); end; Wenn man jetzt aber mehrere Titel auswählte, so spielte er ja den als nächstes welchen man zuletzt gewählt hat. Das fand ich doof, also habe ich folgende Änderung vorgenommen:
Delphi-Quellcode:
Wishes zähl ich jetzt einfach mit jedem "wunsch des Hochsetztens" hoch.
var wishes: integer;
begin listbox1.Items.Insert(wishes,listbox1.Items[listbox1.itemindex]); end; Die Variable wishes macht nun scheinbar Ärger, denn manchmal (ich konnte noch nicht greifen, wann das passiert) gibt´s einen so krassen Fehler im Programm, dass es sich quasi total aufhängt. Es kommen irgendwelche eigenartige Meldungen "Zugriffsverletzung in Modul xy" usw. Ich habe beobachtet, dass er irgendwelche seltsamen Zeichen dann an oberste Stelle setzt. Also habe die Aktion mit Try Except gekapselt. Wenn dann der Fehler mal auftritt, löst die Exception auch aus, allerdings bringt´s nichts, denn danach kackt das Programm genauso ab, wie ohne Exception. Nebenbei habe ich die Variable wishes als Globale Variable extra auf 0 vorbefruchtet und auch im OnCreate Erreignis auch noch zu 0 beschrieben, da ich dem Vorbefruchten in der Deklaration nicht getraut habe. Ich konnte mir den Fehler nur so erklären, dass wishes einen Wert kleiner 0 hatte und deshalb der Fehler kam, aber das kann ich so eigentlich ausschließen. Bin für jeden Hinweis dankbar. Grüße Padavan |
Re: fehler in Delphi 7 bzgl Listbox?!
Zitat:
Delphi-Quellcode:
Bei Insert() müsstest du eigentlich bemerken, dass das Item kopiert wurde - üble Sache, wenn du Objekte an deine Strings angedockt hast.
with Listbox1 do Items.Move(ItemIndex, 0);
Grüße vom marabu |
Re: fehler in Delphi 7 bzgl Listbox?!
Moin!
Auch solltest du den Unterschied den du schon beobachtet hast, beachten: Bei MultiSelect gibt der ItemIndex immer nur die Zeile mit dem Fokus an und nicht zwangsweise die ausgewählte Zeile. Auch fragst du nicht ab, ob ItemIndex vielleicht -1 ist, was er durchaus sein kann, wenn keine Zeile einen Fokus hat. Nutze bei einer ListBox mit MultiSelect lieber die Selected[] Eigenschaft... MfG Muetze1 |
Re: fehler in Delphi 7 bzgl Listbox?!
also auf jeden Fall werde ich jetzt Move verwenden, warum ich das anders (umständlich) gemacht hab, kann ich gar nicht mehr sagen. (Habe das kopierte zwar anschließend gelöscht, damit ich nichts doppelt habe, aber das war trotzdem quatsch)
Aber das Listbox1.Itemindex = -1 sein könnte dürfte mit meinem Problem nichts zu tun haben, denn ich habe ja eine integervariable verwendet die auf keinen Fall kleiner 0 sein kann, da ich die Zahl von 0 aufwärts nur hoch- oder runterzähle, aber eben nur bis 0. Bleibt also die Frage, warum die Listbox sich so übel aufhängt. Ist zwar umständlich progammiert, sollte aber genauso funktionieren. (Werde dennoch auf Move umstellen, da´s einfach simpler ist). |
Re: fehler in Delphi 7 bzgl Listbox?!
Moin!
Zitat:
2. Du greifst direkt mit dem ItemIndex auf die Items-Eigenschaft zu - und da kommt es zu einem Problem wenn ItemIndex -1 ist. 3. Hast du die Bereichsprüfung (Projekt->Optionen->Compilereinstellungen->Bereichsprüfung) aktiviert? Wenn nicht, dann tue dies mal... MfG Muetze1 |
Re: fehler in Delphi 7 bzgl Listbox?!
Hallo padavan,
das einzige, was mit deinem zweiten Code-Fragment schief laufen kann, ist tatsächlich ein falscher Wert in der Variablen wishes, aber das führt bestimmt nicht zu einem Programmabsturz. Du musst an einer anderen Stelle noch viel Schlimmeres machen, die Folgen davon werden halt erst später bemerkt. Isoliere das Problem oder zeige mehr Code. Außerdem noch ein Tipp: deine Art eine Playlist zu sortieren ist originell, das interaktive Umstellen der Einträge könntest du aber konventioneller durch die beiden Befehle MoveUp() und MoveDown() bewerkstelligen. Die kannst du recht simpel mit der Methode Exchange() implementieren:
Delphi-Quellcode:
Grüße vom marabu
with Listbox do
Items.Exchange(ItemIndex, Succ(ItemIndex)); with Listbox do Items.Exchange(ItemIndex, Pred(ItemIndex)); |
Re: fehler in Delphi 7 bzgl Listbox?!
Integer -2147483648..2147483647
Cardinal 0..4294967295 Wenn du Cardinal nimmst merkst du wenigstens falls diese kleiner 0 ist :mrgreen: (anhand der Fehlermeldung) |
Re: fehler in Delphi 7 bzgl Listbox?!
Hallo Leute,
danke für die Rege Beteiligung. Also ich hoffe das ich keinen Denkfehler mache, aber ich verstehe einfach immernoch nicht, was meine Integervariable mit dem Absturz zu tun haben soll. Das sie kleiner 0 sein kann ist mir klar, aber ich benutze ja zum einfügen nicht den Listenindex, sondern einen Integerwert welchen ich ja von 0 begonnen hochzähle. Er kann also Programmtechnisch nicht kleiner 0 werden, habe mir das auch extra in einem Editfeld zum testen angeschaut. (Fehlersuche online quasi) Habe meinen Programmteil gemäß des Vorschlags von marabu auf move geändert, das hat aber nichts an dem Problem des Absturzes geändert. Was mich nur wundert liste ich jetzt nochmal kurz auf: Funktioniert: (ist nicht die gewünschte Funktion, stürzt aber nicht ab) ********************
Delphi-Quellcode:
ehemals so gelöst:
listbox1.Items.Move(listbox1.ItemIndex,0);
Delphi-Quellcode:
Funktioniert nicht: (davon ausgegangen, dass wishes nicht kleiner 0 sein kann, wie gesagt, hab´s getestet und ist Programmtechnisch "unmöglich", da ich von 0 ab hochzähle und wieder runter - aber eben nur bis 0)
listbox1.Items.Insert(0,listbox1.Items[listbox1.itemindex]);
listbox1.DeleteSelected; ********************
Delphi-Quellcode:
ehemals so gelöst:
listbox1.Items.Move(listbox1.ItemIndex,wishes);
Delphi-Quellcode:
listbox1.Items.Insert(wishes,listbox1.Items[listbox1.itemindex]);
listbox1.DeleteSelected; auf welche Weise ich es auch angehe, verwende ich die Wishes - Integervariable kommt´s gelegentlich zu abstürzen. kompletter Auschnitt des Programmteils zur Übersicht:
Delphi-Quellcode:
(Das ganze ist eine Prozedur aus einem PopMenuClick)
if Listbox1.SelCount = 1 then begin
try listbox1.Items.Move(listbox1.ItemIndex,wishes); Wishes := Wishes + 1;// inc(wishes); LEDDisplay_wishes.Value := wishes; except Showmessage('error'); // wird übrigens auch noch angezeigt wenn der Fehler kommt, aber danach schmiert´s trotzdem ab end; end; end; |
Re: fehler in Delphi 7 bzgl Listbox?!
Moin!
1. Da du MultiSelect der ListBox auf True hast, enthält ItemIndex immer das Element der ListBox mit dem Fokus-Rechteck. Dieses kann auch sehr gut mal nicht vorhanden sein, dann ist der ItemIndex -1. Diesen Fall hatte ich dir oben schon genannt und diesen Fall beachtest du immernoch nicht! 2. Wenn MultiSelect auf True ist, dann nutze die Eigenschaft Selected[] den selektierten Eintrag heraus zu finden und nicht ItemIndex. ItemIndex hat eine ganz andere Bedeutung! MfG Muetze1 |
Re: fehler in Delphi 7 bzgl Listbox?!
He Mütze1,
jetzt hab ich´s hingekriegt - vielen Dank! Frage jetzt auch auf Itemindex >= 0 ab und jetzt gibt´s keinen Absturz mehr. Aber auf selected abzufragen hab ich nicht hingekriegt. Ich hab´s zwar geschafft, dass er mir zurückgibt wenn ein bestimmeter Eintrag selektiert wurde als Bool, aber ich hab´s noch nicht geschafft das mir der Eintrag als Zahl zurückgebenen wird. Anhand der OH kann ich nicht erkennen wie die Syntax für diesen Fall sein soll. Trotzdem ist mein ursprüngliches Problem erstmal gelöst - Dank an alle |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:06 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