Announcement

Collapse
No announcement yet.

Type Casting ???

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Type Casting ???

    Hallo

    Ich habe in in Delphi 6 einige für mich recht hilfreiche Klassen gebaut und haben nun das Problem beim einbinden dieser Klassen in Delphi 8 das Problem der Typ-Konvertierung.

    Folgnedes ging nicht:

    <pre>
    type
    TLongRec = record
    Hi : Word;
    Lo : word;
    end;
    var
    i : Integer;
    w : word;
    d : TDate;
    dt : TDateTime;
    p : Pointer;
    begin

    // folgendes geht nicht mehr - Initialisierung sehe ich jetzt mal als nicht so wichtig //

    // 1. Problem //
    w := TLognRec(i).Hi;

    // 2. Problem //
    d := dt;

    // 3. Problem //
    p := pointer(i);

    end;
    </pre>

    Ich habe nun auch schon mitbekommen, dass jetzt endlich auch die nativen Typen (wie Integer, word usw.) jetzt Klassen sind (so wie in Java).
    Aber wie werde ich diese Probleme hier am einfachsten lösen ?

  • #2
    Hallo,

    &gt;Aber wie werde ich diese Probleme hier am einfachsten lösen ?

    Der einfache Weg besteht darin, auf derartige Konstrukte freiwillig zu verzichten ;-)

    Wenn das Bisherige auch weiterhin genutzt werden soll, muss man selbst das machen, was Borland am Beispiel <b>TMessageCracker</b> vorexerziert. Diese Hilfsklasse implementiert das <b>IConvertible</b>-Interface, um über die Methode <b>ToType</b> eine typsichere Objekttyp-Transformation anzubieten. Die bereits vordefinierte Methode <b>System.Convert.ChangeType</b> hilft im Fall der eigenen Struktur nicht weiter.

    Aber <b>TDateTime</b> (wie auch der alten Currency-Typ) kann nicht mehr in jedem Fall als Zahl interpretiert werden. Denn auch TDateTime hat sich stark geändert, so dass der Zugriff nur über die Methoden oder die <b>Convert</b>-Klasse erfolgreich ist.
    <pre>
    <b>type</b>
    TDateTime = <b>packed</b> <b>record</b>(IFormattable, IComparable, IConvertible)
    strict <b>private</b>
    <b>var</b>
    FValue: System.DateTime;
    <b>class</b> <b>var</b>
    FMinValue, FMaxValue: System.DateTime;
    <b>public</b>
    ...
    </pre>
    Und um auf einen Zeiger zuzugreifen, muss die Unit über {$UNSAFECODE ON} als "verseucht" gekennzeichnet werden. Aber auch dann wird das Ganze so umständlich, dass die Mühe das Ergebnis nicht lohnt.

    &#10

    Comment

    Working...
    X