[IDE] 델파이 작업경로 바로가기

2012.02.10 10:10
델파이로 개발 작업 중 현재 소스 경로로 이동해야 되는 일이 종종 있죠...

그럴때마다 explorer를 실행해서 이동하려면 번거롭습니다. 

그럴때 유용한  기능을 소개합니다.

* 델파이 메뉴에 현재 작업 중인 작업경로를 여는 메뉴를 추가합니다.

우선 예전 아는 선배에게 들은 재미있는 이야기 하나.

선배는 핸드폰 관련된 개발 일을 했습니다. 

동료와 이야기 중 "Window CE에서는 탐색기를 어떻게 열어요?" 라는 질문에

근처에 있던 외국인 개발자 曰

"뭔 새끼? 탐새끼?"

-_-;

 
그래서 그 이야기를 들은 저는 그 이후로 탐새끼라는 단어를 주로 사용합니다. 

그러면 위의 탐새끼를 델파이에 등록해 보겠습니다. 

1, Tools > Configure Tools 선택
 

 2, [Add] 버튼 클릭 후 아래와 같이 입력 후 [OK] 클릭
 

3, Tools > 탐새끼 등록 확인

 위와 같이 등록하시면 "탐새끼"를 통해 현재 작업 중인 경로의 탐색기가 실행 됩니다.

참 좋은 새끼(?)죠?

끝~ 

험프리.김현수 Delphi/C++Builder 델파이, 작업경로이동, 탐새끼

델파이 구조체(record) 사용 팁

2012.01.31 10:37

구조체(Record) 많이 사용하시죠?

생각보다 구조체를 사용하는 방법이 다양해서 소개하려 합니다.

우선 간단한 샘플
연/월/일 형식으로 데이터 입력 후 한번에 데이터 저장하는 코드입니다. 

type
  TRecordType = (rtData, rtStructure);

  TDateRec = record
    case TRecordType of
    rtData:       (Data: array[0..5] of Byte);
    rtStructure:  (Year, Month, Day: Word);
  end;
위와 같이 구조체가 정의 되어 있습니다.

2가지 타입(rtData, rtStructure)로 사용해 봅니다.
 
| rtStructure - 연월일 형식으로 입력
procedure TForm2.btnAddClick(Sender: TObject);
var
  Rec: TDateRec;
begin
  DecodeDate(dtpDate.Date, Rec.Year, Rec.Month, Rec.Day);

  AddDate(Rec);
end;

| rtData - 데이터 형식으로 저장
procedure TForm2.AddDate(ADate: TDateRec);
var
  FilePath: string;
  FS: TFileStream;
begin
  FilePath := ExtractFilePath(Application.ExeName) + 'test.dat';

  FS := TFileStream.Create(FilePath, IfThen(FileExists(FilePath), fmOpenReadWrite, fmCreate));
  try
    FS.Position := FS.Size;
    FS.Write(ADate.Data, SizeOf(ADate.Data));
  finally
    FS.Free;
  end;
end;

 위의 2가지 코드대로 하나의 구조체를 다양한 방식으로 사용가능합니다.
TRecordType 은 제가 임의로 2개를 정의한 것이므로, 여러개로 나누어 사용하여도 됩니다.
또한, 굳이 위 구조체가 아니어도 아래와 같은 코드로도 사용 가능합니다.

| Messages.pas의 window message record 
  TMessage = packed record
    Msg: Cardinal;
    case Integer of
      0: (
        WParam: WPARAM;
        LParam: LPARAM;
        Result: LRESULT);
      1: (
        WParamLo: Word;
        WParamHi: Word;
        LParamLo: Word;
        LParamHi: Word;
        ResultLo: Word;
        ResultHi: Word);
  end;
끝~

험프리.김현수 Delphi/C++Builder Delphi, Packed record, Record

델파이 2010(2009)에서 DSPack 설치

2011.12.20 12:51
델파이 2009, 2010에서 설치 가능한 DSPack package(버전은 2.3.3) 입니다.

\src\DSPack\DSUtil.pas 가   \src\DSPack\DSUtils.pas 로 변경
(이유: Delphi DBX Framework인 DSUtil.pas와 충돌)
기존 작성된 소스는 주의 필요

DSPack project : 
DSPack is a set of Components and class to write Multimedia Applications using MS Direct Show and DirectX technologies.

험프리.김현수 Delphi/C++Builder

2GB 이상 파일크기 구하는 함수

2011.12.19 10:51
function FileSize(const AFileName: string): Int64;
var
  srData: TSearchRec;
  FileData: DWORD;
  SizeHigh, SizeLow: Integer;
  RetVal: array[0..7] of Byte;
begin  Result := -1;
{$IFDEF MSWINDOWS}
  FileData := FindFirst(AFileName, faReadOnly, srData);
  if FileData <> 0 then
    Exit;

  SizeHigh := srData.FindData.nFileSizeHigh;
  SizeLow  := srData.FindData.nFileSizeLow;
  ZeroMemory(@RetVal[0], SizeOf(RetVal));
  Move(SizeLow, RetVal[0], 4);
  Move(SizeHigh, RetVal[4], 4);
  Move(RetVal[0], Result, 8);
{$ENDIF}
end;

험프리.김현수 Delphi/C++Builder Delphi, 델파이, 파일사이즈

[Delphi] Wild Card 문자비교

2010.03.23 12:33
문자열에서 Wild Card('?': single character, '*': multi character)를 포함하여 비교한다.
function MatchString(ASource, APattern: String): Boolean;
  function _MatchPattern(element, pattern: PChar): Boolean;
  begin
    if 0 = StrComp(pattern, '*') then
      Result := True
    else if (element^ = Chr(0)) and (pattern^ <> Chr(0)) then
      Result := False
    else if element^ = Chr(0) then
      Result := True
    else
    begin
      case pattern^ of
      '*': if _MatchPattern(element, @pattern[1]) then
             Result := True
           else
             Result := _MatchPattern(@element[1],pattern);
      '?': Result := _MatchPattern(@element[1],@pattern[1]);
      else
        if element^ = pattern^ then
          Result := _MatchPattern(@element[1],@pattern[1])
        else
          Result := False;
      end;
    end;
  end;
var
  pSource, pPattern: PChar;
begin
  pSource   := StrAlloc(Length(ASource)+1);
  pPattern  := StrAlloc(Length(APattern)+1);
  try
    StrPCopy(pSource,   ASource);
    StrPCopy(pPattern,  APattern);

    Result := _MatchPattern(pSource, pPattern);
  finally
    StrDispose(pSource);
    StrDispose(pPattern);
  end;
end;
출처 : 인터넷 어딘가...:-)
// sample
var 
  source: string;
  target: string;
begin
  source := 'abcdefg';
  target := 'ab*e?g';  // correct('cd' = '*', 'f' = '?')

  if MatchString(source, target) then  
    ShowMessage('Correct match')
  else 
    ShowMessage('Incorrect match')
  ;
end;

험프리.김현수 Delphi/C++Builder Delphi, 델파이, 문자비교