Einzelnen Beitrag anzeigen

padavan

Registriert seit: 12. Jan 2005
271 Beiträge
 
Delphi 7 Enterprise
 
#1

Phänomen (zumindest für mich) mit Showmessage

  Alt 25. Aug 2005, 21:38
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;
  Mit Zitat antworten Zitat