험프리 2월 18일, 2022에 포스트됨 공유하기 2월 18일, 2022에 포스트됨 이 문서의 목적: 델파이 소스코드의 컴포넌트 정보를 일괄변경 변경할 수 있는 데브기어 컴포넌트 컨버터를 소개합니다. 데브기어 컴포넌트 컨버터 데브기어 컴포넌트 컨버터는 델파이 컴포넌트를 일괄변경할 수 있는 자동화 도구이다. 이 도구의 특징은 "변환패턴 자체를 델파이 코드로 작성할 수 있다"는 것이며, 이로 인해 복잡한 패턴도 원하는 방식으로 변환하도록 구현 가능하다. 다음 목적으로 데브기어 컴포넌트 컨버터가 개발 및 활용되었다. TReadGrid를 퀀텀 그리드(TcxGrid, TcxGridLevel, TcxBandedTableView)로 변환(참고) TRealDBGrid를 퀀텀 그리드(TcxGrid, TcxGridLevel, TcxDBBandedTableView)로 변환(참고) TFDUpdateSQL의 Connection 속성을 TFDQuery의 Connection 속성을 복사해 추가(참고) TFDAutoIncField에 AutoIncrementSeed 속성이 없는 경우에 한해, AutoIncrementSeed, AutoIncrementStep 속성 추가(참고) 사용방법 데브기어 마이그레이션 컨설팅 중 실사용 목적으로 개발된 프로그램으로 사용법위주로 설명한다. (혹시, 부족하거나 추가로 궁금한 내용은 공개된 소스코드에서 직접 확인하거나 이글 또는 저장소의 이슈 기능으로 질문하시기 바랍니다.) 설치방법 데브기어 컴포넌트 컨버터는 오픈소스로 제공된다. https://github.com/devgear/ComponentConverter 데브기어 컴포넌트 컨버터는 두가지 프로젝트를 제공한다. 컴포넌트 컨버터(CompMigrationTool) : 델파이 폼파일과 소스파일에서 컴포넌트 정보를 변경 소스코드 컨버터(SrcMigrationTool) : 델델파이 소스파일에서 컴포넌트를 사용한 코드를 찾아 변경 (MigrationToolGroup.groupproj 프로젝트 그룹 파일을 열어 2개 프로젝트를 한번에 열수 있다.) 변환 패턴 추가 방법 두개 프로젝트 공통으로 TConverter라는 베이스 클래스를 공통으로 제공한다. 기능을 추가는 TConverter 클래스를 상속받아 메소드를 제정의하는 방식으로 기능을 구현한다. 컴포넌트 컨버터(CompMigrationTool) TConverterLabelColor = class(TConverter) protected function FindComponentInDfm(AData: TConvertData): Boolean; override; function GetTargetCompClassName: string; override; function GetConvertCompClassName: string; override; function GetConvertedCompText(ACompText: TStrings; var Output: string): Boolean; override; function GetDescription: string; override; end; initialization TConvertManager.Instance.Regist(TConverterLabelColor); EtcPropsConverter.pas 일부로 주요 메소드를 설명한다. FindComponentInDfm : DFM 파일에서 변환할 컴포넌트가 있는지 판단결과 반환 GetTargetCompClassName / GetConvertCompClassName : 변환대상 클래스명과 변환이후 클래스명을 반환 GetConvertedCompText : 컴포넌트 문자열(ACompText)를 받아 변환 후 반환(Output) GetDescription : 컨버터의 설명을 반환 이후 컨버터 매니저(TConverterManager)에 컨버터 클래스를 등록하면 메인화면의 컨버터 목록에 표시된다. 소스코드 컨버터(SrcMigrationTool) TColumnConverter = class(TConverter) protected function GetCvtCompClassName: string; override; function GetDescription: string; override; function GetCvtBaseClassName: string; override; published [Impl] function ConvertFixedCount(AProc, ASrc: string; var ADest: string): Integer; [Impl] function ConvertColCount(AProc, ASrc: string; var ADest: string): Integer; ... 생략 ... end; initialization TConvertManager.Instance.Regist(TColumnConverter); ColumnConverter.pas 일부로 주요 메소드를 설명한다. GetCvtCompClassName : 변환할 컴포넌트 클래스명을 반환하며, 소스코드가 해당 클래스명을 사용하는 경우 변환을 진행 GetDescription : 컨버터의 설명을 반환 [Impl] / [Intf] : 구현부(Implimentation 영역)과 선언부(interface 영역)를 대상으로 변환할지를 지정하는 Attribute ConvertXXXXXX 함수들 : 실제 변환을 수행할 메소드들을 추가(Convert로 시작하고, 동일한 매개변수와 반환 데이터타입으로 지정할 것) 컨버터 메소드 구현 예시 - (Org)의 소스코드를 (Mig)로 변환하는 패턴 구현 function TColumnConverter.ConvertFixedCount(AProc, ASrc: string; var ADest: string): Integer; //(Org) if not (RealDBGrid1.DataSource.DataSet.State in [dsInsert]) then //(Mig) if not (RealDBGrid1DBBandedTableView1.DataController.DataSource.DataSet.State in [dsInsert]) then const SEARCH_PATTERN = GRIDNAME_REGEX + '\.[Ff]ixed[Cc]ount'; REPLACE_FORMAT = '[[COMP_NAME]]DBBandedTableView1.FixedCount'; begin Result := 0; if TryRegExGridConvert(ASrc, SEARCH_PATTERN, REPLACE_FORMAT, ADest) then Inc(Result); end; 검색 패턴(SEARCH_PATTERN)과 변환 포맷(REPLACE_FORMAT)을 정의하고, 정규표현식을 이용해 검색 및 치환한다. 대부분의 기능은 내부적으로 구현(SrcConverter.pas, SrcConvertUtils.pas)되어 있다. 참조 컨버터 컴포넌트 컨버터 디렉토리와 소스코드 컨버터 디렉토리에 참고용 컨버터 클래스를 남겨두었다. 기존 진행한 프로젝트의 변환 패턴을 참고할 수 있다. 인용하기 이 댓글 링크 다른 사이트에 공유하기 더 많은 공유 선택 사항
Recommended Posts
이 토의에 참여하세요
지금 바로 의견을 남길 수 있습니다. 그리고 나서 가입해도 됩니다. 이미 회원이라면, 지금 로그인하고 본인 계정으로 의견을 남기세요.