Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Smileys in einer Listbox? (https://www.delphipraxis.net/57297-smileys-einer-listbox.html)

Delphi-Noobie 18. Nov 2005 15:37


Smileys in einer Listbox?
 
Huhu,

Weiß jemand wie man kleine Bilder in Listbox an einer ganz bestimmten stelle malen kann? Also ich schreib ein Text dann kommt zwischendurch ein Bild und wieder Text, wodurch das Bild also irgendwo in der Listbox gemalt werden muss zwischen den Texten. Der text steht vorher in einem Editfeld bevor er in die Listbox kommt und wenn im Editfeld z.B der Teilstring "XD" vorhanden ist, soll er da dann das Bild malen.

Klingt etwas umständlich aber kann mir da jemand helfen? bis jetzt hatte ich nur die Procedure listbox1.canvas.stretchdraw(rect,bmp) im ondrawitem event aber das mit dem rect hab ich net hinbekommen.

[edit=Luckie]Programmiersprache korrigiert. Mfg, Luckie[/edit]

Khabarakh 18. Nov 2005 15:44

Re: Smileys in einer Listbox?
 
Bist du dir sicher, dass du Delphi.NET verwendest? Denn die FCL-Controls haben keine Canvas-Property. Und ich denke (hoffe) mal nicht, dass du für ein neues Projekt VCL.NET benutzt.

Delphi-Noobie 18. Nov 2005 15:47

Re: Smileys in einer Listbox?
 
Ich benutze Delphi7 :oops:

Pfoto 18. Nov 2005 17:26

Re: Smileys in einer Listbox?
 
Hallo Delphi-Noobie,

du kannst der Liste sagen, dass du die Items selber zeichnen möchtest, indem du
Delphi-Quellcode:
    ListBox1.Style := lbOwnerDrawVariable;
setzt.

Nun rufst du den OnDrawItem-Teil der Listbox auf und musst nun das Zeichnen der Items implementieren.
Delphi-Quellcode:
procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;
        Rect: TRect; State: TOwnerDrawState);
begin
  with ListBox1 do
  begin
    Canvas.FillRect(Rect);
// Hier müsste nun ermittelt werden, wo das Item sitzt und ein entsprechendes Bitmap eingesetzt werden
 
  end;
end;
Die Position des Icon-Zeichnens könntest du mit Pos herausfinden.
Da ich selbst noch am Anfang bin, kann ich dir leider nicht mal kurz was runterschreiben, das auch funktioniert. Sorry.
Ich würde auch vermuten, dass das ständige Aufsuchen und Ersetzen innerhalb des OnDrawItem-Ereignis entsprechend Zeit in Anspruch nimmt. Vielleicht gibt es ja auch eine bessere Lösung...

Gruß
Pfoto

Delphi-Noobie 18. Nov 2005 17:52

Re: Smileys in einer Listbox?
 
Ja genau damit komme ich auch net klar, das es da rein muss konnte ich mir schon denken. Das Bild an eine bestimmte position zu bringen is auch noch klar dank Listbox.canvas.stretchdraw(rect,bmp) aber wie finde ich die position in der listbox raus, wo das bild hin soll? Z.B 'hallo Welt XD' --> dann steht in der listbox "Hallo Welt" und dann muss das Bild kommen aber welche Koordinaten sind das hinter den Text? :). Vielleicht weis jemand eine elegante Lösung? ^^

Delphi-Noobie 22. Nov 2005 16:04

Re: Smileys in einer Listbox?
 
Ok ich habs geschafft! Ich hab das im ondrawitem geschrieben:
Delphi-Quellcode:
const
  SM1 = ':)';
var
  s, t: String;
  m, z: Integer;
begin

  try with (Control as TListbox) do begin
    z := 0;
    s := Items[Index];
    Canvas.Brush.Style := bsClear;
    while Pos(SM1, s) > 0 do begin
      t := Copy(s, 1, Pos(SM1, s) - 1);
      m := Canvas.TextWidth(t);

      Canvas.TextRect(Rect, Rect.Left + z, Rect.Top, t);
      Canvas.Draw(Rect.Left + z + m, Rect.Top, self.image1.Picture.Bitmap);

      Delete(s, 1, Pos(SM1, s) - 1);
      Delete(s, 1, Length(SM1) );
      z := z + m + self.image1.Width + 2;
    end;
    Canvas.TextRect(Rect, Rect.Left + z, Rect.Top, s);
  end;
  except
  end;
end;
Allerdings klappt das nur für 1 Smiley :'( wenn ich noch ne 2. Konstante definiere z.B SM2 = 'o_O'; und den selben Coden nochmal an den hier ranhänge dann löscht er die zeichen nicht mehr sondern lässt sie stehen und malt das bild noch drüber, so das man beides sieht.
Delphi-Quellcode:
const
  SM1 = ':)';
  Sm2 = 'o_O';
var
  s, t: String;
  m, z: Integer;
begin

  try with (Control as TListbox) do begin
    z := 0;
    s := Items[Index];
    Canvas.Brush.Style := bsClear;
    while Pos(SM1, s) > 0 do begin
      t := Copy(s, 1, Pos(SM1, s) - 1);
      m := Canvas.TextWidth(t);

      Canvas.TextRect(Rect, Rect.Left + z, Rect.Top, t);
      Canvas.Draw(Rect.Left + z + m, Rect.Top, self.image1.Picture.Bitmap);

      Delete(s, 1, Pos(SM1, s) - 1);
      Delete(s, 1, Length(SM1) );
      z := z + m + self.image1.Width + 2;
    end;
    Canvas.TextRect(Rect, Rect.Left + z, Rect.Top, s);
  end;
  except
  end;

 try with (Control as TListbox) do begin
    z := 0;
    s := Items[Index];
    Canvas.Brush.Style := bsClear;
    while Pos(SM2, s) > 0 do begin
      t := Copy(s, 1, Pos(SM2, s) - 1);
      m := Canvas.TextWidth(t);

      Canvas.TextRect(Rect, Rect.Left + z, Rect.Top, t);
      Canvas.Draw(Rect.Left + z + m, Rect.Top, self.image2.Picture.Bitmap);

      Delete(s, 1, Pos(SM2, s) - 1);
      Delete(s, 1, Length(SM2) );
      z := z + m + self.image2.Width + 2;
    end;
    Canvas.TextRect(Rect, Rect.Left + z, Rect.Top, s);
  end;
  except
  end;
end;
Kann mir einer sagen woran das liegt und wie ich das beheben kann?

hardy1234 24. Dez 2005 13:17

Re: Smileys in einer Listbox?
 
Laß mich raten,

die Methode mit dem const solltest Du dir zu allererst schenken, besser ist ne Schnittstelle;

Delphi-Quellcode:

procedure InsertSmileyInLB(PartStr: string; smfn: string);
begin

end;
Das hat den Vorteil, das Du beliebig viele smileys einbauen kannst. Aber der Fehler dürfte wohl schlich an der Berechnung des Startpunktes liegen. Das sieht mir irgendwie so aus, als ob der den neuen Smiley auf der selben Zeile zeichnet. Das die übereinander geraten ist wohl eher Zufall.

felice navidad


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:20 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