Bob Swart (aka Dr.Bob)
Borland Delphi 4 van Inprise

Borland Delphi 4 van Inprise
Op 15 juni 1998 werd hij dan officiëel aangekondigd: Borland Delphi 4 van Inprise. In de loop van Juli zullen de eerste echte dozen voor distrubutie beschikbaar komen, en tot die tijd kan ik mijn Gamma pers-versie ("Release Candidate 1") van Delphi 4 gebruiken om vast een aantal tipjes van de sluier op te lichten. In dit artikel zal de nadruk met name liggen op de nieuwe ObjectPascal taal-constructies die we in Delphi 4 zullen tegenkomen. Sommige waren al in C++Builder versie 3 geïntroduceerd, dus een oplettende bouwer had al een beetje kunnen weten wat er te wachten stond. Jeroen Pluimers zal de aandacht meer richten op de IDE en de Debugger, en in mijn Delphi 4 C/S Web Modules artikel richten we de aandacht op internet ontwikkelingen. Overigens is meer Delphi 4 nieuws altijd te vinden op mijn nieuwe website "Dr.Bob's Delphi 4 Clinic" te www.drbob42.com/delphi4

Real LongWord
Met Delphi 4 zijn er wat aanpassingen gemaakt in de standard types zoals Real en Cardinal. Een Real was vroeger 6 bytes, maar is nu 8 bytes net als een Double. Wie nog de oude "real" wil gebruiken zal de compiler optie {$REALCOMPATIBILITY} moeten gebruiken. Waarom deze wijziging? Omdat de oude real in feite een overbrlijfsel was uit de Borland Pascal tijd, en nooit echt door Delphi ondersteund werd. Denk maar eens aan properties van type real, die niet gepublished konden worden... Een andere mooie uitbreiding is de LongWord, die nu echt unsigned 32-bits is, dus van 0 tot 4G-1. Dit is ook het nieuwe bereik van de Cardinal (die vroeger slechts 21-bits unsigned was, dus van 0 tot 2G-1).

Default Parameters
Na wat bit-neuken, komen we nu tot een handige uitbreiding van ObjectPascal, namelijk Default Parameters. Dit zijn parameters die al van een default waarde zijn voorzien, zodat zij - indien deze default waarde gewenst is - weggelaten kunnen worden bij aanroep. Bekijk bijvoorbeeld de volgende definitie en aanroep eens:

  procedure DatumTijd(Maand: Integer; Dag: Integer;
                      Uur: Integer = 12; Min: Integer = 0; Sec: Integer = 0);
  begin
    ...
  end;

  begin
    DatumTijd(11,7,20)
  end.
De aanroep zal leiden tot de waarde Maand van 11, Dag is 7, Uur wordt 20, en voor Min en Sec worden de default waardes nul genomen. Vanwege mogelijke ambiguiteitsproblemen, mogen default parameters slechts van rechts naar links worden weggelaten (dus als het aantal meegegeven parameters eentje minder is dan het aantal gedeclareerde parameters, dan is per definitie de meest rechtse parameter weggelaten, en voor deze parameter wordt dan de default waarde doorgegeven). Omdat parameters in deze volgorde kunnen worden weggelaten (waarbij de default waarde wordt ingevuld), is het dus nutteloos (en verboden) om links van een "normale" parameter nog default parameters toe te voegen. Dus het volgende is niet toegestaan:
  procedure DatumTijd(Eeuw: Integer = 1900; Jaar: Integer;
                      Maand: Integer; Dag: Integer;
                      Uur: Integer = 12; Min: Integer = 0; Sec: Integer = 0);
Ook al zou de Eeuw parameter een default waarde van 1900 moeten hebben, toch is dit niet zinvol (en niet toegestaan), omdat Eeuw nooit als default waarde gebruikt zou kunnen worden (Jaar, Maand en Dag zijn immers geen default argumenten). Er is overigens zinvollere ondersteuning voor het jaar 2000 in Delphi 4; let maar op...

Dynamische Arrays
Een andere sterke uitbreiding van Delphi 4 is de mogelijkheid tot het declareren en gebruiken van Dynamische Arrays. Dit zijn arrays waarvan de lengte bij het declareren niet vast staat (en ook niet wordt meegegeven), maar waarvan de lengte tijdens het draaien van het programma kan worden bepaald en zelfs worden aangepast. Om een dynamisch array van strings te declareren, bijvoorbeeld, kunnen we het volgende schrijven:

  var
    X: Array of String;
Om tijdens het draaien van het programma aan te geven dat we 42 Strings willen gebruiken, moeten we de SetLength procedure aanroepen. We hebben vervolgens de beschikking over 42 Strings, met de index nummers 0 tot 41. Voor een bestaand dynamisch array is altijd de lengte (in dit geval 42) op te vragen, en de minimale en maximale index, resp. met Low (altijd 0) en High (in dit geval 41).

Method Overloading
Naast Default Parameters is ook Method Overloading afkomstig uit de C++ wereld. Het betreft hier de mogelijkheid om voor een routine met dezelfde naam verschillende (typen) parameters te kunnen definieren. Dus niet alleen maar een Max met een open array van Integers, maar ook een Max met een open array van Reals. Bij het combineren van Method Overloading en Default Parameters is het belangrijk om op te passen dat de methoden niet tot elkaar te herleiden zijn (often wel dat bij het weglaten van de default parameters wel methods overblijven met verschillende types, zodat de compiler bij elke aanroep uniek kan bepalen welke method moet worden aangeroepen). Method overloading kan met name nuttig zijn bij het definiëren van constructors (die nu altijd Create kunnen heten, zelfs als ze verschillende argumenten hebben).

Het jaar 2000
Als laatste wil ik de aandacht even vestigen op het naderende jaar 2000. Voor wie het nog niet weet: in dat jaar weten we mogelijkerwijs niet langer of 7-11-39 nu de geboortedatum van mijn vader is, of mijn pensioendatum. Delphi 4 probeert hier wat ondersteuning te bieden, alhoewel je wel twee keer moet nadenken voordat helemaal duidelijk is hoe de ondersteuning precies werkt (nietwaar Jeroen?). In de unit SysUtils is nu een speciale globale variabele TwoDigitYearCenturyWindow gedefinieerd, die we kunnen gebruiken om aan te geven hoe een 2-cijferig jaar geïnterpreteerd moet worden. Als we TwoDigitYearCenturyWindow bijvoorbeeld een waarde van 10 geven, dan heeft dat een "pivot" jaar tot gevolg met als waarde 1998 (het huidige jaar) minus 10 - oftewel 1988. Alle 2-cijferige jaren voor 88 worden dan geïnterpreteerd alsof ze in de vorige eeuw plaatsvinden, terwijl alles tussen de 88 en 99 in de huidige eeuw is. Nu is 88 niet zo zinvol, maar 40 zou dat wel zijn, zeker in het voorbeeld waarbij ik wil kijken hoeveel dagen het nog kost voor we de datum 11/7/29 bereiken (waarbij 29 dus in de volgende eeuw is):

  program Delphi4;
  uses
    SysUtils, Dialogs;
  const
    Pensioen = '11/7/29';
  var
    DaysToGo: Double;
  begin
    ShortDateFormat := 'M/D/YYYY';
    TwoDigitYearCenturyWindow := 58; { alles voor "40" is dus 20xx }
    DaysToGo := StrToDate(Pensioen) - Date;
    ShowMessage(Format('%d dagen te gaan tot %s',
               [Round(DaysToGo),
                DateToStr(StrToDate(Retirement))]))
  end.
Dit programma laat zien dat ik nog zo'n 11-en-een-half duizend dagen te gaan heb voor m'n pensioen. Dat zijn nog heel wat artikeltjes denk ik zo, dus laat ik het er - wat Delphi 4 betreft - voorlopig hier maar even bij. De volgende keren volgt vast en zeker nog veel meer...


This webpage © 1998-2006 by webmaster drs. Robert E. Swart (aka - www.drbob42.com). All Rights Reserved.