kkuzil.own@gmail.com

Posted
Filed under Development/Delphi
CnPack.. 사용하면 무지 편한데 Gexpert랑 같이 쓰다보면 단축키도 겹치고
쓸데없이 기능이 넘 많아서 짜증(?)날때도 있다.
항상 설치하면 이 빼주는 옵션이 생각이 안나서 맨땅에 헤딩하는데.. 좀 정리좀 하는 차원에서..끄적

- MessageBox Visual Designer - X
메시지박스 코드를 편하게 위저드 형식으로 추가해 줄 수 있게 하는데 이건 이미 Gexpert에서 애용하는
기능이기에 제외시킨다.

- Tab Orders Configuration - X
컨트롤들의 탭 순서를 비주얼하게 표시해주는건데.. 활성화 시키면 컨트롤 많을 지저분해져서 뵈기싫어 지므로
제외시킨다.

- Component Prefix Wizard - X
컴포넌트 및 컨트롤 삽입 시 이름을 자동생성 시켜주는 기능인데.. 지맘대루 이름이 바뀌는 경우가 있어서
제외시킨다.

- Procedure List Wizard - X
프로시주어 리스트를 보여주는 위저드인데.. Ctrl+D가 Gexpert의 메시지박스 생성 기능이랑 겹치고
이미 Gexpert에서 Ctrl+G의 기능과 겹치기 때문에 제외시킨다.

- Editor Enhancements - X
Edit창안에 툴바를 생성해 주는건데.. 지저분하기만 하고 필요없다.. 필요하면 메뉴를 이용하자.

- Code Input Helper
코드 자동완성 기능인데.. 쓸데없이 많은 목록들이 발생되고 원하는 대소문자 구별을 멋대로 사용하므로 제외.
2008/11/12 14:46 2008/11/12 14:46
Posted
Filed under Development/Delphi

안녕 하십니까?
(주)바로북닷컴의 김성규 입니다.
이 강좌는 본인이 관리합니다. 다른곳으로 옮기시면 출처를 밝혀주시기 바랍니다.

질문란에 인터넷 연결상태를 체크하는 방법에 대한 질문이 많이 올라옵니다.
Ping을 이용하는 방법에서 갖가지 방법이 있는데.. 표준 API 를 사용해 봅시다.
저도 사실 그동안은 네트워크카드의 정보를 읽어와서 활성화된 상태인지.. 또
루프백 디바이스인지를 가지고 체크해왔었지요.

강좌에 사용된 환경 : 델파이5, Windows 2000 pro, 익스플로러 5.0.2290
소스 정렬 : Tab size 4


-----

마이크로 소프트는 인터넷관련 API 를 간편하게 제공합니다.
FTP나 HTTP 같은 것을 만든다고 한다면 굳이 소켓을 사용할 필요가 없습니다.

하지만 이 강좌에서는 인터넷 연결상태 체크와 연결을 호출하는 것을 알아봅니다.

이 API 는 WinInet.dll 에 포함되어 있습니다.
이 DLL에 대한 인터페이스는 델파이에 이미 포함되어 있습니다.
/source/rtl/win/wininet.pas 죠.. (플랫폼 SDK에 포함된 wininet.h 를 번역하다가
죽을뻔 했음.. --;)

하지만 도움말에는 포함이 안되어 사람들이 잘 모르는 것 같습니다.

주의 할 점은 이 API 들은 익스플로러 4.0 부터 제공합니다.
다시 말하면 익스플로러가 반드시 4.0 이상이 깔려있어야 사용할 수 있다는
것입니다.
wininet.dll 을 같이 배포할 수도 있지만 별로 권장할 일은 아니죠.. MS 가 언제
업그레이드할지 모르니까요.

익스플로러버전에 따른 API 리스트는 다음과 같습니다.

API Functions Introduced in Internet Explorer 4

CreateUrlCacheGroup
DeleteUrlCacheGroup
FindFirstUrlCacheEntryEx
FindNextUrlCacheEntryEx
GetUrlCacheEntryInfoEx
HttpEndRequest
HttpSendRequestEx
InternetAutodial
InternetAutodialHangup
InternetDial
InternetGetConnectedState
InternetGoOnline
InternetHangUp
InternetReadFileEx
SetUrlCacheEntryGroup


API Functions Introduced in Internet Explorer 5

FindFirstUrlCacheGroup
FindNextUrlCacheGroup
FtpCommand
FtpGetFileSize
GetUrlCacheGroupAttribute
InternetGetConnectedStateEx
SetUrlCacheGroupAttribute


여기서 연결 상태를 체크하는 것은 InternetGetConnectedState 를 이용하면
간단합니다.

연결을 하는 것은 InternetAutodial 을 이용하면 됩니다.

이 함수들에 대한 도움말은 MSDN이나 플랫폼 SDK에 포함된 도움말을 이용하세요.

다음은 간단히 만들어본 유닛의 소스입니다.

(*
인터넷 관련 윈도우즈 API 자동화 유틸리티.

   제작자 : 김성규. allex@barobook.com
   날  짜 : 2000.09.16

*)

unit InternetUtil;

interface

uses
Windows, Dialogs, Forms, WinInet;

// Functions
function InternetConnected : Boolean;
function ConnectToInternet(Parent : TForm) : Boolean;
function AutoConnectToInternet(Parent : TForm) : Boolean;

implementation

function InternetConnected : Boolean;
var
Flags : DWORD;
begin
Flags := INTERNET_CONNECTION_LAN or INTERNET_CONNECTION_MODEM or
INTERNET_CONNECTION_PROXY;

Result := InternetGetConnectedState(@Flags, 0);
end;

function ConnectToInternet(Parent : TForm) : Boolean;
begin
Result := InternetAutodial(0, Parent.Handle);
end;

function AutoConnectToInternet(Parent : TForm) : Boolean;
begin
Result := True;
   if not InternetConnected then
   begin
    ShowMessage('인터넷에 연결되지 않았습니다. 연결을 시도합니다.');
// 모뎀으로 인터넷 연결을 시도한다.
       if ConnectToInternet(Parent) = false then
           Result := False;
   end
end;

end.


사용 예는 다음과 같습니다.

procedure TForm1.Button5Click(Sender: TObject);
begin
//
   if AutoConnectToInternet(Self) = False then
   begin
    ShowMessage('인터넷 연결에 실패하였습니다.');
   end else begin
    ShowMessage('인터넷에 연결된 상태 입니다..');
   end;
end;

간단하죠?

이상입니다.

2007/09/20 17:55 2007/09/20 17:55
Posted
Filed under Development/Delphi

단축아이콘 만들기
출처 : 델파이 3000

아래 소스는 바탕화면, 시작메뉴, 보내기 에 단축아이콘을 만드는 함수입니다.

사용예는 첨부파일 참조


procedure CreateShortcut(FileName: string; Location: ShortcutType);
var
MyObject : IUnknown;
MySLink : IShellLink;
MyPFile : IPersistFile;
Directory,
LinkName : string;
WFileName : WideString;
MyReg,
QuickLaunchReg : TRegIniFile;
begin
MyObject := CreateComObject(CLSID_ShellLink);
MySLink := MyObject as IShellLink;
MyPFile := MyObject as IPersistFile;

MySLink.SetPath(PChar(FileName));

MyReg := TRegIniFile.Create('Software\MicroSoft\Windows\CurrentVersion\Explorer');
try
  LinkName := ChangeFileExt(FileName, '.lnk');
  LinkName := ExtractFileName(LinkName);
  case Location of
    _DESKTOP    : Directory := MyReg.ReadString('Shell Folders', 'Desktop', ''); // 바탕화면
    _STARTMENU  : Directory := MyReg.ReadString('Shell Folders', 'Start Menu', '');// 시작메뉴
    _SENDTO     : Directory := MyReg.ReadString('Shell Folders', 'SendTo', '');  // 보내기
    _QUICKLAUNCH:   // 디렉토리가 유동적(사용자에 따라)
  begin
       QuickLaunchReg := TRegIniFile.Create('Software\MicroSoft\Windows\CurrentVersion\GrpConv');
       try
         Directory := QuickLaunchReg.ReadString('MapGroups', 'Quick Launch', '');
       finally
         QuickLaunchReg.Free;
       end;
     end;
 end;

 if Directory <> '' then
   begin
     WFileName := Directory + '\' + LinkName;
     MyPFile.Save(PWChar(WFileName), False);
   end;
finally
  MyReg.Free;
end;
end;  

2007/09/20 17:54 2007/09/20 17:54
Posted
Filed under Development/Delphi
WinExec(PChar('cmd /c explorer /select,"C:\test.txt"'), SW_SHOWNORMAL);
2007/09/20 17:53 2007/09/20 17:53
Posted
Filed under Development/Delphi

순수하게 설정정보만 편하게 저장하고 싶을때 쓰면좋다..

델마당에서 얻었어요~^ㅁ^
================================================================

어플리케이션에서 사용하는 특정한 내용들은 보통 .INI 파일이나 레지스트리에 저장하는데
하다보면 무진장 귀찮습니다(귀차니즘 모드).

특히, 정수, 문자 등이 아닌 열거형이나 집합형을 읽고 쓰려면 더욱 귀찮지요.
그래서 델파이가 컴포넌트의 정보를 폼(DFM)에 저장되는 방식을 빌어서 좀 간편하게 사용할 수 있도록
클래스를 한번 만들어 봤습니다.

::아래 코드::

//
// Unit        : dxConfigManager.pas
// Description : INI를 대신하는 유닛
//               누구든 자유롭게 사용하고 고쳐쓸 수 있습니다.
// Author      : 안영제(civilian@korea.com)
// History
//   1.0   2005.07.11 처음 만듦
//

unit dxConfigManager;

interface

uses
 Windows, SysUtils, Classes;

type
 TCustomConfigManager = class(TComponent)
 private
   FFileName: String;
 public
   constructor Create(AOwner: TComponent); override;

   procedure LoadFromFile;
   procedure SaveToFile;
  
   property FileName: String read FFileName write FFileName;
 end;

implementation

{ TCustomConfigManager }

constructor TCustomConfigManager.Create(AOwner: TComponent);
begin
 inherited;

 FFileName := '';
end;

//
// 파일에서 읽어오기
//
procedure TCustomConfigManager.LoadFromFile;
var
 Stream: TFileStream;
 BinStream: TMemoryStream;
begin
 if FileExists(FFileName) then
 begin
   Stream := TFileStream.Create(FFileName, fmOpenRead);
   BinStream := TMemoryStream.Create;
   try
     ObjectTextToBinary(Stream, BinStream);
     BinStream.Seek(0, soFromBeginning);
     BinStream.ReadComponent(Self);
   finally
     Stream.Free;
     BinStream.Free;
   end;
 end;
end;

//
// 파일에 저장
//
procedure TCustomConfigManager.SaveToFile;
var
 Stream: TFileStream;
 BinStream: TMemoryStream;
begin
 Stream := TFileStream.Create(FFileName, fmCreate);
 BinStream := TMemoryStream.Create;

 try
   BinStream.WriteComponent(Self);
   BinStream.Seek(0, soFromBeginning);
   ObjectBinaryToText(BinStream, Stream);
 finally
   Stream.Free;
   BinStream.Free;
 end;
end;

end.


::사용방법::

위 클래스를 어플리케이션에서 사용하려면 우선 저녀석으로 부터 상속받은 클래스를 하나 만들어야 합니다.

type
 TMyConfig = class(TCustomConfigManager)
 private
   FServerIP: String;
   FServerPort: String;
 published
   //
   // 파일에 기록되는 것은 published 절에 있는 프로퍼티만 저장됩니다.
   //
   property ServerIP: String read FServerIP write FServerIP;
   property ServerPort: String read FServerPort write FServerPort;
 end;

자 이제 클래스를 만들었으니 사용하면 되겠지요.

::저장할 때::

MyConfig := TMyConfig.Create;
MyConfig.FileName := 'cL\temp\MyConfig.dat';
MyConfig.ServerIP := '10.0.0.1';
MyConfig.ServerPort := '8080';

MyConfig.SaveToFile;
MyConfig.Free;

::읽어올 때::
MyConfig := TMyConfig.Create;
MyConfig.FileName := 'cL\temp\MyConfig.dat';
MyConfig.LoadFromFile;
MyConfig.Free;

보통 유닛(Config.pas)에 넣어놓고 쓰는 것이 편리할 겁니다.

::저장된 파일의 구조::
델파이의 DFM이 TEXT 포맷으로 저장된 것과 동일합니다.
아래 샘플은 제가 만드는 어플리케이션의 설정값을 저장한 것입니다.

object TMyConfig
 AudioOptions.Auto = True
 AudioOptions.Device = -1
 AudioOptions.Format = -1
 FixedHeight = 0
 FixedWidth = 0
 CursorOptions.ActualCursor = False
 CursorOptions.HighliteColor = clYellow
 CursorOptions.HighliteCursor = False
 CursorOptions.HighliteShape = hsCircle
 CursorOptions.HighliteSize = 0
 CursorOptions.LeftClickUse = False
 CursorOptions.LeftClickShape = csRing
 CursorOptions.LeftClickSize = 0
 CursorOptions.RightClickUse = False
 CursorOptions.RightClickShape = csRing
 CursorOptions.RightClickSize = 0
 NameOption = foAsk
 ProgramOptions = []
 RecordOptions = [ro4Times]
 SoundOptions.MouseSoundUse = False
 SoundOptions.MouseVolume = 0
 SoundOptions.KeySoundUse = False
 SoundOptions.KeyVolume = 0
 VideoOptions.Auto = True
 VideoOptions.Frame = 10
 VideoOptions.KeyFrame = 1
end


================================================================

2007/01/13 16:08 2007/01/13 16:08