Registriert seit: 29. Mai 2002
37.621 Beiträge
Delphi 2006 Professional
|
Listboxeintrag mit Link selberzeichnen
11. Apr 2009, 23:30
Ich zeichne Listboxeinträge selber. Jetzt hatte ich die Idee, dass es schön wäre, wenn man einen Teil des Textes wie einen Link anklicken könnte. Speziell in meinem Fall handelt es sich um eine Adressdatenbank. In dem Listboxeintrag wird der Name und darunter die Telefonnummern ausgegeben. Jett wollte ich zusätzlich noch die E-mailadresse ausgeben und diese sollte anklickbar sein. Sie entsprechen formatiert auszugeben ist kein Problem. Nur müsste ich rausfinden, wann der Mauszeiger über über genau diesem Bereich ist, um den Mauszeiger anzupassen und um bei einem Klick eine Aktion auszulösen.
Hier mal meine bisherige Zeichenroutine:
Delphi-Quellcode:
procedure DrawItems(AControl: TWinControl; AIndex: Integer; ARect: TRect; AState: TOwnerDrawState);
const
Col2: array[Boolean] of TColor = (clInactiveCaptionText, clWindowText);
var
Ico: TIcon;
ItemCaption: string;
Nachname: string;
Vorname: string;
Firma: string;
Tele1: string;
Tele2: string;
begin
Nachname := TContact((AControl as TListbox).Items.Objects[AIndex]).Name;
Vorname := TContact((AControl as TListbox).Items.Objects[AIndex]).Vorname;
Firma := TContact((AControl as TListbox).Items.Objects[AIndex]).Firma;
Tele1 := FormatTelefonNumber(TContact((AControl as TListbox).Items.Objects[AIndex]).Telefon1);
Tele2 := FormatTelefonNumber(TContact((AControl as TListbox).Items.Objects[AIndex]).Telefon2);
ItemCaption := Helper.Makecaption(Nachname, Vorname, Firma);
with (AControl as TListbox) do
begin
if odSelected in AState then
Canvas.Font.Color := clCaptionText
else
Canvas.Font.Color := Col2[(AControl as TListbox).Enabled];
Canvas.FillRect(ARect);
// Grafik
Ico := TIcon.Create;
try
if Firma <> '' then
Main.frmAdressen.ImageList1.Draw(Canvas, ARect.left + 4, ARect.Top + 4, 10, dsTransparent, itImage)
else
Main.frmAdressen.ImageList1.Draw(Canvas, ARect.left + 4, ARect.Top + 4, 8, dsTransparent, itImage);
finally
Ico.Free;
end;
// Itemcaption
Canvas.Font.Style := [fsBold];
Canvas.Font.Size := 12;
Canvas.Font.Name := 'Arial';
Canvas.TextOut(ARect.Left + 25, ARect.Top + 3, ItemCaption);
// SubText
Canvas.Font.Style := [];
Canvas.Font.Size := 10;
ARect.Left := ARect.Left + 25;
ARect.Top := ARect.Top + 2 + 19;
// nur Telefon1
if (Tele1 <> '') and (Tele2 = '') then
begin
DrawText(Canvas.Handle, PChar(Tele1), length(Tele1), ARect, DT_LEFT);
end;
// nur Telefon2
if (Tele1 = '') and (Tele2 <> '') then
begin
DrawText(Canvas.Handle, PChar(Tele2), length(Tele2), ARect, DT_LEFT);
end;
// beides
if (Tele1 <> '') and (Tele2 <> '') then
begin
DrawText(Canvas.Handle, PChar(Tele1), length(Tele1), ARect, DT_LEFT);
ARect.Left := ARect.Left + 125;
DrawText(Canvas.Handle, PChar(Tele2), length(Tele2), ARect, DT_LEFT);
end;
end;
end;
Im Anhang ein Blid, wie ich es mir vorstelle. Und nur die Mailadresse sollte eben anklickbar sein. Wenn möglich ohne Fremdkomponenten.
Michael Ein Teil meines Codes würde euch verunsichern.
|