Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Phänomen (zumindest für mich) mit Showmessage (https://www.delphipraxis.net/52235-phaenomen-zumindest-fuer-mich-mit-showmessage.html)

padavan 25. Aug 2005 20:38


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;

GuenterS 25. Aug 2005 21:26

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