כך תוכלו לאפשר גרירה ושינוי גודל של פקדים (בטופס Delphi) באמצעות עכבר, בזמן שהיישום פועל.
עורך טפסים בזמן ריצה
ברגע שמניחים שליטה (רכיב חזותי) על הטופס, תוכלו להתאים את מיקום, גודלה ותכונות זמן עיצוב אחרות. עם זאת, ישנם מצבים בהם עליך לאפשר למשתמש של היישום שלך למקם מחדש את פקדי הטפסים ולשנות את גודלם בזמן ההפעלה.
כדי לאפשר תנועה של משתמשים בזמן ריצה ושינוי גודל של פקדים בטופס באמצעות עכבר, שלוש אירועים הקשורים לעכבר זקוק לטיפול מיוחד: OnMouseDown, OnMouseMove ו- OnMouseUp.
בתיאוריה, נניח שאתה רוצה לאפשר למשתמש להזיז (ולשנות את גודל) שליטת כפתור, עם עכבר, בזמן הפעלה. ראשית, אתה מטפל באירוע OnMouseDown כדי לאפשר למשתמש "לתפוס" את הכפתור. בשלב הבא, אירוע OnMouseMove צריך למקם מחדש (להזיז, לגרור) את הכפתור. לבסוף, OnMouseUp אמור לסיים את פעולת ההעברה.
גרירה ושינוי גודל של בקרות טופס בפועל
ראשית, השמט מספר פקדים על טופס. יש CheckBox כדי לאפשר או לבטל בקרות העברה ושינוי גודל בזמן ההפעלה.
בשלב הבא, הגדר שלושה נהלים (בסעיף ממשק קטע בהצהרת הטופס) שיטפל באירועי עכבר כמתואר לעיל:
סוג TForm1 = מעמד(TForm)... תהליך ControlMouseDown (שולח: TObject; כפתור: TMouseButton; Shift: TShiftState; X, Y: מספר שלם); תהליך ControlMouseMove (שולח: נושא; Shift: TShiftState; X, Y: מספר שלם); תהליך ControlMouseUp (שולח: TObject; כפתור: TMouseButton; Shift: TShiftState; X, Y: מספר שלם); פרטי מיקום: בוליאני; oldPos: TPoint;
הערה: נדרשים שני משתנים ברמת טופס כדי לסמן אם מתרחשת תנועת בקרה (inReposition) ולאחסן שליטה במיקום ישן (oldPos).
באירוע OnLoad של הטופס, הקצה נהלי טיפול באירועי עכבר לאירועים תואמים (לאותם פקדים שברצונך שניתן יהיה להחלפה / לשנות אותם):
תהליך TForm1.FormCreate (שולח: TObject); התחל Button1.OnMouseDown: = ControlMouseDown; Button1.OnMouseMove: = ControlMouseMove; Button1.OnMouseUp: = ControlMouseUp; Edit1.OnMouseDown: = ControlMouseDown; Edit1.OnMouseMove: = ControlMouseMove; Edit1.OnMouseUp: = ControlMouseUp; Panel1.OnMouseDown: = ControlMouseDown; Panel1.OnMouseMove: = ControlMouseMove; Panel1.OnMouseUp: = ControlMouseUp; Button2.OnMouseDown: = ControlMouseDown; Button2.OnMouseMove: = ControlMouseMove; Button2.OnMouseUp: = ControlMouseUp; סוף; (* FormCreate *)
הערה: הקוד שלמעלה מאפשר מיקום מחדש של זמן ריצה של כפתור 1, עריכה 1, לוח 1 וכפתור 2.
סוף סוף, הנה קוד הקסם:
תהליךTForm1.ControlMouseDown ( שולח: נושא; כפתור: TMouseButton; Shift: TShiftState; X, Y: מספר שלם);התחלאם (chkPositionRunTime. בדק) ו (שולח הוא TWinControl) לאחר מכןהתחל inReposition: = נכון; SetCapture (TWinControl (שולח). Handle); GetCursorPos (oldPos); סוף; סוף; (* ControlMouseDown *)
ControlMouseDown בקיצור: ברגע שמשתמש לוחץ על כפתור העכבר מעל לשליטה, אם מיקום מחדש של זמן ריצה מופעל (תיבת הסימון chkPositionRunTime מסומן) והבקרה שקיבלה את העכבר אפילו נגזרת מ- TWinControl, סמנו כי מיקום השליטה מתרחש (inReposition: = נכון) וודא שכל עיבוד העכברים נלכד לצורך הפקד - כדי למנוע את אירועי "הקליק" המוגדרים כברירת מחדל. מעובד.
תהליךTForm1.ControlMouseMove ( שולח: נושא; Shift: TShiftState; X, Y: מספר שלם);const minWidth = 20; minHeight = 20; var newPos: TPoint; frmPoint: TPoint; התחלאם inReposition לאחר מכןהתחלעם TWinControl (שולח) לעשותהתחל GetCursorPos (newPos); אם ssShift בתוך הסטה לאחר מכןהתחל//resize מסך. סמן: = crSizeNWSE; frmPoint: = ScreenToClient (עכבר. CursorPos); אם frmPoint. X> minWidth לאחר מכן רוחב: = frmPoint. איקס; אם frmPoint. Y> minHeight לאחר מכן גובה: = frmPoint. Y; סוףאחר//moveהתחל מסך. סמן: = crSize; שמאל: = שמאל - oldPos. X + newPos. איקס; למעלה: = למעלה - oldPos. Y + newPos. Y; oldPos: = newPos; סוף; סוף; סוף; סוף; (* ControlMouseMove *)
ControlMouseMove בקיצור: שנה את סמן המסך כדי לשקף את הפעולה: אם לחצו על מקש Shift, אפשרו שינוי גודל שליטה, או פשוט העבירו את הפקד למיקום חדש (לאן העכבר הולך). הערה: minWidth ו גובה קבועים מספקים מעין אילוצי גודל (רוחב וגובה שליטה מינימלי).
כאשר כפתור העכבר משוחרר, נגרר הגרירה או שינוי הגודל:
תהליךTForm1.ControlMouseUp ( שולח: נושא; כפתור: TMouseButton; Shift: TShiftState; X, Y: מספר שלם);התחלאם inReposition לאחר מכןהתחל מסך. סמן: = crDefault; ReleaseCapture; inReposition: = שווא; סוף; סוף; (* ControlMouseUp *)
ControlMouseUp בקיצור: כאשר משתמש סיים לזוז (או לשנות את גודל הפקד) שחררו את לכידת העכבר (כדי לאפשר עיבוד קליקים כברירת מחדל) וסמנו כי מיקום מחדש מסתיים.
וזה עושה את זה! הורד את היישום לדוגמה ונסה בעצמך.
הערה: דרך נוספת להעביר פקדים בזמן ריצה היא להשתמש בדלפי גרור ושחרר מאפיינים ושיטות קשורים (DragMode, OnDragDrop, DragOver, BeginDrag וכו '). ניתן להשתמש בגרירה ושחרור כדי לאפשר למשתמשים לגרור פריטים מפקד אחד - כגון תיבת רשימה או תצוגת עץ - למשנהו.
כיצד לזכור את מיקום הגודל ואת השליטה?
אם אתה מאפשר למשתמש לנוע ולשנות את גודל פקדי הטפסים, עליך להבטיח שמיקום השליטה יהיה איכשהו נשמר כאשר הטופס נסגר ושמיקום של כל בקרה משוחזר כשנוצר / טוען הטופס. כך תוכלו לאחסן את המאפיינים שמאל, עליון, רוחב וגובה, עבור כל בקרה בטופס, בסמל INI קובץ.
מה דעתך על 8 ידיות בגודל?
כאשר אתה מאפשר למשתמש להזיז ולשנות את גודל הפקדים בטופס דלפי, בזמן ריצה באמצעות העכבר, אל כדי לחקות באופן מלא את הסביבה בזמן העיצוב, עליך להוסיף שמונה ידיות בגודל לפיקוח שינוי גודל.