Seite 1 von 1

Module und Prototype Problem

Verfasst: 29.08.2013 22:04
von hjbremer
Pardon, habe vergessen Version, ist 5.20 B12 x86

Ich wollte dass Postevent durch Prototype ersetzen. Geht auch, aber ...

Wenn der Prototype-FunktionsName im Modul der Gleiche ist wie der Prozedurname im Mainprogramm gibt es eine Fehlermeldung

Was mach ich falsch ? oder muß das so sein !

Code: Alles auswählen

DeclareModule ListIconGadgetEdit
   ; Alle Elemente in diesem Abschnitt sind für den Zugriff von außerhalb verfügbar
      
   Declare ListIconGadgetEdit(lvnr, window, fontid = 0, ptr = 0)
   Declare ListIconGadgetEditOld(lvnr, *p.point)
   
   #my_EventType_EditEnd = 999
   
EndDeclareModule

Module ListIconGadgetEdit   
   ; Alle Elemente in diesem Abschnitt sind privat. Alle Namen können ohne
   ; Namenskonflikt auch woanders verwendet werden.
   
   Structure EditStruktur
      lvnr.i               ;ListIconGadget PBnr
      lvpt.i               ;Pointer Ori WndProc
      item.i               ;Zeile
      subitem.i            ;Spalte
      header.i             ;Header Id
      strgnr.i             ;Stringgadget PBnr
      strgpt.i             ;Pointer Ori WndProc
      editflag.i           ;wenn 1 im Editmode
      oldtext.s
      newtext.s
      checkptr.i
      StructureUnion       ;um lParam in Hi + Loword zu zerlegen, nur für Mouseposi
         lparam.i          ; lParam vom Callback
         points.points     ; aufgeteiltes lParam in x + y
      EndStructureUnion   
   EndStructure
   
   Prototype editcheck(a, b, c)
   
   Global EditCheck.editcheck
   
   EnableExplicit
   
   Macro Edit_End(p)
      If p\editflag
         p\editflag = 0
         p\oldtext = GetGadgetItemText(p\lvnr, p\item, p\subitem)
         p\newtext = GetGadgetText(p\strgnr)
         SetGadgetItemText(p\lvnr, p\item, p\newtext, p\subitem)
         ;PostEvent(#PB_Event_Gadget, EventWindow(), p\lvnr, #my_EventType_EditEnd)
         If p\checkptr
            EditCheck = p\checkptr
            If EditCheck(p\lvnr, p\item, p\subitem) = #False
               Debug "xyz bla bla"
            EndIf            
         EndIf   
         HideGadget(p\strgnr, 1)   
      EndIf
   EndMacro
   
   Macro Edit_Esc(p)
      If p\editflag
         p\editflag = 0
         HideGadget(p\strgnr, 1)   
      EndIf
   EndMacro
   
   Procedure.s ListIconGadgetGetItem(lvnr, iitem)      
      Protected j
      Protected head = SendMessage_(GadgetID(lvnr), #LVM_GETHEADER, 0, 0)
      Protected cols = SendMessage_(head, #HDM_GETITEMCOUNT, 0, 0)
      Protected item$ = GetGadgetItemText(lvnr, iitem, 0)  
      
      For j = 1 To cols -1
         item$ + #TAB$ + GetGadgetItemText(lvnr, iitem, j)
      Next
      item$ + #CR$  
      
      ProcedureReturn item$
   EndProcedure
   
   Procedure.i CallBackLv(hwnd, msg, wParam, lParam) 
      
      Protected *lv.EditStruktur = GetWindowLongPtr_(hwnd, #GWL_USERDATA)   
      
      Protected *nm.NMHDR, hitinfo.LVHITTESTINFO
      Protected rect.rect, x, y, br, hh, txt$      
      Protected j, count, iitem, shift
      
      Static item$
      
      With *lv      
         
         Select msg 
            Case #WM_MOUSEMOVE
               If \editflag = 0
                  \lparam = lparam    ;Mouseposi: Hi+Loword stehen in \points\x + y
               EndIf            
               
            Case #WM_VSCROLL, #WM_HSCROLL, #WM_RBUTTONDOWN, #WM_LBUTTONDOWN ;, #WM_NCMOUSELEAVE
               Edit_End(*lv)
               
            Case #WM_NOTIFY   ;vom Header 
               *nm = lparam               
               If *nm\hwndFrom = \header: Edit_End(*lv): EndIf
               
            Case #WM_KEYDOWN  ;: Debug wParam
               Select wParam
                  Case #VK_F2: PostMessage_(hwnd, #WM_LBUTTONDBLCLK, 0, 0)
                     
                  Case #VK_DELETE                     
                     shift = #False
                     If GetKeyState_(#VK_SHIFT) > 1: shift = #True: EndIf
                     If shift = #True: item$ = "": EndIf
                     iitem = -1
                     count = SendMessage_(hwnd, #LVM_GETSELECTEDCOUNT, 0, 0)
                     For j = 1 To count
                        iitem = SendMessage_(hwnd, #LVM_GETNEXTITEM, iitem, #LVNI_SELECTED) 
                        If shift = #True
                           item$ + ListIconGadgetGetItem(\lvnr, iitem)
                           SetClipboardText(item$)
                        EndIf
                        RemoveGadgetItem(\lvnr, iitem)
                        iitem - 1
                     Next
                     SetGadgetState(\lvnr, iitem + 1)                       
                     
                  Case #VK_INSERT
                     shift = #False
                     If GetKeyState_(#VK_SHIFT) > 1: shift = #True: EndIf                     
                     iitem = GetGadgetState(\lvnr) 
                     If shift = #False
                        If iitem = -1 
                           AddGadgetItem(\lvnr, iitem, "")
                           iitem = CountGadgetItems(\lvnr) - 1
                        Else
                           AddGadgetItem(\lvnr, iitem, "")
                        EndIf
                     Else 
                        If iitem = -1: iitem = CountGadgetItems(\lvnr): EndIf
                        count = CountString(item$, #CR$)
                        ReplaceString(item$, #TAB$, #LF$, #PB_String_InPlace)
                        For j = 1 To count
                           AddGadgetItem(\lvnr, iitem + j - 1, StringField(item$, j, #CR$))                    
                        Next
                        SetGadgetState(\lvnr, -1)
                     EndIf                       
                     SetGadgetState(\lvnr, iitem)
                     
               EndSelect               
               
            Case #WM_LBUTTONDBLCLK            
               Edit_End(*lv)              ;wenn im Editmode, erst beenden
               hitinfo\pt\x = \points\x   ;\points kommt von #WM_MOUSEMOVE
               hitinfo\pt\y = \points\y  
               SendMessage_(hwnd, #LVM_SUBITEMHITTEST, 0, hitinfo)
               \item = hitinfo\iitem
               \subitem = hitinfo\iSubItem
               rect\top = \subitem          
               rect\left = #LVIR_LABEL
               SendMessage_(hwnd, #LVM_GETSUBITEMRECT, \item, rect)                
               x = rect\left + 1 
               y = rect\top + 0
               br = rect\right - rect\left - 1
               hh = rect\bottom - rect\top - 1
               txt$ = GetGadgetItemText(\lvnr, \item, \subitem)
               ResizeGadget(\strgnr, x, y, br, hh)
               SetGadgetText(\strgnr, txt$)
               SendMessage_(GadgetID(\strgnr), #EM_SETSEL, Len(txt$), -1)  ;Cursor ans Ende
               HideGadget(\strgnr, 0)
               SetActiveGadget(\strgnr)
               \editflag = 1
         EndSelect       
         ProcedureReturn CallWindowProc_(\lvpt, hwnd, msg, wParam, lParam)      
      EndWith
   EndProcedure 
   
   Procedure.i CallBackStrg(hwnd, msg, wParam, lParam) 
      Protected *lv.EditStruktur = GetWindowLongPtr_(hwnd, #GWL_USERDATA)
      If msg = #WM_CHAR            
         Select wparam 
            Case #VK_RETURN: Edit_End(*lv)
            Case #VK_ESCAPE: Edit_Esc(*lv)                  
         EndSelect
      ElseIf msg = #WM_KILLFOCUS
         Edit_End(*lv)
      EndIf
      ProcedureReturn CallWindowProc_(*lv\strgpt, hwnd, msg, wParam, lParam) 
   EndProcedure 
   
   Procedure.i ListIconGadgetEdit(lvnr, window, fontid = 0, ptr = 0)   
      
      Protected *lv.EditStruktur = AllocateMemory(SizeOf(EditStruktur))    
      Protected lvid, strgid, oldlist 
      
      If fontid = 0: fontid = GetGadgetFont(lvnr): EndIf   
      With *lv      
         ;LV
         \lvnr = lvnr: lvid = GadgetID(lvnr)
         \lvpt = GetWindowLongPtr_(lvid, #GWL_WNDPROC)         ;Ori WindowProcPointer holen
         SetWindowLongPtr_(lvid, #GWL_USERDATA, *lv)           ;Memory setzen
         SetWindowLongPtr_(lvid, #GWL_WNDPROC, @CallBackLv())  ;WindowProc setzen
         \header = SendMessage_(lvid, #LVM_GETHEADER, 0, 0)
         ;StringGadget
         oldlist = UseGadgetList(WindowID(window))
         \strgnr = StringGadget(#PB_Any, 0, 0, 0, 0, "") 
          strgid = GadgetID(\strgnr)         
         \strgpt = GetWindowLongPtr_(strgid, #GWL_WNDPROC)
         SetGadgetFont(\strgnr, fontid)
         HideGadget(\strgnr, 1)
         SetParent_(strgid, lvid) 
         SetWindowLongPtr_(strgid, #GWL_USERDATA, *lv)
         SetWindowLongPtr_(strgid, #GWL_WNDPROC, @CallBackStrg())
         If oldlist: UseGadgetList(oldlist): EndIf
         \checkptr = ptr
      EndWith   
   EndProcedure   
   
   Procedure.i ListIconGadgetEditOld(lvnr, *p.point)   
      
      Protected *lv.EditStruktur = GetWindowLongPtr_(GadgetID(lvnr), #GWL_USERDATA)
      
      *p\y = *lv\item
      *p\x = *lv\subitem
      
      ProcedureReturn @*lv\oldtext
      
   EndProcedure
   
EndModule

UseModule ListIconGadgetEdit

; -Test

CompilerIf #PB_Compiler_IsMainFile
   
   Enumeration
      #window   
      #liste1   
      #liste2   
   EndEnumeration
   
   Procedure.i EditCheck1(nr, iitem, subitem)
      
      Debug "nr " + nr
      Debug "iitem " + iitem
      Debug "subitem " + subitem
      
      ProcedureReturn #True
   EndProcedure
   
   Procedure.i EditCheck(nr, iitem, subitem)
      
      Debug "nr " + nr
      Debug "iitem " + iitem
      Debug "subitem " + subitem
      
      ProcedureReturn #False      
   EndProcedure
   
   Procedure.i Mainwindow()
      
      Protected j, event   
      Protected flags = #PB_Window_SystemMenu|#PB_Window_MinimizeGadget
      
      OpenWindow(#window, 150, 150, 700, 600, "", flags)
      
      flags = #PB_ListIcon_GridLines|#PB_ListIcon_FullRowSelect
      flags | #PB_ListIcon_MultiSelect   
      
      ListIconGadget(#liste1, 20, 5, 290, 500, "0", 40, flags)
      ListIconGadget(#liste2, 320, 5, 290, 500, "0", 40, flags)
      
      For j = 1 To 3
         AddGadgetColumn(#liste1, j, Str(j), 80)
         AddGadgetColumn(#liste2, j, Str(j), 80)
      Next   
      For j = 0 To 27      
         AddGadgetItem(#liste1, -1, Str(j)+#LF$+"Hans"+#LF$+"Meier"+#LF$+Str(Random(999)))      
         AddGadgetItem(#liste2, -1, Str(j)+#LF$+"Otto"+#LF$+"Leier"+#LF$+Str(Random(999)))      
      Next 
      
      ListIconGadgetEdit(#liste1, #window, 0, @EditCheck1())
      ListIconGadgetEdit(#liste2, #window, 0, @EditCheck())
      SetActiveGadget(#liste1)
      
      Repeat: event = WaitWindowEvent()      
      Until event = #PB_Event_CloseWindow 
      
   EndProcedure
   
   Mainwindow()
   
CompilerEndIf

Re: Module und Prototype Problem

Verfasst: 29.08.2013 23:16
von Bisonte
Also in b14 gibts kein Error...

Wobei ich sagen muss, das mir das logisch vorkommt.

EditCheck(a,b,c) und EditCheck(a,b,c) .... erkennst du den Unterschied ?

Ich weiss gar nicht wie man das nennt, aber dieses sString, iInteger, pPrototype usw. hab ich mir vor langer
Zeit angewöhnt, damit ich da nicht durcheinanderkomme.
Weil man deklariert ja meist am Anfang und dann kommt man ohne Endung wie .s, .i usw. aus....