Ich glaube, ich hab schon eine Lösung gefunden mit dem Event UpdateObjects.
Code:
procedure TForm1.lvUpdateObjects(const Sender: TObject;
const AItem: TListViewItem);
begin
if aItem.Objects.TextButton=nil then exit;
aItem.Objects.TextButton.Visible:=aItem.ButtonText<>'';
end;
Allerdings wundert es mich, dass man das Textbutton-Object auf NIL prüfen muss. Sonst bekommt man eine saubere Zugriffsverletzung.
Aber so funktioniert es, und die Buttons sind nur dort, wo ich auch welche sehen möchte.