העברה והחזרה

dudiku

New member
העברה והחזרה

שלום לכולם, יצרתי טופס פשוט עם שתי ListBox ושתי כפתורים של העברה והחזרה (Add & Remove). ומשהו "מתחרבש" בצורה לא עקבית. משהו אולי יכול בבקשה לשלוח לי או להפנות דוגמא של הנושא? בתודה, דודי.
 

dudiku

New member
תודה על ההפניה אבל ...

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

טרמפיסט

New member
פתרון אלגנטי יותר

בהנחה ויש לך שני Listbox ששניהם מסומנים בשם lstRec עם אינדקסים 0 ו-1, ושני כפתורי העברה cmdMove המאונדקסים באותו אופן כך ש: הכפתור בעל אינדקס 0 מוציא מהרשימה בעלת האינדקס 0 ומוסיף לרשימה בעלת האינדקס 1 וכן באופן דומה לכפתור בעל האינדקס 1. ניתן לעשות:
Private Sub cmdMove_Click(Index As Integer) Const NONE_SELECTED = (-1) Dim lstSource As ListBox Dim lstTarget As ListBox Dim sItem As String 'set source and target list boxes Set lstSource = IIf(Index = 0, lstRec(0), lstRec(1)) Set lstTarget = IIf(Index = 0, lstRec(1), lstRec(0)) If (lstSource.ListIndex <> NONE_SELECTED) Then sItem = lstSource.List(lstSource.ListIndex) lstSource.RemoveItem lstSource.ListIndex lstTarget.AddItem sItem End If 'ensure user will not try to remove an item from an empty list cmdMove(0).Enabled = (lstRec(0).ListCount > 0) cmdMove(1).Enabled = (lstRec(1).ListCount > 0) End Sub​
תסתכל על הקוד ותראה שהוא לא מאוד מסובך וסה"כ נותן פתרון אלגנטי לבעיה שלך.
 

dudiku

New member
באותו העיניין

קודם כל תודה רבה על הפתרון האלגנטי והיעיל ---> למדתי. שאלה נוספת בעיניין ה ListBox כשאני מנסה (בסוף התהליך) למשוך אותה לתוך המערך אני מקבל מערך דו מיימדי בגודל מינימאלי של 10 רשומות (Rows) גם כשהרשימה קצרה יותר וגם שהרשימה היא חד מיימדית. משהו מכיר את הבעיה והפתרון? (שוב) תודה מראש, דודי.
 

טרמפיסט

New member
לא הבנתי

נסה להסביר את כוונתך: מה אתה מנסה לבצע, מה האמצעים ומה יוצא בסופו של דבר.
 

dudiku

New member
הסבר ...

אני מנסה למשוך את את הערכים מה LisrBox לתוך מערך Array. מה הדרך הנכונה?
 

טרמפיסט

New member
תשובה

מכיוון שעל מערך חובה להכריז בגודל קבוע, לא ניתן להגדיר אותו כתלוי במספר הפריטים ברשימה. מה שבכל זאת אפשר לעשות הוא להגדיר מערך בעל גודל לא ידוע מראש. הגדרה כזו לא מאפשרת גישה לכל אלמנט במערך ולכן לא ניתן להציב בו ערכים באופן ישיר ע"י ציון אינדקס. הדרך היחידה (כמעט) להצבה במערך כזה היא ע"י פונקציית פיצול (Split) אשר חותכת מחרוזת ארוכה לחלקים ע"י ציון ה-'חוצץ' והצבתם במערך המדובר. לכן נכריז על מערך בעל גודל לא ידוע וניתן לפונקצית הפיצול (Split) לקבוע את גודלו ע"י פיצול מחרוזת ארוכה שתהווה שרשור של כל הפריטים ברשימה עם חוצץ בין כל פריט לפריט. ניקח לדוגמה את החוצץ ";" (חובה לבחור חוצץ שאינו מופיע כחלק מאף פריט, לכן אם הסימן קיים באחד הפריטים ברשימה יש לבחור חוצץ אחר במקומו), ונשרשר את הפריטים יחד למחרוזת אחת. לדוגמה:
alef;bet;gimel;dalet​
נשים לב שהחוצץ, כשמו כן הוא, מופיע רק בין שני פריטים ולא בהתחלה או בסוף. פונקציית הפיצול תחפש את החוצץ ותפצל את המחרוזת לחלקים לפיו. כעת ניתן להבין את הקוד ואת דרך פעולתו:
Private Sub cmdAssemble_Click() Const SEPARATOR As String = ";" 'set separator string constant Dim itemsArray() As String 'declare on a dynamic array Dim strItems As String Dim i As Integer 'chain all items into a long string separated by ";" For i = 0 To lstRec.ListCount - 1 strItems = strItems & SEPARATOR Next i If (lstRec.ListCount > 0) Then 'if there are items strItems = Left$(strItems, Len(strItems) - 1) 'cut last separator End If 'if there were no items at all, array will be empty itemsArray = Split(strItems, SEPARATOR) 'split the long string to array End Sub​
בסוף הפרוצדורה ניתן לעבור באופן רציף על איברי המערך ע"י שימוש בפונקציות LBound ו-UBound המחזירות את האינדקס הראשון והאחרון (בהתאמה) במערך ולולאה פשוטה.
 
למעלה