Guten Abend Delphianer,
ich dreh echt fast durch, keine Ahnung was der große Manitu des Programmierens von mir will.
Unten folgende Routine soll doppelte Einträge aus einer Playlist schmeißen.
Tut sie auch, ABER:
Wenn kein doppelter Eintrag vorhanden ist, schmeißt sie trotzdem immer einen Eintrag raus.
Da dachte ich mir, ich Debugge die Sache mal mit Showmessage(..) und lass mir dabei gleich anzeigen was die Routine da so treibt.
Geholfen hat´s mir nichts, außer der Erkenntniss, dass wenn ich eine der beiden auskommentierten Zeilen "Scharf schalte" die Routine genau das macht was sie soll.
Kommentiere ich die die Zeilen wieder aus, habe ich den gleichen Bug wie vorher.
Die Showmessage(..)- Dinger verändern doch nichts, wie kann es sein, das sie Einfluss auf die Sache haben?
Hat die Anwendung während eine Message kommt, etwa Zeit die Variable "kill" ordentlich zu schreiben, oder so?
Ich verstehe das alles nicht.
Jemand ´ne Ahnung???
Delphi-Quellcode:
(* Doppelte Einträge raus! --> Playlist säubern *)
procedure TForm1.AbColBitBtn_PlaylistcleanClick(Sender: TObject);
var i,j: integer;
kill: bool;
killed: integer;
begin
if Listbox1.Count = 0
then showmessage('
No title there...')
else begin
if Application.messagebox('
Are you sure to delete several titles?','
Dreamplayerquestion',52) = 6
then begin
try
ProgressBar_Fortschritt.Visible := true;
ProgressBar_Fortschritt.Position := 0;
ProgressBar_Fortschritt.Max := Listbox1.Count;
screen.cursor := crAppstart;
killed := 0;
j := Listbox1.Count - 1;
repeat
if (getasynckeystate(vk_escape) <> 0)
then break;
Progressbar_Fortschritt.Position := j;
i := j - 1;
repeat
application.ProcessMessages;
if (getasynckeystate(vk_escape) <> 0)
then break;
if comparetext(Listbox1.Items[i], Listbox1.Items[j]) = 0
then begin
//showmessage(inttostr(j) + Listbox1.Items[j] + ' ' + inttostr(i) + Listbox1.Items[i]);
kill := true;
end else begin
dec(i);
end;
until (i = -1)
or (kill = true);
if (kill = true)
and (i > -1)
then begin
//showmessage(inttostr(j) + Listbox1.Items[j] + ' löscht ' + inttostr(i) + Listbox1.Items[i]);
Listbox1.Items.Delete(i);
inc(killed);
kill := false;
end else kill := false;
dec(j);
until j = 0;
//wenn nur noch ein Titel da, kann er nicht doppelt sein
Label_Message.caption := inttostr(killed) + '
Title(s) has been killed';
except
ProgressBar_Fortschritt.Visible := false;
screen.Cursor := crdefault;
end;
ProgressBar_Fortschritt.Visible := false;
Label_Titelanzahl_Anzeige.Value := Listbox1.Count;
screen.Cursor := crdefault;
end;
end;
end;