Announcement

Collapse
No announcement yet.

Pascal-Programm nach C++ übersetzen

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

  • Pascal-Programm nach C++ übersetzen

    Moin, moin!

    Ich möchte einmählich in OOP in Pascal und C++ reinschnuppern. Deswegen versuche ich das Programm „ColorButton“ (http://delphi.about.com/library/code/ncaa061104a.htm ) von Delphi nach C++ zu übersetzen. Von dem Pascal-Code habe ich ziemlich viel verstanden und nach C++ übersetzen können. Allerdings habe ich ein paar Schwierigkeiten die ich alleine nicht überwältigen kann.

    Zum Beispiel der folgende Pascal-Code:
    Code:
    procedure TColorButton.CMEnabledChanged(var Message: TMessage);
    begin 
      inherited; 
      Invalidate;
    end;
    habe ich nach C++ so übersetzt:
    Code:
    void __fastcall TMyColorButton::CMEnabledChanged(TMessage &Message)
    {
    	TButton::CMEnabledChanged(Message);
    	Invalidate();
    }
    Leider akzeptiert der Compiler meine Übersetzung nicht und haut mir mit folgender Meldung auf die Finger:
    [BCC32 Error] MyColorButton.cpp(100): E2247 `__fastcall TWinControl::CMEnabledChanged(TMessage &)’ is not accessible.`
    Die Meldung verstehe ich so (um das ein bisschen naiv auszudrucken), dass die Funktion CMEnabledChanged in der Basisklasse (TButton) nicht ansprechbar ist (warum auch immer).

    Meine Frage ist: Was für eine Funtion ist das? VCL? RTL? Win-API? habe ich das „inherited“ richtig übersetzt? Wenn ja, warum meckert der C++-Compiler und der Pascal-Compiler nicht? Ist die Methode in Pascal anders als in C++ definiert/deklariert?

    Viele Grüße
    Markus

  • #2
    Die Meldung verstehe ich so (um das ein bisschen naiv auszudrucken), dass die Funktion CMEnabledChanged in der Basisklasse (TButton) nicht ansprechbar ist (warum auch immer).
    Vermutlich weil sie als private deklariert ist. Bin kein Delphispezialist, aber mir ist unklar was inherited dort soll? M.E. hat das Ding nur etwas in einem Konstruktor zu suchen zum Aufruf der geerbten Elemente. Im C++ würde ich erstmal darauf verzichten
    Christian

    Comment


    • #3
      Moin. moin!

      Ja, Christian, das stimmt. Die Funktion „CMEnabledChanged“ ist in mehreren „Include-Dateien“ als privat deklariert. Ich habe zwei davon unter die Lupe genommen. In Pascal-Umgebung habe ich die Unit „Buttons.pas“ (source\win32\vlc) und in CPP-Umgebung die „Buttons.hpp“ (include\vcl) angeschaut. In beiden ist die Funktion als privat deklariert:

      CPP:
      Code:
      HIDESBASE MESSAGE void __fastcall CMEnabledChanged(Messages::TMessage &Message);
      Pascal:
      Code:
      procedure CMEnabledChanged(var Message: TMessage); message CM_ENABLEDCHANGED;
      Nun, wenn (wie es wahrscheinlich allgemein gilt) die privaten Methoden nur für eigene Klassen vorbehalten sind, warum lässt sich der Pascal-Code einer abgeleiteten Klasse dann um Himmelswillen fehlerfrei kompilieren und CPP-Code nicht? Anscheinend, wird die private Methode einer Klasse in Pascal anders betrachtet als in CPP?! Das wundert mich sehr! Oder ist das nicht so? Vielleicht findet sich ein Pascal-Kenner unter den CPP-Profis und gibt mir die Antwort.

      Also, wer kennt die Antwort?

      Crosspost:
      DelphiPraxis
      DSDT


      Viele Grüße
      Markus
      Zuletzt editiert von MarkusB; 05.01.2008, 14:53.

      Comment


      • #4
        Hallo,

        hier http://delphi.about.com/library/code/ncaa061104a.htm

        ist die Methode als protected definiert.

        Ausserdem hat der originale TButton gar keine Methode CMEnabledChanged
        (zumindestens in D6).
        Das inherited macht in diesem Fall also gar nichts.


        Heiko

        Comment


        • #5
          Moin, moin!


          Methode CMEnabledChanged(TMessage &Message) reagiert auf die Änderung der Enabled-Eigenschaftwert. Warum ich die Methode in der Basisklasse nicht direkt aufrufen kann, ist klar, sie ist nämlich als privat deklariert. Ich muss sie aber aufrufen um die Darstellung meines neuen Buttons zu ändern.

          A. Lösung in CPP:
          Meine Lösung sieht folgendermaßen aus:

          Code:
          void __fastcall TMyColorButton::CMEnabledChanged(TMessage &Message)
          {
                      TButton::Dispatch(&Message);
                      Invalidate();
          }
          Also anstatt die Methode in der Basisklasse direkt aufzurufen, lasse ich die Message von der Basisklasse abarbeiten, indem ich sie an die Basisklasse weiterleite. Das funktioniert gut, aber …

          Und nun kommt das Beste! Wenn das tatsächlich so ist, das die von mir definierte Messageabarbeitungmethode CMEnabledChanged lediglich die Nachricht an die Basisklasse weiterleitet und nichts weiter tut, dann muss ich sie überhaupt nicht definieren und aufrufen! Wozu den ganzen Quark wenn die gleiche Methode mir durch die Vererbung zu Verfugung gestellt worden ist? Also weg mit dem Umweg! Ich habe alles was mit der CMEnabledChanged-Methode irgendwas zutun hatte aus meiner Klasse weggelöscht und siehe da! Funktioniert genau so gut oder vielleicht noch besser!

          B. Die Frage an Pascal-Kenner unter den CPP-Profis:
          Wird die private Methode einer Klasse in Pascal anders betrachtet als in CPP? Oder funktioniert „inherited“ im Zusammenhang mit der Abarbeitung der Systemnachrichten vielleicht anders und erlaubt den direkten Zugriff auf private Methoden der Basisklasse?

          Viele Grüße
          Markus

          Comment


          • #6
            Also weg mit dem Umweg! Ich habe alles was mit der CMEnabledChanged-Methode irgendwas zutun hatte aus meiner Klasse weggelöscht und siehe da! Funktioniert genau so gut oder vielleicht noch besser!
            M.E. hat das Ding nur etwas in einem Konstruktor zu suchen zum Aufruf der geerbten Elemente. Im C++ würde ich erstmal darauf verzichten
            Würde das mal im Delphi-Teil fragen......
            Christian

            Comment

            Working...
            X