DBGrid - exakte Breite bestimmen
-
Hallo,
ich habe Probleme für mein DBGrid die genaue Breite zu bestimmen.
Je nachdem welche Spalten ich aus der DB lade bleibt am rechten Rand des Gitters ein Bereich mit "Luft", was sehr unschön u unprofessionell aussieht.Font/Schriftgröße des DBGrids habe ich alles in der Standardeinstellung belassen. Die 1. Fixspalte für den Datensatzzeiger links habe ich ausgeschaltet. Durch Probieren habe ich für den Schiebebalken rechts eine Breite von 52 Pixel ermittelt.
Mit ->DisplayWidth erhalte ich über das DataSet die originale Spaltenbreiten der Datenbank (=Anzahl d Zeichen für jede Spalte).
Ergo addiere ich in einer Schleife über alle Spalten die Einzelbreiten zur Gesamtbreite des DBGrids.Durch Probieren im OI habe ich auch herausgefunden, wie die optimale Pixelbreite des DBGrids mit Schiebebalken rechts ist.
Abzüglich dessen Breite kann ich dann die Pixel für die Nettobreite nur der Spalten bestimmen.
Dabei komme ich bei meinen Berechnungen für den B r e i t e n f a k t o r der Schrift (=Nettopixelbreite/Anzahl Schriftzeichen) auf Werte zwischen ca 5.0 und 5.7 je nachdem welche Spalten ich lade.
Und da liegt der Hase im Pfeffer!Gibt es irgendwo eine Vorlage, wie sich die DBGridbreite exakt berechnen läßt? Wie bestimmt der Builder die Breite?
-
Ich habe jetzt mehrmals deinen Beitrag durchgelesen und werde immer noch nicht richtig schlau daraus, was du jetzt genau erreichen willst?
Möchtest du die Gesamtbreite des Grids verändern oder möchtest du die einzelnen Spalten des Grids vergrößern (falls rechts zu viel Platz ist).
Und wie kommst du auf 52 Pixel für die Breite des Schiebereglers (dieser wäre aber sehr breit, denn standardmäßig sollten es eher 16-20 Pixel sein)?
Mittels Canvas::TextWidth(text) kannst du die genaue Breite eines Textes (in Abhängigkeits des Fonts) ermitteln.
Normalerweise wird einfach ein bestimmtes Zeichen (z.B. 'x') als Standardbreite angenommen und dann halt mit der Anzahl der Zeichen multipliziert.
-
Hallo @Th,
ich versuch das nochmal anders zu erklären.
Ziel ist es die Spalten des DBGrids mit einer Schiebeleiste rechts (vertikal) so darzustellen, dass darunter kein weiterer Schiebebalken quer (horizontal) erscheint. Gleichzeitig soll der Schiebebalken (vertikal) rechts exakt am Ende der letzten rechten Spalte anschließen.Folgendes Beispiel.
Das DBGrid hat 4 Spalten: | 15 | 15 | 15 | 10 | => 55 Zeichen (in der Summe)
DBGrid->Canvas->TextWidth("x") = 5 Pixel/Zeichen
Nach Deiner Vorgabe wären das 55Zeichen x 5Pixel/Zeichen = 275PixelWenn ich mit dem OI die DBGrid->Width einstelle benötige ich aber 370Pixel, damit ich die 4Spalten mit Schiebebalken rechts exakt abschließe, wie beschrieben.
Deshalb muß es doch einen Faktor geben mit dem ich diese Differenz ausgleichen kann, oder sehe ich hier etwas falsch?
-
Hier ist der Delphi-Source (vom BCB5):
Canvas.Font := Self.Font; GetTextMetrics(Canvas.Handle, TM); Result := Field.DisplayWidth * (Canvas.TextWidth('0') - TM.tmOverhang) + TM.tmOverhang + 4; if dgTitles in Options then begin Canvas.Font := Title.Font; W := Canvas.TextWidth(Title.Caption) + 4; if Result < W then Result := W; end;
Es wird also das Zeichen '0' als Default angenommen (ich hatte ja geschrieben, z.B. "x", da ich es nicht wußte).
Du brauchst aber doch einfach die Summe der Spaltenbreiten addieren (+ Scrollbar-Breite), um die Gesamtbreite des Grids zu erhalten.
int w = 20; // Scrollbar-Breite (evtl. ändern) for(int i=0; i<Grid->Columns->Count; i++) w += Grid->Columns->Items[i]->Width;
Oder habe ich dein Problem immer noch nicht verstanden?
-
Hallo @Th, nein Du hast das schon absolut richtig verstanden!
int w = 20; // Scrollbar-Breite (evtl. ändern) for(int i=0; i<Grid->Columns->Count; i++) w += Grid->Columns->Items[i]->Width;
Das war genau das, was ich gesucht habe. Ich wußte nicht, dass das so einfach mit "Columms->Items[i]->Width" zu lösen geht. Einfach super
Mein Ansatz wäre mehr in Richtung des von Dir gezeigten Delphi-Codes gegangen. Den Multiplikationsfaktor (Canvas.TextWidth('0') - TM.tmOverhang) hätte ich aber wahrscheinlich auch dann so alleine nicht gefunden.
Vielen Dank nochmal.