Als je een applicatie maakt dat moet draaien via een WLAN (Wifi), pas dan even op en lees het onderstaande door:
{$SetPEFlags IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP}
Als je een applicatie maakt dat moet draaien via een WLAN (Wifi), pas dan even op en lees het onderstaande door:
{$SetPEFlags IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP}
Soms wordt je onaangenaam verrast: je meet de tijd van alle SQL queries in je programma met "MillisecondsBetween" en je krijgt als resultaat: 0, 0, 0, en 15ms...
Consequenties
De default time slice van 15ms heeft nogal wat consequenties voor het programmeren: zo gaat een "Sleep(1)" niet 1ms wachten, maar 10 - 15ms! (afhankelijk van andere threads etc). Maar ook andere tijd functies zoals "GetTickCount", "Now" (Delphi) of "GetLocalTime" (Windows) werken in stapjes van 15ms!
OldNow := KOLDetours.InterceptCreate(@Now, @NowExact);
Vlak na de preview van Delphi 2010 (zie mijn vorige post), verscheen al de RTM versie en is het officieel released. Ondertussen zijn er verschillende interessante blogs verschenen, waarbij verschillende verbeteringen verder uitgelegd worden. Ik zal niet alle verbeteringen bespreken, maar een paar uitlichten. (P.S: zie ook de complete "reviewers" guide!)
Uitgebreide online wiki help (!)
Na de Delphi Prism Wiki is de hele RAD Studio via een mooie online wiki te doorzoeken. Bijvoorbeeld voor het complete overzicht van alle verbeteringen in de 2010 versie:
Voor een handig beginpunt:
Maar ook de complete Delphi Language Guide is beschikbaar, evenals bijvoorbeeld de VCL, etc.
Class constructors
Een mooie uitbreiding (wat nog niet zo nadrukkelijk genoemd is), is de ondersteuning van Class Constructors (net als .Net)
Een voorbeeld hoe je het kunt gebruiken:
RTTI (a la .Net reflection)
Verder is de RTTI sterk verbeterd, meer object georiënteerd zoals .Net Reflection werkt, zonder allerlei pointers, records, etc.
Class attributes
Zoals je ziet, zijn in D2010 verschillende .Net technieken verwerkt. Nu heeft Delphi ook ondersteuning voor class attributes:
TStopwatch
Nog een kleine maar handige uitbreiding is de TStopwacht, voor het meten van tijden (hoe lang een stuk code duurt etc):
Andere handigheidjes:
Datasnap (multitier):
IDE & Source Code:
DBX: Firebird + alle sourcecode (!)
Wat ik zelf erg mooi vind, is de native ondersteuning van de open source database Firebird (compatible (?) met Interbase). Maar ook dat de broncode van alle drivers meegeleverd wordt! Niet alleen van DBX, maar ook (eindelijk!) van Midas.dll (oa bekend van TClientdataset).
Extra's
De eerste extra functies en fixes van "andy" zijn al verschenen voor D2010:
Laatst is er een interessante dotNed meeting geweest bij DTS/4DotNet over TPL voor .Net. Gelukkig bestaat voor Delphi zoiets dergelijks al een poosje:
Op de site van Codegear/Embarcadero is vorige week de Delphi 2010 Preview Center verschenen: Nog 7 dagen, 2 uur, 31 minuten (and counting…) en dan is het zover.
Delphi 2010 belooft de beste Delphi release ooit te worden, met veelbelovende nieuwe features en verbeteringen! Zoals (Multi)Touch, Mouse Gestures, IDE Insight (alles (!) vinden in 1 scherm), background compilation, verbeterde debugger (oa threads), verbeterde RTTI (.Net Reflection!), class attributes, Direct2d canvas (Win7), etc etc.
Bekijk onder andere deze video eens:
Vervolgens zijn er op de Codegear blog een groot aantal artikelen hierover verschenen:
Niet minder interessant zijn de blog artikelen van de “Wings of wind” blog!:
Een ander blog had een leuk artikel over een andere (kleine) verbetering mbt API wrappers:
1 ding is zeker: ze zijn bij Codegear/Embarcadero druk bezig met Delphi! De toekomst zag met al het .Net geweld er somber uit, maar de zon schijnt achter de wolken. Wat betreft “native code” versus “managed/.Net code” vond ik de volgende gedeelte van de blog van Pawel Glowacki wel mooi:
Tim Anderson in his post “Native code makes a comeback – except it never away” has some good points on this subject as well. The very good example why native code continues to be important is new Windows 7 Direct2D graphics. I like the quote from MSDN Magazine June 2009 issue “Introducing Direct2D” where author sums it up:
(…) if you want to develop high-performance and high-quality commercial applications, you’ll still look to C++ and native code to deliver that power. (…)
That is why Delphi and C++Builder developers are not looking to move away from native to managed code.
Er is de laatste tijd weer genoeg nieuws te melden. Deze keer over nieuwe zoekmachines, PopupMode, gratis Blaise Pascal Magazine editie, MonoDevelop op Mac & Windows, Delphi Prism May 2009 met AOP(!) en VS2010 met .Net 4.0 met PFX.
Zoekmethoden:
RemObjects SDK:
Delphi:
Visual Studio:
Delphi Prism:
Mono:
Axum in Visual Studio:
Laatst sprak ik klant, en die vroeg mij over de toekomst van Delphi. Ik kon toen daar geen goed antwoord op geven. De huidige Delphi 2007 en 2009 zijn mooie en goede versies, maar daarna?
Deze week was de Delphi Live! 2009 conferentie, waarin veel nieuwe en interessante sessies waren, en waar open en vrij over gesproken werd. 1 ding is duidelijk als je kijkt naar roadmap: Embarcadero investeert flink in Delphi! Daarnaast is het team uitgebreid, en ondanks de crisis: “the business is healty”. Kortom: de toekomst ziet er zonnig uit :-).
Na de “serieuze” disclaimer werden de sessies gehouden. Hieronder een overzicht van de vele onderdelen:
Tot slot nog een samenvatting en bespreking van dag 2 en dag 3 (!) door Marco Cantu, een overzicht van Pawel Glowacki en de Delphi Live! 2009 Recap and Product Address.
Edit: er zijn nog meer video’s beschikbaar gekomen:
Een aantal zaken mbt Delphi (Win32 + Prism):
Nog wat leuke informatie mbt .Net algemeen:
prince.WaitForObjectVisible (princess);
prince.WalkTo (princess);
prince.Kiss (princess);
RemObjects SDK is een Remoting Framework, waar onder andere eenvoudig WebServices mee gemaakt kunnen worden. Het is van het gelijknamige RemObjects.com . De laatste tijd is het vooral bekend geworden door Delphi Prism , omdat zij de Oxygene compiler geschreven hebben. RemObjects maakt nog meer mooie software: Hydra (.Net assemblies in Win32 gebruiken), Data Abstract , Pascal Script, etc. Niet alleen Delphi maar ook .Net (Visual Studio) wordt ondersteunt.
Ik heb geluk gehad dat ik bij mijn huidige detacheringsopdracht met deze mooie software in aanraking mocht komen :-).
De RO SDK is een beetje te vergelijken met WCF van .Net en DataSnap van Delphi. Maar het vooral veelzijdiger dan deze 2! Het is in principe taal onafhankelijk (C++, C#, php, Delphi maar ook FPC), meerdere platformen (Windows, Linux en MacOs!), ondersteunt verschillende formaten (binair, SOAP, JSON, XML, etc) en allerlei transporten (TCP, UDP, HTTP, mail, IPC, Messages, dll(!) etc). Daarnaast ondersteunt het verschillende vormen van encryptie en compressie. Juist deze brede ondersteuning biedt heel veel mogelijkheden, waarbij WebServices maar een van de vele is.
Ontwikkelen met de RO SDK is eenvoudig, globaal te verdelen in 4 stappen:
Doordat de software mooi integreert met oa Delphi wordt je stap voor stap geholpen door middel van een wizard. Zo kan automatisch een server en client project aangemaakt worden, zodat je snel er mee kunt werken. Ook worden vele demos (inclusief handleiding en uitleg!) meegeleverd, zodat wat geavanceerde technieken eenvoudig geleerd kunnen worden. Ook de gegenereerde code is netjes gedocumenteerd. Alles is gewoon heel netjes afgewerkt!
Demonstratie
Om het een en ander toe te lichten, zal ik de stappen tonen waarmee je een nieuwe RO applicatie maakt.
Als eerste maken een nieuw project via File -> New -> Other:
Vervolgens kiezen we voor een VCL Standalone server (dit is het makkelijkst te testen):
Na het drukken op OK verschijnt een mooie wizard van RO:
Via de "Advanced Project Options" knop kunnen wat meer instellingen aangepast worden:
Na het drukken op OK hebben we een nieuwe Project Group met een server en client project.
Cliënt
De client bestaat uit een channel (in dit geval een TCP client), een message (binair formaat) en een remote service waarmee we de functies aan de server kant mee kunnen aanroepen:
Server
De server bestaat uit een TCP server en message component (binair formaat):
Standaard staat alles al goed ingesteld, tijd om de "service interface" te bekijken.
Service Interface
Om de interface te bekijken of aan te passen, klikken we op "Edit Service Library" in het "RemObjects SDK" menu:
Vervolgens verschijnt de Service Builder, met default de volgende interface:
Zoals je ziet in de bovenstaande screenshot, kun je hier je eigen structures, enumerations en arrays maken. Deze types kunnen als parameter of result van een functie gebruikt worden. Ook kunnen custom exceptions gedefinieerd worden en asynchrone events gemaakt worden. Het mooie van deze types en definities is dat deze ook als fixed types in code gebruikt kunnen worden!
Server Code
Zodra het project gecompileerd wordt (of via het RO menu) wordt vanuit de Service Definitie de code gegenereerd. Voor elke "service" wordt een RO Datamodule aangemaakt:
Verder wordt een "invoker" unit, "interface" unit (met alle types) en een "implementation" unit gemaakt. De eerste 2 units worden elke keer automatisch ververst en hoeven niet aangepast te worden. Alleen de implementatie moet uiteraard zelf gemaakt worden, zoals in dit geval voor de "Sum" en "GetServerTime" functies:
Client Code
Het enige wat we nu nog moeten doen is een paar knoppen toevoegen aan de client, zodat we server functies kunnen aanroepen:
procedure TClientForm.btnServerTimeClick(Sender: TObject);
var dtServer: TDateTime;
begin
dtServer := (RORemoteService as INewService).GetServerTime;
lblServerTime.Caption := DateTimeToStr( dtServer );
end;procedure TClientForm.btnSumClick(Sender: TObject);
var iSum: integer;
begin
iSum := (RORemoteService as INewService).Sum( edtA.Value, edtB.Value );
edtSum.Text := IntToStr( iSum );
end;
Als laatste builden we de beide projecten.
Uitvoeren
Om onze code te testen, starten we als eerste via het RO menu de server:
Het eenvoudige scherm van de server verschijnt, waarna we de client kunnen starten (zie onder voor server en client):
Zoals je ziet werkt de code uitstekend :-). En dat met maar 6 regels code!
Vorige week heeft CodeGear de Delphi Prism Roadmap vrijgegeven. 1 onderdeel wat me opviel was de support voor "Aspect Oriented Programming" (AOP). Ik heb deze term opgezocht bij Wikipedia (AOP [nl] en AOP [en] ) en simpel gezegd komt het erop neer dat het een uitbreiding is van "Object Oriented Programming", waarbij de nadruk ligt in het verdelen van functionaliteit in "aspecten". Leuk, maar hoe werkt dit in de praktijk?
Gelukkig verscheen eind vorige week een interesante blog op de blogsite van RemObjects (makers van de Oxygene compiler in Delphi Prism): Delphi Prism AOP - Cirrus
Cirrus is de code naam voor de AOP implementatie. Het is een onderdeel van de compiler: tijdens het compileren worden de "aspecten" aan de classes toegevoegd. Het is een beetje te vergelijken met "class c.q. extensions methods" en "partial classes". Maar AOP gaat veel verder, doordat je de aspecten kun hergebruiken en toe kunt passen op alle classes!
Erg interesant, maar de bovenstaande blog was vooral een simpel voorbeeld hoe het technisch werkt, wat ook bleek uit de reacties in de trant van: "Leuk, maar wat kun je er nou mee?". Hierop werd de volgende uitleg gegeven:
The reason this is cool is it allows you to separate your concerns. When you are writing code you don't need mix your concerns by including logging code in your main business logic classes, and you don't need to duplicate the calls to logging in each method.
Keep in mind this is the simplest example. You can use AOP to add multi-threading support, security, logging, etc. to a class. You implement the logging, security, threading, etc. code in one class, and the business logic in another class. Then it is injected for you.
It makes code easier to write and maintain. Less duplication of code so less bugs.
Later verscheen de volgende blog met een specifiek partijk voorbeeld hoe je AOP kunt gebruiken: Prism Aspects to Help with Monobjc Development
AOP is niet de oplossing voor alle problemen, maar zeker een nuttige feature om te gebruiken! Sommige C# programmeurs werden al jalours toen ze die blog lazen... ;-)
method MainForm.button1_Click(sender: System.Object; e: System.EventArgs);Prism compileert de code gewoon, alleen als ik tijdens het runnen op de bewuste test knop druk, krijg ik een foutmelding: FileLoadException System.Core.dll.
begin
var i: future Integer;
var j: Integer;
i := async 1; //background asigning 1 to i, next line will wait
j := 2 + i; //j should be 3 now
end;
oxygene.exe -rebuild -frameworkfolder="C:\Program files\Microsoft.NET\SDK\CompactFramework\v3.5\WindowsCE"En nu kan ik hem wel gewoon draaien en debuggen... alleen op de desktop... Helaas gaat het nog steeds fout in de emulator (harde crash zonder foutmelding).
FuncDeze geeft de foutmelding:func = PrivateImplementationDetails.FutureHelper.ExecuteAsync (delegate {
return 1;
}, true);
NotSupportedException: .Net Compact Framework does not support invoking delegates asynchronouslyDus het Compact Framework ondersteunt deze functionaliteit gewoon niet! Dus einde oefening...
Codegear heeft een aantal Whitepapers op hun website staan. Deze zijn erg interessant om door te lezen! Hierin staat veel nuttige informatie over de veranderingen die in Delphi 2009 zitten. Om eerlijk te zijn: er zijn veel meer veranderingen en verbeteringen dan ik eerst dacht! Ik kan niet alles opnoemen, maar ik heb wel even een overzicht gemaakt:
De nieuwste Whitepaper van Marco Cantu gaat over User Interface wijzigingen (VCL):
http://dn.codegear.com/article/images/39226/Building-User-Interfaces-with-Delphi-2009_WP.pdf
Om even een idee te geven zal ik de deze wijzigingen kort bespreken:
In plaats van saaie simpele hints, kun je nu gelikte hints geven, met een image en title:
Deze heeft nu standaard image support (net als TBitButton), CommandLink type, Dropdown button, Elevation required (Vista UAC) property:
Er is oa een Alignment property toegevoegd (text left/right), "numbers only" format, empty text hint, XP password char:
Dit is een nieuwe edit control, met rechts een button en een image, en de mogelijkheid voor een drop down menu:
De listview ondersteunt nu ook geavanceerde groupings!
Nog een nieuwe control, waarbij de panels kunnen in en uitklappen:
Nu ingebouwde PNG ondersteuning, 32bit bitmaps (met transparantie kanaal), en "PartialTransparency" support.
Een door Codegear ontwikkelde Ribbon control (die veel lijkt qua werking en uiterlijk op de Office 2007 Ribbon):
Conclusie: redenen genoeg om Delphi 2009 te gaan gebruiken!