
PrintPage.e.Graphics: אובייקט שמציג את הדף. מציירים עליו בעזרת פונקציות:DrawRectangle מצייר מלבן ריק, ו-FillRectangle מצייר מלבן מלא. הפונקציה שמתחילה ב-Fill מקבלת מברשת (Brush).DrawString מדפיס מחרוזת בגופן, במברשת ובמיקום נתונים (X ו-Y).DrawImage מדפיס תמונה.DrawLine מצייר קו, עם עט (Pen).printDocument1.Print(), למשל מתפריט.Document כ-PrintDocument, וקוראים ל-ShowDialog(). הכפתור Print בתוך התצוגה מדפיס ישירות.Invalidate() כדי שהתצוגה תתרענן. התכונה Columns (או Rows) קובעת כמה דפים יוצגו זה לצד זה.ShowDialog() לפני ההדפסה, ומדפיסים רק אם התוצאה היא OK. בלחיצה על Cancel לא מודפס דבר.File.ReadAllLines) ושומרים במשתנה, עם אינדקס שורה נוכחית שמאופס.PrintPage מחשבים כמה שורות נכנסות בדף: גובה אזור ההדפסה (e.MarginBounds.Height) חלקי גובה הגופן.e.HasMorePages קובע אם להפעיל את האירוע שוב לדף נוסף. הדובר הראה שבלי זה מודפס רק דף אחד, גם אם הקובץ ארוך.e.MarginBounds נותן את גבולות השוליים: Left, Top, Right, Bottom.Top מעט מעל השוליים, כדי שלא יתנגש בשורה הראשונה.MarginBounds.Right - image.Width.SolidBrush).הטקסט המלא של הדקות הראשונות בהרצאה «הדפסה מתוך אפליקציה - Printing» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
אנחנו מגיעים לסדרה של רכיבי UI שמאפשרים הדפסה למדפסת. סדרת הרכיבים נמצאת בסרגל פרינטינג. חלק מהם זה ממש תיבות דו-שיח כמו שראינו בעבר, וחלק זה רכיבים שמסוגלים לבצע הדפסה.
אז בואו נראה איך אנחנו יכולים לעבוד איתם. קודם כל, הרכיב המרכזי שקיים כאן בסדרת הרכיבים האלה, והוא זה שהולך לבצע בפועל את ההדפסה, זה הרכיב Print Document.
כל מה שאנחנו צריכים לעשות זה לזרוק אותו על הטופס. הרכיב הזה מכיל אירוע, אם אנחנו נלחץ עליו דאבל קליק אנחנו נגיע לאירוע שלו, שנקרא Print Page.
והאירוע הזה זה אירוע שמסוגל להדפיס בעצם דף אחד או יותר. בואו נראה איך אנחנו יכולים לעבוד איתו. נצמצם פה את החלונות, נוריד פה את זה וקונטרול נקודה בצורה כזאת, קוד יותר נקי.
האירוע הזה מקבל את הפרמטר E. בפרמטר E יש לנו משתנה שנקרא Graphics והוא זה שאחראי על הגרפיקה שאנחנו מעוניינים להדפיס. אנחנו יכולים להדפיס בעזרתו כל דבר, בין אם זה דף אחד או בין אם זה סדרת דפים.
בגרפיקס יש כל מיני פונקציות שמאפשרות הדפסה. לדוגמה, Draw Rectangle. Draw Rectangle אומרת לנו, תביאו לי איזושהי עט שאתם מעוניינים שאני אדפיס איתה.
יש לנו סדרת עטים. באוסף פאנס, בואו נניח גרין ותביאו לי את המימדים של אותו מלבן שאתם מעוניינים להדפיס אז פאנס זה סך הכל איזשהו אוסף של אובייקטים שמתארים עט שבעזרתה אנחנו יכולים לראות את הקו ופה אנחנו רואים שאנחנו יכולים לתת אובייקט ריקטנגל או אנחנו יכולים לתת מימדים של ריקטנגל לדוגמה בואו נתחיל ב-50-70 xy 50-70 וניגש
200-100. אז אנחנו רואים שיש לנו אפשרות לבצע הדפסות של כל מיני דברים. פונקציות שמתחילות ב-draw יבצעו לנו צורה שהיא ריקה ופונקציות שמתחילות ב-fill יבצעו לנו צורה שהיא מלאה.
אם היה לנו fill rectangle אז היינו יכולים לראות צורה מלאה. צורה מלאה מקבלת brush. בואו ניקח מאוסף brushes.blue וניתן מקום אחר בשביל להדפיס את המלבן הזה.
בואו נניח במיקום 300, 200, רוחב 50, 70. פונקציה נוספת שקיימת graphics.drawString שאומרת לנו תביאו לי את ה-String עצמו, תביאו לי את הגופן, בואו ניתן את אותו גופן של הטופס, תביאו לי באיזה מברשת אתם רוצים שאני אדפיס, בראש אז נקודה לייט בלו ובאיזה מיקום אתם רוצים שאני אדפיס בואו נראה הנה יש לנו פה x וy בואו נניח 200 100
עכשיו איך אנחנו גורמים לאירוע הזה להתבצע כל מה שאנחנו צריכים לעשות זה פשוט לקרוא לפונקציית print ששייכת לרכיב print document לצורך כך בואו ניגש ונוסיף מניו כי בדרך כלל הדפסות שייכות לאזור המניו לא חובה אנחנו יכולים סתם לקחת איזשהו לחצן.
אז יש לנו פה פרינטינג, וכאן נרשום פרינט. בואו ניתן להם שמות. התפריט העליון הולך להיקרא MNU פרינטינג, שייך לכל ההדפסות, והתת-תפריט הזה יבצע בפועל את ההדפסה ונקרא לו MNU פרינט.
דאבל קליק, ניכנס לתוך התפריט, נגיע לקוד, וכל מה שאנחנו צריכים לעשות זה לקרוא ל-print document 1, זה השם של הרכיב, נקודה, נבצע בנייה, נריץ את התוכנית, אפשר בינתיים לסגור כל מיני חלונות אז הנה הטופס רץ לו וכל
מה שאנחנו רוצים לעשות זה ללחוץ על פרינט ואנחנו כבר רואים שמתבצעת פה איזושהי הדפסה ואני לא יודע אם אתם שומעים את זה אבל דף כלשהו יוצא לי כרגע מהמדפסת הוא בתהליכי הדפסה עכשיו, מודפס, זהו זה סיים, אני מסתכל עליו ואני רואה שבאמת יש לנו בול את הצורות ואת המחרוזת שהדפסתם.
אבל יכול להיות מצב שאני רוצה להראות את זה למשתמש עצמו, מה בדיוק הולך לצאת. אז בואו נראה איך עושים את זה. אנחנו ראינו שיש לנו כל מיני רכיבים נוספים ששייכים לתחום הפרינטינג, והרכיבים האלה מאפשרים לנו גם להציג preview למשתמש.
לדוגמה, print preview dialog. אם אני שם את print preview dialog על הטופס, אני רואה שזה רכיב שמופיע פה למטה, אבל הרכיב הזה מאפשר להציג איזשהו טופס נוסף שבו המשתמש הולך לראות את ההדפסה.
אוקיי, איך ניתן לעשות את זה? כל מה שאנחנו צריכים לעשות זה דבר ראשון לגשת לרכיב ה-Print Preview Dialog ולומר לו איזה Print Document הולך לבצע את ההדפסה בכדי שהוא יציג אותה.
לכן אנחנו רואים שיש לנו פה מאפיין דוקיומנט ששייך לפרינט פריוויו דיאלוג. בואו נבחר את פרינט דוקיומנט 1, זה הרכיב שמבצע את ההדפסה בפועל. נחזור לאירוע, אני מדבר על האירוע של התפריט MNU פרינט, שדרך אגב לפי סדר הגיוני הוא אמור להיות פה למעלה, ולפני שאנחנו הולכים לבצע את ההדפסה אנחנו יכולים
פשוט לגשת לפרינט פריוויו דיאלוג 1 נקודה שואו דיאלוג ולתת לו דיס כמו שתמיד עושים. הרמנו בעצם את השואו דיאלוג הזה. בואו נריץ, ניגש לפרינטינג, נלחץ על פרינט ושימו לב שעולה לנו איזשהו טופס ומראה לנו מה בדיוק הולך להיות מודפס.
עכשיו שימו לב זה בדיוק הדף שסרטטנו באירוע של ההדפסה וזה בדיוק הדף שיצא לי מהמדפסת ואני כרגע מסתכל ומשווה בול אותו הדבר. דרך הפרינט פריווי אנחנו יכולים לבצע בפועל את ההדפסה אם אני כרגע אלחץ פה על פרינט אז בעצם יודפס הדף וכרגע אני רואה שהמדפסת שלי שוב פעם מתחילה לעבוד ולהוציא את הדף שאנחנו רואים.
אנחנו יכולים לבצע סגירה ואז כמובן מה שביצענו זה המשך הדפסה חוזרת, אתם רואים ששוב פעם התבצעה הדפסה ושוב פעם המדפסת שלי עובדת ומוציאה בפעם השלישית את אותו הדף שהדפסנו.
אז בכדי שהדף לא יודפס פעמיים למשתמש, מה שכדאי לנו לעשות זה פשוט לבצע הפרדה ולהגיד למשתמש כזה דבר. זה נכון שיש לך פה אופציית פרינט, אבל בואו נוסיף, נלך ל-insert, מניו אייטם נוסיף מניו אייטם אפילו לפני הפרינט ונקרא למניו הזה פרינט פריוויו כלומר יכול להיות שהמשתמש רוצה
להדפיס בלי לראות שום פריוויו ויכול להיות שהוא רוצה כן לראות פריוויו אנחנו נבצע הפרדה בין שניהם ולא נעשה אותם ביחד וככה המשתמש יכול או להדפיס ישירות בלי לראות פריוויו או אם הוא רוצה שיראה פריוויו ואז דרך הפריוויו שיבצע את ההדפסה זה יהיה mnu print preview דאבל קליק עליו נגיע לאירוע שלו, נעלה אותו ראשון כי הוא לפי הסדר אמור להיות לפני כולם, זה רק סדר הגיוני,
ואת הפרינט פריוויו דיאלוג אני פשוט אעתיק לכאן. אז אם המשתמש לוחץ על פרינט פריוויו הוא פשוט יראה את התיבה של הדיאלוג ויכול להדפיס או לבטל, אם המשתמש לא רוצה לראות דיאלוג בבקשה שילחץ על לחצן הפרינט, אנחנו נבצע במקומו את ההדפסה והוא לא יראה שום preview במקרה הזה.
אז כאן אנחנו ראינו בינתיים שני רכיבי הדפסה שניתן לעבוד איתם. רכיב נוסף שקיים לנו זה הרכיב Page Setup דיאלוג. Page Setup מאפשר למשתמש להגדיר את התצורה של הדף, כלומר מה המימדים של הדף, האם הדף באמת מוגדר כדף הסטנדרטי A4 או שאנחנו רוצים לאפשר לו לבחור דף אחר, אולי
הוא רוצה להדפיס את צורה של דף קטן יותר, דף של מעטפה אולי, A5, יש כל מיני סוגים של דפים. איך אנחנו עובדים עם הרכיב הזה?
קודם כל, כל הרכיבים האלה צריכים לדעת מי הרכיב שמבצע את ההדפסה בפועל בשביל לשלוט על המאפיינים שלו. אז כל מה שאנחנו עושים זה בוחרים את ה-Page Setup Dialog, הולכים ל-Document ואומרים לו, תקשיב, יש רכיב אחד שמבצע את ההדפסה וזה ה-Print Document.
כעת אנחנו יכולים ללכת ולהוסיף למניו עוד תפריט והתפריט הזה יהיה עבור Page Setup. נבחר אותו, נקרא לו MNU Page Setup, דאבל קליק על התפריט.
בגלל שהתפריט הזה מופיע ראשון, יכול להיות שהמשתמש ירצה לבחור בו ראשון, למרות שבדרך כלל משתמשים לא נוהגים להגדיר את הדפים ומשאירים A4, אנחנו כן נגדיר אותו פה וכל מה שאנחנו רוצים לעשות ברכיב הזה זה להגדיר בעצם את page setup dialog 1.show dialog וכאן בעצם אנחנו מבצעים הגדרה של או הצגה של איזושהי תיבה שמאפשרת להגדיר את הדף בואו נסתכל נריץ קודם כל מה שאני
רוצה לעשות זה להסתכל על פרינט פריוויו בלי לגשת לפייג' סטאפ ניגש לפרינט פריוויו ואני רואה בדיוק את המימדים של הדף שמוצג לנו בסדר שימו לב שאם אנחנו מסתכלים על הדף אנחנו רואים את המימדים האלה בואו נסגור לא נבצע הדפסה ואז ניגש לפייג' סטאפ פייג' סטאפ יש לנו את התיבה הזאת ופה אנחנו יכולים להגדיר את המימדים החדשים
של הדף שאנחנו רוצים בואו נבחר envelope כאילו אנחנו רוצים מעטפה שימו לב שהוא נותן לנו פה דף יותר ארוך ויותר צר נבצע אוקיי ועכשיו נבצע print preview ונראה אולי אתם שמים לב אבל שימו לב באמת מצליחים לראות את זה שהדף עצמו הממדים שלו הם אחרים הם קצת יותר צרים נראים כמו מעטפה כזאת קצת יותר ארוכים אז אנחנו רואים שהרכיב הזה השפיע ברגע שבחרנו
מספיק שבחרנו, הוא כבר השפיע על אופן ההצגה של הדף או על המימדים של הדף. אז יש לנו גם אפשרות להראות את זה למשתמש. גם בוויז'ל סטודיו אתם יכולים לראות את הדברים האלה.
אם אתם הולכים לפייל אתם יכולים לעשות פרינט, ויש לנו פה פייג' סט-אפ אבל אני רואה שהוא כרגע לא מאופשר מאיזושהי סיבה. בדרך כלל אתם יכולים לראות את הדברים האלה אולי במסמכי וורד.
אתם יכולים לראות שאתם יכולים לשלוט על המימדים של הדף שמוצגים. בוויז'אול סטודיו אני רואה שביטלו את זה לפחות בקובץ הזה.
רכיב נוסף שאנחנו יכולים להתעסק איתו זה רכיב שהוא בעצם אותו הדבר כמו הפרינט פריוויו, בעצם מאוד מאוד דומה, נותן לנו גם איזשהו פריוויו, אבל הוא לא עושה את זה על ידי טופס נפתח בצורה נפרדת, טופס שבצורה נפרדת נפתח לנו, אלא על ידי קונטרול, זה הרכיב.
פרינט פריוויו קונטרול. בואו נזרוק אותו על הדף ונפתח אותו שיהיה קצת יותר בעל ממדים גדולים ויכול להיות מצב שאתם רוצים להגיד למשתמש תראה, המפמח שבחרת להדפסה, רואים אותו כאן אתה יכול לראות אותו ולהחליט אם אתה רוצה להדפיס או לא רוצה להדפיס צמצם טיפה את הטופס, מעולה אז איך אנחנו עובדים עם הרכיב הזה?
הדבר שאנחנו תמיד היינו עושים וגם אנחנו צריכים לעשות עכשיו זה לומר לרכיב Print Preview Control מי הדוקיומנט שהוא אמור להציג הנה אנחנו רואים פה את המאפיין דוקיומנט בואו נפתח ונבצע פרינט דוקיומנט אחד וברגע שאנחנו מריצים את התוכנית אז הוא כבר
הולך לדוקיומנט ואומר בואו תגידו לי מה אתם רוצים שאני אציג להדפסה אוקיי בואו נריץ את זה תוכנית רצה וכבר כאן אנחנו רואים את המסמך להדפסה כי מה שקרה ובייסיקלי הוא הלך לדוקיומנט אמר טוב אני קורא לפונקציית פרינט בשביל לראות מה בעצם מודפס והפונקציה או האירוע print הדפיס לו את מה שהוא רוצה והוא פשוט מציג את זה.
אז אנחנו יכולים, היוזר יכול לראות בצורה כזאת את מה שהולך להיות מודפס וזה כמובן לחילופים כן הוא יכול לראות את זה בצורה של טופס נפרד אם הוא רוצה ואם הוא רוצה אם אתם רוצים להציג לו אתם יכולים להציג לו את זה כרכיב כזה.
מעולה. בואו נראה האם שינוי של התצוגה או ליתר דיוק של גודל הדף ישפיע גם על רכיב הפרינט preview control. אז הנה אנחנו רואים את התצוגה הנוכחית.
שימו לב איפה נמצא בדיוק המלבן הירוק ואיפה המלבן הכחול יחסית לכל הדף. נלך לפייג' סטאפ, נגיד המשתמש בוחר לנו את אותה envelope שראינו מקודם. אוקיי ואנחנו רואים שאין פה שום השפעה על רכיב הפרינט פריוויו קונטרול למרות שאמורה להיות השפעה.
כל מה שאנחנו צריכים לעשות זה לחזור לקוד, לגשת לקוד הזה שביצע את התצוגה של הרכיב של המימדים של הדף ולהגדיר print preview control 1.invalidate אני לא בפרינט פריוויו קונטרול, print preview control 1 invalidate preview זאת הפונקציה שחיפשתי invalidate זה פונקציה ידועה שחוזרת על גרפיקה של דבר מסוים מרפרשת את הגרפיקה שלו ו-invalidate
preview זאת אומרת בוא תצבע שוב פעם את הגרפיקה בשביל שזה יהיה תואם בואו נריץ שוב פעם נבחר את page setup נבחר את המעטפה envelope נבצע אוקיי ואנחנו רואים שבאמת גם הפריוויו קונטרול השתנה.
בואו ננסה לעשות משהו אחר. בואו נריץ, נבחר את הפייג' סטאפ, נבחר את האנבלו ונלחץ על cancel ולא קרה שום דבר.
אבל עדיין ראינו איזשהו פליקרינג שהתבצע, מפני שזה היה ה-invalidate preview. לכן מה שכדאי לנו לעשות זה מה שעשינו בעבר בדיאלוג בוקסז, ופה קיבלנו את הדיאלוג ריזולט ואז ביצענו בדיקה רק אם הריזולט זה אוקיי, רק אז רצינו לבצע את הפעולה הבאה בתור שהייתה אחרי זה.
בואו נריץ, נבחר סט-אפ אנבלופ, נבצע קאנסל, לא קרה כלום, נבחר סט-אפ אנבלופ, נבצע אוקיי, ה-קונטרול רפרש את עצמו והציג את הדף הנוכחי שבחרנו, את המימדים החדשים של הדף.
ובעצם והרכיב Print Preview Control. עכשיו, אני בטוח שכאשר יצא לכם להדפיס בעבר דברים, יכלתם לשלוט גם על איזה מדפסת או קובץ אתם רוצים להדפיס אליה, או כל מיני הגדרות נוספות לגבי איכות ההדפסה אולי.
איך אנחנו יכולים לשלוט על הדברים האלה? אז למעשה, כל ההגדרות האלה נמצאות ברכיב נוסף שאנחנו הולכים להכיר, והוא נקרא Print Dialog.
Print Dialog זה רכיב נוסף, בואו נזרוק אותו דאבל קליק, אנחנו רואים אותו פה למטה, כמו תמיד אנחנו צריכים לבוא ולהגיד לו על איזה דוקיומנט הוא שולט, ניקח את הדוקיומנט ונגיד לו יש לנו רכיב שנקרא פרינט דוקיומנט אחד, מעולה, ועכשיו אנחנו צריכים להעלות אותו,
להציג אותו. איפה אנחנו עושים את זה? אנחנו עושים את זה בפעולה של ההדפסה עצמה. אז בואו נלך לפרינט, מה שאנחנו רואים כאן זה שפשוט באנו ואמרנו למשתמש בבקשה אתה יכול להדפיס, ואנחנו לפני זה רוצים כרגע לבצע העלאה של print dialogue 1.show dialogue.
עכשיו שימו לב שהיוזר יכול גם לבטל את ההדפסה בעזרת הרכיב הזה. אם הוא לוחץ על cancel, אז כדאי שנקבל את התוצאה ממנו. dialogue result, ונבצע את ההדפסה רק אם result הוא אוקיי.
יוזר ביטל הדפסה, אין בעיה, אנחנו לא מדפיסים לך שום דבר. בואו נראה איך נראה הפרינט דיאלוג הזה. אני מריץ את האפליקציה, אני הולך לפרינטינג, מבצע הפעם פרינט, וכאן אנחנו רואים את התיבה הזאת שאומרת, יש לכם כל מיני מדפסות, אולי גם ברשת, אם היה לי פה רשת היינו רואים עוד מדפסות.
יש לי פה מדפסת בראבר, אנחנו רואים את הסימן השחור של ה-V הזה, בקושי מצליחים לראות אותו, רואים אותו עכשיו יותר טוב. זה אומר שמה שמסומן בשחור V זה המדפסת הדיפולטית שמוגדרת.
דרך אגב, אפשר ללכת במערכת ההפעלה. בואו נלך ל-Settings, Printer and Faxes, ואפשר לבחור מישהו אחר כדיפולט. אני יכול ללכת למישהו אחר ולהגדיר Set as default printer, וזה הופך להיות מעכשיו ה-Default.
דרך אגב, אתם יכולים ללכת במערכת ההפעלה ל-Properties של המדפסת, ואז להגדיר כל מיני מאפיינים שהם יהיו תמידיים כאשר אתם מבצעים הדפסות.
לדוגמה, אם אני הולך ל-Printing Preferences, אז נפתחת לי התיבה שאחראית על המדפסת עצמה, ואני יכול להגדיר שב-Default, כל הזמן שאני מדפיס, האיכות תהיה Fine, האיכות הכי טובה, או Normal, או איזה איכות שאני לא רוצה, או Fast.
אצלי זה מוגדר ב-Default כ-Fast Normal. כמובן, ככל שזה יותר חזק, אז זה מבזבז יותר דיו, יש לשים לב לנקודה הזאת. פה אני יכול להגדיר שביידיפולט אני רוצה שזה ידפיס לי בגריי סקייל, בגוונים של אפור, לא בצבעים.
זה מוגדר ביידיפולט בצבע. אז אנחנו יכולים לשלוט על ההגדרות האלה, בואו נעשה כרגע קאנסל. וברגע שעשינו את ההגדרות האלה ממערכת ההפעלה, אלה ההגדרות הדיפולטיות שתמיד קיימות.
אבל כאשר אני מציג את התיבה הזאת של פרינט דיאלוג, גם כאן אנחנו יכולים ללכת ל-Perferences ולהגיע לאותו חלון ולשנות את ההגדרות.
אם אנחנו משנים אותם, ההגדרות האלה יהיו ספציפית לגבי ההדפסה הנוכחית. אם אני אדפיס את זה כרגע למדפסת, זה כרגע יהיה ספציפית לגבי ההדפסה הנוכחית.
אז אם אני עכשיו לוחץ על Print, אז ההדפסות כרגע מוצגות למדפסת, מוצגות למדפסת, אני שומע את המדפסת עובדת, ואם היינו לוחצים על Cancel, אז כמובן ההדפסה הייתה מתבטלת.
בואו רגע נוציא את הדף, כרגע הודפס לי דף. אותו הדבר כמו מקודם, אבל הוא בשחור לבן. בואו ניגש, נבצע פרינט, כמובן נלחץ על cancel ושום דבר לא קרה ושום דבר גם לא קורה.
אין דף שמוצג כרגע או הודפס כרגע במדפסת. אז אחרי שראינו את כל הרכיבים ששייכים להדפסה Page Setup, Print Dialog, Print Document מבצע את ההדפסה, Print Preview Control מציג את התצוגה המקדימה על קונטרול על הטופס ו-Print Preview Dialog
מאפשר להציג את התצוגה המקדימה על טופס נפרד. בואו נראה איך אפשר להשתמש בכל מה שלמדנו עכשיו בשביל לבצע הדפסה אמיתית של איזשהו מסמך טקסטואלי.
בואו ניקח מסמך טקסטואלי פשוט, ניתן למשתמש אפשרות לבחור אותו ונדפיס אותו בצורה מעניינת. דבר ראשון, בואו נגדיר לעצמנו כמה מאפיינים גלובליים.
בואו נגדיר באיזה פונט אנחנו רוצים להדפיס ותהיה לנו את היכולת אחר כך על ידי המשתמש לשנות אותו. נקרא לזה לטר פונט, נגדיר איזשהו פונט דיפולט, נגדיר איזשהו בראש להדפסה, אולי דיפולט זה יהיה שחור, אחר כך נוכל לשלוט על זה.
אני רואה שהוא לא נותן לי, אז אין שום בעיה, נגדיר את זה כבראש, זה יהיה יותר הגיוני. יופי. לאחר מכן נגדיר איזשהו משתנה פרייבט שיחזיק לנו את כל השורות של הקובץ שאנחנו רוצים להדפיס, זה יהיה השורות, יוזר יבחר את הקובץ שהוא רוצה ונגדיר איזשהו אינטג'ר של מה השורה הנוכחית שאנחנו כרגע
רוצים להדפיס, וכמובן אנחנו הולכים להעלות אותה שוב ושוב עם פלוס פלוס בשביל להדפיס שורה שורה בקובץ שהיוזר צריך לבחור. בואו ננקה פה מרחבי שמות.
הדבר הבא שאנחנו רוצים לעשות זה לאפשר למשתמש לבחור את הקובץ. ואוקיי. אז בואו נגדיר פה תפריט נוסף שהמשתמש יבחר דברים שקשורים למסמך שהוא רוצה להדפיס.
יש לנו פה דוקיומנט Select a File to Print. תן לזה MNU Select File ובשביל לבחור איזשהו קובץ בואו נלך ונצרף את Open File Dialog מה שראינו בעבר שמאפשר למשתמש לבחור איזשהו קובץ.
בואו נגיד שאנחנו רוצים לאפשר למשתמש לבחור קבצי טקסט כי זאת ההדגמה שלנו כרגע, נלך לפילטר ונעצב כאן פילטר והפילטר שאנחנו רוצים זה text files ==txt vertical pipe ==txt ובעצם מתאר שהמשתמש יכול לבחור רק קבצי טקסט להדפסה.
אוקיי, בואו נחזור לאירוע הזה ונגדיר למשתמש אפשרות לבחור את הקובץ. נשים את זה פה למעלה ומה שאנחנו רוצים לעשות דיאלוג ריזולט ריזולט שווה אופן פייל דיאלוג אחד נקודה שואו דיאלוג רק במידה והריזולט היה אוקיי מה שאנחנו רוצים לעשות זה לקרוא את הקובץ ולבצע את ההדפסה.
אז אנחנו הולכים ל-letter lines ומכניסים לתוכו file.read all lines. יש לנו את הקובץ שהמשתמש בחר, open file dialog 1.file name, יוזר בחר את הקובץ הזה ומה שאנחנו רוצים לעשות זה לקרוא את כל השורות ממנו.
כי זה קובץ טקסטואלי יש לו שורות. בנוסף אנחנו רוצים לגשת ל-current letter line ולהכניס לתוכו 0, יכול להיות שכבר קראנו מסמך קודם וה-current letter line עלה עלה עלה עד סוף המסמך ועכשיו אנחנו רוצים אחד חדש אז אנחנו רוצים להחזיר אותו.
בנוסף מה שאנחנו רוצים לעשות זה לרפרש את הגרפיקה של ה-Print Preview Control כדי שהוא יוכל להציג את המסמך החדש מיידית את המסמך שאנחנו רוצים להדפיס. אז יש לנו רפרוש של הגרפיקה כך שהיוזר מיד יוכל לראות את המסמך שנבחר בקונטרול עצמו שמוצג על הטופס אם אנחנו משתמשים בקונטרול כזה כמו שעשינו בדוגמה הזאת.
כל ההגדרות האלה סך הכל אפשרו למשתמש לבחור קובץ. בואו נמשיך לעבור על הקוד ונתאים אותו לדוגמה שאנחנו בונים כרגע.
בפייג' סטאפ המשתמש בוחר את המימדים של הדף. גם כאן יכול להיות שהוא כבר הדפיס מסמך קודם ואנחנו רוצים להחזיר אחורה את השורה הנוכחית בכדי שהוא יתחיל מההתחלה להדפיף את השורה הנוכחית.
את אותו הדבר אנחנו רוצים לעשות גם בפרינט פריוויו. שימו לב למה אני תמיד מחזיר אחורה את ה-current letter line לאפס, מפני שתכף אנחנו הולכים באירוע ההדפסה עצמו בפרינט פייג', זה האירוע המרכזי שמבצע את ההדפסה בפועל.
באירוע הזה אנחנו הולכים לרוץ בלולאה ולהדפיס את כל השורות של הקובץ. אז במהלך הלולאה אנחנו הולכים להעלות את ה-Current Letters Line שוב ושוב ושוב.
כל הרכיבים האלה שראינו מקודם, ה-Print Preview Control וה-Print Preview Dialog, כל הרכיבים האלה הולכים לקרוא לאירוע ה-Print Page בשביל להציג בתוך עצמם את המסמך.
אם הם קוראים ל-Print Page, זה אומר שבתוך print page אנחנו הולכים להעלות את ה-current letter line עד שהוא יגיע לסוף ולכן כל פעם שהמשתמש בוחר את הרכיבים האלה בשביל לראות את התצוגה או כל פעם שהוא עושה איזשהו change אנחנו נרצה להחזיר בחזרה אחורה את ה-current letter line כי הרכיבים האלה צריכים מחדש לקרוא את כל המסמך.
תכף אנחנו נראה את זה בפועל מתבצע בתוך print page. פה בעצם החזרנו אותו גם בפרינט פריוויו בכדי שהרכיב פרינט פריוויו יוכל שוב פעם לרוץ ולהציג את כל המסמך שאנחנו רוצים להדפיס כביכול.
כעת כל מה שנשאר לנו לעשות זה לבנות את האירוע פרינט פייג'. במקום שלושת הדברים האלה שאני אשים אותם כרגע בהערה כי אנחנו לא רוצים להדפיס מלבנים ואת המחוזת הלואו, כל מה שאנחנו רוצים לעשות זה לבצע ריצה על כל המסמך ולהדפיס אותו שורה שורה.
בואו ניכנס לפה. דבר ראשון מה שאנחנו רוצים לבצע זה לבדוק האם באמת יוזר בחר קובץ או שהוא לא בחר. אם letter lines זה נל, letter lines המספר של השורות הוא 0, נניח שיוזר בחר קובץ ריק, אנחנו לא רוצים לבצע שום דבר ולצאת החוצה מפני שאין לנו שום מסמך אם ברצוננו להדפיס או שהמסמך הוא ריק.
למה אנחנו צריכים לבחור את זה? או למה אנחנו צריכים לבדוק את זה? מפני שעל ההתחלה כשהטופס עולה אז הרכיבים האוטומטיים לדוגמה print preview control הולך וקורא ל-print page ואם אנחנו לא נעשה את זה אז אנחנו נחטוף exception כי מנסים כאילו לקרוא את ה-letter lines ואין שם שום דבר.
אז בעצם מה שנשאר לנו לעשות זה רק לרוץ בלולאה. נרוץ בלולת while כל עוד ה-current letter line יותר קטן מ-lines או מ-letter lines.length אנחנו רוצים להציג את השורה הנוכחית שאנחנו קוראים ולקדם את current line++. אז איך אנחנו מציגים את השורה הנוכחית?
דבר ראשון, כאשר אנחנו מתעסקים עם הצגה של מחרוזת, ראינו מקודם שאנחנו צריכים ללכת לאי נקודה גרפיקס דרואו סטרינג. דבר ראשון הוא אומר לנו איזה מכרוזת אתה רוצה.
אנחנו רוצים את letter lines במיקום current letter line. השורה הנוכחית שאנחנו כרגע רצים ורוצים להדפיס אותה.
הדבר הבא שדרואו סטרינג אומרת לנו זה מה הגופן שאתם רוצים. יש לנו גופן letter font שעוד מעט היוזר גם ישלוט עליו.
באיזה בראש, באיזה מברשת, באיזה צבע אתם רוצים להציג את המחוזת? היה לנו למעלה לטר בראש, אבל הדבר המרכזי זה באיזה מיקום אתם רוצים להציג.
הנה ה-X והנה ה-Y. אז איפה אנחנו רוצים להציג את המידע? X אנחנו לא רוצים 0 מפני שאז זה יהיה ממש בקצה קצה קצה של הדף. אנחנו רוצים בשוליים שמוגדרים לפי כל ההגדרות שהיוזר בחר לפני זה אז איך אנחנו יודעים מה ההגדרות שהיוזר בחר יש לנו את האי המשתנה שמגיע לאירוע ולמשתנה הזה יש אובייקט
שנקרא מרג'ין באונדס אובייקט מאוד חשוב בעולם ההדפסות מרג'ינג זה שוליים באונדס זה גבולות האובייקט הזה מחזיק את הגבולות של השוליים הנוכחיים שהיוזר הגדיר או שמוגדרות by default אם היוזר עדיין לא הגדיר שום דבר ולאובייקט הזה יש כל מיני משתנים שאנחנו יכולים
לגלות מה השוליים לדוגמה left זה המרחק של השוליים מצד שמאל וזה בדיוק ה-X שאנחנו רוצים להציג ה-Y זה המיקום מלמעלה זאת הבעיה כי ה-Y צריך כל הזמן לגדול אז איך אנחנו מגלים את ה-Y בואו ניקח פה משתנה Y ונגלה איפה אנחנו רוצים כרגע לבצע את ההדפסה אנחנו רוצים לבצע את ההדפסה ב-E.MarginBounds.top כלומר אנחנו לא רוצים להתחיל מ-Y0 וראש הדף
אלא אנחנו רוצים טיפה לרדת למטה בדיוק מתחיל מהשוליים אבל אנחנו רוצים להוסיף איזושהי פעולת חישוב שאומרת כזה דבר Current Letter Lime כפול פונט שלנו letterFont.getHeight כי אנחנו רוצים לחשב כמה הגובה של הפונט הנוכחי אז יש לנו את הפונקציה
getHeight שיכולה להגיד לנו מה הגובה של הפונט בגרפיקה הנוכחית זאת אומרת כל המשפט הזה בעצם אומר לנו כמה הגובה הנוכחי וכדאי לעשות את זה כפלואוט ולא כאינטג'ר מפני שכל החישוב הזה הוא חישוב פלואוטי.
ויש לנו את ערך ה-y. אז בואו נראה מה בעצם הקוד הזה מבצע. אני מריץ את התוכנית ואני הולך קודם כל לבצע בחירה של אובקס. בואו נלך לדוקיומנט, Select a file to print, נלך לדסטופ והכנתי פה לפני ושני מסמכים, letter1 ו-letter2 ואני בוחר כרגע את letter1, נבצע open ונראה בדיוק את כל המסמך מוצג.
אחלה. אם היינו הולכים עכשיו ומבצעים פרינט פריוויו היינו אמורים לראות את המסמך הזה בצורה כזאת זאת אומרת שזה נראה שזה עובד אבל זה לא ממש עובד למה כי בואו נבחר קובץ אחר בואו נבחר את לטר 2 ההבדל בין לטר 1 ללטר 2 זה שלטר 2 מתפרס על פני כמה קבצים לצורך הדפסה אם עכשיו אנחנו בוחרים את
לטר 2 אנחנו רואים שהמדפסת יודעת להדפיס רק דף אחד או ליתר דיוק הרכיבים אומרים לנו שיש לנו פה דף אחד והמסמך הזה הוא יותר מדי ארוך נכון אבל עדיין מודפס פה דף אחד בואו נלך לפרינט פריוויו ונראה שיש לנו פה דף אחד אנחנו יכולים פה למעלה לנסות לרפרש בין הדפים או לגלוש בין הדפים ואנחנו רואים שזה דף אחד כמו שניתן לראות במסמך מסמך יותר ארוך מזה אם אנחנו הולכים ואומרים