1️⃣ 프로젝트 구조 매핑
| UI 계층 | Form (.dfm/.pas) | WPF (.xaml/.cs) / WinForms (.Designer.cs) |
| 데이터 계층 | TQuery, TADOConnection, FireDAC | Entity Framework Core / Dapper / ADO.NET |
| 공통 유틸 | Unit (Utils, Common 등) | Static class / Helper class |
| 전역 변수 | Global Unit 변수 | Singleton / DI 주입 서비스 |
| 데이터모듈 | TDataModule | Service class / Repository class |
| 이벤트 | OnClick, OnChange | 이벤트 핸들러 (Button.Click += …) |
| 패키지 | .dpk | NuGet 패키지 (.csproj 종속성) |
2️⃣ 문법 변환 규칙
🔹 변수 선언
Delphi
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/themes/prism.min.css"><pre class="code code-wrap" id="29cbad7c-b227-8078-8ef2-ec35e4939488">
var i: Integer; s: String; f: Double; C#
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/themes/prism.min.css"><pre class="code code-wrap" id="29cbad7c-b227-80d7-a7df-ce19be133f40">
int i; string s; double f;
🔹 함수 / 프로시저
Delphi
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/themes/prism.min.css"><pre class="code code-wrap" id="29cbad7c-b
227-8093-9528-cec83f71f7bf">
function Add(a, b: Integer): Integer; begin Result := a + b; end; C#
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/themes/prism.min.css"><pre class="code code-wrap" id="29cbad7c-b227-80ad-9882-d00ae9ebd43f">
int Add(int a, int b) { return a + b; }
🔹 클래스 선언
Delphi
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/themes/prism.min.css"><pre class="code code-wrap" id="29cbad7c-b227-8062-af40-c3cd087ad089">
type TPerson = class private FName: string; public constructor Create(AName: string); procedure ShowName; end; C#
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/themes/prism.min.css"><pre class="code code-wrap" id="29cbad7c-b227-806a-b584-d3177fd9df68">
class Person { private string Name; public Person(string name) { Name = name; } public void ShowName() { Console.WriteLine(Name); } }
🔹 속성(Property)
Delphi
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/themes/prism.min.css"><pre class="code code-wrap" id="29cbad7c-b227-80ba-8ff2-ec7d13a22e15">
property Name: string read FName write FName; C#
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/themes/prism.min.css"><pre class="code code-wrap" id="29cbad7c-b227-8096-a547-c42879ce1065">
public string Name { get; set; }
🔹 배열 및 리스트
Delphi
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/themes/prism.min.css"><pre class="code code-wrap" id="29cbad7c-b227-80b5-8f6a-defa6d80db99">
arr: array of Integer; SetLength(arr, 10); C#
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/themes/prism.min.css"><pre class="code code-wrap" id="29cbad7c-b227-802a-a529-c8a6eb23df9e">
int[] arr = new int[10]; 혹은
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/themes/prism.min.css"><pre class="code code-wrap" id="29cbad7c-b227-80d6-bf98-cb3c91677bd2">
List<int> list = new List<int>();
🔹 문자열 처리
Length(s) | s.Length |
Copy(s, 2, 5) | s.Substring(1, 5) |
Pos('a', s) | s.IndexOf("a") |
UpperCase(s) | s.ToUpper() |
LowerCase(s) | s.ToLower() |
Trim(s) | s.Trim() |
3️⃣ 데이터 접근 매핑
🔹 Delphi FireDAC / ADO
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/themes/prism.min.css"><pre class="code code-wrap" id="29cbad7c-b227-807f-a275-ea2da975c9e9">
FDQuery.SQL.Text := 'SELECT * FROM CUSTOMER WHERE ID = :ID'; FDQuery.ParamByName('ID').AsInteger := 10; FDQuery.Open; 🔹 C# Entity Framework Core
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/themes/prism.min.css"><pre class="code code-wrap" id="29cbad7c-b227-8039-b390-f8d6f7857fa0">
var customer = db.Customers.FirstOrDefault(c => c.Id == 10); 또는 Dapper 사용 시:
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/themes/prism.min.css"><pre class="code code-wrap" id="29cbad7c-b227-80d3-9813-e0712a30b842">
var customer = conn.QueryFirstOrDefault<Customer>( "SELECT * FROM CUSTOMER WHERE ID = @Id", new { Id = 10 });
4️⃣ UI 이벤트 매핑
Button1.OnClick := Button1Click; | button1.Click += Button1_Click; |
procedure Button1Click(Sender: TObject); | private void Button1_Click(object sender, EventArgs e) |
Edit1.Text := 'Hello'; | textBox1.Text = "Hello"; |
FormCreate(Sender) | Form_Load(object sender, EventArgs e) |
5️⃣ DB 트랜잭션 변환
Delphi
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/themes/prism.min.css"><pre class="code code-wrap" id="29cbad7c-b227-8013-8ed8-ef3cd78bd5f8">
FDConnection.StartTransaction; try FDQuery.ExecSQL; FDConnection.Commit; except FDConnection.Rollback; end; C# (EF Core)
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/themes/prism.min.css"><pre class="code code-wrap" id="29cbad7c-b227-802e-8f78-eab7b2645253">
using var transaction = db.Database.BeginTransaction(); try { db.SaveChanges(); transaction.Commit(); } catch { transaction.Rollback(); }
6️⃣ 전역 변수 / Singleton 패턴 대체
Delphi
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/themes/prism.min.css"><pre class="code code-wrap" id="29cbad7c-b227-807d-8e81-d0b5134dca58">
var gUserName: string; C#
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/themes/prism.min.css"><pre class="code code-wrap" id="29cbad7c-b227-805a-9335-ca72a49ac67c">
public static class GlobalData { public static string UserName { get; set; } } 또는 DI 기반 서비스 등록
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/themes/prism.min.css"><pre class="code code-wrap" id="29cbad7c-b227-80ff-a2d5-f47d0dba3731">
builder.Services.AddSingleton<UserContext>();
7️⃣ 예외 처리
Delphi
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/themes/prism.min.css"><pre class="code code-wrap" id="29cbad7c-b227-8085-81cd-f32a323e03a0">
try x := 1 div 0; except on E: Exception do ShowMessage(E.Message); end; C#
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/themes/prism.min.css"><pre class="code code-wrap" id="29cbad7c-b
227-8018-8213-fa47e3525299">
try { int x = 1 / 0; } catch (Exception ex) { MessageBox.Show(ex.Message); }
8️⃣ 파일 입출력
Delphi
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/themes/prism.min.css"><pre class="code code-wrap" id="29cbad7c-b227-805a-b54f-f2aa38f9e138">
AssignFile(f, 'data.txt'); Reset(f); ReadLn(f, s); CloseFile(f); C#
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/themes/prism.min.css"><pre class="code code-wrap" id="29cbad7c-b227-80f1-9a41-d6bc147b8665">
using (StreamReader sr = new StreamReader("data.txt")) { string s = sr.ReadLine(); }
9️⃣ 외부 DLL / API 호출
Delphi
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/themes/prism.min.css"><pre class="code code-wrap" id="29cbad7c-b227-80d9-9cc0-ec8ed544f7eb">
function GetTickCount: Cardinal; stdcall; external 'kernel32.dll'; C#
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/themes/prism.min.css"><pre class="code code-wrap" id="29cbad7c-b227-8034-b7f5-c7a893555ff9">
[DllImport("kernel32.dll")] static extern uint GetTickCount();
🔟 추가 권장 사항
| 프로젝트 구조 | Multi-layer (Presentation, Business, Data) |
| 설정 파일 | appsettings.json (Delphi ini 대체) |
| 로그 관리 | Serilog, NLog |
| 의존성 주입 | .NET DI Container |
| 빌드 및 배포 | dotnet publish / CI-CD Pipeline |
| 테스트 | xUnit / NUnit |
| 형상관리 | Git + Branch 전략 (module 단위 병행 전환) |
⭐ 발표자 : 이영청님
델파이 → C#(.NET) 변환 가이드
1️⃣ 프로젝트 구조 매핑
2️⃣ 문법 변환 규칙
🔹 변수 선언
Delphi
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/themes/prism.min.css"><pre class="code code-wrap" id="29cbad7c-b227-8078-8ef2-ec35e4939488">var i: Integer; s: String; f: Double;C#
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/themes/prism.min.css"><pre class="code code-wrap" id="29cbad7c-b227-80d7-a7df-ce19be133f40">int i; string s; double f;🔹 함수 / 프로시저
Delphi
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/themes/prism.min.css"><pre class="code code-wrap" id="29cbad7c-b227-8093-9528-cec83f71f7bf">function Add(a, b: Integer): Integer; begin Result := a + b; end;C#
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/themes/prism.min.css"><pre class="code code-wrap" id="29cbad7c-b227-80ad-9882-d00ae9ebd43f">int Add(int a, int b) { return a + b; }🔹 클래스 선언
Delphi
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/themes/prism.min.css"><pre class="code code-wrap" id="29cbad7c-b227-8062-af40-c3cd087ad089">type TPerson = class private FName: string; public constructor Create(AName: string); procedure ShowName; end;C#
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/themes/prism.min.css"><pre class="code code-wrap" id="29cbad7c-b227-806a-b584-d3177fd9df68">class Person { private string Name; public Person(string name) { Name = name; } public void ShowName() { Console.WriteLine(Name); } }🔹 속성(Property)
Delphi
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/themes/prism.min.css"><pre class="code code-wrap" id="29cbad7c-b227-80ba-8ff2-ec7d13a22e15">property Name: string read FName write FName;C#
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/themes/prism.min.css"><pre class="code code-wrap" id="29cbad7c-b227-8096-a547-c42879ce1065">public string Name { get; set; }🔹 배열 및 리스트
Delphi
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/themes/prism.min.css"><pre class="code code-wrap" id="29cbad7c-b227-80b5-8f6a-defa6d80db99">arr: array of Integer; SetLength(arr, 10);C#
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/themes/prism.min.css"><pre class="code code-wrap" id="29cbad7c-b227-802a-a529-c8a6eb23df9e">int[] arr = new int[10];혹은
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/themes/prism.min.css"><pre class="code code-wrap" id="29cbad7c-b227-80d6-bf98-cb3c91677bd2">List<int> list = new List<int>();🔹 문자열 처리
Length(s)s.LengthCopy(s, 2, 5)s.Substring(1, 5)Pos('a', s)s.IndexOf("a")UpperCase(s)s.ToUpper()LowerCase(s)s.ToLower()Trim(s)s.Trim()3️⃣ 데이터 접근 매핑
🔹 Delphi FireDAC / ADO
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/themes/prism.min.css"><pre class="code code-wrap" id="29cbad7c-b227-807f-a275-ea2da975c9e9">FDQuery.SQL.Text := 'SELECT * FROM CUSTOMER WHERE ID = :ID'; FDQuery.ParamByName('ID').AsInteger := 10; FDQuery.Open;🔹 C# Entity Framework Core
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/themes/prism.min.css"><pre class="code code-wrap" id="29cbad7c-b227-8039-b390-f8d6f7857fa0">var customer = db.Customers.FirstOrDefault(c => c.Id == 10);또는 Dapper 사용 시:
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/themes/prism.min.css"><pre class="code code-wrap" id="29cbad7c-b227-80d3-9813-e0712a30b842">var customer = conn.QueryFirstOrDefault<Customer>( "SELECT * FROM CUSTOMER WHERE ID = @Id", new { Id = 10 });4️⃣ UI 이벤트 매핑
Button1.OnClick := Button1Click;button1.Click += Button1_Click;procedure Button1Click(Sender: TObject);private void Button1_Click(object sender, EventArgs e)Edit1.Text := 'Hello';textBox1.Text = "Hello";FormCreate(Sender)Form_Load(object sender, EventArgs e)5️⃣ DB 트랜잭션 변환
Delphi
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/themes/prism.min.css"><pre class="code code-wrap" id="29cbad7c-b227-8013-8ed8-ef3cd78bd5f8">FDConnection.StartTransaction; try FDQuery.ExecSQL; FDConnection.Commit; except FDConnection.Rollback; end;C# (EF Core)
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/themes/prism.min.css"><pre class="code code-wrap" id="29cbad7c-b227-802e-8f78-eab7b2645253">using var transaction = db.Database.BeginTransaction(); try { db.SaveChanges(); transaction.Commit(); } catch { transaction.Rollback(); }6️⃣ 전역 변수 / Singleton 패턴 대체
Delphi
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/themes/prism.min.css"><pre class="code code-wrap" id="29cbad7c-b227-807d-8e81-d0b5134dca58">var gUserName: string;C#
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/themes/prism.min.css"><pre class="code code-wrap" id="29cbad7c-b227-805a-9335-ca72a49ac67c">public static class GlobalData { public static string UserName { get; set; } }또는 DI 기반 서비스 등록
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/themes/prism.min.css"><pre class="code code-wrap" id="29cbad7c-b227-80ff-a2d5-f47d0dba3731">builder.Services.AddSingleton<UserContext>();7️⃣ 예외 처리
Delphi
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/themes/prism.min.css"><pre class="code code-wrap" id="29cbad7c-b227-8085-81cd-f32a323e03a0">try x := 1 div 0; except on E: Exception do ShowMessage(E.Message); end;C#
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/themes/prism.min.css"><pre class="code code-wrap" id="29cbad7c-b227-8018-8213-fa47e3525299">try { int x = 1 / 0; } catch (Exception ex) { MessageBox.Show(ex.Message); }8️⃣ 파일 입출력
Delphi
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/themes/prism.min.css"><pre class="code code-wrap" id="29cbad7c-b227-805a-b54f-f2aa38f9e138">AssignFile(f, 'data.txt'); Reset(f); ReadLn(f, s); CloseFile(f);C#
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/themes/prism.min.css"><pre class="code code-wrap" id="29cbad7c-b227-80f1-9a41-d6bc147b8665">using (StreamReader sr = new StreamReader("data.txt")) { string s = sr.ReadLine(); }9️⃣ 외부 DLL / API 호출
Delphi
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/themes/prism.min.css"><pre class="code code-wrap" id="29cbad7c-b227-80d9-9cc0-ec8ed544f7eb">function GetTickCount: Cardinal; stdcall; external 'kernel32.dll';C#
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/themes/prism.min.css"><pre class="code code-wrap" id="29cbad7c-b227-8034-b7f5-c7a893555ff9">[DllImport("kernel32.dll")] static extern uint GetTickCount();🔟 추가 권장 사항
⭐ 발표자 : 이영청님