Возможно, есть способ лучше, но пока никто не предложил, вот возможный вариант...
Код:
var
Form1: TForm1;
{ битмап этот будет хранить текст со звездочками }
bmp: TBitmap;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
var
i: Integer;
begin
ListView1.GridLines := True;
ListView1.ViewStyle := vsReport;
ListView1.Columns.Clear;
{ создадим и обзовем как-нибудь три столбца }
for i := 0 to 2 do
begin
ListView1.Columns.Add;
ListView1.Column[i].Caption := 'Column ' + IntToStr(i);
end;
{ добавим несколько строк... }
for i := 0 to 4 do
with ListView1.Items.Add do
begin
Caption := 'Item ' + IntToStr(i);
SubItems.Add('Subitem ' + IntToStr(i) + '-0');
SubItems.Add('Subitem ' + IntToStr(i) + '-1');
end;
{ выведем на битмап текст звездочек }
bmp := TBitmap.Create;
bmp.Width := ListView1.Columns[1].Width - 3;
bmp.Height := ListView1.Font.Size;
bmp.Canvas.Font := ListView1.Font;
bmp.Canvas.TextOut(3, 2, '*******');
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
bmp.Free;
end;
{ добавим собственную реакцию на событие отрисовки subitem'ов OnCustomDrawSubItem }
procedure TForm1.ListView1CustomDrawSubItem(Sender: TCustomListView;
Item: TListItem; SubItem: Integer; State: TCustomDrawState;
var DefaultDraw: Boolean);
begin
{ скрываем за звездочками содержимое только второго столбца }
if SubItem = 1 then
with (Sender as TListView) do
begin
Canvas.Draw(Item.Left + Columns[0].Width, Item.Top, bmp);
DefaultDraw := False; { =) }
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
{ убедимся, что «реальный» текст во втором столбце остался
нетронутым, и его можно программно прочесть, хоть там
и видны только звездочки }
ShowMessage(ListView1.Items.Item[1].SubItems[0]);
end;