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

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

💡 רוצה לזכור קריאת שמע בזמן? לחץ כאן!
pcinfogmachP

pcinfogmach

@pcinfogmach
אודות
פוסטים
706
נושאים
186
שיתופים
0
קבוצות
0
עוקבים
3
עוקב אחרי
1

פוסטים

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

  • שלאה בקוד C#: איך לעשות חיפוש בתוך מסמך html שהוא פתוח בwebbrowser
    pcinfogmachP pcinfogmach

    @dovid

    מסתבר שטעיתי הקוד שהבאתי לא עשה כלום - הסיבה שלא היה את הבעיה כי במקום לטעון מסמך html עשיתי הזרקה של טקסט לתוך עמוד about:blank

    ניסיתי את הקוד שלך וגם לא עזר - אז עכשיו שוב אני תקוע.

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

    תכנות

  • שלאה בקוד C#: איך לעשות חיפוש בתוך מסמך html שהוא פתוח בwebbrowser
    pcinfogmachP pcinfogmach

    @dovid
    ממש תודה! פשוט אין מילים

    @dovid כתב בשלאה בקוד C#: איך לעשות חיפוש בתוך מסמך html שהוא פתוח בwebbrowser:

    בWinForms יש לזה פתרון, אבל סביר שהוא לא עובד בVSTO (אולי כן, תבדוק)

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

    <meta http-equiv='X-UA-Compatible' content='IE=10'>
    

    ושוב תודה

    תכנות

  • שלאה בקוד C#: איך לעשות חיפוש בתוך מסמך html שהוא פתוח בwebbrowser
    pcinfogmachP pcinfogmach

    @dovid כתב בשלאה בקוד C#: איך לעשות חיפוש בתוך מסמך html שהוא פתוח בwebbrowser:

    אני חושב שהכי טוב זה לכתוב את הקוד בJS, ולשים בדף פונקציית find שעושה את העבודה

    יש בעיה עם כל קוד JS כאשר משתמשים עם פקד WebBrowser בC# מכיון שהוא בעצם בנוי על אינטרנט אקספלורר - אז מה שקורה שהוא חוסם כל קוד jS (זוכרים את הימים ההם של הודעות ACTIVEX ?)
    הייתי משתמש עם פקדים יותר מתקדמים אבל דא עקא בVSTO למיטב הבנתי הם לא זמינים.

    תכנות

  • שלאה בקוד C#: איך לעשות חיפוש בתוך מסמך html שהוא פתוח בwebbrowser
    pcinfogmachP pcinfogmach

    @dovid
    לא זוכר כרגע מאחד מהפורומים כמו stack או משהו כזה אבל הייתי צריך לשפץ אותו כך שזה קוד קצת בלי מקור.

    תכנות

  • שלאה בקוד C#: איך לעשות חיפוש בתוך מסמך html שהוא פתוח בwebbrowser
    pcinfogmachP pcinfogmach

    שלאה בקוד C#: איך לעשות חיפוש בתוך מסמך html שהוא פתוח בwebbrowser

    אז יש לי את הקוד הזה:

    public void searchNext(string searchText)
    {
        if (!string.IsNullOrEmpty(searchText))
        {
    
            // Ensure the webBrowser1 control is not null and has a valid document loaded.
            if (webBrowser1.Document != null)
            {
                IHTMLDocument2 doc = webBrowser1.Document.DomDocument as IHTMLDocument2;
    
                if (doc != null)
                {
                    IHTMLSelectionObject sel = (IHTMLSelectionObject)doc.selection;
                    IHTMLTxtRange rng = (IHTMLTxtRange)sel.createRange();
                    rng.collapse(false); // collapse the current selection so we start from the end of the previous range
    
                    if (rng.findText(searchText, 1000000000, 0))
                    {
                        rng.select();
                    }
                    else
                    {
    
                        if (webBrowser1.Document != null)
                        {
                            IHTMLDocument2 myDoc = webBrowser1.Document.DomDocument as IHTMLDocument2;
                            if (doc != null)
                            {
                                IHTMLBodyElement body = myDoc.body as IHTMLBodyElement;
                                if (body != null)
                                {
                                    IHTMLTxtRange docRange = body.createTextRange();
                                    docRange.collapse(true);
    
                                    if (docRange.findText(searchText, 1000000000, 0))
                                    {
                                        docRange.select();
                                    }
                                }
                            }
                        }
    
    
                    }
                }
            }
            else
            {
                // Handle the case when the webBrowser1.Document.DomDocument cannot be cast to IHTMLDocument2.
                MessageBox.Show("Could not access the document.");
            }
        }
       
    }
    

    השאלה היא - איך אני עושה שיחפש רק בכותרות ולא בגוף הטקסט

    תכנות

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

    @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;
    }
    

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

    תכנות

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

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

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

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

    תכנות

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

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

    נ.ב. החכמתני

    תכנות

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

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

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

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

    if (!taskPane.Visible) { windowSnap = false; } else {  windowSnap = true; }
    
    תכנות

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

    @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;
            }
        }
    
    }
    
    תכנות

  • האם חסר לי פה ספר מהרשימה? (רשימה של התנ"ך) - תודה מראש.
    pcinfogmachP pcinfogmach

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

    גומלין - כללי

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

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

    תכנות

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

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

    תכנות

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

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

    תכנות

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

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

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

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

    תכנות

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

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

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

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

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

    תכנות

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

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

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

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

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

    תכנות

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

    @dovid
    ניתקלתי בבעיה בקוד הנוכחי - כאשר המשתמש סוגר את החלונית אז זה לא מעיל לו לסגור אותה לגמרי כי זה קופץ לו בחזרה ברגע שהוא מחליף תצוגה ממסמך למסמך
    חשבתי לעשות משתנה Bool שיקלוט את זה אבל אולי יש דרך יותר טובה?
    כמו"כ לא הצלחתי לקלוט את הלחיצה על כפתור הסגירה. (שים לב כפתור הסגירה אינו סוגר רק מסתיר אז לתפוס את ההסתרה אולי זה אופציה השאלה אם זה עלול לגרום לבעיה שלא חשבתי עליה)

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

    תכנות

  • קוד לבוחר פונטים בשביל C#
    pcinfogmachP pcinfogmach

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

    using System;
    using System.Drawing;
    using System.Windows.Forms;
    using System.Linq;
    public class CustomFontSelectionDialog : Form
    {
        private ListBox fontListBox;
        private Label previewLabel;
        private Button okButton;
        private TextBox searchBox;
    
        public Font SelectedFont { get; private set; }
    
        public CustomFontSelectionDialog()
        {
            this.Text = "בחר גופן";
            this.Size = new Size(450, 280);
            this.RightToLeft = RightToLeft.Yes;
            this.RightToLeftLayout = true;
    
            searchBox = new TextBox();
            searchBox.Location = new Point(10, 10);
            searchBox.Size = new Size(200, 20);
            searchBox.TextChanged += SearchBox_TextChanged;
            this.Controls.Add(searchBox);
    
            fontListBox = new ListBox();
            fontListBox.Location = new Point(10, searchBox.Bottom + 10);
            fontListBox.Size = new Size(200, 180);
            fontListBox.SelectedIndexChanged += FontListBox_SelectedIndexChanged;
            this.Controls.Add(fontListBox);
    
            previewLabel = new Label();
            previewLabel.Location = new Point(fontListBox.Right + 10, 10);
            previewLabel.Size = new Size(180, this.ClientSize.Height - 2 * 20 - 40); // Adjusted for searchBox and margin
            previewLabel.Font = new Font("Arial", 12);
            previewLabel.Text = "תצוגה מקדימה"; // Sample Hebrew text for preview
            previewLabel.BackColor = Color.White;
            this.Controls.Add(previewLabel);
    
            okButton = new Button();
            okButton.Text = "אישור";
            okButton.Location = new Point(previewLabel.Right - okButton.Width, this.ClientSize.Height - okButton.Height - 20);
            okButton.Click += OkButton_Click;
            this.Controls.Add(okButton);
    
            // Populate the fontListBox with available fonts
            foreach (FontFamily fontFamily in FontFamily.Families)
            {
                fontListBox.Items.Add(fontFamily.Name);
            }
        }
    
        private void SearchBox_TextChanged(object sender, EventArgs e)
        {
            string searchText = searchBox.Text.ToLower(); // Convert search text to lowercase
            fontListBox.Items.Clear();
    
            // Filter and display fonts that match the search text (case-insensitive)
            foreach (FontFamily fontFamily in FontFamily.Families)
            {
                if (fontFamily.Name.ToLower().Contains(searchText))
                {
                    fontListBox.Items.Add(fontFamily.Name);
                }
            }
            //fontListBox.SelectedIndex = 0;
        }
    
        private void FontListBox_SelectedIndexChanged(object sender, EventArgs e)
        {
            string selectedFontName = fontListBox.SelectedItem as string;
            if (selectedFontName != null)
            {
                SelectedFont = new Font(selectedFontName, 12); // Set a default size
                previewLabel.Font = SelectedFont;
            }
        }
    
        private void OkButton_Click(object sender, EventArgs e)
        {
            // The user has selected a font, you can use the SelectedFont property here.
            DialogResult = DialogResult.OK;
            this.Close();
        }
    
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.Run(new CustomFontSelectionDialog());
        }
    }
    
    

    וזה הקוד שלי לפתיחת הבוחר פונטים
    שימו לב: אפשר להשתמש עם זה כדי להגדיר פונט בתוכנה שלכם על ידי שימוש ב resources >Settings שם תוכלו להגדיר משתנה שישמור את שם הפונט שהשתמשתם בו כמוצג בקוד דלהלן.

    private void chooseFontForBooks_Click(object sender, EventArgs e)
    {
        using (CustomFontSelectionDialog fontDialog = new CustomFontSelectionDialog())
        {
            if (fontDialog.ShowDialog() == DialogResult.OK)
            {
                Properties.Settings.Default.fontName = fontDialog.SelectedFont.Name;
                Properties.Settings.Default.Save();
            }
        }
    }
    
    תכנות

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

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

    נ.ב. אם תצליח לגרום לחבר שלך להשתתף פה בדיונים אודה לך מאוד!

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

    תכנות
  • 1
  • 2
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 31 / 36
  • התחברות

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

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