Announcement

Collapse
No announcement yet.

"Links" in TListBox

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

  • "Links" in TListBox

    <p>Hallo Christian,<br>
    <br>
    die Listbox verfügt über das Ereignis <b>OnDrawItem</b>. Mit diesem kannst Du Dein Vorhaben realisieren. Näheres und Beispiel dazu in der Delphi-Hilfe. Weiterhin muss die Eigenschaft <b>Style</b> der Listbox auf <b>lbOwnerDrawFixed</b> gesetzt werden.<br>
    <br>
    Gruß Thomas</p&gt

  • #2
    "Links" in TListBox

    Gibt es eine Möglichkeit, die Einträge einer Listbox wie Links im Internetbrowser darzustellen? Es handelt sich aber nicht um Verknüpfungen zu Web-Adressen, sondern um "Verknüpfungen" zu anderen Stellen im Programm. Es geht also nur um die Darstellung, nicht die Funktionalität von Links, die Funktionalität kann man ja auch über OnDblClick o.ä. realisieren.

    Hat jemand eine Idee?

    Comment


    • #3
      <p>Hallo Christian,<br>
      <br>
      die Listbox verfügt über das Ereignis "OnDrawItem". Mit diesem kannst Du Dein vorhaben realisieren. Nähers und Beispiel dazu in der Delphi-Hilfe. Weiterhin muss die Eigenschaft <b>Style</b> der Listbox auf <b>lbOwnerDrawFixed</b> gesetzt werden.<br>
      <br>
      Gruß Thomas</p&gt

      Comment


      • #4
        Hi

        Sollte die Liste NUR Links beinhalten, reicht auch die Eigenschaft ListBox.Font zu ändern. Font.Style := [fsUnderline], Font.Color := clBlue;

        Gruß Hage

        Comment


        • #5
          Die Liste Soll NUR Links enthalten.
          An die Veränderung der Schriftfarbe habe ich auch schon gedacht, ich müßte dann aber ständig testen, ob sich die Maus über einem Eintrag befindet, um diesen zu verfärben (als Zeichen dafür, daß es sich um einen Link handelt)

          Comment


          • #6
            Danke, mit <b>OnDrawItem</br> klappt das ganz gut.<br>
            Zwei Probleme bleiben:<br>
            1. Bei einem Klick soll sich der Eintrag verfärben und nicht markiert werden,<br>
            2. Im Moment entstehen nach einem Klick hässliche Rahmen um den Eintrag, die auch bei Klicks auf andere Items nicht verschwinden

            Comment


            • #7
              Muß wohl den Umgang mit HTML-Tags noch ein wenig üben..

              Comment


              • #8
                <p>Hallo Christian,<br>
                <br>
                versuche es doch einmal damit:<br>
                <br>
                <pre>
                procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;
                Rect: TRect; State: TOwnerDrawState);
                begin
                with TListBox(Control), Canvas do
                begin
                Brush.Color:=clWhite;
                if ((odSelected in State) or (odFocused in State)) then Font.Color:=clRed
                else Font.Color:=clNavy;
                TextRect(Rect, Rect.Left+1, Rect.Top+1, Items[Index]);
                end; // with
                end;
                </pre>
                <br>
                Gruß Thomas</p&gt

                Comment


                • #9
                  Folgender Code realisiert, worauf ich eigentlich hinaus wollte:<br>
                  <br>
                  procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index:Integer;
                  Rect: TRect; State: TOwnerDrawState);<br>
                  begin<br>
                  with TListBox(Control), Canvas do<br>
                  begin<br>
                  Brush.Color:=clWhite;<br>
                  if ((odSelected in State) or (odFocused in State)) then <br>
                  Font.Color:=clRed<br>
                  else Font.Color:=clNavy;<br>
                  TextRect(Rect, Rect.Left + 1, Rect.Top + 1, Items[Index]);<br>
                  end; // with<br>
                  end;<br>

                  procedure TForm1.ListBox1MouseMove(Sender: TObject; Shift: TShiftState; X,
                  Y: Integer);<br>
                  var Rect:TRect;<br>
                  zeile: integer;<br>
                  begin<br>
                  ListBox1.Repaint;<br>
                  Rect.Left := 0;<br>
                  Rect.Right := ListBox1.width - 4;<br>
                  Rect.Top := trunc(y / 16) * 16;<br>
                  Rect.Bottom := Rect.Top + 16;<br>
                  zeile := ListBox1.TopIndex;<br>
                  zeile := zeile + trunc(y / 16);<br>
                  with ListBox1, Canvas do<br>
                  begin<br>
                  Brush.Color:=clWhite;<br>
                  Font.Color:=clRed;<br>
                  TextRect(Rect, Rect.Left + 1, Rect.Top + 1, Items[zeile]);<br>
                  end; // with<br>
                  end;<br>
                  <br>
                  Aber: Durch das ständige <b>Repaint</b> entsteht ein Flackern. Ist das irgendwie zu unterbinden

                  Comment


                  • #10
                    <p>Hallo,<br>
                    <br>
                    ich kann das jetzt nicht im Detail nachvollziehen, aber ist das <b>ListBox.Repaint</b> bei jeder Mausbewegung notwendig? Ist das Repaint überhaupt notwendig, wenn der Eintrag noch einmal gezeichnet wird?<br>
                    Wäre es nicht besser, die Liste erst dann neu zu zeichnen, wenn sich die Maus über einem neuen Eintrag befindet?<br>
                    <br>
                    Gruß Thomas</p&gt

                    Comment


                    • #11
                      Problem ist folgendes:<br>
                      Wenn Repaint fehlt, bleiben alle einmal verfärbten Einträge in der neuen Farbe, sie sollen aber nur verfärbt werden, wenn sich die Maus über ihnen befindet

                      Comment


                      • #12
                        <p>Hallo Christian,<br>
                        <br>
                        ersetze Deine MouseMove durch folgenden Code:<br>
                        <br>
                        <pre>
                        procedure TForm1.ListBox1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
                        var zeile:Integer;
                        begin
                        zeile:=ListBox1.TopIndex+Trunc(y/16);
                        ListBox1.ItemIndex:=zeile;
                        end;
                        </pre>
                        <br>
                        Gruß Thomas</p&gt

                        Comment


                        • #13
                          Das ist, worauf ich hinaus wollte, vielen Dank.<br>
                          Eine Kleinigkeit (ist kein Problem, nur auffällig und mir unerklärlich) noch:<br>
                          Gerate ich mit der Maus an die untere Kante der Listbox, die mit mehr Items gefüllt ist, als angezeigt werden können, wird automatisch nach unten gescrollt.<br>
                          Dieses Phänomen tritt nur am unteren Rand, nicht am oberen auf

                          Comment


                          • #14
                            <p>Hallo Christian,<br>
                            <br>
                            das liegt daran, dass die Einträge vom TopIndex aus nach unten berechnet werden. Um das zu umgehen musst Du eben feststellen, ob sich die Maus am oberen Rand der ListBox befindet.<br>
                            <br>
                            Gruß Thomas</p&gt

                            Comment

                            Working...
                            X