unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls;

type
TForm1 = class(TForm)
Panel1: TPanel;
procedure Panel1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
private
{ Private declarations }
procedure WMCHitTest(var msg : TMessage); message WM_NCHITTEST;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

// 판넬로 움직이기
procedure TForm1.Panel1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
ReleaseCapture;
SendMessage(Handle, WM_NCLBUTTONDOWN, HTCAPTION, 0);
// 이건.. 폼의 캡션을 클릭했을때와 같은 역할을 하게 한다.
end;

// 폼으로 움직이기
procedure TForm1.WMCHitTest(var msg: TMessage);
begin
inherited; // 이거 꼭 포함^^
If msg.Result = htClient Then
msg.Result := htCaption
end;

end.

출처 : http://yuhani.springnote.com/pages/973228

이 팁은 다국어 버전의 프로그램을 만들때, OS마다 폰트가 약간씩 차이날때 유용하게 써먹을 수 있는 팁입니다.

  1. unit Unit1;

  2. interface

    uses
    Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
    StdCtrls;

    type
    TfrmSystemFont = class(TForm)
    GroupBox1: TGroupBox;
    GroupBox2: TGroupBox;
    lblSysFont: TLabel;
    Label1: TLabel;
    procedure FormCreate(Sender: TObject);
    private
    { Private declarations }
    public
    { Public declarations }
    end;

    var
    frmSystemFont: TfrmSystemFont;

    implementation

    {$R *.DFM}

    procedure TfrmSystemFont.FormCreate(Sender: TObject);
    begin
    // frmSystemFont 폼의 폰트를 시스템의 MenuFont로 설정합니다.
    Self.Font.Assign(Screen.MenuFont);
    // 이폼의 폰트가 부모 폰트가 되도록 설정합니다.
    // 하위 컨트롤들은 부모 폰트를 따르게 됩니다.
    Self.ParentFont := True;
    end;

    end.

 

 윈도우에 폰트 설치 / 제거 하기

  1. // 폰트 설치
    AddFontResource(PChar('XXXFont.TTF'));
    SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0);

    // 폰트 제거
    RemoveFontResource(PChar('XXXFont.TTF'));
    SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0); 

 

 폰트에 안티알리아스 적용하기

  1. procedure TForm1.Button1Click(Sender: TObject);
    var
    LogFont : TLogFont;
    begin
    Canvas.Font.Name := '굴림체';
    Canvas.Font.Size := 40;
    {*}GetObject(Canvas.Font.Handle, SizeOf(LogFont), Addr(LogFont));
    {*}LogFont.lfQuality := ANTIALIASED_QUALITY;
    {*}Canvas.Font.Handle := CreateFontIndirect(LogFont);
    Canvas.TextOut(100,100,'안녕하세요');
    end; 

 

사용가능한 폰트 확인하기

  1. .....
  2. uses
  3.  ..., printers;
  4.  
  5. ....
  6. ....
  7. procedure aaaa;
  8. begin
  9. .... := screen.fonts // 스트링리스트 형식으로 사용가능한 폰트를 보여줌.
  10. end;

폼생성시 이벤트 발생 순서 (VCL) 폼생성시 이벤트 발생 순서

폼 생성시: OnCreate->OnShow->OnResize->OnActivate->OnPaint
폼 종료시: OnCloseQuery->OnClose->OnDeactivate->OnHide->OnDestroy 


출처 : http://yuhani.springnote.com/pages/975272

Delphi의 OnActivate Event에서 발생하는 오류

OnActivate Event에서 Form의 FormStyle 특성을 변경하려면 ‘Cannot Change Visible in Onshow or OnHide'에러가 발생한다.

Form 스타일 뿐만이아니라 OnActivate에서 이벤트나 메서드 호출을 할경우에도 발생한다.  정확한 원인은 생성위치문제로 동일하겠으나 일단은 ‘Cannot Change Visible in Onshow or OnHide' 에러가 발생한다면 이곳이라는 것을 알아두자.


FormStyle은 Window가 생성될 때 결정되며,OnCreate Event에서 일반적인 설정이 이루어진다.그러므로 OnShow나 OnHide, OnActivate Event에서 사용될 수 없다.


출처 : http://yuhani.springnote.com/pages/883996

구글링후 windows 7, windows server 2008 버젼확인하는 코드 추가

//-----------------
unit
 GetWinVersionInfo;
interface

uses
  Windows, Registry, SysUtils;

type
  _OSVERSIONINFOEX = record
    dwOSVersionInfoSize : DWORD;
    dwMajorVersion      : DWORD;
    dwMinorVersion      : DWORD;
    dwBuildNumber       : DWORD;
    dwPlatformId        : DWORD;
    szCSDVersion        : array[0..127] of AnsiChar;
    wServicePackMajor   : WORD;
    wServicePackMinor   : WORD;
    wSuiteMask          : WORD;
    wProductType        : BYTE;
    wReserved           : BYTE;
  end;
  TOSVERSIONINFOEX = _OSVERSIONINFOEX;
 
  function GetVersionExA(var lpVersionInformation: TOSVersionInfoEX): BOOL;
        stdcall; external kernel32;
 
const
  VER_NT_WORKSTATION    :Integer = 1;
  VER_SUITE_ENTERPRISE  :Integer = 2;
  VER_NT_SERVER         :Integer = 3;
  VER_SUITE_DATACENTER  :Integer = 128;
  VER_SUITE_PERSONAL    :Integer = 512;
 
const
  PRODUCT_BUSINESS                      = $00000006; {Business Edition}
  PRODUCT_BUSINESS_N                    = $00000010; {Business Edition}
  PRODUCT_CLUSTER_SERVER                = $00000012; {Cluster Server Edition}
  PRODUCT_DATACENTER_SERVER             = $00000008; {Server Datacenter Edition
(full installation)}
  PRODUCT_DATACENTER_SERVER_CORE        = $0000000C; {Server Datacenter Edition
(core installation)}
  PRODUCT_ENTERPRISE                    = $00000004; {Enterprise Edition}
  PRODUCT_ENTERPRISE_N                  = $0000001B; {Enterprise Edition}
  PRODUCT_ENTERPRISE_SERVER             = $0000000A; {Server Enterprise Edition
(full installation)}
  PRODUCT_ENTERPRISE_SERVER_CORE        = $0000000E; {Server Enterprise Edition
(core installation)}
  PRODUCT_ENTERPRISE_SERVER_IA64        = $0000000F; {Server Enterprise Edition
for Itanium-based Systems}
  PRODUCT_HOME_BASIC                    = $00000002; {Home Basic Edition}
  PRODUCT_HOME_BASIC_N                  = $00000005; {Home Basic Edition}
  PRODUCT_HOME_PREMIUM                  = $00000003; {Home Premium Edition}
  PRODUCT_HOME_PREMIUM_N                = $0000001A; {Home Premium Edition}
  PRODUCT_HOME_SERVER                   = $00000013; {Home Server Edition}
  PRODUCT_SERVER_FOR_SMALLBUSINESS      = $00000018; {Server for Small Business
Edition}
  PRODUCT_SMALLBUSINESS_SERVER          = $00000009; {Small Business Server}
  PRODUCT_SMALLBUSINESS_SERVER_PREMIUM  = $00000019; {Small Business Server
Premium Edition}
  PRODUCT_STANDARD_SERVER               = $00000007; {Server Standard Edition
(full installation)}
  PRODUCT_STANDARD_SERVER_CORE          = $0000000D; {Server Standard Edition
(core installation)}
  PRODUCT_STARTER                       = $0000000B; {Starter Edition}
  PRODUCT_STORAGE_ENTERPRISE_SERVER     = $00000017; {Storage Server Enterprise
Edition}
  PRODUCT_STORAGE_EXPRESS_SERVER        = $00000014; {Storage Server Express
Edition}
  PRODUCT_STORAGE_STANDARD_SERVER       = $00000015; {Storage Server Standard
Edition}
  PRODUCT_STORAGE_WORKGROUP_SERVER      = $00000016; {Storage Server Workgroup
Edition}
  PRODUCT_UNDEFINED                     = $00000000; {An unknown product}
  PRODUCT_ULTIMATE                      = $00000001; {Ultimate Edition}
  PRODUCT_ULTIMATE_N                    = $0000001C; {Ultimate Edition}
  PRODUCT_WEB_SERVER                    = $00000011; {Web Server Edition}
  PRODUCT_UNLICENSED                    = $ABCDABCD; {Unlicensed product}


  function GetOSInfo: string;
var
{$EXTERNALSYM GetProductInfo}
  GetProductInfo: function (dwOSMajorVersion, dwOSMinorVersion,
                            dwSpMajorVersion, dwSpMinorVersion: DWORD;
                            var pdwReturnedProductType: DWORD): BOOL stdcall = NIL;

implementation

function GetOSInfo: string;
var
  NTBres, BRes: Boolean;
  OSVI: TOSVERSIONINFO;
  OSVI_NT: TOSVERSIONINFOEX;
  tmpStr: string;
  dwOSMajorVersion, dwOSMinorVersion,
  dwSpMajorVersion, dwSpMinorVersion,
  pdwReturnedProductType : DWORD;
begin
  Result := 'Error';
  NTBRes := FALSE;
  try
    OSVI_NT.dwOSVersionInfoSize := SizeOf(TOSVERSIONINFOEX);
    NTBRes := GetVersionExA(OSVI_NT);
    OSVI.dwOSVersionInfoSize := SizeOf(TOSVersionInfo);
    BRes := GetVersionEx(OSVI);
  except
    OSVI.dwOSVersionInfoSize := SizeOf(TOSVersionInfo);
    BRes := GetVersionEx(OSVI);
  end;
  if (not BRes) and (not NTBres) then
    Exit;
  Move( OSVI, OSVI_NT, SizeOf(TOSVersionInfo) );
 
  case OSVI_NT.dwPlatformId of
     VER_PLATFORM_WIN32_NT:
       begin
         if OSVI_NT.dwMajorVersion <= 4 then
           Result := 'Windows NT ';
         if (OSVI_NT.dwMajorVersion = 5) and (OSVI_NT.dwMinorVersion = 0) then
           Result := 'Windows 2000 ';
         if  (OSVI_NT.dwMajorVersion = 5) and (OSVI_NT.dwMinorVersion = 1) then
           Result := 'Windows XP ';
         if (OSVI_NT.dwMajorVersion = 6)  then
         begin
           if (OSVI_NT.dwMinorVersion = 0) then
           begin
            if OSVI_NT.wProductType = VER_NT_WORKSTATION then
              Result := 'Windows Vista'
            else
              Result := 'Windows Server 2008';
           end
           else if OSVI_NT.dwMinorVersion = 1 then
           begin
            if OSVI_NT.wProductType = VER_NT_WORKSTATION then
              Result := 'Windows 7'
            else
              Result := 'Windows Server 2008 R2'
           end
           else
              Result := 'After Windows 7 Version. Not Supply this version';

           if Assigned(GetProductInfo) then
           begin
             GetProductInfo( dwOSMajorVersion, dwOSMinorVersion,
                             dwSpMajorVersion, dwSpMinorVersion,
                             pdwReturnedProductType );
             case pdwReturnedProductType of
               PRODUCT_BUSINESS:
                 tmpStr := 'Business Edition';
               PRODUCT_BUSINESS_N:
                 tmpStr := 'Business Edition';
               PRODUCT_CLUSTER_SERVER:
                 tmpStr := 'Cluster Server Edition';
               PRODUCT_DATACENTER_SERVER:
                 tmpStr := 'Server Datacenter Edition (full installation)';
               PRODUCT_DATACENTER_SERVER_CORE:
                 tmpStr := 'Server Datacenter Edition (core installation)';
               PRODUCT_ENTERPRISE:
                 tmpStr := 'Enterprise Edition';
               PRODUCT_ENTERPRISE_N:
                 tmpStr := 'Enterprise Edition';
               PRODUCT_ENTERPRISE_SERVER:
                 tmpStr := 'Server Enterprise Edition (full installation)';
               PRODUCT_ENTERPRISE_SERVER_CORE:
                 tmpStr := 'Server Enterprise Edition (core installation)';
               PRODUCT_ENTERPRISE_SERVER_IA64:
                 tmpStr := 'Server Enterprise Edition for Itanium-based Systems';
               PRODUCT_HOME_BASIC:
                 tmpStr := 'Home Basic Edition';
               PRODUCT_HOME_BASIC_N:
                 tmpStr := 'Home Basic Edition';
               PRODUCT_HOME_PREMIUM:
                 tmpStr := 'Home Premium Edition';
               PRODUCT_HOME_PREMIUM_N:
                 tmpStr := 'Home Premium Edition';
               PRODUCT_HOME_SERVER:
                 tmpStr := 'Home Server Edition';
               PRODUCT_SERVER_FOR_SMALLBUSINESS:
                 tmpStr := 'Server for Small Business Edition';
               PRODUCT_SMALLBUSINESS_SERVER:
                 tmpStr := 'Small Business Server';
               PRODUCT_SMALLBUSINESS_SERVER_PREMIUM:
                 tmpStr := 'Small Business Server Premium Edition';
               PRODUCT_STANDARD_SERVER:
                 tmpStr := 'Server Standard Edition (full installation)';
               PRODUCT_STANDARD_SERVER_CORE:
                 tmpStr := 'Server Standard Edition (core installation)';
               PRODUCT_STARTER:
                 tmpStr := 'Starter Edition';
               PRODUCT_STORAGE_ENTERPRISE_SERVER:
                 tmpStr := 'Storage Server Enterprise Edition';
               PRODUCT_STORAGE_EXPRESS_SERVER:
                 tmpStr := 'Storage Server Express Edition';
               PRODUCT_STORAGE_STANDARD_SERVER:
                 tmpStr := 'Storage Server Standard Edition';
               PRODUCT_STORAGE_WORKGROUP_SERVER:
                 tmpStr := 'Storage Server Workgroup Edition';
               PRODUCT_UNDEFINED:
                 tmpStr := 'An unknown product';
               PRODUCT_ULTIMATE:
                 tmpStr := 'Ultimate Edition';
               PRODUCT_ULTIMATE_N:
                 tmpStr := 'Ultimate Edition';
               PRODUCT_WEB_SERVER:
                 tmpStr := 'Web Server Edition';
               PRODUCT_UNLICENSED:
                 tmpStr := 'Unlicensed product'
             else
               tmpStr := '';
             end;{ pdwReturnedProductType }
             Result := Result + tmpStr;
             NTBRes := FALSE;
           end;{ GetProductInfo<>NIL }
         end;{ Vista }

         if NTBres then
         begin
           if OSVI_NT.wProductType = VER_NT_WORKSTATION then
           begin
             if OSVI_NT.wProductType = VER_NT_WORKSTATION then
             begin
               case OSVI_NT.wSuiteMask of
                 512: Result := Result + 'Personal';
                 768: Result := Result + 'Home Premium';
               else
                 Result := Result + 'Professional';
               end;
             end
             else if OSVI_NT.wProductType = VER_NT_SERVER then
             begin
               if OSVI_NT.wSuiteMask = VER_SUITE_DATACENTER then
                 Result := Result + 'DataCenter Server'
               else if OSVI_NT.wSuiteMask = VER_SUITE_ENTERPRISE then
                 Result :=  Result + 'Advanced Server'
               else
                 Result := Result + 'Server';
             end;
           end{ wProductType=VER_NT_WORKSTATION }
           else
           begin
             with TRegistry.Create do
               try
                 RootKey := HKEY_LOCAL_MACHINE;
                 if OpenKeyReadOnly('SYSTEM\CurrentControlSet\Control\ProductOptions') then
                   try
                     tmpStr := UpperCase(ReadString('ProductType'));
                     if tmpStr = 'WINNT' then
                       Result := Result + 'Workstation';
                     if tmpStr = 'SERVERNT' then
                       Result := Result + 'Server';
                   finally
                     CloseKey;
                   end;
               finally
                 Free;
               end;
             end;{ wProductType<>VER_NT_WORKSTATION }
           end;{ NTBRes }
         end;{ VER_PLATFORM_WIN32_NT }
     VER_PLATFORM_WIN32_WINDOWS:
       begin
         if (OSVI.dwMajorVersion = 4) and (OSVI.dwMinorVersion = 0) then
         begin
           Result := 'Windows 95 ';
           if OSVI.szCSDVersion[1] = 'C' then
             Result := Result + 'OSR2';
         end;
         if (OSVI.dwMajorVersion = 4) and (OSVI.dwMinorVersion = 10) then
         begin
           Result := 'Windows 98 ';
           if OSVI.szCSDVersion[1] = 'A' then
             Result := Result + 'SE';
         end;
         if (OSVI.dwMajorVersion = 4) and (OSVI.dwMinorVersion = 90) then
           Result := 'Windows Me';
       end;{ VER_PLATFORM_WIN32_WINDOWS }
     VER_PLATFORM_WIN32s:
       Result := 'Microsoft Win32s';
  else
    Result := 'Unknown';
  end;{ OSVI_NT.dwPlatformId }
end;{ GetOSInfo }

initialization
   @GetProductInfo := GetProcAddress(GetModuleHandle('KERNEL32.DLL'),
                                     'GetProductInfo');

end.


출처 : http://beehone.egloos.com/2601506

사용자 이름 얻기

nSize :=  MAX_COMPUTERNAME_LENGTH + 1;

SetLength(szBuffer,NSize);

GetUserName(Pchar(szBuffer),nSize);

컴퓨터 이름 얻기
GetComputerName(Pchar(szBuffer),nSize);

2009이후로 사용못해봤으나 2007까지는

Pchar에서 string은 형변환이 자유롭다.

------------------------------------------------------------

프로그램 추가삭제에서 뜨는 목록 보기
const
  UNINST_PATH = 'Software\Microsoft\Windows\CurrentVersion\Uninstall';
var
  Reg : TRegistry;
  SubKey: TSTringList;
  I : Integer;
  sDisplayName : String;
begin
  Reg := TRegistry.Create;
  try
    Reg.RootKey := HKEY_LOCAL_MACHINE;
    if Reg.OpenKeyReadOnly(UNINST_PATH) then
    begin
      SubKey := TStringList.Create;
      try
        Reg.GetKeyNames(SubKey);
        Reg.CloseKey;
        for i := 0 to subKey.Count - 1 do
        begin
          if Reg.OpenKeyReadOnly(Format('%s\%s', [UNINST_PATH, SubKey[i]])) then
          begin
            try
              sDisplayName := Reg.ReadString('DisplayName');
              if  ((sDisplayName) <> '') and
                  (Pos('업데이트',sDisplayName) = 0) and
                  (Pos('HOTFIX',UpperCase(sDisplayName)) = 0) and
                  (Pos('핫픽스',sDisplayName) = 0) then
              begin
                    //-------TODO--------
                    //---------------------
              end;
            finally
              Reg.CloseKey;
            end;
          end;
        end;
      finally
        SubKey.Free;
      end;
    end;
  finally
    Reg.CloseKey;
    reg.Free;
  end;
end;
//---------아웃룩으로 이메일 보내기---------------
    try
      OutlookApp := GetActiveOleObject('Outlook.Application');
    except
      OutlookApp := CreateOleObject('Outlook.Application');
    end;

    try
      MailItem := OutlookApp.CreateItem(olMailItem);
      MailItem.Recipients.Add(메일주소);

      MailItem.Subject := edt_User.Text + '  Program List';

      MailItem.Body := '내용'
      MailItem.Attachments.Add(경로);
      MailItem.Send;
      //MailItem.Display(True);

    finally
      myAttachments := VarNull;
      OutlookApp := VarNull;
    end;
//------------------------------------------------


출처 : http://beehone.egloos.com/2601505

1. 일단 firebird를 받자. 
    2.5버젼을 다운받았음.

2. FlameRobin GUI 프로그램을 다운받자.

3. localhost에 마우스 우클릭하고 create new data base를 하면 DB가 생성이된다.
   이곳에 테이블생성하고 펑션생성하고 프로시져 생성하면된다.
   Oracle만 사용해봐서 varchar2때문에 에러나는걸 찾질못했었다.

4. 테이블을 생성하고 ER DIAGRAM을 그리고싶다.

여기서 많이 검색해봤는데 기업용 프리라이센스 위주로 검색을하려다보니

쓸수있는것이 얼마없더라.

그래서 선택한 DBDesignerFork  Firebird를 지원한다해서 설치했는데 db connect에서

파이어버드는 눈씻고 찾아봐도 찾을수가없더라.

결국 firebird odbc driver 2.0을 설치하고

제어판-관리-odbc 관리에서 추가를해주고

Firerbird ODBC Setup 이 뜬다. 아 다시 난감한 상황.

Data SOurce Name 에는 보여질 이름을 입력한다.

database에는 생성한 파일 주소를 입력한다.

database account에는 아이디 password에는 pw를 입력한다. 이상태로 ok하면 끝.

이제 DBDesignerFork에서 ODBC를 이용해 파이어버드DB에 접속할수있다.

이제 ER-DIAGRAM까지 그렸다.

이제 코딩을 클라이언트를 만들어야하는데 주로 사용하는 델파이를 켯는데..

이걸 어떻게 해야하나. ODBC로 연결할수도있고 INTERBASE를 선택할수도있다.

어디선가 ODBC로 연결하면 성능저하가있다는 말을보고 INTERBASE 컴포넌트를 이용한 접속방법을 선택했다.

TIBDatabase 컴포넌트를 폼에디트 창에 올려놓고

소스코드에 접속해줘야할 부분에서


IBDatabase1.Params.Clear;
IBDatabase1.SQLDialect := 3;
IBDatabase1.Params.Add('user_name=sysdba');
IBDatabase1.Params.Add('PASSWORD=PW);
IBDatabase1.DatabaseName := '경로';
IBDatabase1.LoginPrompt := false;
IBDatabase1.Connected := True;


를 해주면 접속 성공!

출처 : http://beehone.egloos.com/2601499
   가. 기초
1.  콤포넌트 개발 기초
http://www.acrosoft.pe.kr/lecture/component1.htm
2.  프로퍼티
http://www.acrosoft.pe.kr/lecture/component1-3.htm
3. 프로퍼티 카테고리
http://www.acrosoft.pe.kr/lecture/component1-4.htm
4. 메소드와 이벤트
http://www.acrosoft.pe.kr/lecture/component1-5.htm
5. VCL
http://www.acrosoft.pe.kr/lecture/component1-7.htm
6. 윈도우 메시지 처리
http://www.acrosoft.pe.kr/lecture/component1-8.htm

   나. 컴포넌트 제작
1. 컴포넌트 개발 실전
http://www.acrosoft.pe.kr/lecture/component2-1.htm
2. 3차원 레이블 컴포넌트 제작
http://www.acrosoft.pe.kr/lecture/component2-3.htm
3. 데이터 연동 콤포넌트(Data-Aware Component) 개발
http://www.acrosoft.pe.kr/lecture/component2-5.htm
4. 패키지
http://www.acrosoft.pe.kr/lecture/component2-6.htm
   다. 컴포넌트 제작 고급
1. 콤포넌트 개발의 고급 기술
http://www.acrosoft.pe.kr/lecture/component3-1.htm
2. 프로퍼티 에디터
http://www.acrosoft.pe.kr/lecture/component3-3.htm
3. 콤포넌트 에디터(Component Editor)
http://www.acrosoft.pe.kr/lecture/component3-4.htm
4. 도움말 만들기
http://www.acrosoft.pe.kr/lecture/component3-5.htm

출처 : http://beehone.egloos.com/2084739
출처:http://www.howto.pe.kr

프로그램을 띄우거나 파일을 실행할경우 ShellAPI 함수인 ShellExecute() 를 사용합니다.
이 함수는 윈도우즈 탐색기에서 파일을 선택하고 더블클릭하는 기능과 동일한 동작을 합니다.
다음은 ShellExecute() 의 몇가지 사용예입니다.

(1) 파일과 연관(association)된 프로그램으로 파일을 엽니다
    ShellExecute(Handle, 'open', PChar('test.txt'), nil, nil, SW_SHOW);

(2) notepad.exe 에 파라미터로 config.sys 파일을 주어 메모장을 실행합니다
    ShellExecute(Handle, 'open', 'notepad', 'c:\config.sys', nil, SW_SHOW);

(3) PC에 설치된 기본 웝브라우저로 지정한 사이트를 엽니다.
    ShellExecute(Handle, 'open', 'www.howto.pe.kr', nil, nil, SW_SHOW);

(4) 특정 폴더를 시작 폴더로 하는 윈도우즈 탐색기를 엽니다
    ShellExecute(Handle, 'explore', PChar('c:\windows)', nil, nil, SW_SHOW);

(5) readme.doc 파일을 연결된 프로그램으로 인쇄하고 화면을 닫습니다
    ShellExecute(Handle, 'print', 'readme.doc', nil, nil, SW_SHOW);
    
(6) rMyDelphiFile.pas 파일을 wordpad 프로그램으로 인쇄하고 화면을 닫습니다
    ShellExecute(Handle, 'print', 'wordpad.wxe', 'MyDelphiFile.pas', nil, SW_SHOW);

(7) readme.doc 파일을 프린터를 선택하여 연결된 프로그램으로 인쇄하고 화면을 닫습니다
    var
      Device : array[0..255] of char;
      Driver : array[0..255] of char;
      Port   : array[0..255] of char;
      S: String;
      hDeviceMode: THandle;
    begin
      Printer.PrinterIndex := -1;  // 프린터 인덱스를 지정합니다. 여기서는 기본 프린터(-1) 선택
      Printer.GetPrinter(Device, Driver, Port, hDeviceMode);
      S := Format('"%s" "%s" "%s"',[Device, Driver, Port]);
      ShellExecute(Handle, 'printto', 'readme.doc', Pchar(S), nil, SW_HIDE);

(8) 기본 메일 프로그램을 실행합니다.
    ShellExecute(Handle, nil, 'mailto:cozy@howto.pe.kr', nil, nil, SW_SHOW);

(9) DOS 명령어를 실행하고 화면을 닫습니다
    ShellExecute(Handle, 'open', PChar('command.com'), PChar('/c copy file1.txt file2.txt'), nil, SW_SHOW);

(10) DOS 명령어를 실행하고 화면을 닫지 않습니다
     ShellExecute(Handle, 'open', PChar('command.com'), PChar('/k dir'), nil, SW_SHOW);

(11) ShellExecute()의 리턴값은 실행된 프로그램의 핸들이거나 에러코드입니다
     리턴값이 32 이하이면 에러가 발생한것으로 각각은 아래와 같은 의미가 있습니다

  var
    code: Integer;
  begin
    code := ShellExecute(...);
    if code <= 32 then ShowMessage(ShowShellExecuteError(code));
  end;
    
  // ShellExecute()의 리턴코드에 대한 에러 메시지
  function ShowShellExecuteError(i: integer): String;
  begin
    case i of 0: result := 'The operating system is out of memory or resources.';
      ERROR_FILE_NOT_FOUND: result := 'The specified file was not found.';
      ERROR_PATH_NOT_FOUND: result := 'The specified path was not found.';
      ERROR_BAD_FORMAT: result := 'The .EXE file is invalid (non-Win32 .EXE or error in .EXE image).';
      SE_ERR_ACCESSDENIED: result := 'The operating system denied access to the specified file.';
      SE_ERR_ASSOCINCOMPLETE: result := 'The filename association is incomplete or invalid.';
      SE_ERR_DDEBUSY: result := 'The DDE transaction could not be completed because other DDE transactions were being processed.';
      SE_ERR_DDEFAIL: result := 'The DDE transaction failed.';
      SE_ERR_DDETIMEOUT: result := 'The DDE transaction could not be completed because the request timed out.';
      SE_ERR_DLLNOTFOUND: result := 'The specified dynamic-link library was not found.';
      //SE_ERR_FNF          : result:='The specified file was not found.';
      SE_ERR_NOASSOC           : result:='Unbekannter Extender.';
      SE_ERR_OOM: result := 'There was not enough memory to complete the operation.';
      //SE_ERR_PNF          : result:='The specified path was not found.';
      SE_ERR_SHARE: result := 'A sharing violation occurred.';
    end;
  end;

(12) ShellExecuteEx()를 이용하여 notepad.exe 를 실행한 후 종료될때까지 기다립니다
  var
    SEInfo: TShellExecuteInfo;
    ExitCode: DWORD;
    ExecuteFile, ParamString, StartInString: string;
  begin
    ExecuteFile   := 'notepad.exe';   // 실행할 프로그램
    ParamString   := 'c:\winzip.log'; // 프로그램의 명령행 파라미터
    StartInString := 'c:\';           // 시작 위치
    FillChar(SEInfo, SizeOf(SEInfo), 0);
    SEInfo.cbSize := SizeOf(TShellExecuteInfo);

    with SEInfo do
    begin
      fMask        := SEE_MASK_NOCLOSEPROCESS;
      Wnd          := Application.Handle;
      lpFile       := PChar(ExecuteFile);
      lpParameters := PChar(ParamString);
      lpDirectory  := PChar(StartInString);
      nShow        := SW_SHOWNORMAL;
    end;
    if ShellExecuteEx(@SEInfo) then
    begin
      repeat
        Application.ProcessMessages;
        GetExitCodeProcess(SEInfo.hProcess, ExitCode);
      until (ExitCode <> STILL_ACTIVE) or Application.Terminated;
      ShowMessage('프로그램이 종료되었습니다');
    end
    else ShowMessage('프로그램을 실행할 수 없습니다');

출처 : http://beehone.egloos.com/1423137

델파이에서의 문자열은 C의 Char와 비슷한 (NULL 터미네이터)문자열과 파스칼 스타일의 문자열이 있다.

문자열의 선언

  ▶ PChar(C 스타일 문자열)
    pTest:PChar;
    이렇게 선언했을 경우에는 pTest는 포인터임으로 문자열의 영역을 다음과 같이 확보해야된다.
    pTest:=AllocStar(128);

    아니면 아래와 같이 영역을 지정해 주면 된다.
    ArrTest:array[0..127] of Char;
         :
    pTest := ArrTest;  

  ▶ String(파스칼 스타일 문자열)
    sTest:String
    스트링은 특별히 문자열의 영역을 확보할 필요는 없다.
    단 $H 옵션을 사용했을 경우 길이가 255가 된다.



  ■ C스타일 문자열 관련 함수

함수

기능

StrAlloc C문자열에 버퍼사이즈를 정하고 문자열의 첫 문자를 가르키는 포인터를 반환
StrBufSize StrAlloc으로 정한 문자열 버퍼에 저장할 수 있는 최대 문자수를 반환
StrCat Source의 카피를 Dest 의 마지막에 추가하고 결합된 문자열을 반환
StrComp Str1을 Str2과 비교
StrCopy Source를 Dest 에 카피하고 Dest를 반환
StrDispose 文字列을 파기
StrECopy Source를 Dest에 카피, 문자열의 마지막에 NULL문자를 가르키는 포인터를 반환
StrEnd Null로 끝나는 문자열의 마지막을 가르키는 포인터 반환
StrFmt 배열의 엔트리를 형식화
StrIComp 지정된 문자수 만큼 두개의 문자열을 비교
StrLCat 지정한 문자수를 문자열에 추가
StrLComp 지정한 문자수 만큼의 2개의 문자열을 비교
StrLCopy 지정된 문자수를 Source에서 Dest로 카피
StrLen 문자열안에 NULL을 제외한 문자수를 반환
StrLFmt 지정된 오픈 배열의 일련의 인수를 형식화
StrLIComp 지정된 문자수 만큼 대소문자를 구별하지 않고 두개의 문자열을 비교
StrLower 문자열을 소문자로 변환
StrMove 지정된 문자수를 문자열에 카피
StrNew 힙영역을 확보 문자열을 카피, 그 문자열을 가르키는 포인터 반환。
StrPCopy 파스칼 스타일의 문자열을 NULL로 끝나는 문자열에 카피
StrPLCopy 파스칼 스타일의 문자열의 문자를 Null로 끝나는 문자열에 카피
StrPos Str1안의 최초의 Str2을 가르키는 포인터를 반환
StrRScan Str 안의 마지막 Chr를 가르키는 포인터를 반환
StrScan 문자열 안의 최초의 지정 문자를 가르키는 포인터를 반환
StrUpper 문자열을 대문자로 반환


 
파스칼 스타일 문자열 관련 함수

함수

기능

Concat 문자열과 문자열을 더한다.
이것보다는 그냥 "+" 를 이용하여 문자열을 더한다.
Copy 부분 문자열 얻기
Delete 문자열의 일부 삭제
Insert 문자열을 다른 문자열에 삽입
Length 문자열의 길이 얻기
Pos 문자열에 지정한 부분의 문자열의 위치 반환
Format 지정한 형식으로 수치나 문자열을 변환


  문자열 수치 변환 관련 함수

함수

기능

IntToStr 정수를 파스칼 문자열로 변환
DateToStr TDateTime형의 변수를 파스칼 문자열로 변환
FloatToStr 부동소수점값을 파스칼 문자열로 변환
IntToHex 정수를 16진수 표기 문자열로 표기
StrToInt 문자열(10진수, 16진수)을 수치로 변환
StrToIntDef 문자열을 수치로 변환
TimeToStr TDateTime 변수를 문자열로 변환
Val 문자열을 수치로 변환


  특수 문자 표기
    #을 사용하면 문자열에 제어문자를 표기할 수 있다.
   '#13#10' (CRLF)

  ■ 문자 판별

함수

기능

IsCharLower 소문자인지 아닌지 판별
IsCharUpper 대문자인지 아닌지 판별
IsCharAlpha 영자이지 아닌지 판별
IsCharAlphaNumeric 영숫자인지 아닌지 판별

+ Recent posts