kkuzil.own@gmail.com

Posted
Filed under Development/Delphi

기존의 패치들을 보면 VMT를 얻어서 테이블을 수정하거나 하는 등의 복잡한 방법이지만, 이 새로운 트릭에서는 이러한 구현없이 수정없이 그냥 간단한 구현 유닛을 uses 절 맨 마지막에 추가하는 것만으로 쉽게 해결을 할 수 있습니다.

실질적인 패치 코딩에서도 아주 간단하게 구현을 할 수 있습니다. 따로 패치를 위한 추가적인 코드도 필요없게 됩니다.

unit HVProgressBarVistaFix;

interface

uses Messages, ComCtrls;

type
TProgressBar = class(ComCtrls.TProgressBar) // 이곳의 선언이 이 코드의 핵심. 새로 선언된 아래의 핸들러가 적용됩니다.
private
procedure WMEraseBkgnd(var Message: TWmEraseBkgnd);
message WM_ERASEBKGND;
end;

implementation

procedure TProgressBar.WMEraseBkgnd(var Message: TWmEraseBkgnd);
begin
DefaultHandler(Message);
end;

end.

사용 방법은

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


일반적으로 우리들은 이 문제를 해결하기 위해 TProgressBar를 계승해서 이러쿵저러쿵 해야 한다고 생각할 것입니다. 하지만 유닛 이름을 머리에 붙인 클래스 이름(위의 경우에는 ComCtrls.TProgressBar)을 사용하면 기존의 해당 클래스(위의 경우 TProgressBar)를 치환하는 효과가 일어납니다.


참고하시길.

내용 출처 : http://hallvards.blogspot.com/2007/04/hack16-published-field-rtti-replacement.html

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

- Component Selector - X
안씀

- Script Wizard - X
안씀

- Coding Toolset - X
안씀
한글 입력 시 Ctrl + S를 누르거나 Ctrl + / 키를 누르면 주석이 걸리면서 마지막 글자가 내려가는 문제 발생

- 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