July 19, 2013

Creating Splash Screen

This article will show how to create a splash screen which is displayed over the main form. It was designed for Smart 1.1.2 and may not work with older versions.

Start by creating a new visual project. Add another form which will contain the splash screen. Rename it to something sensible (say, SplashForm).

In reality you cannot rename it in the Smart IDE as rename function is broken in the 1.1.2 beta. As a temporary workaround you can open the .opp file in the Notepad (make a backup copy first!) and rename all occurrences of ‘Form2’  to ‘SplashForm’.

Edit the main unit to create the new form.

uses 
w3system, w3components, w3forms, w3application, form1,
SplashForm;

type
TApplication = class
(TW3CustomApplication)
private
FForm1:
TForm1;
FSplashForm:
TSplashForm;
public
procedure ApplicationStarting; override
;
end
;

implementation

{ TApplication}

procedure
TApplication.ApplicationStarting;
begin
FForm1 :=
TForm1.Create(Display.View);
FForm1.Name := 'Form1'
;
RegisterFormInstance(FForm1,
True);

FSplashForm :=
TSplashForm.Create(Display.View);
FSplashForm.Name := 'SplashForm'
;
RegisterFormInstance(FSplashForm, False);

inherited
;
end
;

Show the splash screen when the main form is activated for the first time. The best place for that is in the overridden FormActivated method.

type
TForm1=class
(TW3form)
private
FFirst:
boolean;
{$I 'Form1:intf'}
public
procedure FormActivated; override
;
protected
procedure InitializeObject; override
;
end
;

implementation

{ TForm1}

procedure
TForm1.FormActivated;
begin
if FFirst then
begin
FFirst :=
false;
Application.ShowModal('SplashForm', 'SplashPanel', ''
);
end
;
end
;

procedure
TForm1.InitializeObject;
begin
inherited
;
{$I 'Form1:impl'}
W3Label1.Font.Size := 24
;
FFirst :=
true;
end
;

Now you only have to design the splash screen. Place all components on a panel named SplashPanel (as this name is used in the ShowModal call) and write a simple FormActivated method which will close the splash screen after three seconds.

uses 
w3system, w3graphics, w3components, w3forms, w3fonts,
w3borders,
w3application, w3panel, w3label,
w3time;

type
TSplashForm=class
(TW3form)
private
{$I 'SplashForm:intf'}
public
procedure FormActivated; override
;
protected
procedure InitializeObject; override
;
end
;

implementation

{ TSplashForm}

procedure
TSplashForm.FormActivated;
begin
TW3EventRepeater.After(3000, lambda Application.HideModal(mrOK); end
);
// do program initialization here
end
;

procedure
TSplashForm.InitializeObject;
begin
inherited
;
{$I 'SplashForm:impl'}
W3Label1.Font.Size := 24
;
end
;

If you want to do any slow initialization (such as loading resources from the server), the FormActivated method is the proper place for it.


Run and the splash screen will be displayed over the main form.


image


The splash screen will disappear after three seconds and you’ll be able to use the program.


image



You can test the program here or download it from here.

July 04, 2013

Smart 1.1.2

Next version of Smart Mobile Studio was released as a beta yesterday. It should be pretty much close to the release version (except for the bugs that will be found by first users) so you can use it in your normal development workflow.

Still, this is a beta and it has problems that we didn’t find in internal testing. Make sure that you read the Installation section of the release document (linked above) before installing it as the installer will kill your snippets file. (Stupid oversight for which I apologize.)

The official document contains a pretty long list of changes so go there if you want to know everyhing. Here I will just sum up the features that I find most important.

Smart is now much more version control friendly. Source files inside the .opp project are not stored anymore in the BASE64 encoding but use much more diff-friendly CDATA format. For example, a file that was previously stored as

        <files>
            <file clsid="TIDEProjectFileSource">
                <name>ApplicationShutdown</name>
                <created>2012-08-18T11:14:02Z</created>
                <notes/>
                <source>dW5pdCBBcHBsaWNhdGlvblNodXRkb3duOw0KDQppbnRlcmZhY2UNCg0KdXNlcyANCiAgdzNzeXN0
ZW0sIHczY3RybHMsIHczY29tcG9uZW50cywgdzNmb3JtcywgdzNhcHBsaWNhdGlvbiwgZm9ybTE7
DQoNCnR5cGUNCiAgVEFwcGxpY2F0aW9uID0gY2xhc3MoVFczQ3VzdG9tQXBwbGljYXRpb24pDQog
IHByaXZhdGUNCiAgICBwcm9jZWR1cmUgSGFuZGxlQmVmb3JlVW5sb2FkKFNlbmRlcjogVE9iamVj
dCk7DQogICAgcHJvY2VkdXJlIEhhbmRsZVVubG9hZChTZW5kZXI6IFRPYmplY3QpOw0KICBwdWJs
aWMNCiAgICBwcm9jZWR1cmUgQXBwbGljYXRpb25TdGFydGluZzsgb3ZlcnJpZGU7DQogICAgcHJv

would now be saved as

      <file clsid="TIDEProjectFileSource">
        <name>ApplicationShutdown</name>
        <created>2012-08-18T11:14:02.000Z</created>
        <notes></notes>
        <source>
          <![CDATA[unit ApplicationShutdown;

interface

uses
  w3system, w3ctrls, w3components, w3forms, w3application, form1;

type
  TApplication = class(TW3CustomApplication)
  private
    procedure HandleBeforeUnload(Sender: TObject);
    procedure HandleUnload(Sender: TObject);

Handling of ‘external’ (not stored in the .opp) units and forms was also much improved and all newly created units and forms can now be external by default (there’s a Preference setting for that).

Compiler was improved again (go Eric!). I especially like the sort and map support for dynamic arrays and improvements in the for in support. Sets will also come handy, I’m sure.

Some long standing bugs in the RTL (like the inability of TW3Label to be displayed in a disabled state) have finally been fixed. Otherwise, RTL didn’t change a lot. Oh, there’s a new Android Holo theme (CSS) which give the application much more ‘androidish’ look. The old Android theme (which was just renamed iOS theme) is also installed but you can safely ignore it.

I am a great fan of the new IDE behaviour where editing state (open tabs, bookmarks) is stored in the project file and is restored on load. Editing and code navigation has also been improved – see the changelog for more details.

The last great addition, built-in diff viewer, was shamelessly copied from the Andreas Hausladen’s great DDevExtensions. (Well, the idea was copied. Implementation is our own.) When a file that is open in Smart Mobile Studio is modified externally, a ‘change’ dialog will pop up.

image

You can select a file (or even a form) and click Compare to run a diff engine based on the TDiff component, written by Angus Johnson.

image

You can also configure an external diff/merge tool such as TortoiseMerge or WinMerge.

All in all, 1.1.2 will be a very strong release which should ease waiting on the next big release, 1.2 (due in Autumn).