2016-04-30 9 views
5

आपकी मदद की ज़रूरत है (मैं खोज पर फंस गया हूं)। मैं डेल्फी सिएटल पर हूं, मेरे फॉर्म के चिकनी आकार बदलने की कोशिश कर रहा हूं। मेरे मामले में "आकार बदलने" बस थोड़ी पतन है/इस तरह का विस्तार:डेल्फी: चिकनी पतन/विस्तृत फॉर्म

enter image description here

मैं ऐसा कैसे एहसास कर सकते हैं?

मैं उपयोग एक 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; 

... लेकिन यह है बहुत ही सरल (कोई त्वरण/मंदी) लग रहा है और यहां तक ​​कि छोटे अंतराल के साथ धीमी गति से काम करता है।

+2

स्थानीय चर ('h' और' t' की तरह) कॉल के बीच लगातार नहीं हैं (टाइमर ईवेंट यहाँ) वे ढेर पर आवंटित और जब अस्तित्व के लिए प्रक्रिया रास्ते को जब्त कर रहे हैं। बार-बार कॉल पर आप भाग्यशाली हो सकते हैं और उसी स्मृति का पुन: उपयोग किया जाता है, लेकिन इस पर भरोसा करना गलत है। टीटीमर रिज़ॉल्यूशन 10ms - 15ms है, इसके बावजूद आप इसे 1ms तक सेट कर सकते हैं। यह संदेश आधारित है और टाइमर संदेश कम प्राथमिकता वाला है। अधिक सटीक और अधिक प्रदर्शन करने वाले टाइमर के लिए एक winapi मल्टीमीडिया टाइमर का उपयोग करें। अंत में, सरल कोड सरल दिख सकता है, आप इसे त्वरण/मंदी दिखाने की उम्मीद क्यों करते हैं? –

उत्तर

6

टीटीमीटर के साथ जटिल होने की कोई आवश्यकता नहीं है। यह आपके लिए आवश्यक चिकनीता सहित फ़ॉर्म को ढहने और विस्तार करने दोनों का ख्याल रखेगा।

चाल प्रत्येक आकार पर लक्ष्य आकार - वर्तमान ऊंचाई और div 3 ले कर प्रत्येक चरण की गणना करना है, जो दोनों प्रारंभिक पतन या विस्तार को तेज करेंगे, फिर फॉर्म को अपने लक्ष्य आकार के करीब पहुंचने के साथ ही कम हो जाएगा।

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

बहुत बहुत धन्यवाद जॉन! यह वही है जो मैं देखना चाहता था! –

+0

ने मुझे बहुत मदद की। धन्यवाद – Rahul

संबंधित मुद्दे