8
votes

Comment réinitialiser un Tformulation Delphi à l'apparence originale après utilisation de Scaleby ()

Je veux permettre à un formulaire d'être dimensionné par l'utilisateur avec ses commandes proportionnelles redimensionnées. Shagleby (N, M) fonctionne bien pour moi, mais il y a bien sûr des erreurs d'arrondi cumulées si elles sont répétées. Pour contrer cela, je souhaite simplement précéder Shagleby () avec un appel pour recréer le formulaire dans son apparence et sa taille par défaut, puis appelez l'embarcation avec différentes valeurs. Je sais que je peux le faire en hébrivant ma forme dans un panneau (et en disposant / recréer), mais existe-t-il un appel qui réinitialisera le formulaire après utilisation d'échelleby ()?

Edit - J'utilise Delphi Xe2 et serait également intéressé par le succès de n'importe qui avec un composant ou un autre code (payé ou gratuit) pour mettre en place un formulaire de manière proprement - mes propres téléchargements n'ont pas produit de solution de travail.


2 commentaires

Vous voulez que l'utilisateur puisse augmenter le formulaire à la volée, à plusieurs reprises? Personnellement, je viens de recréer.


@David: Je veux juste qu'ils puissent faire glisser un curseur (disons) jusqu'à ce qu'il ait l'air juste, alors il n'y a pas d'implication de performance.


3 Réponses :


2
votes

Une solution consisterait à utiliser les composants La propriété du formulaire interpore sur tous les contrôles de l'enfant d'une forme et les réinitialiser à leur valeur d'origine.

L'article suivant a l'exemple de code: http://delphi.about.com /od/adpips2005/qt/storecontrolpos.htm

Ceci est pour un objectif légèrement différent, mais il ne devrait pas être difficile de modifier le code à vos besoins.


1 commentaires

Cela nécessite-t-il vraiment de stocker une copie d'eux au début? Pourquoi n'y a-t-il aucun moyen de les redessiner mais à la taille par défaut?



7
votes

try Easysize code> ( Composant TformResizer code>).
Le composant code> TformResizer code> redimensionne toutes les commandes sur un formulaire (ou un panneau) lorsque la taille du formulaire change.
Je l'ai utilisé avec succès il y a des années - fonctionne avec D5 / 7. Vous devrez peut-être faire de petits ajustements pour XE2 (je n'ai pas XE2, donc je ne peux pas le tester).

Utilisation: strong> p>

uses
  ..., Easysize;

type
  TForm1 = class(TForm)
    ...        
    procedure FormCreate(Sender: TObject);
    procedure FormResize(Sender: TObject);
  private
    FR: TFormResizer;
  end;

...

procedure TForm1.FormCreate(Sender: TObject);
begin
  FR := TFormResizer.Create(Self);
  FR.ResizeFonts := True;
  FR.InitializeForm;
end;

procedure TForm1.FormResize(Sender: TObject);
begin
  FR.ResizeAll;
end;

end.


2 commentaires

Nice - je vais jeter un coup d'oeil. Merci.


Easysize fonctionne un régal et sauf si et jusqu'à ce qu'une solution native apparaisse, je vais accepter votre réponse. Merci.



1
votes

Tout d'abord, ajustez la balance à l'échelle d'origine, puis à la nouvelle échelle. Par exemple, à l'échelle d'un formulaire dans un événement OnResize:

...
  private
    FDesignHeight: Integer;
    FDesignWidth: Integer;
    FPrevWidth: Integer;
  end;

...

procedure TForm1.FormShow(Sender: TObject);
begin
  FDesignHeight := Height;
  FDesignWidth := Width;
  FPrevWidth := Width;
  Scaled := True;
end;

procedure TForm1.FormResize(Sender: TObject);
begin
  if Scaled then
  begin
    DisableAlign;
    ScaleBy(FDesignWidth, FPrevWidth);
    ScaleBy(Width, FDesignWidth);
    EnableAlign;
  end;
  FPrevWidth := Width;
end;

procedure TForm1.FormCanResize(Sender: TObject; var NewWidth,
  NewHeight: Integer; var Resize: Boolean);
begin
  NewHeight := Round(NewWidth * FDesignHeight / FDesignWidth);
end;


1 commentaires

C'est une solution soignée. Merci.