Das mit dem PChar liegt daran, dass du Delphi 7 hast, darauf hatte ich nicht weiter geachtet. Damals (ist ja nun immerhin 11 Jahre alt) gab es die Stringversion von DrawText noch nicht.
Das mit der Markierung war noch ein Fehler, da fehlte ein FillRect um die Markierung aufzuräumen.
Mit Delphi 7 funktioniert es bei mir so:
Delphi-Quellcode:
procedure TForm246.ListBox1DrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState);
const
TextToHighlight = 'Dennis:';
var
MyListBox: TListBox;
CurrentItem: string;
CurrentRect: TRect;
CurrentPaintLeft: Integer;
FormatValue: Integer;
begin
MyListBox := Control as TListBox;
CurrentItem := MyListBox.Items[Index];
CurrentRect := Rect;
MyListBox.Canvas.FillRect(Rect);
FormatValue := DT_LEFT or DT_EXPANDTABS or DT_TABSTOP;
LongRec(FormatValue).Bytes[1] := 14; // Tabbreite in Buchstaben
if AnsiSameText(Copy(CurrentItem, 1, Length(TextToHighlight)), TextToHighlight) then
begin
Delete(CurrentItem, 1, Length(TextToHighlight));
DrawText(MyListBox.Canvas.Handle, PChar(CurrentItem), Length(CurrentItem), CurrentRect, FormatValue); // erst den Text dahinter
MyListBox.Canvas.Font.Style := [fsBold];
DrawText(MyListBox.Canvas.Handle, PChar(TextToHighlight), Length(TextToHighlight), CurrentRect, FormatValue); // nun den Namen vorne
end
else
DrawText(MyListBox.Canvas.Handle, PChar(CurrentItem), Length(CurrentItem), CurrentRect, FormatValue);
end;