2012-01-05 18 views
8

Tôi muốn cho phép một hình thức được kích thước bởi người sử dụng với các điều khiển của nó tỷ lệ thay đổi kích thước. ScaleBy (N, M) hoạt động tốt cho tôi nhưng có tất nhiên các lỗi làm tròn tích lũy nếu nó được lặp lại. Để chống lại điều này tôi chỉ đơn giản là muốn trước ScaleBy() với một cuộc gọi để tạo lại các hình thức trong mặc định của nó xuất hiện và kích thước và sau đó gọi ScaleBy với các giá trị khác nhau. Tôi biết tôi có thể làm điều này bằng cách lưu trữ mẫu của tôi trong một bảng điều khiển (và xử lý/tái tạo nó) nhưng có một cuộc gọi sẽ thiết lập lại các hình thức sau khi sử dụng ScaleBy()?Làm thế nào để thiết lập lại một TForm delphi để xuất hiện ban đầu sau khi sử dụng ScaleBy()

Chỉnh sửa - Tôi đang sử dụng Delphi XE2 và cũng sẽ quan tâm đến thành công của bất kỳ ai bằng một thành phần hoặc mã khác (trả tiền hoặc miễn phí) để chia tỷ lệ biểu mẫu gọn gàng - bản tải xuống của riêng tôi chưa tạo ra giải pháp làm việc.

+1

Bạn muốn người dùng có thể chia tỷ lệ biểu mẫu nhanh chóng, liên tục? Cá nhân tôi vừa mới tạo lại. –

+0

@David: Tôi chỉ muốn họ có thể kéo một thanh trượt (nói) cho đến khi nó trông đúng rồi rời khỏi nó, vì vậy không có ý nghĩa về hiệu suất. –

Trả lời

7

Thử thành phần EasySize (TFormResizer).
Thành phần TFormResizer thay đổi kích thước tất cả các điều khiển trên biểu mẫu (hoặc bảng điều khiển) khi kích thước biểu mẫu thay đổi.
Tôi đã sử dụng nó thành công nhiều năm trước - hoạt động với D5/7. Bạn có thể cần phải thực hiện điều chỉnh nhỏ cho XE2 (Tôi không có XE2, vì vậy tôi không thể kiểm tra nó).

Cách sử dụng:

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

Đẹp - Tôi sẽ xem xét. Cảm ơn. –

+1

Easysize hoạt động một điều trị và trừ khi và cho đến khi một giải pháp gốc xuất hiện, tôi sẽ chấp nhận câu trả lời của bạn. Cảm ơn. –

2

Một giải pháp là sử dụng thuộc tính Components của biểu mẫu tương tác trên tất cả các điều khiển con của biểu mẫu và đặt lại chúng về giá trị ban đầu.

Bài viết sau đây có mã ví dụ: http://delphi.about.com/od/adptips2005/qt/storecontrolpos.htm

này là cho một mục đích rõ ràng, nhưng nó không phải là khó để thay đổi mã yêu cầu của bạn.

+0

Điều này thực sự yêu cầu lưu trữ một bản sao của chúng lúc bắt đầu? Tại sao không có cách nào để vẽ lại chúng nhưng ở kích thước mặc định? –

1

Thứ nhất, điều chỉnh quy mô với quy mô ban đầu, sau đó mở rộng quy mô mới. Ví dụ: để chia tỷ lệ biểu mẫu trong sự kiện 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

Đó là một giải pháp gọn gàng. Cảm ơn. –