Neu vorgestellt, Programmierung

Version 5.8 / Teil 2: Implizite Typkonvertierung

Integrierte Typkonvertierung

Wie bereits im ersten Teil des Blog-Artikels zum Release der Version 5.8 angedeutet, wurden für die Verarbeitung von 64-Bit Datensatz-IDs auch Änderungen am CONZEPT 16-Befehlssatz durchgeführt. Warum dies notwendig ist, beschreibt der vorliegende zweite Teil.

Einleitung

Das folgende Beispiel 1 demonstriert die Problematik.

main

  local
  {
    tPrime : int;
  }

{
  tPrime # RecInfo(MyTable,_RecGetPrime);

  // Verarbeitung von tPrime
  // ...
}

Handelt es sich bei MyTable um eine Tabelle mit 64-Bit-Datensatz-IDs, muss der Befehl RecInfo() prinzipiell auch in der Lage sein, 64-Bit-Werte zurückzuliefern. Deshalb wurde der Befehl angepasst und besitzt nun einen 64-Bit-Rückgabewert (Beispiel 2).

main

  local
  {
    tPrime : bigint;
  }

{
  tPrime # RecInfo(MyTable,_RecGetPrime);

  // Verarbeitung von tPrime als 64-Bit Wert.
  // ...
}

Durch die Umstellung der lokalen Variable tPrime von int auf bigint kann nun auch der 64-Bit Prime-Counter ausgelesen werden. Allerdings müssten beim Umstieg auf die Version 5.8 alle Prozeduren angepasst und neu übersetzt werden, die RecInfo() aufrufen. Damit dies nicht notwendig ist und der vorhandene Prozedur-Code kompatibel bleibt, wird mit der Version 5.8 die implizite Typkonvertierung eingeführt. Diese erlaubt die Zuweisung eines bigint-Wertes an einen int-Wert (und auch umgekehrt) ohne den Aufruf einer Konvertierungsfunktion (Beispiel 3).

main

  local
  {
    tVal32 : int;
    tVal64 : bigint;
  }

{
  tVal64 # 4711;
  tVal32 # tVal64;
}

Vor der Version 5.8 wäre der Aufruf der Konvertierungsfunktion CnvIB() notwendig, um die Prozedur fehlerfrei zu übersetzen. Mit der impliziten Typkonvertierung ist dies nicht mehr notwendig, da die Variable tVal64 bei der Zuweisung implizit nach int konvertiert wird. Überschreitet tVal64 den Wertebereich von tVal32, wird der Laufzeitfehler “Wert zu groß” generiert. Da die Typkonvertierung Konstanten mit einschließt, funktioniert auch die Zuweisung des Wertes 4711 an tVal64 ohne die Angabe von \b. Gleiches gilt auch für die Datentypen byte und word. Diese werden ebenfalls implizit nach und von bigint gewandelt. Die Wandlung von byte und word nach int und zurück war bereits vor der Version 5.8 ohne Konvertierungsfunktion möglich.

Durch die implizite Typkonvertierung kann somit der Code aus Beispiel 1 unverändert und ohne Neuübersetzung in Version 5.8 ausgeführt werden. Erst bei Aktivierung der 64-Bit Datensatz-IDs der betreffenden Tabelle muss der Prozedurtext angepasst werden, um Laufzeitfehler bei der Zuweisung von RecInfo() zu vermeiden.

Eine detaillierte Beschreibung der impliziten Typkonvertierung enthält die Online-Hilfe.

Befehle, Ereignisse und Eigenschaften

Nicht nur der Befehl RecInfo() ist von 64-Bit-IDs betroffen. Auch weitere Befehle sowie Ereignisse und Eigenschaften wurden angepasst.

Befehle für die Datensatzverarbeitung

  • RecInfo : Der Rückgabewert und das 3. Argument wurden auf bigint geändert
  • RecRead : Der Typ des 4. Argumentes, das u.a. zur Angabe der Datensatz-ID dient, wurde auf bigint geändert.

Befehle der Mehrfachselektion für RecList und DataList

Die Mehrfachselektion für das RecList-Objekt baut auf eine Cte-Liste auf. Die Datensatz-ID wird hier in der Eigenschaft spID abgelegt.

  • spID : Der Typ der Eigenschaft wurde auf bigint geändert.
  • CteInsertItem : Das 2. Argument zur Angabe der ID-Eigenschaft wurde auf bigint geändert.
  • CteInsertNode : Das 2. Argument zur Angabe der ID-Eigenschaft wurde auf bigint geändert.
  • WinMsdInsert : Das 2. Argument zur Angabe des neu aufzunehmenden Elementes wurde auf bigint geändert.
  • WinMsdDelete : Das 2. Argument zur Angabe des zu entfernenden Elementes wurde auf bigint geändert.
  • WinMsdRead : Das 2. Argument zur Angabe des zu lesenden Elementes wurde auf bigint geändert.

Ereignisse

Einige Ereignisse von Oberflächenobjekten erhalten beim Aufruf im Argument aID bzw. aRecID eine Datensatz-ID. Dort ist es nun möglich das Argument als bigint zu definieren. Der folgende Code-Ausschnitt zeigt dies exemplarisch am Ereignis EvtLstSelect.

sub EvtLstSelect
(
  aEvt                 : event;    // Ereignis
  aID                  : bigint;   // Record-ID des Datensatzes oder Zeilennummer
)
: logic;                           // Wird nicht ausgewertet
{
  // aID kann als int oder bigint deklariert werden.
  return(true);
}

Werden die Argumente der betreffenden Ereignisse als int deklariert, wird ein Laufzeitfehler ausgelöst, wenn die übergebene Datensatz-ID außerhalb des Wertebereiches von int liegt. Dies ist nur dann der Fall, wenn die 64-Bit-Datensatz-IDs in der Tabelle aktiviert sind und auch tatsächlich Datensätze mit einer Datensatz-ID >= 0x80000000\b existieren. Die folgenden Ereignisse wurden angepasst:

  • EvtHelpTip
  • EvtKeyItem
  • EvtLstDataInit
  • EvtLstEditFinished
  • EvtLstRecControl
  • EvtLstSelect
  • EvtLstSelectRange
  • EvtMenuContext
  • EvtMouseItem
API-Client und DLL-Schnittstelle

Die Schnittstelle des API-Client und die DLL-Schnittstelle (DllCall()) wurden um die Funktionen C16_RecInfo64() sowie C16_RecRead64() erweitert.

Keine Kommentare

Kommentar abgeben