Seite 4 von 5

Verfasst: 22.04.2006 12:07
von Kiffi
hallodri hat geschrieben:Ohne Callback muss du am Ende beide Gadgets mit Freegadget wieder frei geben.
aha, wusste ich nicht. Ich wollte nur mal mit Copy&Paste anschauen, was Ihr
da schönes bastelt. :-)

Grüße ... Kiffi

Verfasst: 22.04.2006 12:27
von ts-soft
@Kiffi
Dafür gibts ja die Lib, das man Destroyen des Fensters automatisch erledigt :wink:

@edel und gnozal
Euer nettes Beispiel ist für mich nicht verwendbar. Bau einfach mal einen
FontRequester ein, dann wirste sehen, wie durcheinande Windows ist :mrgreen:
Vielleicht kommt ja bald TailBite, dann kann ich es ja als Gadget registrieren,
dann sollte es keine Probleme mehr geben.

Verfasst: 22.04.2006 12:43
von edel
Mein Fehler , habe nicht daran gedacht das man keine Klasse zerstoeren
kann, solange sie ein Fenster hat. :-(

Verfasst: 24.04.2006 04:59
von ts-soft
Update: Das erstellte Scintilla-Control ist ein echtes Gadget!
(#PB_Any wird auch unterstützt)

besonderen Dank an hallodri :allright:

Wozu das ganze?
Damit man zum Beispiel auch ein SplitView erzeugen kann :wink:

Code: Alles auswählen

EnableExplicit

XIncludeFile "Scintilla.pb"

Scintilla_Init() ; Initfunktion, wird später in der Lib nicht mehr gebraucht


Define.Scintilla *Edit1, *Edit2 ; Objectvariable für Scintilla-Control definieren
Define.l Splitter, *pdoc

#PB_Window_Flags = #PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_MaximizeGadget|#PB_Window_MinimizeGadget
If OpenWindow(0, #PB_Ignore, 0, 640, 480, "SplitView", #PB_Window_Flags) = #False : End : EndIf

RemoveKeyboardShortcut(0, #PB_Shortcut_All) ; Ansonsten funktioniert TAB nicht!

If CreateGadgetList(WindowID(0))
  *Edit1 = New_Scintilla(#PB_Any, 0, 0, 0, 0)
  *Edit2 = New_Scintilla(#PB_Any, 0, 0, 0, 0)
  *pdoc = *Edit1\SciMsg(#SCI_GETDOCPOINTER)
  *Edit2\SciMsg(#SCI_SETDOCPOINTER, 0, *pDoc)
  Splitter = SplitterGadget(#PB_Any, 0, 0, 640, 480, *Edit1\Id, *Edit2\Id)
  SetActiveGadget(*Edit1\Id)
EndIf

Repeat
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow
      Break
    Case #PB_Event_SizeWindow
      ResizeGadget(Splitter, #PB_Ignore, #PB_Ignore, WindowWidth(0), WindowHeight(0))
  EndSelect
ForEver

Scintilla_End() ; Endfunktion, wird später in der Lib nicht mehr gebraucht

Verfasst: 24.04.2006 06:57
von ts-soft
Weils so schön ist, nochmals geupdatet!
Optionales Callback kann angegeben werden!

Code: Alles auswählen

EnableExplicit

XIncludeFile "Scintilla.pb"

Scintilla_Init() ; Initfunktion, wird später in der Lib nicht mehr gebraucht

Enumeration ; Gadgets
  #Sci1
  #Sci2
  #Splitter
EndEnumeration

Procedure SciCallback(*Gadget.long, Window, Message, wParam, lParam)
  Protected *msg.SCNotification
  Select Message
    Case #WM_NOTIFY
      *msg = lParam
      If *msg\NMHDR\hwndFrom = *Gadget\l
        Select *msg\NMHDR\code
          Case #SCN_UPDATEUI
            Debug "SCN_UPDATEUI"
          Case #SCN_CHARADDED
            Debug "SCN_CHARADDED"
          Case #SCN_DOUBLECLICK
            Debug "SCN_DOUBLECLICK"
          Case #SCN_MODIFIED
            Debug "SCN_MODIFIED"
        EndSelect
      EndIf
  EndSelect
EndProcedure

Define.Scintilla *Edit1, *Edit2 ; Objectvariable für Scintilla-Control definieren
Define.l *pdoc

#PB_Window_Flags = #PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_MaximizeGadget|#PB_Window_MinimizeGadget
If OpenWindow(0, #PB_Ignore, 0, 640, 480, "SplitView", #PB_Window_Flags) = #False : End : EndIf

RemoveKeyboardShortcut(0, #PB_Shortcut_All) ; Ansonsten funktioniert TAB nicht!

If CreateGadgetList(WindowID(0))
  *Edit1 = New_Scintilla(#Sci1, 0, 0, 0, 0, @SciCallback())
  *Edit2 = New_Scintilla(#Sci2, 0, 0, 0, 0, @SciCallback())
  *pdoc = *Edit1\SciMsg(#SCI_GETDOCPOINTER)
  *Edit2\SciMsg(#SCI_SETDOCPOINTER, 0, *pDoc)
  SplitterGadget(#Splitter, 0, 0, 640, 480, #Sci1, #Sci2)
  SetGadgetState(#Splitter, 360)
  SetActiveGadget(#Sci1)
EndIf

Repeat
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow
      Break
    Case #PB_Event_SizeWindow
      ResizeGadget(#Splitter, #PB_Ignore, #PB_Ignore, WindowWidth(0), WindowHeight(0))
  EndSelect
ForEver

Scintilla_End() ; Endfunktion, wird später in der Lib nicht mehr gebraucht

Verfasst: 24.04.2006 07:29
von edel
Es handelt sich aber dabei um den Callback des Parentfenster.

Starte den Callback lieber ueber ein Prototyp , Das *Gadget.long
irritiert etwas.

Verfasst: 24.04.2006 07:36
von ts-soft
hallodri hat geschrieben:Es handelt sich aber dabei um den Callback des Parentfenster.

Starte den Callback lieber ueber ein Prototyp , Das *Gadget.long
irritiert etwas.
Was heißt das mit dem Parentfenster, ist das nicht korrekt?

Verfasst: 24.04.2006 09:13
von gnozal
Nice example, but who knows how long this ASM stuff is valid ?

Code: Alles auswählen

!EXTRN _PB_Object_GetOrAllocateID@8
  !EXTRN _PB_Gadget_RegisterGadget@16
  !EXTRN _PB_Gadget_Globals
  !EXTRN _PB_Gadget_Objects
  !MOV   eax,[_PB_Gadget_Objects]
  !MOV   [p.v_ObjectList],eax
  !MOV   [p.v_GetOrAllocateID],dword _PB_Object_GetOrAllocateID@8
  !MOV   [p.v_RegisterGadget],dword _PB_Gadget_RegisterGadget@16
  !MOV   eax,[_PB_Gadget_Globals]
  !MOV   eax,[eax]
  !MOV   [p.v_parent],eax
PB internals change all the time...

Verfasst: 24.04.2006 09:19
von ts-soft
gnozal hat geschrieben:Nice example, but who knows how long this ASM stuff is valid ?

Code: Alles auswählen

!EXTRN _PB_Object_GetOrAllocateID@8
  !EXTRN _PB_Gadget_RegisterGadget@16
  !EXTRN _PB_Gadget_Globals
  !EXTRN _PB_Gadget_Objects
  !MOV   eax,[_PB_Gadget_Objects]
  !MOV   [p.v_ObjectList],eax
  !MOV   [p.v_GetOrAllocateID],dword _PB_Object_GetOrAllocateID@8
  !MOV   [p.v_RegisterGadget],dword _PB_Gadget_RegisterGadget@16
  !MOV   eax,[_PB_Gadget_Globals]
  !MOV   eax,[eax]
  !MOV   [p.v_parent],eax
PB internals change all the time...
Diese Lib befindet sich ja auch in Entwicklung :wink:
Der ASM stuff ist übersetzt vom Library SDK, ich hoffe, da gibts nicht mehr
allzuviele Änderungen :D

Verfasst: 24.04.2006 17:53
von edel
ts-soft hat geschrieben:
hallodri hat geschrieben:Es handelt sich aber dabei um den Callback des Parentfenster.

Starte den Callback lieber ueber ein Prototyp , Das *Gadget.long
irritiert etwas.
Was heißt das mit dem Parentfenster, ist das nicht korrekt?
Kommt darauf an was du machen moechtest , dieser Callback ist sehr
nuetzlich, aber eben nicht der des ScintillaGadgets. Brauche ich jetzt
z.b. wm_char muss ich es nochmal "subclassen".