Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   ItemIndex bleibt immer gleich, lösung? (https://www.delphipraxis.net/51881-itemindex-bleibt-immer-gleich-loesung.html)

mimi 21. Aug 2005 11:43


ItemIndex bleibt immer gleich, lösung?
 
Hallo,
habe ein komisches problem was ich einfach nicht lösen kann, seit wochen befasse ich mich jetzt schon damit. Kommme aber leider immer noch nicht weiter.
Hier ist der qullcode denn ich bis jetzt geschrieben habe:
(nur das notwendigste,wegen der übersicht)
Delphi-Quellcode:
{
  Erstellungs Datum : 31.07.2005
  updatet          : 21.08.2005
}
procedure TPlayliste_PLY.SetIndex(Index:Integer);
function isOk(Index:Integer):Boolean;
var
  ok:Boolean;
  str:String;
  i:Integer;
begin
  ok:=False;
  with Playliste do begin
    if M = ColorPlaying then begin
      if ColorIsStr <> '' then begin
        str:=GetValue(index,VC);
        for i:=1 to NumToken(ColorIsStr,';') do begin
          if (str <> 'clNone') and (GetToken(ColorIsStr,';',i) = str) then begin
            ok:=True;
            Break;
          end;
        end;
      end
      else
        ok:=True;
    end  
    else begin
      if m <> NonePlaying then begin
        if (m = isPlaying ) and (Pos('*',Strings[index]) > 0) then ok:=True; // Schon gespielt ?
        if (m = NoPlaying ) and (Pos('*',Strings[index]) =0) then ok:=True; // Noch nicht gespielt
      end
      else
        ok:=True;
    end;
  end;
  result:=ok;
end;

var
  r,m1:Integer;
begin
  r:=-1;

 if index = 1 then begin // Weiter
    r:=PlayIndex;
    repeat
      if r+1  <= Playliste.Count-1  then
        r:=r+1
      else
        r:=0;
    until isOK(r) = True;
  end;
 
  if Assigned(onChangeItem) then onChangeItem(r,index)
end;
// und anwenden tue ich es so:

procedure TForm1.ChangeItemIndex(Index,m1:Integer);
begin
  ListBox1.Selected[ListBox1.ItemIndex]:=False;
  ListBox1.Selected[Index]:=True;
  MusicListe.PlayIndex:=index;
end;
das problem ist: Ich habe eine playliste wo der erste eintrag übersprungen werden muss.
Wenn ich jetzt r+1 nehme ist der index immer einen eintrag zuweit d.h. ich habe hier eine liste:


1. Eintrag
2. Eintrag*
3. Eintrag
4. Eintrag*
5. Eintrag
und nun wenn ich nur die hörbaren abspielen möchte(hier *) ist er z.b. bei dem 3. item anstat dem 2. Item was letztendlich auch klar ist nur ich weiß nicht wie ich es lösen kann. ich habe versucht es mit -1 zuversuch nacher aber das bringt ja auch nichts.
ich kann ja nicht erst r+1 und dann wieder -1 nehmen....

Ich weiß leider keine lösung mehr :(

Flocke 21. Aug 2005 12:10

Re: ItemIndex bleibt immer gleich, lösung?
 
Das Array "Selected[]" und die Eigenschaft "ItemIndex" sind nicht dasselbe.

"ItemIndex" ist der Eintrag, der das Focus-Rechteck hat (den gepunkteten Rahmen). Es kann z.B. sogar sein, dass Selected[ItemIndex]=false ist. Beispiel:

Du klickst auf Zeile 2.
Du klickst mit gehaltener Strg-Taste auf die Zeilen 4, 6 und 8.
Jetzt sind die Zeilen 2, 4, 6, 8 markiert (-> Selected[2] = true).
Jetzt ist die letzte angeklickte Zeile ItemIndex ( 8 ).
Wenn du jetzt mit gehaltener Strg-Taste auf die Zeile 4 klickst, wird die Auswahl aufgehoben.
Jetzt sind die Zeilen 2, 6 und 8 markiert und der ItemIndex ist 4.

Wenn du immer nur eine Zeile markiert haben willst, dann kannst du das MultiSelect (heißt glaube ich so) abschalten.

marabu 21. Aug 2005 12:43

Re: ItemIndex bleibt immer gleich, lösung?
 
Manchmal liegt es auch einfach daran, dass der Index von 0 bis Pred(Count) läuft und nicht bei 1 beginnt.

Grüße vom marabu

mimi 21. Aug 2005 12:49

Re: ItemIndex bleibt immer gleich, lösung?
 
Ich wollte genre mehre makiert haben können, also habe ich es eingeschaltet aber das wusste ich soweit schon nur das mit ItemIndex war neu.... Selectet[ItemIndex] False sein kann.

aber das ist leider nicht das Problem:
bevor das ereignis ChangeItemIndex aufgerufen wird wird ja ItemIndex geändert von eine externen klasse.nämlich hier:
Delphi-Quellcode:
if index = 1 then begin // Weiter
    r:=PlayIndex;
    repeat
      if r+1  <= Playliste.Count-1  then
        r:=r+1
      else
        r:=0;
    until isOK(r) = True;
  end;
nur es muss eine zeile übersprungen werden weil in der erstenzeile speicher ich den zuletzt gepseicherten ItemIndex und den playstats(ob Play/Pause/Stop) ab.
und das problem ist bei r:=r+1 damit sage ich ja: das der index +1 genommen wird(passiert auch) aber nun soll er auf das item laden was das richtige(was den bedinungen erfüllt) ist. und da ist es immmer um ein zu weit und ich kann es einfnach nicht behbenen :( :( :(
@marabu
ja er fängt bei mir auch bei 0 an und nicht bei 1 so wie ich es in der hilfe gelesen habe macht Pred das gleiche wie -1 ist das richtig ?


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:39 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz