2009-05-18 15 views
5

Ich habe eine große Anwendung in Delphi geschrieben. Ich möchte es erneuern, beginnend mit der Benutzeroberfläche. Ich dachte über die Verwendung des neuen Qt nach. Während des Erneuerungsprozesses möchte ich zu C++ als Programmiersprache wechseln. Gibt es eine Möglichkeit, die Anwendung (beginnend mit der Benutzeroberfläche) schrittweise in C++ zu ändern?Port Delphi nach C++ allmählich

Vielen Dank für Ihre Hilfe.

+3

Ich füge das als Kommentar hinzu, weil meine Delphi/Borland-Erfahrung vor Jahren endete. Allerdings denke ich, Borlands C++ - Compiler wird erfolgreich Delphi-Dateien zu erstellen. Sie können möglicherweise nur Sprachen in demselben Projekt mischen. Du solltest es ausprobieren. –

+3

Wenn eine Änderung erforderlich ist, warum würden Sie nicht zu Delphi 2009 wechseln und bei der nativen Benutzeroberfläche bleiben, der VCL statt der QT? –

+0

Warum muss von Delphi auf C++ umgestellt werden? Sie wollen Cross-Plattform? –

Antwort

9

Die beste Vorgehensweise hängt stark von der C++ - Entwicklungsumgebung ab.

Wenn es C++ Builder ist, haben Sie zwei Möglichkeiten:

  • Verwenden Runtime-Pakete anstelle von normalen DLLs. Dies erspart Ihnen viel Kopfzerbrechen, wenn es darum geht, Klassenhierarchien in flache DLL-Funktionen zu mappen und zu mappen.

  • Verwenden Sie gemischten Code. Sie können Delphi/Pascal-Code mit C++ - Code im selben Projekt mischen. (Nur eine Sprache in einem einzigen Modul/Einheit obwohl)

Wenn es andere C++ Compiler ist:

  • Gehen Sie so, wie Sie mit DLLs vorgeschlagen. Sie müssen eine Art Layer/Fassade erstellen, um die Funktionalität Ihrer Klassen flachen DLL-Funktionen zuzuordnen.

  • Wenn Sie die Ebene DLL Weise auch gehen wollen, obwohl Sie C++ Builder verwenden, können Sie versuchen, eine Shared-Memory-Manager wie ShareMem mit (kommt mit Delphi) oder FastMM (SourceForge) Gang string zu ermöglichen s anstelle von PChar s.

  • Erstellen Sie .objs anstelle von .dcus, damit beide Compiler mit demselben Ausgabeformat arbeiten. Dann verknüpfen Sie sie direkt in Ihr C++ Programm. Dies entspricht im Wesentlichen dem Erstellen einer DLL, ist jedoch statisch. Sie werden bestimmte Arten von Fehlern zur Kompilierungszeit statt zur Laufzeit feststellen.

+0

Ich bin nicht glücklich damit, aber ich denke, das ist nur der Weg es ist. Danke euch allen für eure Einsichten. –

2

Konvertieren Sie Ihre Delphi-Anwendung in dll-s. Sie sollten einige vernünftige API herausfinden und es in DLL offen legen. Dann benutze diese DLL-s aus der C++ - Anwendung.

Es gibt auch die Möglichkeit, COM + -Objekte zu erstellen, aber sie sind Windows-spezifische Technologie (wegen QT, ich nehme an, Sie beabsichtigen, Multi-Plattform-Anwendung zu erstellen).

6

Es ist wahrscheinlich einfacher, in die andere Richtung zu gehen - schreiben Sie die Geschäftslogik in C++ um und rufen Sie sie von Delphi über C-Schnittstellen auf. Dies ist besonders wichtig, da eine der wichtigsten Stärken von Delphi die Arbeit mit GUIs ist.

2

Im Allgemeinen, während es Heterosprachoptionen ist, fand ich immer, dass die ältere Version Einfrieren, und eine nächste große Version in der neuen Sprache zeiteffizienter am Ende umgeschrieben war.

Aber ich ging umgekehrt. (steigender C++ - Prozentsatz, den ich schließlich nach Delphi zurückportiert habe)

0

Ich verstehe Sie, weil ich auch ein Delphi-Entwickler bin und ich auch meinen Code zu QT-Framework migrieren möchte, das ist in C++. Ich möchte das plattformübergreifende Ziel erreichen: Also habe ich die DLL-Lösung verworfen, um den ursprünglichen Quellcode zu behalten, weil es mich zwingt, Delphi IDE im Standby zu halten. Ich möchte nicht zurück gehen, um den Delphi-Code noch einmal zu schreiben/reparieren/zu verbessern. Ich möchte mich weiterentwickeln! Die einzige Wahl, die ich sehe, ist Delphi-Code in C neu zu schreiben ++ und kompiliert es mit Qt Creator (im Detail, wird es mit g ++ mingw Compiler von Qt Creator aufgerufen neu kompiliert werden.)

Code Umschreiben bieten Ihnen die Chance, Refaktorieren Sie Ihre Klassen so, dass sie "QTed" -konform werden. Die GUI wird auch komplett neu geschrieben, weil VCL ereignisgesteuert ist, QT stattdessen signalgesteuert ist, aber ich denke, dass du das bereits weißt.

Denken Sie daran: Ihren Delphi-Code intakt zu halten und ihn in eine DLL-Bibliothek zu integrieren oder ihn in Objs zu kompilieren, zwingt Sie dazu, Delphi-Quellen zu pflegen.

+0

Cross-Plattform kann einfacher mit CodeTyphon erreicht werden. Es ist ein leistungsstarkes Ein-Klick-Installationspaket für plattformübergreifende native Pascal-Entwicklung. Es unterstützt bereits 4 CPU/OS-Hosts (Win32, Win64, Linux32, Linux64) und 16 CPU/OS-Ziele (Arm-Wince, Arm-Linux, Arm-Embedded, Arm-Gba, Arm-NDS, I386-Win32, I386) -Linux, i386-FreeBSD, i386-Haiku, x86_64-Win64, x86_64-Linux, x86_64-FreeBSD, powerpc-Linux, powerpc64-Linux, sparc-Linux, sparc-Solaris). Weitere werden in Lazarus/FreePascal unterstützt. http://www.pilotlogic.com/sitejoom/index.php?option=com_content&view=article&id=96&Itemid=148 – avra

1

Ich habe die gleiche Notwendigkeit - migrieren 9 Jahre altes Projekt mit etwa 300K + Zeilen Code von D2010 zu QT 4.6. ich beschlossen, Folgendes zu tun:

  1. Hafen die ADO-Abhängigkeiten zu SQLite-Treiber in Delphi mit DISql3.
  2. MS-Datenbank zu SQLite migrieren
  3. Entfernen Sie die Datenmodule, indem Sie db-Steuerelemente in Wrapper-Datenzugriffsklassen und andere UI-abhängige Steuerelemente wie ImageLists in den Formularen einfügen.
  4. Trennen Sie deutlich die Modelle (Db Zugriff), Ansichten (Forms) und Controller. Auf diese Weise kann ich mit der Portierung der Modelle und Controller beginnen und nach und nach Komponententests durchführen
  5. Schließlich migrieren die Ansichten (Formulare) zu QT-Dialogen. Dies ist der schwierigste Teil, da eine durchschnittliche App von mindestens 3-4 Kontrollen von Drittanbietern abhängig ist. Zum Beispiel für I DevExpress stark VCL verwenden, und ich plane es mit QTitan zu ersetzen (http://www.devmachines.com/qtitan_grid_overview.php)

Derzeit bin ich in der ersten Stufe 2, jedoch ziemlich zuversichtlich, dass die inkrementelle Ansatz wird funktionieren.