Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - OnDrawItem bei anderen Komponeten, bzw selbst machen ?


F34r0fTh3D4rk - Sa 30.07.05 19:25
Titel: OnDrawItem bei anderen Komponeten, bzw selbst machen ?
Hallo, bei der Listbox, werden die Items immer so schön neu gezeichnet, wenn sich zB die größe verändert, wie kann ich das zB bei einer image komponente machen ?

Erstmal sag ich, was ich vor habe:

Ich möchte einen text anzeigen lassen (wie ein label halt), wenn der text zu lang ist, soll er durch '...' gekürzt werden, das funzt mit ner image komponente schonmal einwandfrei, wenn ich diese jetzt aber in der größe verändere, ändert sich das bild nicht, also der text wird nicht neu gezeichnet, bzw die pünktchen wandern nicht weiter nach hinten an den text, man sieht nicht mehr als vorher.

Kleines Beispiel:

Aus

"Iron Maiden - Can I Play With Madness"

wird

"Iron Maiden - Can I ..."

wenn das Formular breiter wird steht dann da zB:

"Iron Maiden - Can I Play ..."

Wie mache ich des ? Mit der Listbox geht's perfekt, aber so halt nicht :?


Martin1966 - So 31.07.05 09:08

Du müsstes doch einfach die Paint Methode überschreiben, oder?

Wie kürzt du denn den Text? Hilfreich könnt der FAQ Beitrag von user profile iconPopov sein: ...Text so kürzen, daß er in eine Canvas-Breite passt? [http://www.delphi-forum.de/topic_Text+so+kuerzen+dass+er+in+eine+CanvasBreite+passt_21852.html]

Lg Martin


Lannes - So 31.07.05 11:28

Hallo,

hilft Dir das Stichwort weiter?
:arrow: DT_END_ELLIPSIS

Dort http://delphi.about.com/od/vclusing/l/aa072203c.htm wird das in einem StringGrid eingesetzt.


F34r0fTh3D4rk - So 31.07.05 12:12

das ondraw von meiner listbox sieht so aus (ok da wird jetzt noch ein bild eingefügt und geprüft, ob eine scrollbar angezeigt wird, der rest dient dann zum kürzen des textes auf die maximale länge die ins canvas passt):

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
procedure TMainForm.LB_PlaylistDrawItem(Control: TWinControl;
  Index: Integer; Rect: TRect; State: TOwnerDrawState);
var
  str: string;
  len: integer;
  i: integer;
begin
  str := LB_Playlist.Items[index];
  with LB_Playlist.Canvas do
    begin
      len := Textwidth(str) + IMG_Icon.width + 1;
      if LB_PLaylist.ItemHeight * LB_Playlist.Count > LB_Playlist.ClientHeight then
        len := len + 17 + 1;
      if len > LB_Playlist.width then
        for i := length(str) downto 1 do
          begin
            str := copy(str, 1, i);
            str := str + '...';
            len := Textwidth(str) + IMG_Icon.width + 2;
            if LB_PLaylist.ItemHeight * LB_Playlist.Count > LB_Playlist.ClientHeight then
              len := len + 17 + 1;
            if len <= LB_Playlist.width then
              break else
                if i = 1 then
                  str := '';
          end;
      FillRect(Rect);
      bitblt(LB_Playlist.Canvas.Handle, Rect.left + 1, Rect.Top + 1, IMG_Icon.width, IMG_Icon.height, IMG_Icon.Canvas.Handle, 00, SRCAnd);
      TextOut(Rect.Left + 1 + IMG_Icon.Width + 1, Rect.Top, str);
    end;
end;


@Lannes: Bei dem Link wird ja auch ein OnDrawItem benutzt, aber bei einem image habe ich das ja nicht :?