![]() |
Phänomen (zumindest für mich) mit Showmessage
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; |
Re: Phänomen (zumindest für mich) mit Showmessage
Warum Dein Programm mit der Messagebox funktioniert und warum ohne nicht kann ich Dir nicht sagen.
Ich frage mich nur warum Du das so kompliziert machst, da gäbs doch eine viel elegantere Lösung...
Delphi-Quellcode:
procedure CleanList(aListBox: TListBox);
var i: integer; lTempList: TStringList; begin if (aListBox <> nil) then begin lTempList := TStringList.Create; try aListBox.Items.BeginUpdate; try for i := 0 to aListBox.Items.Count - 1 do if (lTempList.IndexOf(aListBox.Items[i]) = -1) then //IndexOf liefert -1 wenn nicht gefunden lTempList.Add(aListBox.Items[i]); aListBox.Items.Clear; aListBox.Items.AddStrings(lTempList); finally aListBox.Items.EndUpdate; end; finally lTempList.Free; end; end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:01 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