Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Gridbreite passt sich nicht an (?)


D. Annies - Do 21.01.10 20:14
Titel: Gridbreite passt sich nicht an (?)
Hi, Delpher,

mit dem folgenden Code lege ich die Colbreite und die Stringgridbreite fest.

ich rufe den Code auf, nach einem Fontdialog-Aufruf. Wenn ich die Schriftgröße geändert habe, passt sich das SG aber nicht an - warum, bzw. was muss ich ändern?


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
procedure TForm1.Gridbreite(SG:TStringgrid);  // perfekt!
var n, k, cw : integer;
begin
  SG.Width := 30;
  for n := 0 to SG.colcount -1 do
  begin
    cw := 0;
    for k := 0 to SG.rowcount -1 do
    begin
      if SG.canvas.textwidth(SG.cells[n,k]) > cw then cw := SG.canvas.textwidth(SG.cells[n,k]);
    end;
    SG.Colwidths[n] := cw + 8;
    SG.Width := SG.Width + SG.Colwidths[n];
  end;
  SG.Width := SG.Width + 20;
end;

// Aufruf:

if stringgrid1.rowcount > 1 then      // .Font.style ??
  begin
    if form2.FontDialog1.execute then stringgrid1.Font := form2.FontDialog1.Font;
    gridbreite(stringgrid1);
  end


Danke und Gruß,
Detlef


ub60 - Do 21.01.10 20:51

Du musst den Font zusätzlich in SG.Canvas setzen, dann funzt es. SG.Font tut dies nicht automatisch.

ub60

PS: Wozu die +20 am Ende? Für die Scrollbar?


D. Annies - Do 21.01.10 21:26

ja, genau. Und
Danke erstmal


D. Annies - Do 21.01.10 21:32

So, jetzt habe ich deine Lösung eingearbeitet - SUPER!
Danke und Gruß, Detlef


D. Annies - Do 21.01.10 22:04

Eine "Kleinigkeit" noch - die Zellenhöhe müsste bei großen Schriftarten auch noch angepasst werden - wo muss ich denn da "grabbeln"?

Detlef


ub60 - Do 21.01.10 22:43

-TextHeight
-DefaultRowHeight

ub60


D. Annies - Fr 22.01.10 11:22

recht zufrieden bin ich mit folgender Lösung (in einer Schleife):


Delphi-Quelltext
1:
2:
for k := 0 to SG.rowcount-1 do
  SG.RowHeights[k] := form2.FontDialog1.Font.Size *3;


So long, Detlef


jaenicke - Fr 22.01.10 12:47

Das funktioniert aber nicht zuverlässig. Meistens sind die Schriftgrößen zwar ähnlich bei ähnlichen Größenwerten, aber es gibt auch Schriftarten, bei denen das nicht so ist.

Deshalb wäre es schon sinnvoller wie user profile iconub60 geschrieben hatte die Höhe eines Textes tatsächlich zu ermitteln statt sich darauf zu verlassen, dass Size * 3 in etwa hinkommt. Funktionieren sollte aber auch diese Annahme meistens, weil die Schriftart vermutlich immer eine einigermaßen übliche sein wird. ;-)


D. Annies - Fr 22.01.10 14:58

Danke erstmal, Sebsatian. (Ich habe bloß noch keine Ahnung, wie ich da vorgehe)

Gruß, Det


jaenicke - Fr 22.01.10 15:01

TextWidth hast du ja schon benutzt, genauso kannst du TextHeight nehmen. Der Einfachheit halber kannst du einen Dummytext zur Höhenbestimmung nehmen, denn es geht ja nur darum abzuschätzen wie hoch ca. die Schrift allgemein mit der Schriftart ist.


D. Annies - Fr 22.01.10 15:38

Danke, Sebastian, ich hab's gerade herausgefunden! (Genau nach deiner Idee)


Delphi-Quelltext
1:
2:
if SG.Canvas.TextHeight(SG.Cells[n,k])> rh then rh := SG.canvas.TextHeight(SG.cells[n,k]);
      SG.RowHeights[k] := rh + 4;    // rh ist der Dummy


Gruß, Det


jaenicke - Fr 22.01.10 18:05

Mit Dummy meinte ich einfach das: ;-)

Delphi-Quelltext
1:
2:
3:
DummyHeight := SG.Canvas.TextHeight('Äj');
for ...
  SG.RowHeights[k] := DummyHeight;
Denn mit dem Umlaut und dem j hast du die möglichen Abweichungen nach oben und unten, und anders als bei der Breite wird es andere Abweichungen ja kaum geben, so dass man nicht jede Zeile einzeln betrachten muss. ;-)


D. Annies - Fr 22.01.10 18:16

Da fall ich ja mal wieder aus den Socken, klingt Klasse, deine Idee!
Detlef


Lannes - Fr 22.01.10 18:27

Hallo,

brauchst keine Schleife wenn alle Zeilen die gleiche Schrift haben:

Delphi-Quelltext
1:
SG.DefaultRowHeight := SG.Canvas.TextHeight('Öh');                    


D. Annies - Fr 22.01.10 22:34

Aha, noch einen drauf!
Danke, Detlef