Pull to refresh

Миграция приложений — примеры кода

Reading time2 min
Views7.2K
Данная статья — с одной стороны — изначально задуманное продолжение моей первой статьи "«Миграция приложений — мифы и реальность», а с другой стороны — ответ на часть комментариев, которые задавали в статье Хабравчане vladsharikov, lair и berez.

Конвертация кода с Delphi на C#


Для начала, приведу пример конвертации кода на Delphi в код на C#:
Код на Delphi
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.


После трансляции, код превращается в такой:
Код C#
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 ниже.
Извините — полные варианты тем, с заменяемыми кнопками на заголовке окна и сменными же стилями заголовков, искать не стал


Здесь три дополнительных темы

Glass

Steel Blue gradient

Metro Light

Если есть ещё вопросы по примерам конвертации — прошу в комментарии.
P.S. Перевод с Delphi на C# — один из проектов-тестов, которые использовались в процессе отладки конвертера.
P.P.S. Форма на FoxPro сделана «наспех», специально для демонстрации.
Tags:
Hubs:
Total votes 10: ↑4 and ↓6-2
Comments17

Articles