[Delphi] 프로그래밍 팁 모음 #1

 로케일 정보 읽기

시스템 로케일 정보 읽어오는 방법 지금 사용하는 OS가 어떤 언어를 사용하고 있는지
구분하기 위한 코드 이번 프로젝트에 중국어를 표현해야 되서 사용하게 된 코드

var
   Buffer: array[0..2] of Char;
begin
   GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SABBREVLANGNAME, Buffer, sizeof(Buffer));
   //Buffer 이 "KOR" 이면 한국어 이다.
   //"CHI", "CHT" 이건 중국어
end;

CD-ROM 드라이브 목록 가져오기

CD-ROM 드라기브 목록 가져오기

var
  CDRom: Byte;
begin
  for CDrom := 65 to 90 do begin
    if GetDriveType(PChar(Chr(CDRom) + ':')) = 5 then
      // CDROM 드라이브인지 체크
      // 0 : 드라이브가 아님
      // 1 : 루트 디렉토리 없음
      // 2 : 이동식 디스크
      // 3 : 고정 디스크
      // 4 : 원격 디스크
      // 5 : CDROM
      // 6 : 램디스크
      cboDrive.Items.Add(PChar(Chr(CDRom) + ':'));
end;

컨트롤 한/영 토글하기

설정하는 컨드롤(TEdit)등에 키보드의 한/영키를 누른 효과를 줍니다.
uses에 imm 을 추가합니다. 그리고 한/영 모드 타입 TImeInputMode = (imHangul, imEnglish); 선언해 줍니다.

procedure SetImeInputMode(const AHandle: THandle; const Value: TImeInputMode);
var
   hContext: HIMC;
   dwSentence : DWORD;
   dwConversion : DWORD;
begin
   hContext := ImmGetContext(AHandle);
   try
     ImmGetConversionStatus(hContext, dwConversion, dwSentence);
     if Value = imHangul Then
       ImmSetConversionStatus(hContext, IME_CMODE_HANGUL, dwSentence)
     else
       ImmSetConversionStatus(hContext, IME_CMODE_ALPHANUMERIC, dwSentence);
   finally
     ImmReleaseContext(AHandle, hContext);
   end;
end;

사용법
SetImeInputMode(Handle,imHangul);

마우스로 폼 이동시키기

프로그램을 작성할때 기본폼은 타이틀을 마우스로 움직여야지만 폼이 이동합니다.
타이틀이 아닌 폼의 아무곳이나 드래그하여도 폼이 이동하도록 하는 코드 입니다.
폼이벤트의 MouseDown 이벤트나 원하는 컴포넌트에 코딩하면 됩니다.

ReleaseCapture;
SendMessage(Handle, WM_NCLBUTTONDOWN, HTCAPTION, 0);

Handle 인 기본 폼이동이고
Panel1.Handle 을 지정하면 패널을 품안에서 패널을 이동할수 있습니다.

윈도우즈 디렉토리/버전 구하기

Delphi 에서 Win32Api를 이용해서
윈도우즈 설치디렉토리와 윈도우즈 버전 구분하기

//윈도우 디렉토리 구하기
var
  WinPath : array[0..MAX_PATH + 1] of char;
  // Windows.pas 에 정의 되어 있음 MAX_PATH = 260;
begin
  GetWindowsDirectory(WinPath,MAX_PATH);
end;

//윈도우즈 버전/플랫폼 구분
procedure GetOSVersion;
var
  VersionInfo: TOSVersionInfo;
  Platform: string;
  MajorVersion,MinorVersion,Build: DWORD;
begin
  VersionInfo.dwOSVersionInfoSize := SizeOf(VersionInfo);
  GetVersionEx(VersionInfo);

  with VersionInfo do begin
    case dwPlatformId of
      VER_PLATFORM_WIN32s: Platform := 'Windows 3x';
      VER_PLATFORM_WIN32_WINDOWS: Platform := 'Windows';
      VER_PLATFORM_WIN32_NT: Platform := 'Windows NT';
      VER_NT_WORKSTATION : Platform := 'Windows NT Workstation';
      VER_NT_SERVER: Platform := 'Windows NT Server';
    end;
    MajorVersion := dwMajorVersion;
    MinorVersion := dwMinorVersion;
    Build := dwBuildNumber;
  end;
end;

Win32 Api를 이용하는 방법을 정리해봤습니다.

실행할때마다 (OCX,DLL) 등록하기

프로그램을 개발하면셔 사용되는 라이브러리(OCX,DLL)를 등록해서(Regsvr32 사용) 사용해야 할경우 에 설치프로그램 없이 프로그램을 실행하기 위한 코드 입니다.
이코드를 사용하게 된경우는 CD-ROM 에서 실행되는 프로그램을 만들때 사용하였습니다.
CD-ROW에서 동작하는 프로그램 특성상 설치하거나 라이브러리를 등록해주어야
실행되다는 조건이 있으면 안되기 때문에 이 소스가 필요했습니다.
* 프로젝트 .dpr 에 아래 소스를 삽입합니다.

uses ComObj; 
begin 
  Application.Initialize; 
  WFileName := ExtractFilePath(Application.ExeName)+ DLLNAME; //driver 
  if FileExists(WFileName) then begin
    // OCX, DLL 등록 Regsvr32 를 한 효과를 냅니다. 
    RegisterComServer(WFileName); 
  end 
  else begin 
    Application.Terminate; 
    Exit; 
  end; 
  Application.Title := ''Image viewer; 
  Application.CreateForm(TFmMain, FmMain); 
  Application.Run; 
end.

텍스트를 UTF-8로 저장하기

텍스트를 UTF-8로 저장하기
UTF8String 타입은 System 에 선언 되어 있습니다.
델파이 6부터 사용할수 있는 코드 입니다.

var
  U: UTF8String; //변수를 하나 선언하고
begin
  // UTF-8변환
  U := UTF8Encode(WideString('변환할내용'));
  with TFileStream.Create('저장할파일명', fmCreate) do
  try
    Write(Pointer(U)^, Length(U));
  finally
    Free;
  end;
end

UTF-8을 Ansi로 변환하려면 UTF8Decode('')

트루타입 폰트 체크하기

폰트명을 입력하면
트루타입 폰트인지 아닌지 체크하는 팁 입니다.

function IsTrueTypeFont(FontName : string) : boolean;
const
  PITCH_MASK: byte = $0F;
var
  TxMetric: TTextMetric;
  TempCanvas : TCanvas;
  PitchTest : byte;
begin
  TempCanvas := TCanvas.Create;
  TempCanvas.Handle := CreateCompatibleDC(0));
  TempCanvas.Font.Name := FontName;
  GetTextMetrics(TempCanvas.Handle, TxMetric);
  PitchTest := TxMetric.tmPitchAndFamily and PITCH_MASK;
  Result := ((PitchTest and TMPF_TRUETYPE) <> 0));
  TempCanvas.free;
end;



댓글

이 블로그의 인기 게시물

1. 대학교 축제 전시 프로젝트