Interesting MaxGUI Gadget Text Behavior
Archives Forums/MaxGUI Bug Reports/Interesting MaxGUI Gadget Text Behavior
| ||
Import MaxGui.Drivers
SuperStrict
Local window:TGadget = CreateWindow( AppTitle, 10, 10, 400, 300, Null, WINDOW_TITLEBAR )
Local label:TGadget = CreateLabel("Label text",10,10,280,52,window)
SetGadgetText(label, "New label text")
SetGadgetText(label, "")
SetGadgetText(label, GadgetText(label))
Repeat
WaitEvent()
Print CurrentEvent.ToString()
Select EventID()
Case EVENT_APPTERMINATE, EVENT_WINDOWCLOSE
End
End Select
Forever
BCC 1.39 Mac OS X 10.6.4 XCode 3.2.2 My expectation would be to see nothing in the label as text, or if there is some strange pointer thing going on, the previous string("New label text"). But strangely enough, it points to the original. I can guess, but I'm not sure what is going on here with pointers/memory behind the layers of MaxGUI. Anyone have an idea? (I've searched the forum, but could not find any clues) |
| ||
| Looks like a mac thing, works as expected on XP. |
| ||
| Mac bug: Fix for MaxGUI.CocoaMaxGUI's cocoagui.bmx: Method SetText(msg$)
If internalclass=GADGET_HTMLVIEW
Local anchor$,a
a=msg.Find("#")
If a<>-1 anchor=msg[a..];msg=msg[..a]
If msg[0..7].ToLower()<>"http://" And msg[0..7].ToLower()<>"file://"
If FileType(msg)
msg="file://"+msg
Else
msg="http://"+msg
EndIf
EndIf
msg:+anchor
msg=msg.Replace(" ","%20")
ElseIf internalclass=GADGET_MENUITEM
msg=msg.Replace("&", "")
EndIf
name=msg ' <-- Add this line here
NSSetText Self,msg
End MethodTCocoaGadget.GetText() seems to resort to internal field if an empty string is returned by NSGetText() - Skid, any idea why this was? |
| ||
| Yuck... Apologies for sloppy original code. After quick review name should be private to individual gadgetclass and generic usage is not advised. Labels IMHO instead should be fixed to reflect OS state. Gadgets like textarea certainly don't need their contents retained, so will try some more test code first. seems to resort to internal field if an empty string is returned by NSGetText() - hmph, i thought that was testing for null at first glance, weird To stop cocogui.bmx retaining more than it needs I propose nulling nsgadget.name after it is used as parameter to NSInitGadget Function Create:TNSGadget(internalclass,text$,x,y,w,h,group:TGadget,style) Local gadget:TNSGadget = New TNSGadget gadget.origclass = internalclass gadget.internalclass = internalclass If Not group And internalclass<>GADGET_DESKTOP Then group = Desktop() gadget.parent = group gadget.name = text gadget.SetRect x,y,w,h 'setarea gadget.style = style gadget.font = TCocoaMaxGUIDriver.CocoaGUIFont If TNSGadget(group) Then gadget.forceDisable = Not (TNSGadget(group).enabled And Not TNSGadget(group).forceDisable) EndIf NSInitGadget gadget gadget.name=Null ' <- fixed to keep thing lightweight ?topic=91292 and removing undocumented/incomprehensible fallback in GetText: Method GetText$() Return NSGetText(Self) End Method |
| ||
| Fixed in next release. |
| ||
| Fantastic guys! thanks for looking at it and finding it. |