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

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

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

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

מתוזמן נעוץ נעול הועבר תכנות
45 פוסטים 3 כותבים 835 צפיות
  • מהישן לחדש
  • מהחדש לישן
  • הכי הרבה הצבעות
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • 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
                        • pcinfogmachP מנותק
                          pcinfogmachP מנותק
                          pcinfogmach
                          השיב לdovid ב נערך לאחרונה על ידי pcinfogmach
                          #41

                          @dovid
                          א. בדקתי והוא עוזר
                          ב. הוא עוזר בגלל שברגע שאתה סוגר את "קובץ" ממילא שוב יש טריגר של visiblechanged והפעם הוא נהיה visible כך שהתנאי כפול מוודא שהbool חוזר לקדמותו בכל מצב שכזה.

                          נ.ב. החכמתני

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

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

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

                            ב. הוא עוזר בגלל שברגע שאתה סוגר את "קובץ" ממילא שוב יש טריגר של visiblechanged והפעם הוא נהיה visible

                            בתנאי שאתה לא לוחץ על מסמך חדש, שאז אתה לא חוזר ואז זה לא נהיה visible...

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

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

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

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

                              בתנאי שאתה לא לוחץ על מסמך חדש, שאז אתה לא חוזר ואז זה לא נהיה visible...

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

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

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

                                @dovid
                                מצאתי פיתרון!

                                Globals.ThisAddIn.Application.WindowDeactivate += Application_WindowDeactivate;
                                
                                 private void Application_WindowDeactivate(Document Doc, Window Wn)
                                 {
                                     if (taskPane != null && taskPane.Visible) { windowSnap = true; }
                                 }
                                

                                זה קולט את המצב של החלונית צד בעת פתיחת מסמך חדש.


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

                                 Globals.ThisAddIn.Application.DocumentBeforeClose += Application_DocumentBeforeClose;
                                
                                private void Application_DocumentBeforeClose(Document Doc, ref bool Cancel)
                                {
                                    Globals.ThisAddIn.Application.ActiveWindow.WindowState = WdWindowState.wdWindowStateMinimize;
                                }
                                

                                מה שיוצר מצב שהחלונית הנסגרת איננה החלונית האקטיבית

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

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

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

                                  זה קורה רק כאשר יש פקד webbrowser עם מסמך פתוח בתוכו (עד היום זה לא קרה) מצו"ב מסמך דוגמא
                                  מסמך דוגמא.html

                                  יצרתי גם עוד פרוייקט עם כלום חוץ מפקד toolstrip וwebbroser כדי לבדוק מה קורה שם וזה גם קרה.

                                  רק חבל לי לא להשתמש עם הקוד הנ"ל אחרי כל הטירחה. ובפרט שבעבר הוא כן עבד ועכשיו פתאום לא.

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

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

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

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

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