AGB  ·  Datenschutz  ·  Impressum  







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

TForm.Height vs. ClientHeight

Ein Thema von himitsu · begonnen am 26. Feb 2021 · letzter Beitrag vom 20. Jun 2022
Antwort Antwort
Michael II

Registriert seit: 1. Dez 2012
Ort: CH BE Eriswil
772 Beiträge
 
Delphi 11 Alexandria
 
#1

AW: TForm.Height vs. ClientHeight

  Alt 28. Feb 2021, 05:03
Wie gesagt, es wird einfach ClientHeight komplett ignoriert.

Code:
object Form2: TForm2
  Left = 50
  Top = 100
  ClientHeight = 1200
  ClientWidth = 800
  HorzScrollBar.Range = 1100
  VertScrollBar.Range = 770

  Caption = 'Form2'
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  OldCreateOrder = False
  OnCreate = FormCreate
  PixelsPerInch = 96
  TextHeight = 13
end
Nach dem Speichern ist es dann, ...
Code:
object Form2: TForm2
  Left = 0
  Top = 0
  Width = 833
  Height = 1100
  HorzScrollBar.Range = 1150
  VertScrollBar.Range = 770
  ...
Nur noch kurz: Ist dein Beispiel (oben) eines wo es schief läuft?

Falls Nein, dann lies nicht weiter.

Falls aber Ja: Du schreibst, dass ClientHeight komplett ignoriert wird. Ist es auch mit Clientwidth so, wenn du Clientwidth im DFM nur gross genug (zum Beispiel 3000) wählst?
Wenn du deinen Monitor mit einer Auflösung 1920x1092 (zum Beispiel 1920x1092 HD Monitor mit 100% Skalierung unter Windows Anzeigeeinstellungen) verwendest, dann vermute ich, dass nach dem Speichern Height=1100 und Width=1940 drin steht.
(Dann würde das von dir beschriebene "Problem" aber abhängig von der "Windows Auflösung" und unabhängig von der Verwendung von ScrollBars auftreten: Wenn du im DFM ClientWidth=3000 und ClientHeight=3000 ohne Scrollbars wählen würdest, dann hättest du nach dem Laden und Speichern sehr wahrscheinlich Client Werte um 1924x1061 im DFM.)
Michael Gasser

Geändert von Michael II (28. Feb 2021 um 10:50 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

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

AW: TForm.Height vs. ClientHeight

  Alt 28. Feb 2021, 12:41
Nein, leider nicht.
Das ist jenes, was allen fehlerhaftens Forms gemeinsam ist (was ich bissher entdeckt hab),
aber "irgendwas" fehlt noch.

ClientHeight/ClientWidth ist in allen DFMs aus'm Delphi XE gespeichert,
aber in 10.3 und 10.4 (davor weiß ich nicht), da wird Dieses nicht "beachtet", wenn die Forms im Formdesigner oder im laufenden Programm geladen werden,
jedenfalls dort nicht, wo auch HorzScrollBar/VertScrollBar vorhanden sind.


Die Forms sind und waren kleiner als FullHD bei 100% und nach dem Laden sind sie "jetzt" noch kleiner,
ungefähr so hoch, wie eine nagelneue TForm ist.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (28. Feb 2021 um 12:44 Uhr)
  Mit Zitat antworten Zitat
Michael II

Registriert seit: 1. Dez 2012
Ort: CH BE Eriswil
772 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: TForm.Height vs. ClientHeight

  Alt 28. Feb 2021, 13:05

Die Forms sind und waren kleiner als FullHD bei 100% und nach dem Laden sind sie "jetzt" noch kleiner,
ungefähr so hoch, wie eine nagelneue TForm ist.
Dann war dein gepostetes Beispiel etwas "schräg"... dort hast du ClientHeight = 1200 im Ausgangs DFM File (klar höher als HD) - und dieser Wert wurde in deinem Beispiel auf Height=1100 gekürzt. Dies entspricht exakt der Höhe, welche von Delphi gespeichert wird, wenn du unter Windows Auflösung ?x1092, 100% eingestellt hast.

Falls du ein weiteres Beispiel hast, dann gern - sonst bin ich leise .
Michael Gasser
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

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

AW: TForm.Height vs. ClientHeight

  Alt 28. Feb 2021, 13:35
Sorry, ich hatte das Beispiel testweise per Hand zusammengeklöppelt/gekürzt und bissl auf 100er gerundet.

Ja, mein Monitor ist zufällig 1920x1200, aber du hast Recht, ich hatte hier die Zahlen verdreht.
Es ist querformat und nicht hoch, also 1200 war Width und nicht Height.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (28. Feb 2021 um 13:46 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

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

AW: TForm.Height vs. ClientHeight

  Alt 12. Mär 2021, 13:01
OK, den genauen Grund konnte ich nun sehen, leider.

Es liegt indirekt an der Vererbung.

Es gibt 3 Vorfahren
* der Erste ohne DFM
* dann zwei mit DFM, mit ClientWidth/ClientHeight (Standard, wie bei fast Allen)
* und dann die eigenetliche(n) Form(s), teilweise mit Width/Height in der DFM (weil HorzScrollBar.Range bzw. VertScrollBar.Range)

Wenn die DFMs geladen werden, werden zuerst die Vorfahren mit ClientWidth/ClientHeight geladen und darüber dann die Property die eigentlichen FormDFM,
somit steht insgesamt sowohl ClientWidth/ClientHeight, als auch Width/Height, in der DFM.

ClientWidth/ClientHeight werden von TForm aber zwischengespeichert und erst später (TCustomForm.CMShowingChanged bzw. TCustomForm.ScaleForPPIRect) ausgewertet.
"Eigentlich" würde hier ja zuletzt Width/Height aus den DFMs geladen und die vorher geladenen ClientWidth/ClientHeight überschreiben, nur setzt die TForm dabei nicht FClientWidth/FClientHeight zurück, wodurch sie dann nachfolgend mit aller Hörte zuschlagen.


Im SetWidth/SetHeight könnte ich den Fehler zwar beheben, aber nur zur Laufzeit, im Programm, aber nicht im FormDesigner.



Aber das Schön, von alleine tritt dieser Fehler nur auf, wenn aus der DFM ClientHeight/ClientHeight geladen wird, was standardmäßig bei fast Jedem der Fall ist.
Und es betrifft Alle, die zusätzlich Width/Height in der DFM stehen haben, aber auch jene, welche Width/Height im Contructor beim Laden von SubKomponenten (vor dem Anzeigen) zuweisen, oder HorzScrollBar/VertScrollBar aktivieren.
Außerdem zerballert es dir die Form, wenn sich die DPI zur Laufzeit ändern, z.B. mit'm RDP verbinden oder einen Monitor anschalten/ausschalten/anstöpseln/...
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (12. Mär 2021 um 13:08 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.720 Beiträge
 
Delphi 12 Athens
 
#6

AW: TForm.Height vs. ClientHeight

  Alt 12. Mär 2021, 13:17
Jetzt bin ich ja mal auf QP-Eintrag gespannt...
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

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

AW: TForm.Height vs. ClientHeight

  Alt 12. Mär 2021, 13:57
Eine "schnelle" Lösung ist hier die Width/Height in den DFMs zu suchen und durch ClientWidth/ClientHeight zu ersetzen (notfalls mit bissl Zuschlag, aber egal, da wir mit Align arbeiten) und HorzScrollBar/VertScrollBar in den constructor zu verschieben.


Ich hab jetzt erstmal das absolute MinimalBeispiel gebastelt
  • nagelneue VCL-Anwendung erstellen
  • Alt+F12 (in die DFM)
  • unterhalb von ClientHeight ein Height einfügen
    Delphi-Quellcode:
    object Form12: TForm12
      Left = 0
      Top = 0
      Caption = 'Form12'
      ClientHeight = 299
      ClientWidth = 635
      Color = clBtnFace
    Delphi-Quellcode:
      Height = 800
      Width = 50
  • nicht zurück in den Designer
  • speichern
  • und F9
  • =
  • eigentlich müsste die jetzt 999 hoch und 50 breit sein, aber sie ist noch so, wie vorher im Designer gesehn, also was in ClientHeight/ClientWidth steht.
Bin grad nochmal im XE am Probieren.


Grundsätzlich ist es doch eh ein Fehler, dass Width/Height gespeichert wird?
wenn irgendwas nicht miz Align ausgerichtet ist, dann kann die Form per se falsch geladen werden. (das, weswegen man damals von Height auf ClientHeight umgestiegen ist)
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (12. Mär 2021 um 14:05 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

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

AW: TForm.Height vs. ClientHeight

  Alt 17. Jun 2022, 12:50
Muß man da jetzt nochmal ein neues Tiket machen, oder bekommen die das so mit, dass man nochmal was nachgeschoben hat?
https://quality.embarcadero.com/browse/RSP-33368


Oder gibt es sonst wirklich niemand Anderes, der auch Form-Vererbung nutzt.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Rolf Frei

Registriert seit: 19. Jun 2006
655 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: TForm.Height vs. ClientHeight

  Alt 17. Jun 2022, 14:09
Ich sage es nochmals: Height und Width wurden nur gepeichert, wenn Autoscroll=True ist. Also die Frage, ob du diese auf True hast? Wenn ja setze das im Design auf False und setzte zur Runtime das Property im OnCreate der Form, wenn du dieses Feature nutzen willst. Ich nutze selber nur wenige vererbte Formen, aber bei keiner habe ich dieses Problem, weil bei mir alle Formen AutoScroll=False haben. Schau mal ob das in deiner Situation was ändert.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

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

AW: TForm.Height vs. ClientHeight

  Alt 17. Jun 2022, 19:31
Hier soll es aber Autoscroll sein, z.B. für bei Kunden mit zu kleinen Monitoren, was in der Fabrikhallte schonmal vorkommen kann.


Das Scroll ist auch garnicht das Problem ... nur dass Delphi hier einen Bug hat, beim Laden der Fenstergröße.
Ein Therapeut entspricht 1024 Gigapeut.
  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 22:06 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz