I've been developing software using Delphi for well over 15 years and for at least the last 10 years I hear all about how Delphi is dead and developers are moving to other languages. I have just looked at the TOIBE index which list software development languages by popularity and Delphi has moved from ranking 15 last year to 13 this year, so this shows that Delphi is going to stay around for some time to come.
Obviously these ranking change constantly and it could be next year Delphi goes back down the list, but I do think it says shows that Delphi is not dead and that all the people who have said 'Delphi is dead' for the last 10+ years are wrong.
Friday, 22 May 2015
Tuesday, 19 May 2015
Prefix class with 'I'
The other week I was looking at some code another Delphi developer had written and noticed that he prefixed classes with 'I' instead of 'T'. In my world the prefix 'I' means its an interface, but he argued that an abstract class is an interface and that all abstract classes should be prefixed with 'I'. I disagreed with him for various reasons, one being that Delphi standard classes do not do this.
Does anyone else prefix their abstract classes with 'I' and only use 'T' for concrete classes?
Does anyone else prefix their abstract classes with 'I' and only use 'T' for concrete classes?
Thursday, 30 April 2015
How to refresh a treeview control
I recent development I have been working on uses a TTreeview control. The underlining classes that relate to the nodes of the control get updated and I reflect the state of the class as dynamic colour of the node text. This state change can happen every few seconds so I wanted to refresh the treeview at least every couple of seconds.
I read a few articles on how to do this but found the treeview would flicker. The best solution I found was simple, when I wanted to refresh just simply call the 'invalidiate' method, at first this did not work until I set the doublebuffered property to true and now it works really well.
I read a few articles on how to do this but found the treeview would flicker. The best solution I found was simple, when I wanted to refresh just simply call the 'invalidiate' method, at first this did not work until I set the doublebuffered property to true and now it works really well.
Monday, 19 January 2015
Delphi XE5 App does not work with Android Lollipop
Last year I developed a prototype App using Delphi XE5 and deploying to my Nexus 4. It all worked OK and I was fairly happy with what I had. Last month I updated my Nexus phone to Android Lollipop, the other day I tried to open the App and nothing happened it just did not work anymore. I was a little disappointed and a similar App I had developed using Xamarin still worked fine. I am now not sure how feasible it is using Delphi to develop Android Apps.
Sunday, 26 October 2014
Delphi vs Xamarin
Recently I have been doing some mobile development and assessing the pros and cons of Delphi and Xamarin. Here is a brief list of them, there will be more as I use both.
Delphi Pros
Delphi Pros
- Use existing familiar IDE.
- Quick to prototype and deploy to Android device.
- Easy to use interface designer.
- Large shared code base between different platforms.
Delphi Cons
- Expensive to purchase the latest version of Delphi.
- Crashes often with the loss of any recent changes.
- Slow to build and deploy.
- File size is big, 'Hello world' app will be at least 25MB.
- Nice to use interface (C# code).
- Easy and quick to deploy app to Android.
- File size small, suspect this is due to it having to also deploy virtual platform.
- The app is quick to run on the device compared with Delphi app.
- Cheap compared with Delphi.
Xamarin Cons
- Less shared code between platforms.
- Interface designer does not feel as flexible.
- Properties inspector needs improving and is not as user friendly as Delphi.
- Online tutorials and help are not concise and some seem out of date.
I should point out the version of Delphi I used was XE5, the current release is XE7 so they might have fix a few bugs. I did go to a XE7 launch event (which I will write another blog entry about) and from what I saw and the questions I asked it is not much different and they have not done anything to improve the build time. When it comes to the speed of the build for Android it is best to build to the device rather than use the Android simulator which for both is very slow.
I will continue to add to this blog entry with other pros and cons as I come across them.
Labels:
android,
C#,
Cons,
Delphi vs Xamarin,
device,
devleopment,
IDE,
Pros,
XE5,
XE7
Sunday, 27 July 2014
Delphi XE Android App Emulator Problem
I have recently been using Delphi XE5 do produce an Android mobile app. All was looking good until I wanted to run the app, the Android SDK comes with an Android emulator, but when I tried running the App from Delphi with the emulator running I just got a blank screen. When I plugged an Android device in it ran fine, so I thought it must be an issue with the emulator. After a few days of using the device I thought I would look into how to fix the emulator issue. All you need to do to fix this problem is to turn on the 'Use host GPU' option when setting up the device in the emulator, after that it will run, however there is another annoying issue, it is very slow.
Monday, 3 February 2014
Using TObjectList in Generics.Collections
In 2009 a new TObjectList was introduced in Generics.Collections, the old TOjectList was still available in the Contnrs unit, but the new one was more strongly typed and you need to specify the class of object the the list will be populated with. This means a reduction in type casting. Here is an example of how to use it:
TMyListClass = class(TObject)
private
FEntries: TObjectList<TMyEntry>;
public
property Entries: TObjectList<TMyEntry> read FEntries write FEntries;
function GetEntry(aIndex: integer):TMyEntry;
constructor Create;
destructor Destroy; override;
end;
implementation
constructor TMyListClass.Create;
begin
inherited Create;
FEntries := TObjectList<TMyEntry>.Create();
end;
destructor TMyListClass.Destroy;
begin
FEntries.Free;
inherited Destroy;
end;
function TMyListClass.GetEntry(aIndex: integer):TMyEntry;
begin
// You don't need to typecast
// Old way
// if (FEntries.Items[aIndex] is TMyEntry) then
// Result (FEntries.Items[aIndex] as TMyEntry;
Result := FEntries.Items[aIndex];
end;
TMyListClass = class(TObject)
private
FEntries: TObjectList<TMyEntry>;
public
property Entries: TObjectList<TMyEntry> read FEntries write FEntries;
function GetEntry(aIndex: integer):TMyEntry;
constructor Create;
destructor Destroy; override;
end;
implementation
constructor TMyListClass.Create;
begin
inherited Create;
FEntries := TObjectList<TMyEntry>.Create();
end;
destructor TMyListClass.Destroy;
begin
FEntries.Free;
inherited Destroy;
end;
function TMyListClass.GetEntry(aIndex: integer):TMyEntry;
begin
// You don't need to typecast
// Old way
// if (FEntries.Items[aIndex] is TMyEntry) then
// Result (FEntries.Items[aIndex] as TMyEntry;
Result := FEntries.Items[aIndex];
end;
Subscribe to:
Posts (Atom)