Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Übersetzen von pas nach hpp, dabei cpp Kommentare übergeben (https://www.delphipraxis.net/108044-uebersetzen-von-pas-nach-hpp-dabei-cpp-kommentare-uebergeben.html)

mensch72 6. Feb 2008 21:20


Übersetzen von pas nach hpp, dabei cpp Kommentare übergeben
 
wenn man pas-Dateien vom C-Compilter übersetzen und nutzen möchte, und man Quelltext in c in die Pascal Datei einbinden möchte, an entsprechender Stelle, wie muss man das da deklarieren?

Delphi-Quellcode:
type
MyDateTime = packed record
private
 FDateTime : Double;

public
  function ToDateTime : TDateTime;
  procedure FromDateTime(Value : TDateTime);

{$IFDEF TEST}
    
   MyDateTime& __fastcall operator =(const TDateTime Value) {this->FromDateTime(Value); return(*this);};
   __fastcall operator TDateTime()   {return (this->ToDateTime());   }

{$ENDIF}

end;

Erzeute Hpp Datei sollte dann so aussehen:

Delphi-Quellcode:
struct MyDateTime
#pragma pack(push,1)
struct MyDateTime
{
private:
   double FDateTime;

public:
   System::TDateTime __fastcall ToDateTime(void);
   void __fastcall FromDateTime(System::TDateTime Value);

            MyDateTime& __fastcall operator =(const TDateTime Value) {this->FromDateTime(Value); return(*this);};
            __fastcall operator TDateTime()   {return (this->ToDateTime());   }

} ;

#pragma pack(pop)

Oder aber in einem anderen Anwendungsfall, wenn ich einfach Kommentare auch mit übernehmen möchte?
Welche Compileranweisung nimmt man da. HPPEMIT funktioniert nur für den Dateianfang ...

vielen Dank!

Muetze1 7. Feb 2008 00:17

Re: Übersetzen von pas nach hpp, dabei cpp Kommentare überge
 
1. Von Pascal zu einem C Header geht nicht. Es können nur C++ Header erzeugt werden.
2. C Quellen können nicht von Pascal verwendet werden. Ausnahme: Du compilierst deine .C Dateien zu Objekts und definierst die Procedure als external unter Pascal und bindest die .OBJ mit der "Link" Compileranweisung {$L xxx.obj} mit ein.
3. Die $HPPEMIT Anweisungen werden genau dort eingefügt wo sie in der Quell-PAS stehen. Da gibt es keine Beschränkung von wegen Dateianfang o.ä.
4. Wo liegt das eigentliche Problem? Anscheinend hast du die Pascal Quelle ja schonmal in ein C++ BCB Projekt reingezogen und dir das HPP erstellen lassen.

mensch72 7. Feb 2008 22:19

Re: Übersetzen von pas nach hpp, dabei cpp Kommentare überge
 
Zitat:

Zitat von Muetze1
1. Von Pascal zu einem C Header geht nicht. Es können nur C++ Header erzeugt werden.
2. C Quellen können nicht von Pascal verwendet werden. Ausnahme: Du compilierst deine .C Dateien zu Objekts und definierst die Procedure als external unter Pascal und bindest die .OBJ mit der "Link" Compileranweisung {$L xxx.obj} mit ein.
3. Die $HPPEMIT Anweisungen werden genau dort eingefügt wo sie in der Quell-PAS stehen. Da gibt es keine Beschränkung von wegen Dateianfang o.ä.
4. Wo liegt das eigentliche Problem? Anscheinend hast du die Pascal Quelle ja schonmal in ein C++ BCB Projekt reingezogen und dir das HPP erstellen lassen.

zu 1: nicht gewollt
zu 2: nicht gewollt

zu 3:
{$HPPEMIT 'abc'} erscheint immer am Anfang des erzeugten hpp Files, und nicht in der Klasse. (leider)
Deswegen die Frage, ob es noch einen anderen Compilerschalter dafür gibt.

zu 4: Überladene Operatoren von Records in Delphi2006/2007 werden nicht ins HPP übernommen und müssten nachträglich seperat in cpp Syntax im hpp von Hand ergänzt werden.
(schlecht wäre eine Neucompilierung des pas Files, da alle Handänderungen im hpp wieder verschwinden)

Muetze1 7. Feb 2008 23:13

Re: Übersetzen von pas nach hpp, dabei cpp Kommentare überge
 
Zitat:

Zitat von mensch72
zu 3:
{$HPPEMIT 'abc'} erscheint immer am Anfang des erzeugten hpp Files, und nicht in der Klasse. (leider)
Deswegen die Frage, ob es noch einen anderen Compilerschalter dafür gibt.

Nein, es gibt keine weitere Möglichkeit. Und er fügt die nicht am Anfang der Datei ein, aber vor dem aktuellen Deklarationsblock der behandelt wird. Sprich: HPPEMIT innerhalb von Records, Klassen, etc werden vor dieser in die hpp geschrieben. Aber ausserhalb dessen erscheinen die HPPEMIT an der Stelle wie in der PAS (das war das, was ich vorhin meinte...). Du kannst niemals innerhalb einer Struktur oder Klasse etwas per HPPEMIT einfügen etc. Allerhöchstens per EXTERNALSYM Methoden und Elmente des Records vor der Übertragung ins HPP ausschließen. Einzige Möglichkeit besteht darin, die Klasse komplett per HPPEMIT zu definieren und die Originalübertragung per EXTERNALSYM verhindern.

Zitat:

Zitat von mensch72
zu 4: Überladene Operatoren von Records in Delphi2006/2007 werden nicht ins HPP übernommen und müssten nachträglich seperat in cpp Syntax im hpp von Hand ergänzt werden.
(schlecht wäre eine Neucompilierung des pas Files, da alle Handänderungen im hpp wieder verschwinden)

Da Records mit Methoden wie auch Properties sind grundsätzlich nicht zur Nutzung zu empfehlen, da Borland bei diesem neuen Feature gerade im Zusammenspiel C++ und Pascal nichts wirklich getestet hat. Siehe die folgenden QC Einträge von mir (nach denen habe ich es aufgegeben mich weiter damit zu beschäftigen, es bringt nichts). Diese Aussagen beziehen sich bislang auf BDS2006.

QC53958: using a set definition in pascal record including getter/setter let the C++ linker fail
QC53956: using HPP struct with methods will result in ILI2119


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:51 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz