versión corta: cambiar toda la forma de a AutoScroll = False
El problema es propiedad de la forma AutoScroll
, y cómo afecta a los cuales tamaño del formulario se almacena en la DFM.
Si AutoScroll
es cierto (por defecto) el DFM almacenará Width
y Height
:
object Form1: TForm1
Left = 192
Top = 114
Width = 544
Height = 375
Caption = 'Form1'
...
Si AutoScroll
es falsa (el preferido ajuste) del DFM almacenará ClientWidth
y ClientHeight
:
object frmSplash: TfrmSplash
Left = 192
Top = 114
ClientWidth = 536
ClientHeight = 348
Caption = 'Form1'
El problema con el almacenamiento de Height
es lo que sucede cuando la barra de título del usuario tiene un tamaño diferente al de su máquina de desarrollo, p.
- a desarrollar en Windows 2000, el programa se ejecuta en Windows XP
- a desarrollar en Windows XP, el programa se ejecuta en Windows Vista
- a desarrollar con pequeñas fuentes, el programa se ejecuta con fuentes grandes
Windows 2000 tenía un borde de 4 píxeles, con una barra de título de 23 píxeles. Con el DFM almacenando un Height
de 375, esto deja 348px para el área de formulario de cliente.
Ejecute el mismo programa en Windows XP, que tiene una barra de subtítulos más alta (28 píxeles). Con el DFM almacenando un Height
de 375 píxeles, esto deja 343 píxeles para el área del cliente.
Su formulario "tiene 5 píxeles más cortos".
Debe forzar a Delphi a almacenar ClientWidth
y ClientHeight
en el DFM al desactivar AutoScroll
.
Ahora cuando crea su forma alta de 348px en Windows XP, continuará teniendo 348 píxeles en el área del cliente, y sin embargo, se requiere una altura extra para tener una barra de subtítulos.
i ir tan lejos como para tener una OutputDebugString
y un disparador punto de interrupción si mi código de biblioteca de ayuda considera que alguna forma de que por error tiene AutoScroll
conjunto de cierto.
Editar: Desde trato de ser un buen desarrollador, hago el respeto de mi forma de letra preferencia del usuario. Durante el OnCreate
de todos mis formas i llamar a una función StandardizeForm(Self)
que:
- escalas de la forma para que coincida con el tamaño de fuente predeterminado del usuario
- cambia el tipo de letra en todos los controles en el formulario a la preferencia del usuario
- cuestiones un ODS si el formulario se establece por error establecen en
Scaled
- emite una SAO y de punto de interrupción si
AutoScroll
cierto (y lo establece en false)
- emite una SAO y punto de interrupción si
ShowHint
es falsa (y lo enciende)
- etc
Puede hacer algo similar. Sí, tendría que agregar:
procedure TCustomerEditForm.FormCreat(Sender: TObject);
begin
StandardizeForm(Self); //Pay your taxes!
...
end;
Pero vale la pena para mí.
hay algo más que no nos está diciendo. Recientemente cambié de d6 a d2010 y no tuve tantos problemas –
¿Ha intentado o utilizó un Manifiesto? ¿Tal vez podrías especificar el modo de compatibilidad XP? – Tom
@DavidHeffernan "algo malvado viene de esta manera". Simplemente golpee la pared, que TForm.ClientWidth devuelve un resultado totalmente loco en Win8.x independientemente de DPI .... –