"אוקיי, ה- DBNavigator עושה את עבודתו בניווט נתונים וניהול רשומות. לרוע המזל הלקוחות שלי רוצים חוויה ידידותית יותר למשתמש, כמו גרפיקה וכותרות כפתורים בהתאמה אישית,... "
חקירה זו הגיעה מ מפתח דלפי מחפש דרך לשפר את העוצמה של רכיב DBNavigator.
ה- DBNavigator הוא מרכיב נהדר - הוא מספק ממשק דמוי וידיאו לניווט בנתונים וניהול רשומות ביישומי מסד נתונים. ניווט הקלטות מסופק על ידי הכפתורים הראשונה, הבא, קודמת ואחרונה. ניהול הרשומות מסופק על ידי לחצני עריכה, פרסום, ביטול, מחיקה, הוספה וריענון. ברכיב אחד דלפי מספקת את כל מה שאתה צריך, להפעלת הנתונים שלך.
עם זאת, כפי שאמר גם מחבר חקירת הדואר האלקטרוני, ל- DBNavigator חסר כמה תכונות כמו גליפים מותאמים אישית, כותרות כפתורים ואחרות.
DBNavigator חזק יותר
למרכיבי דלפי רבים תכונות ושיטות שימושיות המסומנות בלתי נראות ("מוגנות") למפתח דלפי. יש לקוות, לגישה לחברים מוגנים כאלה של רכיב, ניתן להשתמש בטכניקה פשוטה המכונה "האק המוגן".
ראשית, תוסיף כיתוב לכל כפתור DBNavigator, ואז תוסיף גרפיקה בהתאמה אישית, ולבסוף, OnMouseUp תאפשר כל כפתור.
מה- DBNavigator ה"משעמם "לאחד מאלה:
- גרפיקה רגילה וכיתובים בהתאמה אישית
- רק כיתובים
- גרפיקה בהתאמה אישית וכיתובים בהתאמה אישית
בואו רוקנרול
ל- DBNavigator יש נכס כפתורים מוגן. חבר זה הוא מערך של TNavButton, צאצא של TSpeedButton.
מכיוון שכל לחצן בנכס מוגן זה יורש מ- TSpeedButton, אם תשים את היד עליו, תוכל לעבוד עם מאפייני TSpeedButton "סטנדרטיים" כמו: כיתוב (מחרוזת שמזהה את הבקרה למשתמש), גליף (מפת הסיביות שמופיעה על הכפתור), פריסה (קובעת היכן מופיעה התמונה או הטקסט על גבי כפתור) ...
מיחידת DBCtrls (בה מוגדרת DBNavigator) "קראת" כי נכס הכפתורים המוגנים מוכרז כ:
כפתורים: מערך[TNavigateBtn] של TNavButton;
כאשר TNavButton יורש מ- TSpeedButton ו- TNavigateBtn הוא ספירה, המוגדרת כ:
TNavigateBtn =
(nb ראשון, nb לוחם, nb הבא, nb אחרון, nb הכנס,
nb מחיקה, nb עריכה, nb פוסט, nb ביטול, nb רענן);
שים לב כי TNavigateBtn מחזיק 10 ערכים, כאשר כל אחד מהם מזהה כפתור שונה באובייקט TDBNavigator. עכשיו, בוא נראה כיצד לפרוץ DBNavigator:
DBNavigator משופר
ראשית, הגדר טופס פשוט לעריכת נתונים של Delphi על ידי הצבת לפחות DBNavigator, א DBGrid, DataSoure ו- אובייקט ערכת נתונים לבחירתך (ADO, BDE, dbExpres, ...). ודא שכל הרכיבים "מחוברים".
שנית, פרוץ DBNavigator על ידי הגדרת מעמד "דמה" בירושה, מעל הצהרת הטופס, כמו:
סוג THackDBNavigator = מעמד(TDBNavigator);
סוג
TForm1 = מעמד(TForm)
...
בשלב הבא, כדי שתוכל להציג כיתובים וגרפיקה בהתאמה אישית בכל לחצן DBNavigator, עליך להגדיר כמה גליפים. ניתן להשתמש ברכיב TImageList ולהקצות 10 תמונות (.bmp או .ico), שכל אחת מהן מייצגת פעולה של כפתור מסוים של DBNavigator.
שלישית, ב אירוע OnCreate לטופס 1, הוסף שיחה כמו:
תהליך TForm1.FormCreate (שולח: TObject);
SetupHackedNavigator (DBNavigator1, ImageList1);
סוף;
הקפד להוסיף את ההצהרה על הליך זה בחלק הפרטי של הצהרת הטופס, כמו:
סוג
TForm1 = מעמד(TForm)
...
נוהל פרטי SetupHackedNavigator (const נווט: TDBNavigator;
const גליפים: TImageList);
...
רביעית, הוסף את נוהל SetupHackedNavigator. נוהל SetupHackedNavigator מוסיף גרפיקה בהתאמה אישית לכל כפתור ומקצה כיתוב מותאם אישית לכל כפתור.
שימושים כפתורים; //!!! אל תשכח
תהליך TForm1.SetupHacked Navigator
(const נווט: TDBNavigator;
const גליפים: TImageList);
const
הכיתובים: מערך[TNavigateBtn] של מחרוזת =
('ראשוני', 'קודם', 'מאוחר יותר', 'סופי', 'הוסף',
'מחק', 'נכון', 'שלח', 'נסיגה', 'להחיות');
(*
כיתובים: מערך [TNavigateBtn] של מחרוזת =
('ראשון', 'קודם', 'הבא', 'אחרון', 'הכנס',
'מחק', 'ערוך', 'פרסם', 'בטל', 'רענן');
בקרואטיה (מקומית):
כיתובים: מערך [TNavigateBtn] של מחרוזת =
('Prvi', 'Prethodni', 'Slijedeci', 'Zadnji', 'Dodaj',
'אובריסי', 'פרומג'ני', 'ספרימי', 'אודוסטאני', 'אוסווג'זי');
*)
var
btn: TNavigateBtn;
מתחיל btn: = נמוך (TNavigateBtn) ל גבוה (TNavigateBtn) לעשות עם THackDBNavigator (Navigator). לחצנים [btn] dobegin// מתוך מערך const captions
הכיתוב: = הכיתובים [btn];
// מספר התמונות בנכס גליף
NumGlyphs: = 1;
// הסר את הגליף הישן.
גליף: = אפס;
// הקצה את המותאם אישית
גליפים. GetBitmap (מספר שלם (btn), גליף);
// גילף מעל הטקסט
פריסה: = blGlyphTop;
// הסביר בהמשך
OnMouseUp: = HackNavMouseUp;
סוף;
סוף; (* SetupHackedNavigator *)
אוקיי, בואו נסביר. אתה עובר על כל הכפתורים ב- DBNavigator. נזכיר כי כל לחצן נגיש מהמאפיין מערך הכפתורים המוגנים - לכן הצורך במחלקה THackDBNavigator. מכיוון שהסוג של מערך הכפתורים הוא TNavigateBtn, אתה עובר מה"ראשון "(באמצעות נמוך לחצן "אחרון" (באמצעות גבוה פונקציה) אחת. עבור כל כפתור, אתה פשוט מסיר את הגליף "הישן", מקצה את אותו חדש (מהפרמטר Glyphs), מוסיף את הכיתוב ממערך הכיתובים ומסמן את הפריסה של הגליף.
שים לב שאתה יכול לשלוט על הכפתורים שמוצגים על ידי DBNavigator (לא הכפתור שנפרץ) דרך המאפיין VisibleButtons שלו. מאפיין אחר שברצונך לשנות את ערך ברירת המחדל שלו הוא רמזים - השתמש בו כדי לספק רמזי עזרה שתבחרו עבור לחצן הנווט הבודד. ניתן לשלוט בתצוגה של הרמזים על ידי עריכת המאפיין ShowHints.
זהו זה. זו הסיבה שבחרת בדלפי!
תן לי עוד!
למה לעצור כאן? אתה יודע שכשאתה לוחץ על כפתור 'nbNext', המיקום הנוכחי של מערך הנתונים מתקדם לרשומה הבאה. מה אם ברצונך לעבור, נניח, 5 רשומות קדימה אם המשתמש מחזיק את מקש CTRL בעת לחיצה על הכפתור? מה לגבי זה?
ל- DBNavigator "הסטנדרטי" אין את אירוע OnMouseUp - זה הנושא את הפרמטר Shift של TShiftState - ומאפשר לך לבדוק את מצב מקשי Alt, Ctrl ו- Shift. ה- DBNavigator מספק רק את אירוע OnClick עבורך לטפל.
עם זאת, ה- THackDBNavigator יכול פשוט לחשוף את אירוע OnMouseUp ולאפשר לך "לראות" את מצב מקשי הבקרה ואפילו את מיקום הסמן מעל הכפתור הספציפי כאשר לוחצים עליו!
Ctrl + לחץ: = 5 שורות קדימה
כדי לחשוף את OnMouseUp, פשוט להקצות את נוהל הטיפול בהתאמה אישית שלך לאירוע OnMouseUp עבור כפתור ה- DBNavigator שנפרץ. זה בדיוק נעשה כבר בהליך SetupHackedNavigator:
OnMouseUp: = HackNavMouseUp;
כעת נוהל HackNavMouseUp יכול להיראות כמו:
תהליך TForm1.HackNavMouseUp
(שולח: נושא; כפתור: TMouseButton;
Shift: TShiftState; X, Y: מספר שלם);
const MoveBy: מספר שלם = 5;
התחלהלא (השולח הוא TNavButton) לאחר מכן יציאה;
מקרה TNavButton (שולח). אינדקס של
nb לוחם:
אם (ssCtrl במשמרת) לאחר מכן
TDBNavigator (TNavButton (שולח). הורה).
מקור מידע. DataSet. MoveBy (-MoveBy);
nb הבא:
אם (ssCtrl במשמרת) לאחר מכן
TDBNavigator (TNavButton (שולח). הורה).
מקור מידע. DataSet. MoveBy (MoveBy);
סוף;
סוף; (* HackNavMouseUp *)
שים לב שעליך להוסיף את החתימה של נוהל HackNavMouseUp בחלק הפרטי של הצהרת הטופס (בסמוך להצהרת נוהל SetupHackedNavigator):
סוג
TForm1 = מעמד(TForm)
...
נוהל פרטי SetupHackedNavigator (const נווט: TDBNavigator;
const גליפים: TImageList);
תהליך HackNavMouseUp (שולח: TObject; כפתור: TMouseButton;
Shift: TShiftState; X, Y: מספר שלם);
...
אוקיי, בואו נסביר, עוד פעם אחת. נוהל HackNavMouseUp מטפל באירוע OnMouseUp עבור כל כפתור DBNavigator. אם המשתמש מחזיק את מקש CTRL בעת לחיצה על כפתור ה- nbNext, הרשומה הנוכחית עבור מערך הנתונים המקושר מועברת "MoveBy" (מוגדרת כקבועה בערך של 5) רשומות קדימה.
מה? מסובך מדי?
כן. אינך צריך להתעסק עם כל אלה אם אתה רק צריך לבדוק את מצב מקשי הבקרה כאשר לחיצה על הכפתור. כך תוכלו לעשות את אותו הדבר ב"רגיל " אירוע OnClick של ה- DBNavigator ה"רגיל ":
תהליך TForm1.DBNavigator1 לחץ
(שולח: נושא; כפתור: TNavigateBtn);
פונקציה CtrlDown: בוליאני;
var
מדינה: TKeyboardState;
התחל
GetKeyboardState (מדינה);
תוצאה: = ((מדינה [vk_Control] ו 128) 0);
סוף;
const MoveBy: מספר שלם = 5;
מתחיל כפתור של
nb לוחם:
אם CtrlDown לאחר מכן
DBNavigator1.DataSource. DataSet. MoveBy (-MoveBy);
nb הבא:
אם CtrlDown לאחר מכן
DBNavigator1.DataSource. DataSet. MoveBy (MoveBy);
סוף; //case
סוף; (* DBNavigator2Click *)
זה הכל אנשים
ולבסוף, הפרויקט מסתיים. או שתוכלו להמשיך. להלן תרחיש / משימה / רעיון עבורך:
נניח שאתה רוצה שרק כפתור אחד יחליף את הכפתורים nbFirst, nbPrevious, nbNext ו- nbLast. אתה יכול להשתמש בפרמטרים של X ו- Y בתוך נוהל HackNavMouseUp כדי למצוא את מיקום הסמן כאשר שחרר הכפתור. כעת, לכפתור אחד זה ("לשלוט בכולם") תוכלו לצרף תמונה שיש בה 4 אזורים, כל אזור נניח לחקות את אחד הכפתורים שאתם מחליפים... יש לך את העניין?