2012-01-05 14 views
8

Desidero consentire a un modulo di essere ridimensionato dall'utente con i suoi controlli ridimensionati proporzionalmente. ScaleBy (N, M) funziona bene per me ma ci sono naturalmente errori di arrotondamento cumulativo se viene ripetuto. Per contrastare ciò, desidero semplicemente precedere ScaleBy() con una chiamata per ricreare il modulo nel suo aspetto e dimensione predefiniti e quindi chiamare ScaleBy con vari valori. So che posso farlo ospitando il mio modulo all'interno di un pannello (e disponendone/ricreando) ma c'è una chiamata che resetterà il modulo dopo l'uso di ScaleBy()?Come resettare un TFF delphi all'aspetto originale dopo l'uso di ScaleBy()

Modifica - Sto usando Delphi XE2 e sarei interessato anche al successo di chiunque con un componente o altro codice (a pagamento o gratuito) per ridimensionare in modo ordinato un modulo - i miei download non hanno prodotto una soluzione funzionante.

+1

Si desidera che l'utente sia in grado di ridimensionare il modulo al volo, ripetutamente? Personalmente mi piacerebbe solo ricreare. –

+0

@David: voglio solo che siano in grado di trascinare un cursore (per esempio) finché non sembra corretto, quindi lasciarlo, quindi non ci sono implicazioni sulle prestazioni. –

risposta

7

Provare il componente EasySize (TFormResizer).
Il componente TFormResizer ridimensiona tutti i controlli su un modulo (o pannello) quando la dimensione del modulo cambia.
L'ho usato con successo anni fa - funziona con D5/7. Potrebbe essere necessario apportare piccole modifiche per XE2 (non ho XE2, quindi non posso testarlo).

Usage:

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. 
+0

Bello - darò un'occhiata. Grazie. –

+1

Easysize funziona a meraviglia e finché non verrà visualizzata una soluzione nativa accetterò la risposta. Grazie. –

2

Una soluzione consisterebbe nell'utilizzare la proprietà Components del modulo interate su tutti i controlli figlio di un modulo e reimpostarli sul loro valore originale.

L'articolo richiesto è codice di esempio: http://delphi.about.com/od/adptips2005/qt/storecontrolpos.htm

Questo è per uno scopo leggermente diverso, ma non dovrebbe essere troppo difficile da modificare il codice per le vostre esigenze.

+0

Questo richiede davvero di archiviarne una copia all'inizio? Perché non c'è modo di ridisegnarli ma con dimensioni predefinite? –

1

In primo luogo, regolare la scala per scala originale, quindi scala per nuova scala. Ad esempio, per ridimensionare un modulo in un evento 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; 
+0

Questa è una soluzione accurata. Grazie. –