Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi fehler in Delphi 7 bzgl Listbox?! (https://www.delphipraxis.net/45317-fehler-delphi-7-bzgl-listbox.html)

padavan 4. Mai 2005 07:20


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:
begin
  listbox1.Items.Insert(0,listbox1.Items[listbox1.itemindex]);
end;
So hatte ich es geschafft, dass er den Titel in der Liste welchen man sich greift quasi dann an oberste Stelle setzt.
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:
var wishes: integer;
begin
  listbox1.Items.Insert(wishes,listbox1.Items[listbox1.itemindex]);
end;
Wishes zähl ich jetzt einfach mit jedem "wunsch des Hochsetztens" hoch.
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

marabu 4. Mai 2005 07:46

Re: fehler in Delphi 7 bzgl Listbox?!
 
Zitat:

Zitat von padavan
Wenn ich jetzt zum Beispiel einen Titel irgendwo in der Liste ganz nach oben setzen will tat ich das immer so:

Delphi-Quellcode:
begin
  listbox1.Items.Insert(0,listbox1.Items[listbox1.itemindex]);
end;

Kennst du schon die Methode Move()?

Delphi-Quellcode:
with Listbox1 do Items.Move(ItemIndex, 0);
Bei Insert() müsstest du eigentlich bemerken, dass das Item kopiert wurde - üble Sache, wenn du Objekte an deine Strings angedockt hast.

Grüße vom marabu

Muetze1 4. Mai 2005 08:05

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

padavan 4. Mai 2005 10:08

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).

Muetze1 4. Mai 2005 11:18

Re: fehler in Delphi 7 bzgl Listbox?!
 
Moin!

Zitat:

Zitat von padavan
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.

1. Integer als Typ kann negativ werden.
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

marabu 4. Mai 2005 11:20

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:
  with Listbox do
    Items.Exchange(ItemIndex, Succ(ItemIndex));

  with Listbox do
    Items.Exchange(ItemIndex, Pred(ItemIndex));
Grüße vom marabu

TeronG 4. Mai 2005 11:43

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)

padavan 9. Mai 2005 13:57

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:
listbox1.Items.Move(listbox1.ItemIndex,0);
ehemals so gelöst:
Delphi-Quellcode:
listbox1.Items.Insert(0,listbox1.Items[listbox1.itemindex]);
listbox1.DeleteSelected;
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)
********************

Delphi-Quellcode:
listbox1.Items.Move(listbox1.ItemIndex,wishes);
ehemals so gelöst:
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:
  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;
(Das ganze ist eine Prozedur aus einem PopMenuClick)

Muetze1 9. Mai 2005 17:33

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

padavan 10. Mai 2005 07:53

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

padavan 10. Mai 2005 08:00

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

Muetze1 10. Mai 2005 09:04

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:
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;
MfG
Muetze1

padavan 15. Mai 2005 12:23

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:
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;
(*****************)
Warum auch immer, kommt manchmal die Exception und trotzdem hat die Listbox dann einen Fehler.
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

jfheins 15. Mai 2005 12:34

Re: fehler in Delphi 7 bzgl Listbox?!
 
Hast du schonmal ein paar Breakpoint gesetzt, um zu schauen, welche Werte den Codeabschnitt zum Absturz bringen ?

(Debugging-Tutorial by MaBuSE)

marabu 15. Mai 2005 17:12

Re: fehler in Delphi 7 bzgl Listbox?!
 
Liste der Anhänge anzeigen (Anzahl: 1)
Nach langem Grübeln bin ich zu der Erkenntnis gelangt,
  • dass du eine Playlist in einer Listbox verwalten willst,
  • dass du diese Playlist sortieren möchtest, während sie gespielt wird,
  • dass nicht der beim Verschieben fokussierte Titel als nächstes gespielt werden soll.
Das positionsweise Schieben - aufwärts und abwärts - hatte ich dir ja schon an Herz gelegt, kam aber wohl nicht richtig an. Die Variable Wishes verstehe ich so, dass du deine Playlist in einen sortierten und einen nicht sortierten Bereich trennen willst, also zwei logische Listen in einer physischen. Nicht ausgesprochen intuitiv, aber auf jeden Fall originell. Damit das Abspielen nicht durch die Sortieraktionen gestört wird, musst du dir den aktuell gespielten Titel merken.

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

Muetze1 15. Mai 2005 18:30

Re: fehler in Delphi 7 bzgl Listbox?!
 
Moin!

Delphi-Quellcode:
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;
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?

MfG
Muetze1

padavan 17. Mai 2005 07:13

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

padavan 17. Mai 2005 07:15

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?

padavan 17. Mai 2005 07:30

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:

padavan 17. Mai 2005 07:38

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