Данная статья — с одной стороны — изначально задуманное продолжение моей первой статьи "«Миграция приложений — мифы и реальность», а с другой стороны — ответ на часть комментариев, которые задавали в статье Хабравчане vladsharikov, lair и berez.
Конвертация кода с Delphi на C#
Для начала, приведу пример конвертации кода на Delphi в код на C#:
unit Unit3; interface type TMyClass = class _str: string; constructor Create; procedure setStr(s2: string); public class var FClassField: integer; end; TMyClassD = class of TMyClass; procedure DoSomeThing; implementation procedure DoSomeThing; begin end; { TMyClass } constructor TMyClass.Create; var c: char; i: byte; cod: integer; s: string; cls: TMyClassD; begin cls := TMyClass; inherited; DoSomeThing; Val('5', i, cod); c := '1'; s := c; end; var cls: TMyClass; s: string; procedure TMyClass.setStr(s2: string); begin s2[4] := 'a'; end; initialization cls := TMyClass.Create; s := '123456'; cls._str := s; s[3] := '0'; cls.setStr(s); end.
После трансляции, код превращается в такой:
using System; using System.Runtime.InteropServices; using System.Collections.Generic; using System.Data; using System.Linq; using System.IO; using System.Text; using FastCode.Delphi.Core._System; namespace Project3 { public static partial class Unit3_Module { public static void Unit3_Initialization_() { cls = TMyClass.Create(); s = "123456"; cls._str = s; //s[3] = '0'; s = s.Substring(0, 2) + '0' + s.Substring(3); cls.setStr(s); } public static void DoSomeThing() { } internal static TMyClass cls; internal static string s; } public partial class TMyClass : TObject { public override void __Create__() { Char c; byte i; int cod; string s; Class_of_TMyClass cls; cls = Class_of_TMyClass.Instance; base.__Create__(); Unit3_Module.DoSomeThing(); System_Module.Val('5'.ToString(), out i, out cod); c = '1'; s = c.ToString(); } public void setStr(string s2) { //s2[4] = 'a'; s2 = s2.Substring(0, 3) + 'a' + s2.Substring(4); } public static TMyClass Create() { TMyClass _instance = new TMyClass(); _instance.__Create__(); return _instance; } public string _str; public static int FClassField; } public partial class Class_of_TMyClass { protected Class_of_TMyClass() { } public TMyClass Create() { return TMyClass.Create(); } public static Class_of_TMyClass Instance = new Class_of_TMyClass(); public int FClassField { get { return TMyClass.FClassField; } set { TMyClass.FClassField = value; } } } }
И да, код на C# работает после подключения миграционной библиотеки и компиляции.
Есть более сложные и интересные места — например, реализация свойств с индексами (если кто знает Delphi — поймут), к которым есть доступ по имени, то есть в форме Obj.Items[index], но прямо сейчас под рукой этого кода нет.
Внешний вид в FoxPro
Накидал, по-быстрому, небольшое приложение на FoxPro, получилось вот такое:
Внешний вид в C# + WPF ниже.
Извините — полные варианты тем, с заменяемыми кнопками на заголовке окна и сменными же стилями заголовков, искать не стал
![](https://habrastorage.org/files/2fc/078/44f/2fc07844f8df48a992d7a0921b679b26.png)
Glass
![](https://habrastorage.org/files/ca5/ffd/081/ca5ffd081aca46ac967ebee5e1df2cf9.png)
Steel Blue gradient
![](https://habrastorage.org/files/fa1/332/fa7/fa1332fa744949fa9ed1e0a9497fd31d.png)
Metro Light
Если есть ещё вопросы по примерам конвертации — прошу в комментарии.
P.S. Перевод с Delphi на C# — один из проектов-тестов, которые использовались в процессе отладки конвертера.
P.P.S. Форма на FoxPro сделана «наспех», специально для демонстрации.
ссылка на оригинал статьи http://habrahabr.ru/post/260023/
Добавить комментарий