שאלה: איך עושים בתוסף vsto לוורד שtaskpane יישאר תמיד בחלונית האקטיבית
-
הסתדר לי התוסף (אני התקנתי את התוסף אחרי פבלוש והסרתו מאפליקציות פתרה את הבעיה).
במאמר שמה כתוב לעשות כמו שעשינו, הם לא מדברים על מקרה שרוצים שכל המצב יעבור למסמך השני,
אפשר לעשות זאת תכנותית, אבל באמת להעביר את הפקד כפי שהוא לא הצלחתי, זה מופיע שחור:private Microsoft.Office.Tools.CustomTaskPane taskPane; private UserControl1 control = new UserControl1(); private Word.Document lastDoc; private void ThisAddIn_Startup(object sender, System.EventArgs e) { Application.DocumentChange += () => loadPanel(); } void loadPanel() { if(Application.Documents.Count == 0 || lastDoc == Application.ActiveDocument) return; lastDoc = Application.ActiveDocument; if (taskPane != null) { control.Parent = null; this.CustomTaskPanes.Remove(taskPane); } taskPane = this.CustomTaskPanes.Add(control, "שלום עולם"); taskPane.Visible = true; taskPane.Width = 200; }
-
@pcinfogmach צודק, עובד!
private Microsoft.Office.Tools.CustomTaskPane taskPane; private UserControl1 control = new UserControl1(); private UserControlContainer container; private Word.Document lastDoc; private void ThisAddIn_Startup(object sender, System.EventArgs e) { Application.DocumentChange += () => loadPanel(); } void loadPanel() { if(Application.Documents.Count == 0 || lastDoc == Application.ActiveDocument) return; lastDoc = Application.ActiveDocument; if (taskPane != null) { container.Controls.Remove(control); this.CustomTaskPanes.Remove(taskPane); } container = new UserControlContainer(control); taskPane = this.CustomTaskPanes.Add(container, "שלום עולם"); taskPane.Visible = true; taskPane.Width = 200; } public class UserControlContainer : UserControl { public UserControlContainer(UserControl1 control) { Controls.Add(control); control.Dock = DockStyle.Fill; } }
-
@dovid
פידבק שקיבלתי מחברזה יפה מאוד, כדאי לך לקחת בחשבון כמה פרטים חשובים
א'. אי סגירת החלונות צד ורק הסתרתם, יש לה מחיר במעבד ובראמ.
ב'. הוספת התיבה בעת פתיחת מסמך חדש, תגרום להאטה של פתיחת המסמך החדש, יש לשקול לעשות את זה רק זמן אחר פתיחת המסמך החדש. -
א. אנו לא רק מסתירים, אנחנו משתמשים עם CustomTaskPanes.Remove שתפקידה לנקות משאבים.
ב. אני לא מבין מה הקשר לנושא פה. אני לא מכיר VSTO, אין לי מושג מה גורם לפתיחה בהתחלה של החלונית ולפי מה אפשר לדחות זאת. אני השתמשתי בקוד שנתת לי וסה"כ עניתי איך לגרום שהפעלת מסמך אחר תציג את אותה חלונית.נ.ב. אם תצליח לגרום לחבר שלך להשתתף פה בדיונים אודה לך מאוד!
-
@dovid כתב בשאלה: איך עושים בתוסף vsto לוורד שtaskpane יישאר תמיד בחלונית האקטיבית:
נ.ב. אם תצליח לגרום לחבר שלך להשתתף פה בדיונים אודה לך מאוד!
נסיתי בעבר אנסה שוב.
ושוב תודה על הכל. פשוט אין מילים בפי. -
@dovid
ניתקלתי בבעיה בקוד הנוכחי - כאשר המשתמש סוגר את החלונית אז זה לא מעיל לו לסגור אותה לגמרי כי זה קופץ לו בחזרה ברגע שהוא מחליף תצוגה ממסמך למסמך
חשבתי לעשות משתנה Bool שיקלוט את זה אבל אולי יש דרך יותר טובה?
כמו"כ לא הצלחתי לקלוט את הלחיצה על כפתור הסגירה. (שים לב כפתור הסגירה אינו סוגר רק מסתיר אז לתפוס את ההסתרה אולי זה אופציה השאלה אם זה עלול לגרום לבעיה שלא חשבתי עליה)עריכה:
ניסיתי את הרעיון עם הbool שיקלוט את אירוע ההסתרה וניתקלתי בבעיה:
כאשר המשתמש סוגר מסמך אחד (דהיינו סוגר מסמך ולא את התוסף) אז החלונית נסגרת בכל החלונות
להוסיף משהו שיטפל באירוע סגירת המסמך ג"כ משתבש לי כי אז זה סוגר בכל החלוניות וכאשר פותחים מסמך חדש זה חוזר בכל חלוניות בקיצור בלאגן גדול -
אכן, סגירה רק מסתירה (מעניין, לפי מה שחבר שלך טוען על RAM וזיכרון זה יוצר בעיה מובנית בכל תוסף).
האזנה לסגירה אתה יכול לעשות עם האירוע taskPane.VisibleChanged שמה בתוכו אתה יכול לבדוק את taskPane.Visible.
אבל כל הסיפור הזה זה השתלשלות בלתי נסבלת מנושא אחר. כי אין פה שום אזכור בנושא מתי אתה רוצה להציג את החלונית, והיה במשמע שאתה תמיד רוצה. אם המצב לא ככה, בהכרח יש טריגר מתי אתה מציג ואז אתה יכול לסמן שדה bool שבמקרה כזה זה יוצג. -
@dovid כתב בשאלה: איך עושים בתוסף vsto לוורד שtaskpane יישאר תמיד בחלונית האקטיבית:
אבל כל הסיפור הזה זה השתלשלות בלתי נסבלת מנושא אחר. כי אין פה שום אזכור בנושא מתי אתה רוצה להציג את החלונית, והיה במשמע שאתה תמיד רוצה.
סליחה שלא כתבתי בהתחלה מספיק ברור.
הרעיון שלי היה לעשות שהחלונית תשאר סטטית בכל המסמכים הפתוחים דהיינו או פתוחה או סגורה.
כי המצב המובנה של וורד שהוא רק פותח חלונית במסמך הנוכחי מאוד מעצבן בתוסף כמו שלי.
אז רציתי לדמות כאילו התוסף פתוח או סגור באותה רמה בכל המסמכים הפתוחים. ושאם כבר פתוח במסמך אחד אז גם ייפתח אוטומטית במסמכים חדשים.
מקווה שכתבתי מספיק ברור.לגבי הטריגר הוא אמור היות הכפתור סגירה רק שהסתכתי עם זה ועם הbool כנ"ל
ושוב תודה -
@dovid כתב בשאלה: איך עושים בתוסף vsto לוורד שtaskpane יישאר תמיד בחלונית האקטיבית:
לא היית צריך להתנצל, ולא הבנת אותי.
מתי אתה רוצה שייפתח התוסף פעם ראשונה, בעת_________?בעת לחיצה על כפתור בסרגל הכלים (סרגל visual לא סרגל xml)
הערה: אם מתכנתים סרגל visual או שמתשמשים עם לשונית מובנית ואש אפשר להשתמש עם cotrolid של office אם רצונך ליצור לשונית חדשה אז צריך להגדיר כ custom
-
וזה ממש טוען את התוסף מאפס (מעורר ThisAddIn_Startup?)
הבנתי, סליחה.@dovid כתב בשאלה: איך עושים בתוסף vsto לוורד שtaskpane יישאר תמיד בחלונית האקטיבית:
האזנה לסגירה אתה יכול לעשות עם האירוע taskPane.VisibleChanged שמה בתוכו אתה יכול לבדוק את taskPane.Visible.
private bool IsVisibleStatus = true; void loadPanel() { if(!IsVisibleStatus) return; if(Application.Documents.Count == 0 || lastDoc == Application.ActiveDocument) return; lastDoc = Application.ActiveDocument; if (taskPane != null) { container.Controls.Remove(control); this.CustomTaskPanes.Remove(taskPane); } container = new UserControlContainer(control); taskPane = this.CustomTaskPanes.Add(container, "שלום עולם"); taskPane.Visible = true; taskPane.Width = 200; taskPane.VisibleChanged += (s, e) => IsVisibleStatus = taskPane.Visible; }
-
@dovid כתב בשאלה: איך עושים בתוסף vsto לוורד שtaskpane יישאר תמיד בחלונית האקטיבית:
האזנה לסגירה אתה יכול לעשות עם האירוע taskPane.VisibleChanged שמה בתוכו אתה יכול לבדוק את taskPane.Visible.
מה עם הבעיות הנ"ל?
https://tchumim.com/post/157637 -
אני לא לגמרי מבין את הבעיה, ובאיזה שלב גם קשה לעקוב אחרי הכל, אבל בוא ננסה לפרק את הבעיה לגורמים
א'. יש לנו אוסף של חלוניות צד, ויש לנו בעיה שאנחנו רוצים שיופיע בכל מסמך שנפתח, מה שלא מובנה בוורד.
ב'. במידה והצלחנו נהיה לנו בעיה אחרת שאנחנו רוצים שלפעמים זה יופיע רק בחלק מהמסמכים [בהנחה והבנתי נכון]
הבעיה הראשונה כבר הרב דוד כתב פתרון ואין צורך להגיב עליה.
לבעיה השנייה לכאורה הפתרון הוא ליצור מילון סטטי, [או LIST של מחלקה התוצאה זהה] והוסיף לפונקציה שאיתה המתכנת קורא לתיבות צד, שתי דברים
א'. להוסיף שכל פעם שפותחים את החלונית, החלונית תירשם באוסף כל שהוא.
ב'. כשפתוחים חלונית ניתן בעת יצירת האוביקט לקרוא לאירוע סגירה, שמודיע לי כשהחלונית נסגרה
ג'. יש מובנה בוורד רשימה של כל המסמכים הפתוחים.בעצם כעת יש לנו שלוש רשימות, חלונות צד [הפתוחים] מסמכים, והשלישי ניצור המסמכים שבהם אנחנו לא רוצים שיהיה את החלונות צד.
בקוד זה בעצם מחלקה כזו [בצורה גסה]public class חלונותצד { public object החלון { get;set; } public Dictionary<string, bool> המסמכים { get; set; } }
במילון אנחנו מאחסנים רשימה של המסמכים שנפתחים, בעצם באירוע של פתיחת מסמך הוא נוסף למילון או לכל מילון שקיים [זה אומר כל חלונית צד שפתוחה וקיימת באוסף]
במידה והמשתמש סוגר את החלונית באותו מסמך, המסמך מקבל במילון את הערך שקר, ככה שמתי שהוא חוזר לתצוגה [אירוע פוקוס או אירוע מסמך הופעל וכהנה וכהנה] יש בדיקה בקוד, אם הוא סימן את החלונית צד כשקר היא לא עולה, ואם לא היא עולה.עד כאן בצורה גסה, צר לי על ההסבר הארוך שגם קצת מורכב, זה הסגנון שאני כותב בו קוד.
הרבה הצלחה בהכל, ומקווה שהתוסף הזה יביא דברים טובים -
@YAKOV2024 כתב בשאלה: איך עושים בתוסף vsto לוורד שtaskpane יישאר תמיד בחלונית האקטיבית:
אני לא לגמרי מבין את הבעיה, ובאיזה שלב גם קשה לעקוב אחרי הכל, אבל בוא ננסה לפרק את הבעיה לגורמים
א'. יש לנו אוסף של חלוניות צד, ויש לנו בעיה שאנחנו רוצים שיופיע בכל מסמך שנפתח, מה שלא מובנה בוורד.
ב'. במידה והצלחנו נהיה לנו בעיה אחרת שאנחנו רוצים שלפעמים זה יופיע רק בחלק מהמסמכים [בהנחה והבנתי נכון]א. יש רק אחת, וזה אכן סודר שתמיד יופיע בפעיל
ב. להבנתי לא הייתה כזו דרישה, אלא שלחצן ההסתרה המובנה יחול גם במעבר למסמך אחר (כלומר שלא יופעל הקוד שכתבנו שכן תופיע שמה חלונית). הבעיה היא שאין שום אירוע ייעודי ללחצן הזה, ואין דרך לדעת שהוא נלחץ כלל. -
@dovid
עוד לא ישבתי על זה לעומק אבל כמדומני שהתגובה שלך היא לשיטתך.
כלומר @YAKOV2024 מציע שיטת עבודה אחרת לגמרי ממה שגיבשנו עד כה