Delphi, C++ Builder Compiler Versions

2013.12.04 16:42
크게 몰라도 되지만 간혹 필요한 델파이 및 C++빌더의 버전 정보입니다.

Delphi conditional VER<nnn>ProductProduct VersionPackage Version

VER260

Delphi XE5 / C++Builder XE5 
(Delphi:Win32/Win64/OSX/iOS/Android) (C++Builder:Win32/Win64)

19

190

VER250

Delphi XE4 / C++Builder XE4 
(Delphi:Win32/Win64/OSX/iOS) (C++Builder:Win32/Win64)

18

180

VER240

Delphi XE3 / C++Builder XE3 
(Delphi:Win32/Win64/OSX/iOS) (C++Builder:Win32/Win64)

17

170

VER230

Delphi XE2 / C++Builder XE2 
(Delphi:Win32/Win64/OSX) (C++Builder:Win32)

16

160

161 is the version for the five FireMonkey packages (at XE2 Update 2): fmi161.bpl, fmx161.bpl, fmxase161.bpl, fmxdae161.bpl, and fmxobj161.bpl.

VER220

Delphi XE / C++Builder XE (Win32)

15

150

VER210

Delphi 2010 / C++Builder 2010 (Win32)

14

140

VER200

Delphi 2009 / C++Builder 2009 (Win32)

12

120

VER190

Delphi 2007 for .Net *

11

110

VER180 or VER185

Delphi 2007 / C++Builder 2007 for Win32 * 

11

110

VER180

Delphi 2006 / C++Builder 2006 (Win32/.Net) and Delphi/C++Builder 2007 for Win32

10

100

VER170

Delphi 2005 (Win32/.Net)

9

90

VER160

Delphi 8 for .Net

8

80

VER150

Delphi 7 (and 7.1)

7

70

VER140

Delphi 6 / C++Builder 6

6

60

VER130

Delphi 5 / C++Builder 5

5

NA

VER125

C++Builder 4

4

NA

VER120

Delphi 4

4

NA

VER110

C++Builder 3

3

NA

VER100

Delphi 3

3

NA

VER93

C++Builder 1

NA

NA

VER90

Delphi 2

2

NA

VER80

Delphi 1

1

NA

VER70

Borland Pascal 7.0

NA

NA

VER15

Turbo Pascal for Windows 1.5

NA

NA

VER10

Turbo Pascal for Windows 1.0

NA

NA

VER60

Turbo Pascal 6.0

NA

NA

VER55

Turbo Pascal 5.5

NA

NA

VER50

Turbo Pascal 5.0

NA

NA

VER40

Turbo Pascal 4.0

NA

NA


참고: http://docwiki.embarcadero.com/RADStudio/XE5/en/Compiler_Versions

험프리.김현수 Delphi/C++Builder Compiler Versions, Delphi

[XE3] 관리자 권한으로 실행 - Project Options 사용

2013.04.17 18:30

UAC가 적용된 윈도우에서 레지스트리나 서비스 등을 제어하기 위해서는 어플리케이션을 관리자 권한으로 실행 해야 합니다.

보통 오른쪽 마우스 버튼의 "관리자 권한으로 실행" 메뉴를 이용하면 아래와 같이 확인창이 뜨지요.



하지만 고객에게 우측마우스로 관리자 권한으로 실행해 주세요. 할 수는 없기에 실행하면 무조건 관리자 권한으로 실행되도록 해야 합니다. 

관리자 권한으로 실행되는 프로그램은 아래의 그림 우측과 같이 방패 아이콘이 표시가 됩니다.


관리자 권한으로 실행하는 프로그램을 작성하기 위해서는

프로젝트 리소스에서 Manifest를 변경하고 적용해야 합니다.


예전 버전의 델파이(델파이 7, 2007)로 설명된 글들이 몇개 보이지만 다소 복잡하기도 해서

정말 쉽게 사용할 수 있는 방법 공유합니다.


아래 예제는 Delphi XE3 기준으로 작성되었구요

하위 버전에서는 잘 될지 모르겠네요.(아... 무책임 하여라..)


| Manifest 파일 작성


1, 프로젝트 생성

프로젝트를 생성하고 프로젝트 파일(*.dpr)이 저장된 경로를 보시면 프로젝트 명과 동일한 리소스 파일(*.res)이 있습니다.



2, 리소스 파일 오픈

리소스 에디터로 리소스파일을 열어봅니다.

리소스 에디터?

 - 리소스 파일을 편집할 수 있는 툴, 다양한 무료 툴들이 있음

 - 제가 사용하는 XN Resource Editor(http://www.wilsonc.demon.co.uk/d10resourceeditor.htm)

    (https://stefansundin.github.io/xn_resource_editor/)

리소스?

 - 어플리케이션에 아이콘, 이미지, 커서, 데이터 등을 포함하기 위한 파일일

 - 델파이에서는 Project > Resources and Images... 메뉴를 통해 이용할 수 있다.


그럼 아래의 좌측 메뉴에서  XP Theme Manifest 항목을 선택하고 하위 메뉴를 선택하면 화면과 같은 XML이 표시됩니다.


3, Manifest 내용 복사 후 파일 생성

리소스 에디터의 Manifest XML 내용을 복사합니다.

프로젝트의 경로에 프로젝트명.manifest(파일명은 임의로 입력하셔도 상관 없음) 파일을 만들고  XML내용을 붙여 넣고 아래와 같이 수정합니다.


requestedExecutionLevel의 level 변경(asInvoker -> requireAdministrator)

<requestedExecutionLevel

          level="requireAdministrator"

          uiAccess="false"/>

        </requestedPrivileges>



| Manifest 적용


1, 프로젝트 옵션에서 Manifest 적용

델파이 IDE로 이동하여 프로젝트 옵션을 열고 Application 항목으로 이동합니다.


2, Custom Manifest 설정

[Runtime Themes]의 콤보박스를 Use custom manifest로 변경하고 활성화된 Custom Manifest를 위에서 만든 reqAdmin.manifest파일을 선택합니다.


3. 컴파일 및 팁

위의 옵션을 적용하고 컴파일을 하면 생성된 실행파일에 방패가 생기고 실행 시 관리자 권한을 자동으로 질의 합니다.


하지만 관리자 권한으로 실행 시 디버깅이 안된다는 문제점이 있습니다.

큰 문제는 아니지만 빠르게 개발할 때 많이 불편하지요.


그래서 저는 컴파일 타겟으로 구분을 했습니다.

 - Release 모드인 경우 Runtime Themes를 Use custom manifest 선택 후 적용하고

 - Debug 모드인 경우 Runtime Themes를 Enable runtime themes로 선택하여 디버깅 가능하게 했습니다.


위와 같이 사용하는 경우 

Release 모드로 컴파일 하는 경우 F9로 실해이 되지 않고 실행파일로 실행을 하는 반면 관리자 권한으로 실행됩니다.

Debug 모드로 컴파일 하는 경우 디버깅이 가능하지만 관리자 권한을 사용하는 기능을 사용하지 못한답니다.

간단한 UI 수정할때 사용하면 좋을 것 같네요^^


그럼 오늘도 끝~

험프리.김현수 Delphi/C++Builder Custom manifest, Manifest 설정, requireAdministrator, 관리자권한으로 실행

  1. 실행파일 속성에서 호환성 부분에서 관리자 권한으로 실행하기하면 Release / Debug 에 상관없이 관리자 권한 다 먹고 들어가요~ 요것두 팁!

  2. 그렇지요^^ 사용하실때는 실행파일 속성에서 관리자권한으로 실행 체크해 주면 편합니다. 좋은팁 감사^^

  3. 언제부터였는진 모르겠는데
    Project Options
    > Application
    > Manifest File
    > Tags to include
    > Enable Administrator Privileges

    로 관리자 권한 실행 추가 가능하네요~

  4. XE10 시애틀부터는 이 글을 참고하시면 됩니다.
    https://www.delmadang.com/community/bbs_view.asp?bbsNo=3&bbsCat=0&indx=450954&page=1

  5. 정보공유 감사합니다^^

Borland Compiler Conditional Defines

2012.03.06 20:29

컴포넌트 및 라이브러리 소스 만들 때 필요한 델파이 버전별 Conditionnal Define 값입니다.

아래 형태로 사용할 수 있습니다.

{$IFDEF VER270}

// XE6에서만 구현할 코드

{$ENDIF}

Delphi conditional VER<nnn>ProductProduct VersionPackage Version

VER270

Delphi XE6 / C++Builder XE6 
(Delphi:Win32/Win64/OSX/iOS/Android) (C++Builder:Win32/Win64/OSX/iOS/Android)

20

200

VER260

Delphi XE5 / C++Builder XE5 
(Delphi:Win32/Win64/OSX/iOS/Android) (C++Builder:Win32/Win64/OSX/iOS)

19

190

VER250

Delphi XE4 / C++Builder XE4 
(Delphi:Win32/Win64/OSX/iOS) (C++Builder:Win32/Win64/OSX)

18

180

VER240

Delphi XE3 / C++Builder XE3 
(Delphi:Win32/Win64/OSX) (C++Builder:Win32/Win64/OSX)

17

170

VER230

Delphi XE2 / C++Builder XE2 
(Delphi:Win32/Win64/OSX) (C++Builder:Win32/OSX)

16

160

161 is the version for the five FireMonkey packages at XE2 Update 2: 
fmi161.bpl, fmx161.bpl, fmxase161.bpl, fmxdae161.bpl, and fmxobj161.bpl.

VER220

Delphi XE / C++Builder XE (Win32)

15

150

VER210

Delphi 2010 / C++Builder 2010 (Win32)

14

140

VER200

Delphi 2009 / C++Builder 2009 (Win32)

12

120

VER190

Delphi 2007 for .Net *

11

110

VER180 or VER185

Delphi 2007 / C++Builder 2007 for Win32 * 

11

110

VER180

Delphi 2006 / C++Builder 2006 (Win32/.Net) and Delphi/C++Builder 2007 for Win32

10

100

VER170

Delphi 2005 (Win32/.Net)

9

90

VER160

Delphi 8 for .Net

8

80

VER150

Delphi 7 (and 7.1)

7

70

VER140

Delphi 6 / C++Builder 6

6

60

VER130

Delphi 5 / C++Builder 5

5

NA

VER125

C++Builder 4

4

NA

VER120

Delphi 4

4

NA

VER110

C++Builder 3

3

NA

VER100

Delphi 3

3

NA

VER93

C++Builder 1

NA

NA

VER90

Delphi 2

2

NA

VER80

Delphi 1

1

NA

VER70

Borland Pascal 7.0

NA

NA

VER15

Turbo Pascal for Windows 1.5

NA

NA

VER10

Turbo Pascal for Windows 1.0

NA

NA

VER60

Turbo Pascal 6.0

NA

NA

VER55

Turbo Pascal 5.5

NA

NA

VER50

Turbo Pascal 5.0

NA

NA

VER40

Turbo Pascal 4.0

NA

NA


끝~

험프리.김현수 Delphi/C++Builder

[IDE] 델파이 작업경로 바로가기

2012.02.10 10:10
델파이로 개발 작업 중 현재 소스 경로로 이동해야 되는 일이 종종 있죠...

그럴때마다 explorer를 실행해서 이동하려면 번거롭습니다. 

그럴때 유용한  기능을 소개합니다.

* 델파이 메뉴에 현재 작업 중인 작업경로를 여는 메뉴를 추가합니다.

우선 예전 아는 선배에게 들은 재미있는 이야기 하나.

선배는 핸드폰 관련된 개발 일을 했습니다. 

동료와 이야기 중 "Window CE에서는 탐색기를 어떻게 열어요?" 라는 질문에

근처에 있던 외국인 개발자 曰

"뭔 새끼? 탐새끼?"

-_-;

 
그래서 그 이야기를 들은 저는 그 이후로 탐새끼라는 단어를 주로 사용합니다. 

그러면 위의 탐새끼를 델파이에 등록해 보겠습니다. 

1, Tools > Configure Tools 선택
 

 2, [Add] 버튼 클릭 후 아래와 같이 입력 후 [OK] 클릭
 

3, Tools > 탐새끼 등록 확인

 위와 같이 등록하시면 "탐새끼"를 통해 현재 작업 중인 경로의 탐색기가 실행 됩니다.

참 좋은 새끼(?)죠?

끝~ 

험프리.김현수 Delphi/C++Builder 델파이, 작업경로이동, 탐새끼

델파이 구조체(record) 사용 팁

2012.01.31 10:37

구조체(Record) 많이 사용하시죠?

생각보다 구조체를 사용하는 방법이 다양해서 소개하려 합니다.

우선 간단한 샘플
연/월/일 형식으로 데이터 입력 후 한번에 데이터 저장하는 코드입니다. 

type
  TRecordType = (rtData, rtStructure);

  TDateRec = record
    case TRecordType of
    rtData:       (Data: array[0..5] of Byte);
    rtStructure:  (Year, Month, Day: Word);
  end;
위와 같이 구조체가 정의 되어 있습니다.

2가지 타입(rtData, rtStructure)로 사용해 봅니다.
 
| rtStructure - 연월일 형식으로 입력
procedure TForm2.btnAddClick(Sender: TObject);
var
  Rec: TDateRec;
begin
  DecodeDate(dtpDate.Date, Rec.Year, Rec.Month, Rec.Day);

  AddDate(Rec);
end;

| rtData - 데이터 형식으로 저장
procedure TForm2.AddDate(ADate: TDateRec);
var
  FilePath: string;
  FS: TFileStream;
begin
  FilePath := ExtractFilePath(Application.ExeName) + 'test.dat';

  FS := TFileStream.Create(FilePath, IfThen(FileExists(FilePath), fmOpenReadWrite, fmCreate));
  try
    FS.Position := FS.Size;
    FS.Write(ADate.Data, SizeOf(ADate.Data));
  finally
    FS.Free;
  end;
end;

 위의 2가지 코드대로 하나의 구조체를 다양한 방식으로 사용가능합니다.
TRecordType 은 제가 임의로 2개를 정의한 것이므로, 여러개로 나누어 사용하여도 됩니다.
또한, 굳이 위 구조체가 아니어도 아래와 같은 코드로도 사용 가능합니다.

| Messages.pas의 window message record 
  TMessage = packed record
    Msg: Cardinal;
    case Integer of
      0: (
        WParam: WPARAM;
        LParam: LPARAM;
        Result: LRESULT);
      1: (
        WParamLo: Word;
        WParamHi: Word;
        LParamLo: Word;
        LParamHi: Word;
        ResultLo: Word;
        ResultHi: Word);
  end;
끝~

험프리.김현수 Delphi/C++Builder Delphi, Packed record, Record

델파이 2010(2009)에서 DSPack 설치

2011.12.20 12:51
델파이 2009, 2010에서 설치 가능한 DSPack package(버전은 2.3.3) 입니다.

\src\DSPack\DSUtil.pas 가   \src\DSPack\DSUtils.pas 로 변경
(이유: Delphi DBX Framework인 DSUtil.pas와 충돌)
기존 작성된 소스는 주의 필요

DSPack project : 
DSPack is a set of Components and class to write Multimedia Applications using MS Direct Show and DirectX technologies.

험프리.김현수 Delphi/C++Builder

2GB 이상 파일크기 구하는 함수

2011.12.19 10:51
function FileSize(const AFileName: string): Int64;
var
  srData: TSearchRec;
  FileData: DWORD;
  SizeHigh, SizeLow: Integer;
  RetVal: array[0..7] of Byte;
begin  Result := -1;
{$IFDEF MSWINDOWS}
  FileData := FindFirst(AFileName, faReadOnly, srData);
  if FileData <> 0 then
    Exit;

  SizeHigh := srData.FindData.nFileSizeHigh;
  SizeLow  := srData.FindData.nFileSizeLow;
  ZeroMemory(@RetVal[0], SizeOf(RetVal));
  Move(SizeLow, RetVal[0], 4);
  Move(SizeHigh, RetVal[4], 4);
  Move(RetVal[0], Result, 8);
{$ENDIF}
end;

험프리.김현수 Delphi/C++Builder Delphi, 델파이, 파일사이즈

[Delphi] Wild Card 문자비교

2010.03.23 12:33
문자열에서 Wild Card('?': single character, '*': multi character)를 포함하여 비교한다.
function MatchString(ASource, APattern: String): Boolean;
  function _MatchPattern(element, pattern: PChar): Boolean;
  begin
    if 0 = StrComp(pattern, '*') then
      Result := True
    else if (element^ = Chr(0)) and (pattern^ <> Chr(0)) then
      Result := False
    else if element^ = Chr(0) then
      Result := True
    else
    begin
      case pattern^ of
      '*': if _MatchPattern(element, @pattern[1]) then
             Result := True
           else
             Result := _MatchPattern(@element[1],pattern);
      '?': Result := _MatchPattern(@element[1],@pattern[1]);
      else
        if element^ = pattern^ then
          Result := _MatchPattern(@element[1],@pattern[1])
        else
          Result := False;
      end;
    end;
  end;
var
  pSource, pPattern: PChar;
begin
  pSource   := StrAlloc(Length(ASource)+1);
  pPattern  := StrAlloc(Length(APattern)+1);
  try
    StrPCopy(pSource,   ASource);
    StrPCopy(pPattern,  APattern);

    Result := _MatchPattern(pSource, pPattern);
  finally
    StrDispose(pSource);
    StrDispose(pPattern);
  end;
end;
출처 : 인터넷 어딘가...:-)
// sample
var 
  source: string;
  target: string;
begin
  source := 'abcdefg';
  target := 'ab*e?g';  // correct('cd' = '*', 'f' = '?')

  if MatchString(source, target) then  
    ShowMessage('Correct match')
  else 
    ShowMessage('Incorrect match')
  ;
end;

험프리.김현수 Delphi/C++Builder Delphi, 델파이, 문자비교