אהלן.טוב, הפתרון שאני מציע לך כאן הוא לא הכי פשוט בעולם ולא מושלם לכל מקרה בעולם אבל הוא בהחלט עונה על מה שהגדרת בשאלה. אני לא יודע מה הרקע התיכנותי שלך אבל ניסיתי להסביר בתוך הקוד מה הרעיון שעומד מאחורי כל שלב. ההערות בתוך הקוד הן באנגלית מהסיבה הפשוטה שאני מקליד אנגלית יותר מהר מעברית. אני אשמח לענות לכל שאלה שלך בנוגע לקוד או לדוגמה שמצורפת אם יהיו לך. מצורף מסד נתונים לדוגמה.
טוב אחרי כל ההסר המקדים הזה, הנה הרעיון:
בניתי מסד נתונים עם טבלה אחת Table1 ובו 10 שדות בשם Field1 - Field10.
כמו כן ישנו טופס Form1 עם 10 Check boxes (תיבות סימון) בשם chkField1 - chkField10. כמו כן על הטופס ישנו כפתור שפותח את הדוח Report1 - הכפתור נבנה עם האשף של אקסס (אם קיים אשף למטרה כלשהי, אין יותר מדי סיבות לא להשתמש בו, זה חוסך הרבה זמן תכנות מיותר).
הדוח נבנה בצורה טבלאית כאשר יש בה 10 שדות (Field1-Field10) ו10 לייבלים (Label1-Label10).
הרעיון הוא לבדוק כל אחד מתיבות הסימון בטופס ולראות האם הוא מסומן (ערך = -1). אם כן אז צריך להציג ולמקם את השדה הרלוונטי ואם לא אז צריך להסתיר את השדה הרלוונטי, כמובן גם את הלייבלים שלהם בהתאמה.
כמו כן אם צריך להציג שדה מסויים אז גם צריך למקם אותו לאחר השדה האחרון שהוצג + רווח בינהם.
הפונקציה הבאה מבצעת את ההצגה/הסתרה + מיקום הנ"ל:
'This procedure will check if the control needs to be placed and 'where it needs to placed. 'The values passed to the procedure are: 'TheControl - The name of the text box to be placed 'TheControlsLabel - the name of the label for this column 'TheCheckBoxToCheck - the name of the checkbox on the form that builds this report Private Sub PlaceTheControl(TheControl As TextBox, _ TheControlsLabel As Label, _ TheCheckBoxToCheck As CheckBox) 'check if the field should be shown or not If TheCheckBoxToCheck = -1 Then 'show the field and its label TheControl.Visible = True TheControlsLabel.Visible = True 'now place the label and the control TheControl.Left = lCurrentXposition TheControlsLabel.Left = lCurrentXposition 'now add the width of the control to the current x position and add the space lCurrentXposition = lCurrentXposition + TheControl.Width + l_Width_Between_Controls Else 'the field does not need to be shown 'hide the field and its label TheControl.Visible = False TheControlsLabel.Visible = False End If End Sub
|
ניתן לראות שאני מעביר לפונקציה הזאת את שם השדה בדוח שאותו אני רוצה להציג/לסתיר ולמקם (TheControl). כמו כן אני מעביר את שם התוית של אותו פקד (TheControlsLabel) וגם את תיבת הסימון שאותו אני צריך לבדוק (TheCheckBoxToCheck).
כמו כן הפונקציה ממקמת את השדה במיקום lCurrentXposition.
לאחר המיקום, הפונקציה מכינה את המשתנה הנ"ל לשדה הבא. את זה היא עושה על ידי הוספת הרוחב של השדה שמיקמנו + רווח שהגדרנו מראש שיהיה בין שדה לשדה (l_Width_Between_Controls).
הפונקציה הזאת תעבוד בצורה מושלמת כל עוד הרוחב של התוית לא תעלה על זו של השדה עצמו, כמובן שגם את זה ניתן לפתור אבל אתה לא רוצה שאני אחשוב פה על הכל נכון?
הפונקציה הזאת עושה בעצם את רוב העבודה, מה שנותר הוא רק לקרוא לפונקציה הזאת מתוך האירוע של עליית הדוח כמספר השדות שאנחנו רוצים למקם ולבדוק. בקיצור שאר המודול של הדוח נראה כך:
'constant to define the width to be used between control (space) Const l_Width_Between_Controls As Long = 10 'variable to hold the current position of the placing Dim lCurrentXposition As Long Private Sub Report_Open(Cancel As Integer) 'start the placing of the controls from position l_Width_Between_Controls lCurrentXposition = l_Width_Between_Controls 'hide or show each of the fields and place them according to 'values selected on form1 (the form that chooses which fields to show) Call PlaceTheControl(Field1, Label1, Forms![Form1]![chkField1]) Call PlaceTheControl(Field2, Label2, Forms![Form1]![chkField2]) Call PlaceTheControl(Field3, Label3, Forms![Form1]![chkField3]) Call PlaceTheControl(Field4, Label4, Forms![Form1]![chkField4]) Call PlaceTheControl(Field5, Label5, Forms![Form1]![chkField5]) Call PlaceTheControl(Field6, Label6, Forms![Form1]![chkField6]) Call PlaceTheControl(Field7, Label7, Forms![Form1]![chkField7]) Call PlaceTheControl(Field8, Label8, Forms![Form1]![chkField8]) Call PlaceTheControl(Field9, Label9, Forms![Form1]![chkField9]) Call PlaceTheControl(Field10, Label10, Forms![Form1]![chkField10]) End Sub
|
זהו, אני מקוה שהבנת את הכל, כמו שאמרתי קודם, אני אשמח לענות על כל שאלה שתהיה לך.
א.