![]() |
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 |
Re: fehler in Delphi 7 bzgl Listbox?!
Mist,
mit meiner Freude war ich zu schnell, der Fehler trat erst nicht mehr auf, aber dann irgendwie hab ich ihn trotzdem wieder zum Abstürzen gebracht. :cry: Frage an Mütze1 wäre also: Kannst du mir mal eine Beispielzeile zeigen, wie man den Integerwert einer selektierten Zeile bekommt? Danke schonmal |
Re: fehler in Delphi 7 bzgl Listbox?!
Moin!
Da MultiSelect mehr als eine selektierte Zeilen haben kann, gibt dir der folgende Code immer den Index des ersten selektierten Eintrages zurück, oder -1 wenn keiner selektiert ist.
Delphi-Quellcode:
MfG
Function TForm1.GiveMeSelectedOne: Integer;
Var i : Integer; Begin If ( ListBox1.SelCount < 1 ) Then Result := -1 Else For i := 0 To Pred(ListBox1.Items.Count) Do If ( ListBox1.Selected[i] ) Then Begin Result := i; Break; End; End; Muetze1 |
Re: fehler in Delphi 7 bzgl Listbox?!
Hallo Mütze1,
nochmal danke für deine Bemühungen, aber ich werde den Gedanken nicht los, das ich doch irgendwie einen Bug in meinem Programm habe, der auf Delphi oder Windows beruht. Habe jetzt den dritten Lösungsansatz benutz, aber es ist immernoch möglich den Fehler zu generieren.
Delphi-Quellcode:
Warum auch immer, kommt manchmal die Exception und trotzdem hat die Listbox dann einen Fehler.
Function TForm1.GiveMeSelectedOne: Integer;
Var i : Integer; Begin If (ListBox1.SelCount < 1) Then Result := -1 Else For i := 0 To Pred(ListBox1.Items.Count) Do If (ListBox1.Selected[i]) Then Begin Result := i; Break; End; End; procedure TForm1.PB_Move_title_to_topClick(Sender: TObject); var y: integer; begin if (Listbox1.SelCount = 1) and (Listbox1.ItemIndex >= 0) then begin try listbox1.Items.Move(Givemeselectedone,wishes); Wishes := Wishes + 1;// inc(wishes); LEDDisplay_wishes.Value := wishes; except Showmessage('error'); end; end; end; (*****************) Eigenartigerweise hat´s auch hier wieder eine Weile funktioniert und dann auf einmal wieder nicht. Ich verstehs einfach nicht. Benutze ich statt der Variable Wishes einfach nur die 0 klappt´s. Benutze ich ne Variable, welche immer mindestens 0 oder größer ist, kracht´s ab und zu. Habe mich langsam damit abgefunden. Vielleicht sollte ich umsatteln auf eine andere Komponente. Anstatt einer Listbox lieber eine Listview??!?!! Ein Programmierer bei uns in der Firma sagte mir, es wäre denkbar, dass die Listbox wirklich von Windowsseiten Fehlerbehaftet ist. Sie ist ja nun auch schon lange im Geschäft - seit Win 3.11 ?! Padavan |
Re: fehler in Delphi 7 bzgl Listbox?!
Hast du schonmal ein paar Breakpoint gesetzt, um zu schauen, welche Werte den Codeabschnitt zum Absturz bringen ?
( ![]() |
Re: fehler in Delphi 7 bzgl Listbox?!
Liste der Anhänge anzeigen (Anzahl: 1)
Nach langem Grübeln bin ich zu der Erkenntnis gelangt,
Vielleicht kannst du an meinem Code-Beispiel erkennen, was du falsch machst, denn ich glaube nicht an einen Fehler in der Listbox-Komponente. Kann aber auch sein, dass ich dein Problem nicht mal ansatzweise verstanden habe. Wer weiß. Grüße vom marabu |
Re: fehler in Delphi 7 bzgl Listbox?!
Moin!
Delphi-Quellcode:
Schon alleine bei diese Procedure: Kannst du dir immer 100%ig sicher sein, dass GiveMeSelectedOne und Wishes ordentliche Werte enthalten? Werden diese mit korrigiert, wenn du Elemente löscht?
procedure TForm1.PB_Move_title_to_topClick(Sender: TObject);
var y: integer; begin if (Listbox1.SelCount = 1) and (Listbox1.ItemIndex >= 0) then begin try listbox1.Items.Move(Givemeselectedone,wishes); Wishes := Wishes + 1;// inc(wishes); LEDDisplay_wishes.Value := wishes; except Showmessage('error'); end; end; end; MfG Muetze1 |
Re: fehler in Delphi 7 bzgl Listbox?!
zu jfheins,
mit Breakpoints habe ich eine Fehlersuche auch schon versucht, leider ohne Erfolg, denn wenn der Fehler auftritt schmiert nicht nur das Programm, sondern auch die IDE ab. Leider! zu mütze1, jo, wenn der Player ein Lied weiterspielt, dann wird natürlich an anderer Stelle dann die Variable wishes wieder um eins dekrementiert. Bis 0, dann ist schluss, sie kann nie kleiner als 0 werden, das ist mehrfach abgefangen. Zu marabu, sorry, ich habe die Informationen ziemlich Tröpfchenweise rausgelassen, und so weiß dann keiner so recht, was ich eigentlich will. Sorry, dass war keine Absicht und auch keine Berechnung. Ich habe einfach mal das Programm angehängt, dann kann man einfach mal schaun was ich da treibe - evtl. ist´s dann ganz schnell klar, was ich meine. Zur Beruhigung, falls das Programm abschmieren sollte, unter mindestens Win2000 ist es kein Problem den Task zu beenden, bei Win98 hab ich´s noch nicht versucht, also lasst es lieber..... Ist eine Zip-Datei mit allen Optionalen Featueres dabei, wer keinen Bock drauf hat, die Dreamplayer.exe allein reicht auch aus. PS: habe versucht einen Anhang an meine Antwort zu hängen, leider kommt dann eine Fehlermeldung beim Vorschau erstellen. Absenden geht auch nicht, deshalb kommt die Antwort erstmal so. Ich versuche es dann nochmal |
Re: fehler in Delphi 7 bzgl Listbox?!
2ter Versuch ging auch nicht. Ein Zip File mit etwa 1,8MB und 8 Dateien darin sollte doch eigentlich gehen, oder?
|
Re: fehler in Delphi 7 bzgl Listbox?!
Liste der Anhänge anzeigen (Anzahl: 1)
3ter Versuch
zwar nur die Doku, aber aus der sollte man es evtl. auch sehen können. Eigentlich hätte ich´s auch mal gerne vorgeführt, wo wir schon davon sprechen. :cry: |
Re: fehler in Delphi 7 bzgl Listbox?!
Leute,
ich bin so ein selten dämliches Ars..... Ich glaube ich hab en Fehler gefunden (zum dritten mal schon) Es war ein Klammerfehler. Habe nochmal geschaut, dort wo ich dafür sorge, dass wishes niemals kleiner 0 werden kann lag der Fehler. Nur unter bestimmten Bedingunen darf wishes dekrementiert werden, und ich hab´s durch einen Klammerfehler immer dekrementiert. Kein Wunder. Ist mir ziemlich peinlich, dass ich immer behauptet habe, dass sie auf keinen Fall kleiner 0 werden kann.... :oops: Es ist und bleibt so, das Problem sitzt vor dem Bildschirm. Sorry Leute und vielen vielen Dank für eure Unterstützung. (werde trotzdem nochmal versuchen, dass Zipfile anzuhängen, in der korrigierten Version natürlich) --> ne, geht net! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:26 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