Delphi "as" Operator -> BCB



  • Hi,

    ich habe ein Problem mit dem Delphi Operator "as" - wie implementiere ich die
    Funtkionalität in BCB?
    Konkret geht es um die Scheduler Komponenten von Jcl/Jvcl.
    Ich möchte dynamisch Ereignisse hinzufügen und deren Eigenschaften ändern.
    Erstelle ich ein neues Ereignis bekomme ich das Interface IJclSchedule aus der
    Eigenschaft Schedule des erzeugten Ereignisses. Wie komme ich aber an das
    Interface IJclDailySchedule, das gleichfalls in der Eigenschaft Schedule steckt?
    In Delphi hab ich das probiert und es funktioniert so:

    var Event : TJvEventCollectionItem;
        JclSchedule : IJclSchedule;
        JclDailySchedule : IJclDailySchedule;
    begin
      Event:=JvScheduledEvents.Events.Add;
      Event.Name:='Event1';
      JclSchedule:=Event.Schedule;
      JclSchedule.RecurringType:=srkDaily;
      JclDailySchedule:=JclSchedule as IJclDailySchedule;
    end;
    

    Daraus habe ich im BCB gemacht:

    TJvEventCollectionItem *Event;
     IJclSchedule *JclSchedule;
     IJclDailySchedule *JclDailySchedule;
    
     Event=JvScheduledEvents->Events->Add();
     Event->Name="Event1";
     JclSchedule=Event->Schedule;
     JclSchedule->RecurringType=srkDaily;
     JclDailySchedule=(IJclDailySchedule*)JclSchedule;
    

    was allerdings beim Zugriff auf Eigenschaften von JclDailySchedule kläglich
    daneben geht (Zugriffsverletzungen). Das ist auch nicht wirklich verwunderlich,
    da sich die Interfacezeiger in der Delphivariante voneinander unterscheiden,
    während sie in BCB natürlich identisch sind (was den referenzierten Speicher
    angeht).
    Normalerweise nehme ich ja sonst bei der Programmierung unter Benutzung von
    Interfaces die Funktion QueryInterface - aber die verlangt eine GUID, die ich
    nicht habe.
    Hat jemand einen Tipp für mich?
    Vielen Dank -
    Ulf



  • Wenn ich den Delphi-Code richtig interpretiere (nein ich kann kein Object-Pascal), dann schau Dir mal die verschiedenen cast Operatoren an.
    dynamic_cast,
    static_cast,
    const_cast und
    reinterpret_cast



  • Danke für den Tipp!

    Leider habe ich es damit nicht hin bekommen -
    dynamic_cast<IJclDailySchedule*>(JclSchedule)
    führt noch in dieser Quelltextzeile zu einer Zugriffsverletzung,
    reinterpret_cast ist effektiv die C++ Version meiner alten C Typumwandlung
    und const_cast/static_cast kompilieren gar nicht erst (sind nach meiner Auffassung
    auch nur Typumwandlungen zur Kompilierungszeit).

    Ulf



  • Danke für den Tipp!

    Leider habe ich es damit nicht hin bekommen -
    dynamic_cast<IJclDailySchedule*>(JclSchedule)
    führt noch in dieser Quelltextzeile zu einer Zugriffsverletzung,
    reinterpret_cast ist effektiv die C++ Version meiner alten C Typumwandlung
    und const_cast/static_cast kompilieren gar nicht erst (sind nach meiner Auffassung
    auch nur Typumwandlungen zur Kompilierungszeit).

    Ulf



  • Sorry für die beiden gleichlautenden Einträge - gab wohl Probleme bei der Übertragung.

    Ich habe die Umwandlung nun endlich hinbekommen. Die Lösung lautet:
    hr=JclSchedule->QueryInterface<IJclDailySchedule>(&JclDailySchedule);
    (hr ist vom Typ HResult und kann verwendet werden, um den Erfolg der Umwandlung
    zu überprüfen (sollte S_OK sein))

    Das hatte ich zwar prinzipiell schon vorher mal probiert, aber irgendwie nicht
    durch den Compiler bekommen.

    Viele Grüße
    Ulf


Anmelden zum Antworten