Portierung von Delphi -> C++ (Problem mit TObject und ClassName)



  • Hi

    ich portiere ein Programm von Delphi nach c++ mit wx, da hab ich jetzt die se Procedure

    procedure StatChange(Sender: TObject);
    begin
    	if Sender.ClassName = TBSModul.ClassName
    ...
    
    if Application.Terminated
            then break;
    
            Application.ProcessMessages;
    

    1. wie bekomme ich ein allgemeines Objekt also ein Tobjekt in wx hin?
    2. Wie setzt ich das mit den ClassName um, hab da noch keine konkretten Vorstellungen außer vielleicht mit wxClassInfo
    3. und zu Guter letzt wie prüf ich ob das Progamm Terminiert ist und was ist PrcessMessages(aktuallisiert das das display, bzw refresht es das)?



    1. TObject wäre in wx wohl wxObject

    2. wxObject hat auch die Funktion: wxClassInfo* GetClassInfo(), mit der man auf Klasseninformationen zugreifen kann
      oder nach der Art (obj = wxObject):
      bool tmp = obj->IsKindOf( CLASSINFO(wxFrame) );

    3. Application.ProcessMessages verarbeitet wohl noch in der Nachrichtenschleife anstehende Nachrichten
      bei wxApp müsstes du mal schauen (wxApp::IsMainLoopRunning, wxApp::IsActive)


  • Mod

    Ich glaube das ist keine gute Idee, wenn du das 1:1 "portierst".
    Bitte lies dir doch mal die Tutorials zu wxWidgets im Magazin durch, und ein Blick in die Doku könnte dir auch weiterhelfen:
    http://docs.wxwidgets.org/stable/wx_classesbycat.html#classesbycat



  • Danke erstmal, mal wieder 😃

    ja in der wxapp steht das richtige drin

    also bis jetzt funktioniert meine fast 1:1 Portierung
    ich übernehm ja nicht alles 😉



  • hab gerade noch geschaut
    aber es gibt weiterhin probleme mit der

    if Sender.ClassName = TBSModul.ClassName
    

    portierung

    hat noch jemand ne idee?



  • Schau mal in wx-Doku nach "Runtime class information " bzw RTTI.

    Du musst in der Klasse TBSModul in .h "DECLARE_DYNAMIC_CLASS (myclass)" und in .cpp "IMPLEMENT_DYNAMIC_CLASS(myclass, wxObject)" schreiben.

    dann in deiner StatChange:

    if  ( Sender->IsKindOf( CLASSINFO(TBSModul) ) )
    

    TBSModul ist der Klassenname ( Sender ist ein Objekt von TBSModul ).

    Update: es gibt auch DECLARE_ABSTRACT_CLASS usw., deine Klasse TBSModul muss mindestens von wxObject abgeleitet sein.



  • Danke,

    Wer lesen kann ist klar im Vorteil!!!

    This class stores meta-information about classes. Instances of this class are not generally defined directly by an application, but indirectly through use of macros such as DECLARE_DYNAMIC_CLASS and IMPLEMENT_DYNAMIC_CLASS.

    gut hatte ich vergessen, danke für den hinweis


  • Mod

    Alternativ kannst du auch dynamic_cast nutzen.
    Damit kannst du dann auf einen entsprechenden Klassenpointer casten, wenn die Klasse den Typ hat, ist der pointer ok, sonst 0.


Anmelden zum Antworten