Seite 1 von 1

Nullzeiger bei DrawIcon_()

Verfasst: 20.04.2010 19:58
von Mok
Hallo.
Ich hab mir den Code Wereiterte Items aus der Lib kopiert, bei mir eingefügt und die IDs angepasst. Weil ich der API nicht wirkilich mächtig bin, muss ich wohl mehr anpassen als nur die IDs. Es tritt ein Zeiger auf ein Null-Objekt bei folgendem Code an der markierten Stelle auf.

Code: Alles auswählen

Structure LBITEMEX
  Icon.i
  Title.i
  Text.i
EndStructure

Procedure WindowCallback(hWnd,uMsg,wParam,lParam)
  Select uMsg
    Case #WM_DRAWITEM
      Protected *lpdis.DRAWITEMSTRUCT = lParam
      Protected *lbex.LBITEMEX = GetGadgetItemData(Dates,*lpdis\itemID)
      Protected hbrFace, hdcMem, lplf.LOGFONT, hfntPrevious, hfntTitle
 
      If *lpdis\itemState & #ODS_SELECTED
        hbrFace = CreateSolidBrush_(GetSysColor_(#COLOR_HIGHLIGHT))
        FillRect_(*lpdis\hdc,*lpdis\rcItem,hbrFace)
        DrawFocusRect_(*lpdis\hdc,*lpdis\rcItem)
        SetTextColor_(*lpdis\hdc,GetSysColor_(#COLOR_HIGHLIGHTTEXT))
      Else
        hbrFace = CreateSolidBrush_(GetSysColor_(#COLOR_WINDOW))
        FillRect_(*lpdis\hdc,*lpdis\rcItem,hbrFace)
        SetTextColor_(*lpdis\hdc,GetSysColor_(#COLOR_WINDOWTEXT))
      EndIf
 
      DeleteObject_(hbrFace)
      DrawIcon_(*lpdis\hdc,2,*lpdis\rcItem\top + 2,*lbex\Icon) ;######################
      GetObject_(SendMessage_(*lpdis\hWndItem,#WM_GETFONT,0,0),SizeOf(LOGFONT),lplf)
      lplf\lfHeight = -MulDiv_(12,GetDeviceCaps_(*lpdis\hdc,#LOGPIXELSY),72)
      hfntTitle = CreateFontIndirect_(lplf)
      SetBkMode_(*lpdis\hdc,#TRANSPARENT)
      hfntPrevious = SelectObject_(*lpdis\hdc,hfntTitle)
      TextOut_(*lpdis\hdc,40,*lpdis\rcItem\top + 2,*lbex\title,lstrlen_(*lbex\title))     
      SelectObject_(*lpdis\hdc,hfntPrevious)
      TextOut_(*lpdis\hdc,40,*lpdis\rcItem\top + 20,*lbex\text,lstrlen_(*lbex\text))
      DeleteObject_(hfntTitle)
 
      ProcedureReturn #True
    EndSelect
 
  ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure

Procedure AddLBItemEx(Gadget,Position,Icon,Title$,Text$)
  Protected *lbex.LBITEMEX = AllocateMemory(SizeOf(LBITEMEX)), Index
  *lbex\Icon = Icon
  CompilerIf #PB_Compiler_Unicode
    *lbex\Title = AllocateMemory(Len(Title$) * 2 + 2)
    *lbex\Text = AllocateMemory(Len(Text$) * 2 + 2)
  CompilerElse
    *lbex\Title = AllocateMemory(Len(Title$) + 1)   
    *lbex\Text = AllocateMemory(Len(Text$) + 1)   
  CompilerEndIf   
  PokeS(*lbex\Title,Title$)
  PokeS(*lbex\Text,Text$)
  Index = SendMessage_(GadgetID(Gadget),#LB_ADDSTRING,0,"")
  SetGadgetItemData(Gadget,Index,*lbex)
EndProcedure

 ; [...]

OpenWindow(#DateWindow,0,0,350,150,"Datum einfügen",#PB_Window_WindowCentered|#PB_Window_SystemMenu,WindowID(Window_0))
Dates = ListViewGadget(#PB_Any,5,25,230,120,#LBS_OWNERDRAWFIXED)
SendMessage_(GadgetID(Dates),#LB_SETITEMHEIGHT,0,36)
SetWindowCallback(@WindowCallback())
AddLBItemEx(Dates,-1,ImageID(CatchImage(#PB_Any,?IconDateICO)),FormatDate("%dd.%mm.%yyy",Date()),"DD.MM.JJJJ")
Grüße, Mok

Re: Nullzeiger bei DrawIcon_()

Verfasst: 20.04.2010 20:13
von ts-soft
Hast Du denn auch ein Icon in einer DataSection mit dem Label:
IconDateICO: IncludeBinary "bla.ico"
eingebunden?

Re: Nullzeiger bei DrawIcon_()

Verfasst: 20.04.2010 20:39
von Mok
@ts-soft:

Code: Alles auswählen

IncludePath "icons"

DataSection
  IconDate:      IncludeBinary "date.png"
    IconDateICO: IncludeBinary "date.ico"
EndDataSection
Außerdem funzt es nicht einaml mit LoadImage()

Re: Nullzeiger bei DrawIcon_()

Verfasst: 20.04.2010 20:58
von ts-soft
Wie wäre es mit:

Code: Alles auswählen

Global Dates

Re: Nullzeiger bei DrawIcon_()

Verfasst: 20.04.2010 21:13
von Mok
ts-soft hat geschrieben:Wie wäre es mit:

Code: Alles auswählen

Global Dates
Es passiert immer wieder /:-> Bild

Edit
Damnit, funzt noch immer nicht :(

Re: Nullzeiger bei DrawIcon_()

Verfasst: 20.04.2010 21:14
von ts-soft
Mok hat geschrieben:Es passiert immer wieder /:-> Bild
Aber nur denjenigen, die den Sinn von EnableExplicit immer noch nicht verstanden haben, also den
absoluten Programmier-Daus! :mrgreen:

Re: Nullzeiger bei DrawIcon_()

Verfasst: 20.04.2010 21:15
von Kaeru Gaman
Es passiert immer wieder
dann benutz doch endlich mal EnableExplicit, da würde er dir sagen dass es nicht definiert ist und du würdest es merken, dass du das Global vergessen hast. /:->

Re: Nullzeiger bei DrawIcon_()

Verfasst: 20.04.2010 21:20
von ts-soft
Noch mal rin in die Kerbe :mrgreen:
Abgesehen davon, die Fehlermeldung des Debugger: Gadget nicht Initialisiert
hätte Dich auch auf den richtigen Weg gebracht, wenn Du die Meldung mal
gelesen hättest :lol:

Re: Nullzeiger bei DrawIcon_()

Verfasst: 20.04.2010 21:22
von Mok
Wie man heutzutage geflamed wird... man kann ja nichtmal mehr seine eigenen Edits finden :mrgreen:
Edit: Damnit, funzt noch immer nicht :(
Das ganze hätte eigentlich nur eine Demo werden sollen, dann hab ich's immer erweitert bis es jetzt ein zukünftiger Texteditor sein soll (skriva ist schwedisch und heißt "schreiben")

Edit:
Noch mal rin in die Kerbe :mrgreen:
Abgesehen davon, die Fehlermeldung des Debugger: Gadget nicht Initialisiert
hätte Dich auch auf den richtigen Weg gebracht, wenn Du die Meldung mal
gelesen hättest :lol:
Bei mir gibt's keine solche Fehlermeldung :?


Edit #2:
OK, EnableExplicit ist wirklich "the answer to everything" Könnte mich grade martern, weil ich selbst einen Artikel zu EnableExplicit in den FAQ geschrieben hab >.<

Re: Nullzeiger bei DrawIcon_()

Verfasst: 20.04.2010 21:44
von ts-soft
Mok hat geschrieben:Bei mir gibt's keine solche Fehlermeldung :?
Vielleicht beim Debuggen von Speicherfehlern den Purifier anschalten, dann
bekommste auch die passende Fehlermeldung.

Und beim nächsten mal bitte gleich einen ausführbaren Code, ansonsten
wirste Deine dummen Fehler selber suchen müssen :twisted:

Gruß
Thomas