Archive for the ‘MadeByKidd’ tag
TimeSync: Windows7에서 안되는 문제
SyncTime 이라는 컴퓨터의 시간을 타입서버와 맞춰주는 개인적으로 만든 프로그램이 있었지요.
그런데 Windows 7으로 업그레이드한 후 작동을 하지 않습니다. 아주아주 간단한 프로그램인데 말입니다.
뒤져보니 SetLocalTime API가 SE_SYSTEMTIME_NAME 이라는 권한을 필요하다고 하네요. Windows Vista 이후 부터는 시간이라는 것도 시스템 자원이라는 개념으로 들어갔다는군요.
그래서 이 권한을 획득하고 처리했는데… 안됩니다. 뭐냐고.. Indy에서도 확인해보니 SE_SYSTEMTIME_NAME 권한을 획득하고 처리하고 있지요. 하라는데로 다 했는데 SetLocalTime 호출하면 오류가 납니다.
뒤져보니 사용자가 SetLocalTime을 호출할 이유가 없다라는 답도 있었지만, 필요에 따라서는 시간을 맞춰줄 필요가 있는데 말입니다. 위 링크에 이야기 언급한 서비스로 만드는건 배보다 배꼽이 큽니다.
생각하다가 그냥 서비스까지 동원해서 작업해버리기로 했습니다. 덕분에 설치하는 것이 조금 복잡해 지긴 했습니다. 이렇게 복잡해지니 단순 실행파일만 가지고는 안되서 셋업본으로 만들었습니다.
설치 및 다운로드는 TimeSync 페이지를 보세요.
pgdbx4 0.4 Release: dbExpress driver for PostgreSQL
그간 방치해뒀던 PostgreSQL용 dbExpress 드라이버를 오늘 좀 수정했습니다.
- Boolean 형태가 잘 안가져오던 문제
- BYTEA/TEXT 타입이 Next를 해도 다음 row를 가져오지 못하던 문제
- 기타 기억안나는 자잘한 것…
자세한 내용은 pgexp4 페이지를 참고하세요.
TLinkLabel에 WordWrap 적용하기
TLinkLabel은 사용하기 따라서 상당히 유용합니다. 근디 WordWrap이 없군요. 이게 없으니깐 AutoSize를 줘도 한줄로 길게 쭈욱 나와버립니다. TLabel의 WordWrap과 같이 동작하면 참 편하겠는데 말이지요. 어찌 되었건 아래처럼 MaxWidth 변수가 사용되는 부분만 몇줄 추가하면 원하는데로 됩니다.
procedure TnxLinkLabel.AdjustBounds;
var
DC: HDC;
SaveFont: HFont;
TextSize: TSize;
Parsed: string;
MaxWidth: Integer;
begin
if not (csLoading in ComponentState) and FAutoSize then
begin
if CheckWin32Version(6) and UseThemes then
begin
if HandleAllocated then
begin
if FWordWrap then
MaxWidth := ClientWidth else
MaxWidth := MaxInt;
SendGetStructMessage(Handle, LM_GETIDEALSIZE, MaxWidth, TextSize);
SetBounds(Left, Top, TextSize.cx + (GetSystemMetrics(SM_CXBORDER) * 4),
TextSize.cy + (GetSystemMetrics(SM_CYBORDER) * 4));
end;
end
else
TCustomLinkLabel.AdjustBounds를 단 몇 줄 수정하면 되는데, AdjustBounds가 virtual로만 되어있어도 편한데 그게 아니라서 이렇게 수정만 해서는 안됩니다. 그렇다고 vcl을 직접 다시 컴파일하기도 그렇고..
결국은 TCustomLinkLabel, TLinkLabel을 모두 몽땅 가져다가 새 이름으로 콤포넌트를 등록해버렸군요. 찝찝하지만 Go~
wslib v2
wslib v2가 릴리스 되었습니다.
TwsListView에서 컬럼을 클릭하면 자동으로 정렬하는 옵션을 추가했네요. 리스트뷰 정렬에 이제 코딩이 하나도 필요없습니다.
덧) 버전을 r2에서 v2로 변경했습니다. Google code 위키에서 r2를 SubVersion revision으로 인식하고 바로 거기로 링크를 해버리네요.
시간 동기화하기
월요일 아침엔 회의가 있습니다. 컴퓨터 시간으로 확인하고 가보니.. 헉. . 지각입니다. 이놈의 컴퓨터 시간이 늦어진거죠. 뭔 이런 일이.. 저기 있는 아날로그 시계는 정확한데, 항상 앞에두고 보는 시계가 부정확합니다.
그래서 시간 동기화하는 툴 만들었습니다. Indy를 이용하니 소스도 23줄 밖에 안됩니다. 뭐 Indy가 다하니깐요.
program TimeSync;
uses
Windows,
SysUtils,
IdSNTP;
{$R *.res}
begin
try
with TIdSNTP.Create(nil) do
try
Host := '2.kr.pool.ntp.org';
SyncTime;
finally
Free;
end;
except
on E: Exception do
MessageBox(0, PChar(E.Message), 'Error', MB_ICONEXCLAMATION);
end;
end.
시작 프로그램에 등록해야겠습니다.
추가: 10.11.02
Window Vista, Windows 7에서는 동작하지 않습니다. MSDN에 보면 SetLocalTime이 SE_SYSTEMTIME_NAME 권한이 필요하다고 되어있지요. 그래서 그렇게 해주고 했는데 안됩니다. ㅡㅡ, 그래서 Indy 소스도 뒤져봤는데 Indy도 SE_SYSTEMTIME_NAME 권한을 획득하고 처리하고 있습니다. 그래도 안됩니다.
결국 관리자 권한에서 실행하는 수 밖에 없군요.
찾아보면서 본 글중에 하나는 “도데체 일반 사용자가 시간을 조종할 필요가 뭐가있냐?”라는 건데, 해주고픈 말은 야 이눔아 내 컴퓨터 시간이 잘못되어있다니깐!!!! 그래서 정확한 시간으로 맞추고 싶다고!!!!