AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TStringGrid Größe ermitteln

Ein Thema von BigAl · begonnen am 26. Aug 2020 · letzter Beitrag vom 27. Aug 2020
Antwort Antwort
BigAl

Registriert seit: 6. Sep 2008
Ort: Kehl
495 Beiträge
 
Delphi 12 Athens
 
#1

TStringGrid Größe ermitteln

  Alt 26. Aug 2020, 21:02
Hallo zusammen,

ich muss einige Tabellen zur reinen Ausgabe von Daten ausgeben. Das soll dann z.B. so aussehen:

test01.png

Ich nutze dazu das TStringGrid, da mir da die VCL am wenigsten vorschreibt. Beim TListView habe ich z.B. das Problem, dass ich den Header nicht zo gezeichnet bekomme wie ich das will usw. Wie gesagt: Es handelt sich um eine reine Ausgabe, ohne jegliche Bedienung.

Das TStringGrid soll immer vollständig dargestellt werden. ScrollBars sind deaktiviert. Es werden also z.B. 4 Spalten und 8 Zeilen anzeigen. Die Breite ist variabel, das Grid wird dann entsprechen neu berechnet. Also z.B. Spalte 1 sind 40% der Breite, der Rest wird auf die restlichen Spalten aufgeteilt. Die Höhe ist aber in jedem Fall fix.

Ich versuche nun die exakte Höhe der Komponente zu berechnen, da andere Teile wieder dynamisch darauf reagieren. Da kommt jetzt das Problem:

Wie erhalte ich bei bekannte Zeilenzahl die exakt benötigte Höhe? RowHeight * RowCount haut nicht hin. Gebe ich z.B. 18 als Zeilenhöhe an, dann ist die Zeile in Wirklichkeit so 20 Pixel hoch. Dazu kommen dann noch die untere Linie, die Margins (AlignWithMargins ist True) etc. Im Moment habe ich das in etwa so im Quellcode:

(DefaultRowHeight + 2) * RowCount + Margins.Top + Margins.Bottom

Allerdings haut das noch wirklich hin. Die errechnete Höhe ist ein paar Pixel höher als die tatsächliche Höhe.

Hat irgendwer eine Idee wie man ein StringGrid auf exakte Größe bringen kann? Und wenn man die exakte Größe hat wie man die äußeren Dimensionen der Komponente exakt ermitteln kann? Width und Height sind ja wieder Größe abzüglich der Ränder...

Alex
Man sollte nie so viel zu tun haben, dass man zum Nachdenken keine Zeit mehr hat. (G.C. Lichtenberg)
  Mit Zitat antworten Zitat
Andreas13

Registriert seit: 14. Okt 2006
Ort: Nürnberg
711 Beiträge
 
Delphi XE5 Professional
 
#2

AW: TStringGrid Größe ermitteln

  Alt 26. Aug 2020, 22:54
Hallo Alex,
kann es sein, daß Dein Problem eigentlich von Windows 10 kommt? Auch ich habe (immer noch) ein ähnlich gelagertes Problem mit der Fenstergröße: Unter Win 7 ist alles OK, bei Win 10 sind die Fenster vignettiert, selbst bei mehreren gekauften kommerziellen Programmen! Früher habe ich einmal manuell Verbesserungen den Fenstern gemacht: https://www.delphipraxis.net/201232-...oeglich-3.html
Gruß, Andreas
Grüße, Andreas
Wenn man seinem Nächsten einen steilen Berg hinaufhilft, kommt man selbst dem Gipfel näher. (John C. Cornelius)
  Mit Zitat antworten Zitat
BigAl

Registriert seit: 6. Sep 2008
Ort: Kehl
495 Beiträge
 
Delphi 12 Athens
 
#3

AW: TStringGrid Größe ermitteln

  Alt 27. Aug 2020, 05:58
Hallo Alex,
kann es sein, daß Dein Problem eigentlich von Windows 10 kommt? Auch ich habe (immer noch) ein ähnlich gelagertes Problem mit der Fenstergröße: Unter Win 7 ist alles OK, bei Win 10 sind die Fenster vignettiert, selbst bei mehreren gekauften kommerziellen Programmen! Früher habe ich einmal manuell Verbesserungen den Fenstern gemacht: https://www.delphipraxis.net/201232-...oeglich-3.html
Gruß, Andreas
Hi Andreas,

kann ich mir eigentlich nicht vorstellen. Es geht ja nicht um ein Fenster, sondern um ein Control. Bei Fenstern ist das mit den Rahmen manchmal tricky, ja. Aber die Controls werden in ihren Dimensionen ja normalerweise von der VCL verwaltet. Komische Effekte sieht man aber da auch wenn die Skalierung des Bildschirms nicht auf 100% steht. Da hat auch auch die IDE ziemliche Probleme damit (auch wenn es unter 10.4 schon etwas besser ist).

Speziell bei Grid habe ich das Gefühl, dass viele Dinge einfach nicht publiziert sind. Wenn man sich den Quellcode anschaut, dann werden da einige Berechnungen für die Dimensionen und Positionen durchgeführt. Leider werden die großteils nicht nach außen weiter gegeben.
Man sollte nie so viel zu tun haben, dass man zum Nachdenken keine Zeit mehr hat. (G.C. Lichtenberg)
  Mit Zitat antworten Zitat
samso

Registriert seit: 29. Mär 2009
439 Beiträge
 
#4

AW: TStringGrid Größe ermitteln

  Alt 27. Aug 2020, 06:21
Es ist besser statt der 2 Pixel die Höhe der Trennlinie korrekt aus GridLineWidth abzuleiten. Bei mir ist das

(DefaultRowHeight + GridLineWidth) * RowCount + GridLineWidth

Die Trennline muss pro Zeile nur einmal berücksichtigt werden. Nur bei der letzen (bzw. der ersten) Zeile muss die Trennlinie noch einmal berücksichtigt werden.
  Mit Zitat antworten Zitat
BigAl

Registriert seit: 6. Sep 2008
Ort: Kehl
495 Beiträge
 
Delphi 12 Athens
 
#5

AW: TStringGrid Größe ermitteln

  Alt 27. Aug 2020, 06:30
Es ist besser statt der 2 Pixel die Höhe der Trennlinie korrekt aus GridLineWidth abzuleiten. Bei mir ist das

(DefaultRowHeight + GridLineWidth) * RowCount + GridLineWidth

Die Trennline muss pro Zeile nur einmal berücksichtigt werden. Nur bei der letzen (bzw. der ersten) Zeile muss die Trennlinie noch einmal berücksichtigt werden.
Ja, bei mir steht es mittlerweile so im Quelltext (gekürzt):

Delphi-Quellcode:
var
  GridHeight: Integer;
begin
  GridHeight := Grid.GridLineWidth + (Grid.DefaultRowHeight + Grid.GridLineWidth) * Grid.RowCount;
  if Grid.AlignWithMargins then
   GridHeight := GridHeight + Grid.Margins.Top + Grid.Margins.Bottom;
  Panel.ClientHeight := GridHeight;
  ...
Das haut auch einigermaßen hin. Sind halt an die 30 Grids die ich so verwalten muss (in verschiedenen Formularen) und ich suche eine "stabile" Lösung. Muss das aber auf verschiedenen Zielgeräten prüfen, da heutzutage ein Pixel ja nicht immer gleich ein Pixel ist. Die Kunden stehen leider immer mehr auf ihre 4K und noch höher auflösenden Monitore und stellen da dann Skalierungen von 200% und mehr ein...
Man sollte nie so viel zu tun haben, dass man zum Nachdenken keine Zeit mehr hat. (G.C. Lichtenberg)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.142 Beiträge
 
Delphi 12 Athens
 
#6

AW: TStringGrid Größe ermitteln

  Alt 27. Aug 2020, 08:00
So lange es runde Skalierungen sind, passt es noch, ansonsten stimmt das nicht mehr.

Beim FMX mit den Float-Positionen lässt sich das teilweise ausgleichen, aber in der VCL macht es dann Spaß.

Es kommt aber auch drauf an wer skaliert.
Wenn Windows skalieren würde und intern es noch die 100%-Pixel sind, dann hast du bei Berechnungen garkeine Probleme, aber es sieht eventuell auch blöd aus.

Wenn es unbedingt Pixelgenau sein muß, dann kannst du ein bissl mit den Einstellungen rumspielen.
HighDPI im Manifest und Form.Scaled und selbst skalieren rumspielen.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:27 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz