דילוג לתוכן
  • דף הבית
  • קטגוריות
  • פוסטים אחרונים
  • משתמשים
  • חיפוש
  • חוקי הפורום
כיווץ
תחומים

תחומים - פורום חרדי מקצועי

💡 רוצה לזכור קריאת שמע בזמן? לחץ כאן!
  1. דף הבית
  2. תכנות
  3. שאלה: איך עושים בתוסף vsto לוורד שtaskpane יישאר תמיד בחלונית האקטיבית

שאלה: איך עושים בתוסף vsto לוורד שtaskpane יישאר תמיד בחלונית האקטיבית

מתוזמן נעוץ נעול הועבר תכנות
45 פוסטים 3 כותבים 835 צפיות
  • מהישן לחדש
  • מהחדש לישן
  • הכי הרבה הצבעות
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • dovidD מנותק
    dovidD מנותק
    dovid ניהול
    כתב ב נערך לאחרונה על ידי
    #21

    אכן, סגירה רק מסתירה (מעניין, לפי מה שחבר שלך טוען על RAM וזיכרון זה יוצר בעיה מובנית בכל תוסף).
    האזנה לסגירה אתה יכול לעשות עם האירוע taskPane.VisibleChanged שמה בתוכו אתה יכול לבדוק את taskPane.Visible.
    אבל כל הסיפור הזה זה השתלשלות בלתי נסבלת מנושא אחר. כי אין פה שום אזכור בנושא מתי אתה רוצה להציג את החלונית, והיה במשמע שאתה תמיד רוצה. אם המצב לא ככה, בהכרח יש טריגר מתי אתה מציג ואז אתה יכול לסמן שדה bool שבמקרה כזה זה יוצג.

    מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

    בכל נושא אפשר ליצור קשר dovid@tchumim.com

    pcinfogmachP תגובה 1 תגובה אחרונה
    0
    • pcinfogmachP מנותק
      pcinfogmachP מנותק
      pcinfogmach
      השיב לdovid ב נערך לאחרונה על ידי pcinfogmach
      #22

      @dovid כתב בשאלה: איך עושים בתוסף vsto לוורד שtaskpane יישאר תמיד בחלונית האקטיבית:

      אבל כל הסיפור הזה זה השתלשלות בלתי נסבלת מנושא אחר. כי אין פה שום אזכור בנושא מתי אתה רוצה להציג את החלונית, והיה במשמע שאתה תמיד רוצה.

      סליחה שלא כתבתי בהתחלה מספיק ברור.
      הרעיון שלי היה לעשות שהחלונית תשאר סטטית בכל המסמכים הפתוחים דהיינו או פתוחה או סגורה.
      כי המצב המובנה של וורד שהוא רק פותח חלונית במסמך הנוכחי מאוד מעצבן בתוסף כמו שלי.
      אז רציתי לדמות כאילו התוסף פתוח או סגור באותה רמה בכל המסמכים הפתוחים. ושאם כבר פתוח במסמך אחד אז גם ייפתח אוטומטית במסמכים חדשים.
      מקווה שכתבתי מספיק ברור.

      לגבי הטריגר הוא אמור היות הכפתור סגירה רק שהסתכתי עם זה ועם הbool כנ"ל
      ושוב תודה

      גמ"ח מידע מחשבים ואופיס

      תגובה 1 תגובה אחרונה
      1
      • dovidD מנותק
        dovidD מנותק
        dovid ניהול
        כתב ב נערך לאחרונה על ידי
        #23

        לא היית צריך להתנצל, ולא הבנת אותי.
        מתי אתה רוצה שייפתח התוסף פעם ראשונה, בעת_________?

        מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

        בכל נושא אפשר ליצור קשר dovid@tchumim.com

        pcinfogmachP תגובה 1 תגובה אחרונה
        0
        • pcinfogmachP מנותק
          pcinfogmachP מנותק
          pcinfogmach
          השיב לdovid ב נערך לאחרונה על ידי pcinfogmach
          #24

          @dovid כתב בשאלה: איך עושים בתוסף vsto לוורד שtaskpane יישאר תמיד בחלונית האקטיבית:

          לא היית צריך להתנצל, ולא הבנת אותי.
          מתי אתה רוצה שייפתח התוסף פעם ראשונה, בעת_________?

          בעת לחיצה על כפתור בסרגל הכלים (סרגל visual לא סרגל xml)

          הערה: אם מתכנתים סרגל visual או שמתשמשים עם לשונית מובנית ואש אפשר להשתמש עם cotrolid של office אם רצונך ליצור לשונית חדשה אז צריך להגדיר כ custom

          גמ"ח מידע מחשבים ואופיס

          תגובה 1 תגובה אחרונה
          0
          • dovidD מנותק
            dovidD מנותק
            dovid ניהול
            כתב ב נערך לאחרונה על ידי
            #25

            וזה ממש טוען את התוסף מאפס (מעורר 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@tchumim.com

            pcinfogmachP תגובה 1 תגובה אחרונה
            0
            • pcinfogmachP מנותק
              pcinfogmachP מנותק
              pcinfogmach
              השיב לdovid ב נערך לאחרונה על ידי pcinfogmach
              #26

              @dovid כתב בשאלה: איך עושים בתוסף vsto לוורד שtaskpane יישאר תמיד בחלונית האקטיבית:

              האזנה לסגירה אתה יכול לעשות עם האירוע taskPane.VisibleChanged שמה בתוכו אתה יכול לבדוק את taskPane.Visible.

              מה עם הבעיות הנ"ל?
              https://tchumim.com/post/157637

              גמ"ח מידע מחשבים ואופיס

              תגובה 1 תגובה אחרונה
              0
              • dovidD מנותק
                dovidD מנותק
                dovid ניהול
                כתב ב נערך לאחרונה על ידי
                #27

                @pcinfogmach סליחה, הצדק עמך. אני לא מוצא עצה.

                מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

                בכל נושא אפשר ליצור קשר dovid@tchumim.com

                תגובה 1 תגובה אחרונה
                2
                • Y מנותק
                  Y מנותק
                  YAKOV2024
                  כתב ב נערך לאחרונה על ידי dovid
                  #28

                  אני לא לגמרי מבין את הבעיה, ובאיזה שלב גם קשה לעקוב אחרי הכל, אבל בוא ננסה לפרק את הבעיה לגורמים
                  א'. יש לנו אוסף של חלוניות צד, ויש לנו בעיה שאנחנו רוצים שיופיע בכל מסמך שנפתח, מה שלא מובנה בוורד.
                  ב'. במידה והצלחנו נהיה לנו בעיה אחרת שאנחנו רוצים שלפעמים זה יופיע רק בחלק מהמסמכים [בהנחה והבנתי נכון]
                  הבעיה הראשונה כבר הרב דוד כתב פתרון ואין צורך להגיב עליה.
                  לבעיה השנייה לכאורה הפתרון הוא ליצור מילון סטטי, [או LIST של מחלקה התוצאה זהה] והוסיף לפונקציה שאיתה המתכנת קורא לתיבות צד, שתי דברים
                  א'. להוסיף שכל פעם שפותחים את החלונית, החלונית תירשם באוסף כל שהוא.
                  ב'. כשפתוחים חלונית ניתן בעת יצירת האוביקט לקרוא לאירוע סגירה, שמודיע לי כשהחלונית נסגרה
                  ג'. יש מובנה בוורד רשימה של כל המסמכים הפתוחים.

                  בעצם כעת יש לנו שלוש רשימות, חלונות צד [הפתוחים] מסמכים, והשלישי ניצור המסמכים שבהם אנחנו לא רוצים שיהיה את החלונות צד.
                  בקוד זה בעצם מחלקה כזו [בצורה גסה]

                  public class חלונותצד
                  {
                      public object החלון { get;set; }
                      public Dictionary<string, bool> המסמכים { get; set; }
                  }
                  

                  במילון אנחנו מאחסנים רשימה של המסמכים שנפתחים, בעצם באירוע של פתיחת מסמך הוא נוסף למילון או לכל מילון שקיים [זה אומר כל חלונית צד שפתוחה וקיימת באוסף]
                  במידה והמשתמש סוגר את החלונית באותו מסמך, המסמך מקבל במילון את הערך שקר, ככה שמתי שהוא חוזר לתצוגה [אירוע פוקוס או אירוע מסמך הופעל וכהנה וכהנה] יש בדיקה בקוד, אם הוא סימן את החלונית צד כשקר היא לא עולה, ואם לא היא עולה.

                  עד כאן בצורה גסה, צר לי על ההסבר הארוך שגם קצת מורכב, זה הסגנון שאני כותב בו קוד.
                  הרבה הצלחה בהכל, ומקווה שהתוסף הזה יביא דברים טובים

                  dovidD תגובה 1 תגובה אחרונה
                  1
                  • dovidD מנותק
                    dovidD מנותק
                    dovid ניהול
                    השיב לYAKOV2024 ב נערך לאחרונה על ידי
                    #29

                    @YAKOV2024 כתב בשאלה: איך עושים בתוסף vsto לוורד שtaskpane יישאר תמיד בחלונית האקטיבית:

                    אני לא לגמרי מבין את הבעיה, ובאיזה שלב גם קשה לעקוב אחרי הכל, אבל בוא ננסה לפרק את הבעיה לגורמים
                    א'. יש לנו אוסף של חלוניות צד, ויש לנו בעיה שאנחנו רוצים שיופיע בכל מסמך שנפתח, מה שלא מובנה בוורד.
                    ב'. במידה והצלחנו נהיה לנו בעיה אחרת שאנחנו רוצים שלפעמים זה יופיע רק בחלק מהמסמכים [בהנחה והבנתי נכון]

                    א. יש רק אחת, וזה אכן סודר שתמיד יופיע בפעיל
                    ב. להבנתי לא הייתה כזו דרישה, אלא שלחצן ההסתרה המובנה יחול גם במעבר למסמך אחר (כלומר שלא יופעל הקוד שכתבנו שכן תופיע שמה חלונית). הבעיה היא שאין שום אירוע ייעודי ללחצן הזה, ואין דרך לדעת שהוא נלחץ כלל.

                    מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

                    בכל נושא אפשר ליצור קשר dovid@tchumim.com

                    pcinfogmachP Y 2 תגובות תגובה אחרונה
                    0
                    • pcinfogmachP מנותק
                      pcinfogmachP מנותק
                      pcinfogmach
                      השיב לdovid ב נערך לאחרונה על ידי
                      #30

                      @dovid
                      עוד לא ישבתי על זה לעומק אבל כמדומני שהתגובה שלך היא לשיטתך.
                      כלומר @YAKOV2024 מציע שיטת עבודה אחרת לגמרי ממה שגיבשנו עד כה

                      גמ"ח מידע מחשבים ואופיס

                      תגובה 1 תגובה אחרונה
                      0
                      • Y מנותק
                        Y מנותק
                        YAKOV2024
                        השיב לdovid ב נערך לאחרונה על ידי
                        #31

                        @dovid אני לא מתחייב שמה שאני כותב פה הוא לעניין, אני שקוע לצערי בסוגיות אחרות, אבל, אנחנו בC# נכון, אם אין למשהו אירוע יעודי, אפשר פשוט לייצר אותו

                        תגובה 1 תגובה אחרונה
                        0
                        • dovidD מנותק
                          dovidD מנותק
                          dovid ניהול
                          כתב ב נערך לאחרונה על ידי
                          #32

                          @YAKOV2024 אכן לא לעניין.
                          אין בעיה ליצור אירוע, הבעיה היא שאין מי ש"מעיר" אותו.

                          מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

                          בכל נושא אפשר ליצור קשר dovid@tchumim.com

                          תגובה 1 תגובה אחרונה
                          0
                          • pcinfogmachP מנותק
                            pcinfogmachP מנותק
                            pcinfogmach
                            כתב ב נערך לאחרונה על ידי pcinfogmach
                            #33

                            אני רוצה לסכם היכן אנחנו אוחזים:
                            בעצם יש לנו קוד נפלא של @dovid שמעביר את החלונית צד מממסמך למסמך בצורה נקייה וטובה.
                            אפשר להגדיר bool שיקבל ערך שקר בעת לחיצה על לחצן הסגירה של חלונית הצד על ידי taskPane.VisibleChanged += TaskPane_VisibleChanged;
                            ומאידך יקבל ערך אמת על ידי לחיצה על כפתור הפתיחה של החלונית צד.
                            אפשר גם להוסיף עוד bool ב settings של התוכנה שיתן למשתמש אפשרות לבחור אם החלונית צד תקפוץ ממסמך למסמך או לא.
                            ויש לנו את ההצעה של @YAKOV2024 שטוען שאולי אפשר להשתמש עם רשימה שרושמת את המסמכים הפתוחים ובכך נוכל להגדיר שרק במסמך המסויים בו נסגר החלונית צד שמה לא יצוץ שוב אבל יישאר בכל שאר המסמכים.

                            גמ"ח מידע מחשבים ואופיס

                            dovidD תגובה 1 תגובה אחרונה
                            1
                            • dovidD מנותק
                              dovidD מנותק
                              dovid ניהול
                              השיב לpcinfogmach ב נערך לאחרונה על ידי
                              #34

                              @pcinfogmach כתב בשאלה: איך עושים בתוסף vsto לוורד שtaskpane יישאר תמיד בחלונית האקטיבית:

                              שרק במסמך המסויים בו נסגר החלונית

                              זהו, שאין דרך לדעת בכלל שנסגר החלונית במסמך מסויים.
                              מעקב אחרי VisibleChanged לא אומר כלום כי אפילו מעבר ממסמך למסמך מעורר אותו.
                              זו נקודת הבעיה היחידה שלנו.

                              מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

                              בכל נושא אפשר ליצור קשר dovid@tchumim.com

                              pcinfogmachP תגובה 1 תגובה אחרונה
                              0
                              • pcinfogmachP מנותק
                                pcinfogmachP מנותק
                                pcinfogmach
                                השיב לdovid ב נערך לאחרונה על ידי pcinfogmach
                                #35

                                @dovid
                                תתקן אותי אם אני טועה
                                לכאורה אפשר לעשות פשוט שכאשר מסמך מסויים הוא נהיה אקטיבי אז זה מעורר משתנה ואז כאשר יש את הטריגר של visiblechanged אז הוא רושם מהו המסמך ומה היה המצב של visiblechanged (כל זה הבנתי מדבריו של @YAKOV2024 )

                                גמ"ח מידע מחשבים ואופיס

                                תגובה 1 תגובה אחרונה
                                0
                                • dovidD מנותק
                                  dovidD מנותק
                                  dovid ניהול
                                  כתב ב נערך לאחרונה על ידי
                                  #36

                                  אמת, אבל הVisibleChanged מתעורר על שטויות, למשל פתיחת כרטסת הבית הופכת אותו ללא נראה.

                                  מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

                                  בכל נושא אפשר ליצור קשר dovid@tchumim.com

                                  pcinfogmachP תגובה 1 תגובה אחרונה
                                  0
                                  • pcinfogmachP מנותק
                                    pcinfogmachP מנותק
                                    pcinfogmach
                                    השיב לdovid ב נערך לאחרונה על ידי pcinfogmach
                                    #37

                                    @dovid כתב בשאלה: איך עושים בתוסף vsto לוורד שtaskpane יישאר תמיד בחלונית האקטיבית:

                                    אמת, אבל הVisibleChanged מתעורר על שטויות, למשל פתיחת כרטסת הבית הופכת אותו ללא נראה.

                                    ??? לא קרה אצלי
                                    הנה הקוד שלי - לא כולל ההצעה של @YAKOV2024 לבינתיים
                                    (הקוד הוא עבור xml ribbon

                                    using Microsoft.Office.Interop.Word;
                                    using Microsoft.Office.Tools.Ribbon;
                                    using System;
                                    using System.Collections.Generic;
                                    using System.IO;
                                    using System.Linq;
                                    using System.Reflection;
                                    using System.Runtime.InteropServices;
                                    using System.Text;
                                    using Word = Microsoft.Office.Interop.Word;
                                    using Office = Microsoft.Office.Core;
                                    using Microsoft.Office.Core;
                                    using System.Windows.Forms;
                                    
                                    namespace ToratEmetInWord_2._0
                                    {
                                        [ComVisible(true)]
                                        public class Ribbon : Office.IRibbonExtensibility
                                        {
                                            private Office.IRibbonUI ribbon;
                                            Microsoft.Office.Tools.CustomTaskPane taskPane;
                                            private Word.Document lastDoc;
                                            private UserControlContainer container;
                                            private UserControl1 ToratEmetTaskPane = new UserControl1();
                                            private bool windowSnap;
                                    
                                            public Ribbon()
                                            {
                                            }
                                    
                                            #region IRibbonExtensibility Members
                                    
                                            public string GetCustomUI(string ribbonID)
                                            {
                                                return GetResourceText("ToratEmetInWord_2._0.Ribbon.xml");
                                            }
                                    
                                            #endregion
                                    
                                            #region Ribbon Callbacks
                                            //Create callback methods here. For more information about adding callback methods, visit https://go.microsoft.com/fwlink/?LinkID=271226
                                    
                                            public void Ribbon_Load(Office.IRibbonUI ribbonUI)
                                            {
                                                this.ribbon = ribbonUI;
                                                Globals.ThisAddIn.Application.DocumentChange += Application_DocumentChange;
                                            }
                                    
                                            private void Application_DocumentChange()
                                            {
                                                if (Properties.Settings.Default.snapWithWindow == true && windowSnap ==true)
                                                {
                                                   loadPanel();
                                                }
                                            }
                                    
                                            public System.Drawing.Image GetImage(Office.IRibbonControl control)
                                            {
                                               System.Drawing.Bitmap image = Properties.Resources.תורת_אמת2;
                                                return image;
                                            }
                                    
                                    
                                            public void toratEmetButton_Click(IRibbonControl control)
                                            {
                                                windowSnap = true;
                                                loadPanel();
                                            }
                                    
                                    
                                    
                                            private void loadPanel()
                                            {
                                                if (Globals.ThisAddIn.Application.Documents.Count == 0 || lastDoc == Globals.ThisAddIn.Application.ActiveDocument)
                                                    return;
                                    
                                                lastDoc = Globals.ThisAddIn.Application.ActiveDocument;
                                                if (taskPane != null)
                                                {
                                                    container.Controls.Remove(ToratEmetTaskPane);
                                                    Globals.ThisAddIn.CustomTaskPanes.Remove(taskPane);
                                                }
                                                container = new UserControlContainer(ToratEmetTaskPane);
                                                taskPane = Globals.ThisAddIn.CustomTaskPanes.Add(container, "תורת אמת");
                                                taskPane.Visible = true;
                                                taskPane.Width = 450;
                                                taskPane.VisibleChanged += TaskPane_VisibleChanged;
                                            }
                                    
                                            private void TaskPane_VisibleChanged(object sender, EventArgs e)
                                            {
                                                if (!taskPane.Visible) { windowSnap = false; }       
                                            }
                                    
                                            #endregion
                                    
                                            #region Helpers
                                    
                                            private static string GetResourceText(string resourceName)
                                            {
                                                Assembly asm = Assembly.GetExecutingAssembly();
                                                string[] resourceNames = asm.GetManifestResourceNames();
                                                for (int i = 0; i < resourceNames.Length; ++i)
                                                {
                                                    if (string.Compare(resourceName, resourceNames[i], StringComparison.OrdinalIgnoreCase) == 0)
                                                    {
                                                        using (StreamReader resourceReader = new StreamReader(asm.GetManifestResourceStream(resourceNames[i])))
                                                        {
                                                            if (resourceReader != null)
                                                            {
                                                                return resourceReader.ReadToEnd();
                                                            }
                                                        }
                                                    }
                                                }
                                                return null;
                                            }
                                    
                                            #endregion
                                        }
                                    
                                        public class UserControlContainer : UserControl
                                        {
                                            public UserControlContainer(UserControl1 control)
                                            {
                                                Controls.Add(control);
                                                control.Dock = DockStyle.Fill;
                                            }
                                        }
                                    
                                    }
                                    

                                    גמ"ח מידע מחשבים ואופיס

                                    תגובה 1 תגובה אחרונה
                                    0
                                    • dovidD מנותק
                                      dovidD מנותק
                                      dovid ניהול
                                      כתב ב נערך לאחרונה על ידי
                                      #38

                                      סליחה, כרטסת "קובץ" שמכסה את כל הדף.
                                      שים נקודת עצירה בשורה 92, ולחץ על "קובץ".

                                      מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

                                      בכל נושא אפשר ליצור קשר dovid@tchumim.com

                                      pcinfogmachP תגובה 1 תגובה אחרונה
                                      1
                                      • pcinfogmachP מנותק
                                        pcinfogmachP מנותק
                                        pcinfogmach
                                        השיב לdovid ב נערך לאחרונה על ידי
                                        #39

                                        @dovid כתב בשאלה: איך עושים בתוסף vsto לוורד שtaskpane יישאר תמיד בחלונית האקטיבית:

                                        סליחה, כרטסת "קובץ" שמכסה את כל הדף.
                                        שים נקודת עצירה בשורה 92, ולחץ על "קובץ".

                                        צודק! אבל הפתרון הוא פשוט על ידי הגדרת תנאי כפול.

                                        if (!taskPane.Visible) { windowSnap = false; } else {  windowSnap = true; }
                                        

                                        גמ"ח מידע מחשבים ואופיס

                                        תגובה 1 תגובה אחרונה
                                        0
                                        • dovidD מנותק
                                          dovidD מנותק
                                          dovid ניהול
                                          כתב ב נערך לאחרונה על ידי
                                          #40

                                          לא הבנתי למה אתה חושב שהקוד שלך עוזר.
                                          נ.ב. הקוד שלך זהה לקוד הבא:

                                          windowSnap  = taskPane.Visible;
                                          

                                          מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

                                          בכל נושא אפשר ליצור קשר dovid@tchumim.com

                                          pcinfogmachP תגובה 1 תגובה אחרונה
                                          1

                                          • 1
                                          • 2
                                          • 3
                                          בא תתחבר לדף היומי!
                                          • התחברות

                                          • אין לך חשבון עדיין? הרשמה

                                          • התחברו או הירשמו כדי לחפש.
                                          • פוסט ראשון
                                            פוסט אחרון
                                          0
                                          • דף הבית
                                          • קטגוריות
                                          • פוסטים אחרונים
                                          • משתמשים
                                          • חיפוש
                                          • חוקי הפורום