ich bin grad dabei ein paar Header Dateien von C++ nach Delphi zu übersetzen... allerdings scheitere ich schon an ein paar dingen
Wie schaut z.B. diese Zeile hier in Delphi aus?? <!--pas--></span><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td>Delphi-Source </td></tr><tr><td id='CODE'><!--pas1--><pre> bool isNull() <span class='reserved'>const</span>;</pre><!--pas2--></td></tr></table><span class='postcolor'><!--pas3-->
Das ist doch: <!--pas--></span><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td>Delphi-Source </td></tr><tr><td id='CODE'><!--pas1--><pre><span class='reserved'>const</span> isNull: Boolean;</pre><!--pas2--></td></tr></table><span class='postcolor'><!--pas3-->
und nochmal als komplettes... wie würdet ihr die Classe hier nach Delphi übersetzen??? <!--pas--></span><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td>Delphi-Source </td></tr><tr><td id='CODE'><!--pas1--><pre><span class='reserved'>class</span> FND_EXPORT MObject { <span class='reserved'>public</span>:
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Hi,
So nachdem ich das Fenster ausversehen geschlossen hatte hier noch mal eine etwas kürzere Version meines Beitrages. :angry:
Code:
bool isNull() const;
Das spiegelt keine Variable sondern eine Methode (erkennbar an den Klammern) wieder. Richtig wäre. <!--pas--></span><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td>Delphi-Source </td></tr><tr><td id='CODE'><!--pas1--><pre><span class='reserved'>class</span> <span class='reserved'>function</span> isNull(): boolean;</pre><!--pas2--></td></tr></table><span class='postcolor'><!--pas3--> Hierbei handelt es sich sich um Klassfuntionen. Diese sind schon vor erzeugen der Klassse verfügbar. <a href='http://www.delphi-treff.de/content/tutorials/oopkurs/index.php4?kat=7' target='_blank'>http://www.delphi-treff.de/content/tutoria...ndex.php4?kat=7</a>
Code:
bool operator == (const MObject &) const;
Hierbei handelt es sich um Operatoren. Diese sind in Delphi nicht verfügbar. In C++ könnte man folgendes machen.
Code:
if (Object1 == Object 2)
Das geht aber nur, wenn man den Operator überschrieben hat. Bei diesem Konstrukt würde der Operator == aufgerufen werden und die dahinterliegende Methode würde die Objecte miteinander vergleichen. Es gibt noch +, +=, -, -= etc. Alles Operatoren. In Delphi müsste man eine Methode schreiben die die Objekte miteinander vergleicht. <!--pas--></span><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td>Delphi-Source </td></tr><tr><td id='CODE'><!--pas1--><pre><span class='reserved'>function</span> isEqual(<span class='reserved'>Object</span>: <span class='reserved'>Type</span>): boolean</pre><!--pas2--></td></tr></table><span class='postcolor'><!--pas3--> Und der aufruf würde dann so lauten. <!--pas--></span><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td>Delphi-Source </td></tr><tr><td id='CODE'><!--pas1--><pre><span class='reserved'>if</span> (Object1.isEqual(Object2))</pre><!--pas2--></td></tr></table><span class='postcolor'><!--pas3--> Das ist mit dem C++ identisch.
MFn::Type kann ich dir auch nicht so genau deuten.
Es wäre wohl sinnvoller du würdest dir die Algorythmen aus der Klasse in eine eigene Delphiklasse übernehmen. Sprich, dass du dir die Delphiklasse von Grund auf neu machst.
PS: Da hast du dir ja für den Anfang was ziemlich ein einfaches ausgesucht. PPS: Als nächstes könnte ich dir Templates an herz legen.
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Gern geschehen.
Aya hat geschrieben:
Templates... gibt es nicht.. Die Header gibt es bisher leider nur in C++ (Sind die Headerdateien von Maya zum PlugIns schreiben)
Sei froh, dass es die nicht gibt.
Aber das könnte das Ganze natürlich noch mal um einiges erschweren. C++ Dll's sind nicht so ohne weites mit Delphi kompatibel (oder andersrum). Ich weiß es weil wir in der Firma C++ Dll's in unserem Frontend client eingebunden haben. Und das rauszufinden welche dinge man wo beachten muss ist nicht wirklich einfach.
Ich gehe ja mal davon aus, dass maya dann deine Delphiklasse verwenden würde. Und für diesen Fall MUSST du wirklich auf jedes popelige kleine Byte achten.
Es wäre da wohl sogar sinnvoller das gleich alles in C++ zu machen.
Kann man überhaupt Delphi Klassen direkt als C++ Klasse exportieren. Ich vermute man das geht nicht, weil TObject ja nicht von CObject abstammt.Ist es eventueller nicht vielleicht sinnvoller auf den Export von Klassen zu verzichten und direkt zu versuchen die entsprechenden Funktionsnamen zu exportieren.
Oder man könnte eine C++ DLL erstellen, die dann eine Delphi DLL lädt und die Funktionsaufrufe dorthin weitergibt. Ich denke das wäre die einfachste Lösung.
@Lossy Ex Haben die C++ Objecte ähnlich wie die Delphi Objecte als ersten Eintrag einen Zeiger auf die VMT/Klasse oder wie läuft das mit den virtuellen Methoden da ab? Klassenreferenzen wie in Delphi (class of ...) gibt es ja in C++ nicht. Und wie ist das bei Mehrfachvererbung. Hat die Klasse dann mehrere VMT's oder werden aneinander gehängt. Wenn die aneinander geängt würden, dann würden die Nummer der virtuellen Methoden eigentlich nicht mehr stimmen.
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Also die Richtung Delphi -> C++ haben wir nicht ausprobiert. Aber wenn es in die eine Richtung geht müsste es auch in die andere gehen. Das TObject und CObject haben damit überhaupt nichts zu tun.
Aber jetzt zum Interessanten Teil. Es können von Delphiseite aus nur Methoden aufgerufen werden die auch in der VMT (Virtual Method Table oder auch VFT Virtual Function table) stehen. Sprich nur Methoden die als virtual deklariert worden. Alle anderen können nicht aufgerufen werden. Das weitere was nicht geht sind Objekte zu erstellen bzw diese wieder frei zu geben. Das kann Delphi nicht. Dort muss die DLL eine Helferfunktionen bieten die ein Object erstellen und wieder frei geben. Diese werden auf Delphiseite so implementiert, das die die Delphiklasse zurückliefern.
Methoden die als Virtuell erstellt werden werden in diese Tabelle gehangen. Immer hintendran. Methoden die andere überschreiben überschreiben also auch deren VFT Eintrag. Und aus dem Grund muss man bei Delphiklassen immer darauf achten, dass die Methoden immer die 100%tige Reihenfolge, Parameteranzahl und Parametertypen haben. Andernfalls würde es zu verschiebungen auf Delphiseite kommen und das Ergebniss ist undefiniert. Der Name der Methode spielt dabei überhaupt keine Rolle. Wichtig ist lediglich die Stelle in der VFT.
Zum Aufbau der Klassen. Vererbungen sind wieder so eine Sache. Von C++ aus ist das kein Ding. Diese Objekte können auch alle als solche benutzt werden. Von Delphiseite kann man keine weiteren Vererbungen vornehmen. Man muss das Objekt dann kappseln.
Und die Klassenfunktionen müssen folgende Anhang haben. virtual; stdcall; abstract; Alle anderen sind frei einsetzbar.
Aber auf Grund der Schwierigkeiten und Fehlersuchen die wir hatten Empfehle ich das niemanden nachzumachen außer es geht wirklich nicht anders.
PS: Operatoren sind an und für sich auch nur Methoden und können somit überschrieben werden. Nur sollte man nicht die Gesamten C++ Schweinereien verwenden, da einige Dinge von Delphi nicht in C++ gehen und andersrumg gibt es auch dinge die es in Delphi nicht gibt.
Aber wie gesagt. Der Aufwand isses kaum Wert außer es Stecken dann tatsächlich mehrere Jahre Entwicklung drin. Ich habe dabei schon so manche Hoffnungen verlohren, weil einfach nur 1 Byte nicht stimmte und somit alles in die Grütze ging. Das kann echt frustrierend sein!!!
nur falls sich hier noch irgendwer bemüht.. *g* Braucht ihr nichmehr
Ich bastel mir mein PlugIn jetzt mit VC++, klappt nu auch richtig gut nach einer kleinen eingewöhnungszeit in C++.. (wääh.. ich vermisse die IDE... *seufzt*)
Au'revoir, Aya~
PS: Falls es wen interressiert *g* Ich bastel mir ein ExportPlugIn... es gibt zwar soviele Dateiformate, aber keines ist richtig perfekt für meine Zwecke = ich mach's mir selbst
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Ich weiß nicht, ob die miteinander Kompatibel sind. Aber evtl. kannst du ja mal was mit Borland C++ Builder machen. Dann hast du auch wieder deine IDE.
Registriert: Mo Sep 23, 2002 19:27 Beiträge: 5812
Programmiersprache: C++
Wenn schon C++, dann die kostenlose Bloodshed Dev-C++IDE ( <a href='http://www.bloodshed.net' target='_blank'>http://www.bloodshed.net</a> ), die auch in der Lage ist VC++ Projekte zu importieren.Die IDE ist mir viel angenehmer als dieser überladene Microsoft-Kram, und Dev-C++ ist zudem auch noch völlig kostenlos.
P.S. : Ansonsten bin ich ein wenig von Aya enttäuscht...wo ein Wille da ein Weg, und wo ein C++-Header da auch eine Delphi-Konvertierung möglich
P.S. : Ansonsten bin ich ein wenig von Aya enttäuscht...wo ein Wille da ein Weg, und wo ein C++-Header da auch eine Delphi-Konvertierung möglich
*gg* Stimmt shcon.. hätte ich auch gemacht wenn es 20 Header gewesen wären... aber es sind 255 Header Dateien... und da is mir der aufwand doch ein wenig zu groß *ggg* und ich meine... mein PlugIn is schon fast fertig, eine kleine GUI noch basteln, dann isses fertig
Mitglieder in diesem Forum: 0 Mitglieder und 4 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.