About two years ago a detailed article about how to use Cordova has been published here. As times are changing quickly, an update for this becomes necessary. This article is about building hybrid web-apps with Cordova with Smart Mobile Studio.
Tag Archives: w3C
Events as objects
Events are fun right? Well, only in part to be honest. For example, what do you do if you want to catch the same event but at different places?
This is where JavaScript’s addEventListener() comes into play. In short it allows you to add as many event-handlers to the same event as your heart desires. But raw unadulterated JavaScript is a bit of a mess, so I decided to wrap this up in clear cut objects. Oh, and I added a “fixed” event for when you want to have objects for standard events as well.
So now whenever you want to hook an event without ruining your published event-handlers (for instance in TW3CustomControl) you can just use one of these 🙂
Enjoy!
unit eventobjs; interface uses w3c.dom, SmartCL.Components, SmartCL.System; type TEventObjTriggeredEvent = procedure (sender:TObject;EventObj:JEvent); TEventObj = class(TObject) private FOwner: TW3TagObj; FAttached: Boolean; FEventName: String; protected procedure HandleEvent(eobj:variant);virtual; public Property Attached:Boolean read FAttached; procedure Attach(EventName:String); procedure Detach; constructor Create(AOwner:TW3TagObj);virtual; destructor Destroy;Override; public Property EventName:String read FEventName; Property Owner:TW3TagObj read FOwner; Property OnEvent: TEventObjTriggeredEvent; end; TFixedEventObj = class(TObject) protected FAttached: Boolean; FOwner: TW3TagObj; procedure HandleEvent(eobj:variant);virtual; protected function DoGetEventName:String;virtual;abstract; public Property Attached:Boolean read FAttached; procedure Attach; procedure Detach; constructor Create(AOwner:TW3TagObj);virtual; destructor Destroy;override; public Property Owner:TW3TagObj read FOwner; Property OnEvent: TEventObjTriggeredEvent; end; TElementRemovedEvent = class(TFixedEventObj) protected function DoGetEventName:String;override; end; TElementAddedEvent = class(TFixedEventObj) protected function DoGetEventName:String;override; end; implementation //############################################################################# // TElementAddedEvent //############################################################################# function TElementAddedEvent.DoGetEventName:String; begin result := "DOMNodeInserted"; end; //############################################################################# // TElementRemovedEvent //############################################################################# function TElementRemovedEvent.DoGetEventName:String; begin result := "DOMNodeRemoved"; end; //############################################################################# // TFixedEventObj //############################################################################# constructor TFixedEventObj.Create(AOwner:TW3TagObj); begin inherited Create; FOwner:=AOwner; Attach; end; destructor TFixedEventObj.Destroy; begin Detach; inherited; end; procedure TFixedEventObj.Attach; begin if FAttached then Detach; FOwner.Handle.addEventListener(DoGetEventName,@HandleEvent,true); FAttached := true; end; procedure TFixedEventObj.Detach; begin if FAttached then begin FOwner.Handle.removeEventListener(DoGetEventName,@HandleEvent,true); FAttached := false; end; end; procedure TFixedEventObj.HandleEvent(eObj:variant); begin if assigned(OnEvent) then OnEvent(self, JEvent(eObj)); end; //############################################################################# // TEventObj //############################################################################# constructor TEventObj.Create(AOwner:TW3TagObj); begin inherited Create; FOwner := AOwner; end; destructor TEventObj.Destroy; begin if FAttached then Detach; inherited; end; procedure TEventObj.HandleEvent(eobj:variant); begin if assigned(OnEvent) then OnEvent(self,JEvent(eObj)); end; procedure TEventObj.Attach(EventName:String); begin if FAttached then Detach; FEventName := EventName; try FOwner.handle.addEventListener(FEventName,@HandleEvent,true); except FEventname:= ''; FAttached:=false; exit; end; FAttached:=true; end; procedure TEventObj.Detach; begin if FAttached then begin try FOwner.handle.removeEventListener(FEventName,@HandleEvent,true); finally FEventName := ''; FAttached := false; end; end; end; end.
Smart Mobile Studio 1.1 RC (build 1.1.0.400)
We are very proud to present the release candidate for Smart Mobile Studio version 1.1 (build number v1.1.0.400). If you would like to give this groundbreaking product a test drive before we officially release it, then you can download the installer directly from SmartMobileStudio.com/download/setup_v1_1_0_400_rc.exe
(The context menu is replaced with Ctrl+Shift+R (start/stop recording) and Ctrl+Shift+P (replay the recorded macro).
We have done a lot of improvements in the IDE, the editor, the RTL and the Smart Pascal language. Below is a list of some of the improvements that have been done since version 1.0 (see full manifest of changes for beta 1 here).
IDE changes
- Added: Support for external form files
- Added: Navigate to ancestor from class-browser
- Added: Components are now organized in more tabs
- Added: RTL source proxy, speeds up compilation and dependency chain
- Added: Syntax hints and improved code insight
- Added: The IDE now uses threading to handle background compilation
- Added: Dependencies for controls are automatically added to the uses clause
- Fixed: Resizer bugs for nested controls
- Fixed: Scrolling issue fixed ([CTRL] + [Up]/[Down])
- Fixed: Disabled unit structure flickering
- Fixed: LineCount issue
- Fixed: Case fix for strict hints
- Fixed: A label “mistake” in the baseframe (it was renamed further up the chain).
- Fixed: modified [CTRL]+/ to work the same as in Delphi:
- if a single line is changed, caret is moved to the next line (current column is preserved)
- if multiple lines are selected, comment is toggled for the whole block and caret is move to the line following the block (current column is set to 1)
- modification is placed into the undo buffer so that it can be undone
- Altered: [CTRL]+[/] is replaced by [CTRL]+[#] for systems where [/] is only accessible via [SHIFT]
- Altered: Minor changes on compiler output (bulk output of errors, warnings and hints).
- Altered: Search and replace dialog remembers the last states
- Altered: improved code proposal (insert item highlight)
- Altered: dialogs are centered
- Altered: Recent file on welcome tab now supports to show unlimited entries if desired (by default limited to 10 items)
- Added: Pascal “Gabelou” StyleCop (see prefrences->misc. to enable it).
- Added: Rename refactoring (including closed files)
- Added ‘Format Keywords’ action (see popup menu), which translates all keywords to lowercase.
- Added: Simplified BrowserAPI
- Added: possibility to filter log messages from the console output (filtered ‘event.layerX and event.layerY are broken and deprecated …’ by default). Select a certain text to filter and right click -> Ignore Message to filter out all messages containing this particular string. The filter will be resetted on restart.
RTL
- Updated: Remobjects headers
- Updated: WebGL headers
- Updated: Sprite3d
- Added: DrawTo, DrawPart and misc CODEF functions added to TW3Canvas
- Added: TW3Progressbar control
- Added: TW3ListBox control
- Added: Unit for complex numbers (w3complex.pas)
- Minor formating and added overload function for CreateImageData
- Added fast sequential read text file loaders
- Applied the new ‘Format Keywords’ to the remaining RTL files
- Removed duplicate & tweaked hash function
- Improved hashing function
- dialogs need custom initialization
- modal dialog support integrated into TW3CustomApplication (ShowModal, HideModal)
- modal dialog is re-centered if application is resized (for example when orientation of a mobile device changes)
- added TW3CustomApplication.CreateOpaqueMask
- TW3CustomControl.getMaxZIndex is now public
- modal dialogs triggered from modal dialogs are now supported
- Fixed: zIndex issues with modal dialogs
- Fixed: opaque layer has high z-index to cover all controls on the form
- Fixed: SendToBack
- Altered: dialogs are centered on the form
- Altered: event handlers are only called when assigned
- Altered: W3ModalDialog made external for easier reuse
- Altered: updated Remobjects interface
- Altered: Changed default Mouse event X,Y coordinates
- Added: W3ModalDialog uses opaque div to block owner form (tnx to Eric)
- Added: PixelRatio info
- Added TVariant.Properties + OwnProperties
- Added HorzLine/VertLine
- Added: New FillRectF/StrokeRectF overloads
- Added: TW3CustomApplication.FormByName, TW3Component.ChildByName, TW3Component.EnumChildrenAltered: SetSize now virtual
- Added: PhoneGapAPI is now complete
COMPILER
- Added: Support for RTTI (!)
- Added: Support for property expressions
- Added: Support for interface expressions
- Fixed: Case fixes for strict mode
- Fixed: an issue where compiler would accept method implementations in a different unit the class was declared
- Fixed: Lambdas don’t have a “var”/”const”/etc. section
- Fixed: issue with invalid symbol table in suggestions in case of fatal error in a lambda
- Fixed: SymbolDictionary bug for forwarded overloaded methods
- Fixed: calling overloaded inherited constructors
- Fixed: codegen for assignments of a function’s result to a var param
- Fixed: timestamp is now up to date
- Updated: now uses latest compiler core
- Updated: tokenizer updated to latest revision
- Altered: Compile speed optimizations
- Added: Missing semi-colon no longer a stopping error
- Added: JSON to reserved names
- Added: JSON static class
- Added: Preparation for source maps
DEMOS
- Fixed: style bug in smartflow
- Fixed: bug in spartacus
- Fixed: bug in box2d wrapper
- Altered: Tested all demos (with exception of gyro). All demos now compile.
- Altered: formatting of Archimedes Spiral
- Added: frames demo
- Added: modal dialog example
Sincerely,
Jon Lennart Aasenden
—
The Smart Mobile Studio Team