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
@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
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
Wozu das ganze?
Damit man zum Beispiel auch ein SplitView erzeugen kann
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
Der ASM stuff ist übersetzt vom Library SDK, ich hoffe, da gibts nicht mehr
allzuviele Änderungen

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".