2016-04-30 18 views
5

Cần sự giúp đỡ của bạn (Tôi đang bị kẹt khi tìm kiếm). Tôi đang ở Delphi Seattle, cố gắng làm cho việc thay đổi kích thước trơn tru dưới hình thức của tôi. Trong trường hợp của tôi "thay đổi kích thước" chỉ là một sự sụp đổ nhỏ/mở rộng như thế này:Delphi: mẫu thu gọn/mở rộng mượt mà

enter image description here

Làm thế nào tôi có thể nhận ra điều đó không?

Tôi đã thử sử dụng một TTimer:

procedure TForm1.Timer1Timer(Sender: TObject); 
var 
h, t: integer; 
begin 
t := Button10.Top + Button10.Height + 10; //slide TForm from/to this point 
if t > h then 
begin 
h := h + 1; 
Form1.Height := h; 
end 
else 
begin 
Timer1.Enabled := false; 
end; 
end; 

... nhưng nó trông rất đơn giản (không có khả năng tăng tốc/giảm tốc) và các công trình chậm ngay cả với khoảng cách nhỏ.

+2

Biến cục bộ (như 'h' và' t') không liên tục giữa các cuộc gọi (sự kiện hẹn giờ ở đây) Chúng được phân bổ trên ngăn xếp và bắt giữ khi thủ tục thoát. Trên các cuộc gọi lặp đi lặp lại, bạn có thể may mắn và cùng một bộ nhớ được tái sử dụng, nhưng dựa vào điều này là sai. Độ phân giải TTimer là 10ms - 15ms, mặc dù bạn có thể đặt nó xuống 1ms. Nó cũng là thông điệp dựa trên và tin nhắn bộ đếm thời gian là một ưu tiên thấp. Để có bộ hẹn giờ chính xác hơn và hiệu quả hơn, hãy sử dụng bộ hẹn giờ đa phương tiện winapi. Cuối cùng, mã đơn giản có thể cung cấp cho vẻ đơn giản, tại sao bạn mong đợi nó để hiển thị tăng tốc/giảm tốc? –

Trả lời

6

Không cần phải phức tạp với TTimers. Điều này sẽ chăm sóc cả hai hình thức sụp đổ và mở rộng bao gồm cả sự êm ái mà bạn yêu cầu. Bí quyết là tính toán từng bước bằng cách lấy Kích thước mục tiêu - Chiều cao hiện tại và div 3 tại mỗi lần lặp, cả hai sẽ đẩy nhanh sự sụp đổ hoặc mở rộng ban đầu, sau đó giảm tốc khi biểu mẫu tiến gần đến kích thước mục tiêu của nó.

procedure TForm1.SmoothResizeFormTo(const ToSize: integer); 
var 
    CurrentHeight: integer; 
    Step: integer; 
begin 
    while Height <> ToSize do 
    begin 
    CurrentHeight := Form1.Height; 

    // this is the trick which both accelerates initially then 
    // decelerates as the form reaches its target size 
    Step := (ToSize - CurrentHeight) div 3; 

    // this allows for both collapse and expand by using Absolute 
    // calculated value 
    if (Step = 0) and (Abs(ToSize - CurrentHeight) > 0) then 
    begin 
     Step := ToSize - CurrentHeight; 
     Sleep(50); // adjust for smoothness 
    end; 

    if Step <> 0 then 
    begin 
     Height := Height + Step; 
     sleep(50); // adjust for smoothness 
    end; 
    end; 
end; 

procedure TForm1.btnCollapseClick(Sender: TObject); 
begin 
    SmoothResizeFormTo(100); 
end; 

procedure TForm1.btnExpandClick(Sender: TObject); 
begin 
    SmoothResizeFormTo(800); 
end; 
+1

Cảm ơn bạn rất nhiều John! Đây chính là điều tôi muốn thấy! –

+0

đã giúp tôi rất nhiều. cảm ơn bạn – Rahul

Các vấn đề liên quan