Announcement

Collapse
No announcement yet.

angewählte ListView-Position?

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • angewählte ListView-Position?

    Hallo Leute,<br>
    ich habe ein Listview mit dem ViewStyle vsReport. Nun möchte ich herausfinden, welche Position in der Liste der User angeklickt hat. Ich habe leider keine solche Property oder Methode gefunden. Kann mir jemand helfen?<br>
    Danke zum Voraus,<br>
    Gruss, Thomas

  • #2
    Hallo Thomas,<br>der selektierte Eintrag steht über ListView1.Selected zur Verfügung. Bevor Du die Selected Eigenschaft verwendest solltest Du immer prüfen, ob sie verschieden nil ist. <br>:-) Jens Schuman

    Comment


    • #3
      Hallo Jens,
      ich möchte nicht den Eintrag selber, sondern dessen Position, da ich bei den ersten und bei den letzten zwei einträgen eine Sonderbehandlung machen muss. Zudem wird die Liste laufend mit CustomSort sortiert

      Comment


      • #4
        Hallo Thomas,<br>dann verwende doch ListView1.Selected.Index. <br>:-) Jens Schuman

        Comment


        • #5
          Hallo Jens,

          Ich bin ebenfalls an der Frage interessiert.

          Ich verwende eine mehrspaltige TListView im vsReport-Modus. Die Liste soll periodisch aktualisiert werden. Jedes Mal wenn ich die Liste neu aufbaue, springt der Scrollbalken wieder ganz nach oben.

          Ich habe es so versucht:

          <b>procedure TForm.ListView1Click(Sender: TObject); var TopItem: TPoint; Name:String;<p>
          begin</b><p>
          topitem := listview1.TopItem.Position;<p>
          ...<p>
          <b>end;</b>

          <b>procedure TForm.Refresh;<p>
          begin<p></b>
          <p>...<p>
          ListView1.Scroll(topitem.x,topitem.y)<p>
          <b>end; </b>

          Problem: Beim Auslesen von ListView1.TopItem.Position bekomme ich den Wert (2|19), unabhängig wie ich nach unten 'gescrollt' habe. Ich habe gesehen, dass es unterschiedliche Befehle zum Auslesen der Position des oberst angezeigten TListItem in der TListView gibt. Ich verwende die TListView mit ViewStyle:=vsreport.

          Sebastia

          Comment


          • #6
            Hallo Sebastian,<br>mit der folgenden procedure kann Du das selektierte TListItem nach oben scrollen.<br>
            <pre><font size="1" face="Verdana">
            procedure TForm1.ScrollSelectedToTop;
            var
            TopRect : TRect;
            sRect : TRect;
            begin
            sRect:=ListView1.Selected.DisplayRect(drBounds);
            TopRect:=ListView1.TopItem.DisplayRect(drBounds);
            ListView1.Scroll(0,sRect.Top-TopRect.Top);
            end;</font>
            </pre>
            :-) Jens Schuman

            Comment


            • #7
              Hallo Jens,

              Vielen Dank für Deinen Input.

              Ich habe Deinen Code analog übernommen, aber die Komponente TListView (im vsReport) speicher unter der Variable TopRect.Top (TRect) vom .TopItem immer die Zahl 19, was dem allerersten Item entspricht - egal wie weit ich nach unten gescrollt habe.

              Ist das wohl ein Bug?

              Sebastia

              Comment


              • #8
                Hallo Sebastian,<br>keine Ahnung, ob es sich um einen Bug handelt. Da der Code genau das macht was ich möchte, ist mir das auch nicht so wichtig. <br>:-) Jens Schuman

                Comment


                • #9
                  Hi Sebastian,<br>
                  <br>
                  das mit Deinem Ergebnis von 19 für TopItem.DisplayRect(drBounds).Top ist kein Bug.<br>
                  Schalte mal ShowColumnsHeader auf False und Du erhältst immer 2, da der Header immer eine<br>
                  Höhe von 17 hat.<br>
                  Vermutlich (ich habe das nicht ausprobiert) erhältst Du diesen Wert (die 2) wenn Du<br>
                  GetSystemMetrics(SM_CYBORDER) aufrufst (Doku siehe Win32 SDK in der Delphi Hilfe).<br>
                  <br>
                  Dass Du immer 19 als Ergebnis bekommst ist auch logisch:<br>
                  TopItem gibt als Ergebnis das TListItem zurück, dass als oberstes im ListView angezeigt wird,<br>
                  und dass muss zwangsläufig auch immer den gleichen Wert für Top haben.<br>
                  Oder anders herum:
                  Bei Standardeinstellung des Systems ist das ListItem dessen DisplayRect(drBounds).Top den<br>
                  Wert 19 hat, das TopItem.<br>
                  <br>
                  Du kannst also soweit scrollen, wie Du willst, das ändert an TopItem.DisplayRect(drBounds).Top<br>
                  nicht das geringste.<br>
                  <br>
                  @Jens<br>
                  Du brauchst also für Dein TopRect.Top also eingentlich nur einmal beim Programmstart den<br>
                  festzulegen, und musst in nicht immer wieder neu bestimmen.<br>
                  <br>
                  Ciao<br>
                  Chri

                  Comment

                  Working...
                  X