Hi,
nach längerem mal wieder eine Frage.
Ich habe mehrere VirtualStringTree auf meinem Formular.
Die sind auf mehrere Tabs verteilt. Im ersten Tab werden Einträge ausgewählt in weiteren dann speziellen Aufgaben zugeteilt.
Die ausgewählten Einträge des ersten Tags werden dabei auf die andere kopiert. Das geht auch alles, ABER im letzten VirtualStringTree sind dann immer die blöden Scrollbars zu sehen.
Ich habe das VirtualStringTree per Copy&Paste vom Zweite genommen, so wie die anderen auch. Die Spalten erstelle ich zur Laufzeit.
Hier die Einstellungen im
FormCreate
(identisch für alle):
Delphi-Quellcode:
vstVerfuegbare.NodeDataSize := SizeOf(TTreeData);
vstVerfuegbare.Header.Columns.Clear;
vstVerfuegbare.Header.Columns.Add.Text := 'Bla';
vstVerfuegbare.Header.Columns.Add.Text := 'Blupp';
vstVerfuegbare.Header.Columns[0].Width := TextGroesse(vstVerfuegbare.Header.Columns[0].Text, vstVerfuegbare.Header.Font).cx + 20;
vstVerfuegbare.Header.AutoSizeIndex := 0;
vstVerfuegbare.Header.Columns[1].Width := TextGroesse(vstVerfuegbare.Header.Columns[1].Text, vstVerfuegbare.Header.Font).cx + 20;
vstVerfuegbare.Repaint;
Nur zur Erklärung von
TextGroesse
.
Delphi-Quellcode:
function TextGroesse(
const Text :
string; Font : TFont =
nil) : TSize;
// Die einzige, mir gekannte, verlässlich Methode die Breite und Höhe des Textes zu ermitteln,
// TCanvas.TextWidth() macht das nicht immer richtig.
var
DC : hDC;
F : hFont;
begin
F := 0;
DC := GetDC(0);
try
if Font <>
nil then
F := SelectObject(
DC, Font.Handle);
if not GetTextExtentPoint32(
DC, Text, Length(Text), Result)
then
begin
Result.cx := 0;
Result.cy := 0;
end;
finally
if F <> 0
then
SelectObject(
DC, F);
ReleaseDC(0,
DC);
end;
end;
Der einzige Unterschied gesteht in der zusätzlichen Methode
vstVerfuegbareDrawText
, weil ich dort einen Eintrag hervorheben will mit
TargetCanvas.Font.Style := [fsBold];