GetFileInfo

Delphi 2018. 9. 6. 20:19
GetFileVersion
  
function GetFileInfo(AFileName: string): string;
var
  VerInfoSize: Cardinal;
  VerValueSize: Cardinal;
  Dummy: Cardinal;
  PVerInfo: Pointer;
  PVerValue: PVSFixedFileInfo;
begin
  Result := '';

  VerInfoSize := GetFileVersionInfoSize(PWideChar(AFileName), Dummy);
  GetMem(PVerInfo, VerInfoSize);
  try
    if GetFileVersionInfo(PWideChar(AFileName), 0, VerInfoSize, PVerInfo) then
      if VerQueryValue(PVerInfo, '\', Pointer(PVerValue), VerValueSize) then
        with PVerValue^ do
        begin
          Result := Format('%d.%d.%d.%d', [HiWord(dwFileVersionMS), LoWord(dwFileVersionMS), HiWord(dwFileVersionLS), LoWord(dwFileVersionLS)]);
        end;
  finally
    FreeMem(PVerInfo, VerInfoSize);
  end;
end;
Posted by Revers Tuna
,
델마당에서 이것저것 구경하며 놀던중 오래전에 봤었던 Guard함수라는 것을 오랫만에 다시 보게 됬다. 출처: http://www.delmadang.com/community/bbs_view.asp?bbsNo=3&bbsCat=0&st=S&keyword=guard&indx=196963&keyword1=guard&keyword2=&page=1 
델마당 글을 그대로 옮겨서 기록해 보자..
  
unit Guards;

interface

function Guard(out Reference; Instance: TObject): IUnknown;

implementation

type
  TGuardObject = class(TInterfacedObject)
  private
    FInstance: TObject;
  public
    constructor Create(Instance: TObject);
    destructor Destroy; override;
  end;

{ TGuardObject }

constructor TGuardObject.Create(Instance: TObject);
begin
  FInstance:= Instance;
end;

destructor TGuardObject.Destroy;
begin
  FInstance.Free;
  inherited;
end;

function Guard(out Reference; Instance: TObject): IUnknown;
begin
  Result:= TGuardObject.Create(Instance);
  TObject(Reference):= Instance;
end;

end.
사용예:
  
procedure TForm1.Button1Click(Sender: TObject);
var List: TStringList;
begin
  Guard(List, TStringList.Create); 
  List.Add('1234');
end;
해설: JCL의 Guard와 같은것인데 좀더 간결하게 만든것입니다. 원리는 간단합니다. Guard는 IUnknown을 반환하는데 이것을 일부러 받지 않는것이죠. 그러면 IUnknown은 임시변수에 저장됩니다. 임시변수는 지역변수와 마찬가지로 프로시져가 종료할때까지 유지됩니다. 임시변수가 IUnknown 이므로 종료할때 자동 Free되고 이때 넘겨줬던 객체도 같이 Free 되는것입니다.


'Delphi' 카테고리의 다른 글

FireDAC DataSet의 변경된 Record 확인  (0) 2018.09.10
GetFileInfo  (0) 2018.09.06
모든 콤포넌트의 font를 변경  (0) 2018.08.31
POSTMESSAGE로 STRING전송  (0) 2018.08.31
백업파일(~pas, ~dfm) 자동 생성 제한  (0) 2015.11.19
Posted by Revers Tuna
,
Change all component's font in TForm
(Tip. After exception class check 'IF' using....)
  
uses TypInfo;

var
  i: Integer;
  Prop: PPropInfo;
begin
  for i := 0 to AForm.ComponentCount -1 do
  begin

    if AForm.Components[i] is "Exception Class" then
    begin
      {Exception Class Coding}
    end
    else begin
      Prop := nil;
      Prop := GetPropInfo(AForm.Components[i].ClassInfo, 'Font');

      if Prop <> nil then
        SetPropValue(GetObjectProp(AForm.Components[i], 'Font'), 'Name', AFontName);
    end; // End of if AForm.Components...
  end;  // End of for
end;

'Delphi' 카테고리의 다른 글

GetFileInfo  (0) 2018.09.06
Guard : 메모리 자동해제...  (0) 2018.08.31
POSTMESSAGE로 STRING전송  (0) 2018.08.31
백업파일(~pas, ~dfm) 자동 생성 제한  (0) 2015.11.19
TWinControl을 동그란 모양으로 깍기  (0) 2015.11.06
Posted by Revers Tuna
,

POSTMESSAGE로 STRING전송

Delphi 2018. 8. 31. 11:27
*Use WM_COPYDATA when passing STRING via SENDMESSAGE.
[SENDER]
  
var
  vHwnd: HWND;
  sStr: PChar;
  vLParam: DWORD;
begin
    vHwnd := FindWindow('TfrmMain', nil);

    if vHwnd <> 0 then
    begin
        sStr := PChar('input send string');
        vLParam := GlobalAddAtom(sStr);
        PostMessage(vHwnd, WM_USER + 9791, LongInt(Handle), vLParam);
    end;
end;
[RECEIVER]
  
  procedure PostMessageFromString(var msg: TMessage); message WM_USER + 9791;
  
var
  pStr: PChar;
  sString: string;
begin
   GetMem(pStr, 1024);

    if GlobalGetAtomName(msg.LParam, pStr, 1024) > 0 then
      sString:= StrPas(pStr);

    GlobalDeleteAtom(msg.LParam);
    FreeMem(pStr);


    ShowMessage(sString);
end;

'Delphi' 카테고리의 다른 글

Guard : 메모리 자동해제...  (0) 2018.08.31
모든 콤포넌트의 font를 변경  (0) 2018.08.31
백업파일(~pas, ~dfm) 자동 생성 제한  (0) 2015.11.19
TWinControl을 동그란 모양으로 깍기  (0) 2015.11.06
Edit 키 입력 제어  (0) 2015.11.05
Posted by Revers Tuna
,

프로그램을 개발하다 보면 자동으로 생성되는 백업파일이 불필요하게 느껴질때도 있다.

이런때 Options에서 자동생성을 막아 두면 편리하다.


[Delphi7]

Tools -> Editor Options -> Display -> Display and file options -> Create backup file


'Delphi' 카테고리의 다른 글

모든 콤포넌트의 font를 변경  (0) 2018.08.31
POSTMESSAGE로 STRING전송  (0) 2018.08.31
TWinControl을 동그란 모양으로 깍기  (0) 2015.11.06
Edit 키 입력 제어  (0) 2015.11.05
폴더 선택  (0) 2015.11.05
Posted by Revers Tuna
,

procedure DrawRounded(Control: TWinControl; RoundPer: integer) ;
var
   R: TRect;
   Rgn: HRGN;
begin
   with Control do
   begin
     R := ClientRect;
     rgn := CreateRoundRectRgn(R.Left, R.Top, R.Right, R.Bottom, RoundPer, RoundPer) ;
     Perform(EM_GETRECT, 0, lParam(@r)) ;
     InflateRect(r, - 4, - 4) ;
     Perform(EM_SETRECTNP, 0, lParam(@r)) ;
     SetWindowRgn(Handle, rgn, True) ;
     Invalidate;
   end;
end;

'Delphi' 카테고리의 다른 글

POSTMESSAGE로 STRING전송  (0) 2018.08.31
백업파일(~pas, ~dfm) 자동 생성 제한  (0) 2015.11.19
Edit 키 입력 제어  (0) 2015.11.05
폴더 선택  (0) 2015.11.05
StrToInt의 차이  (0) 2015.06.16
Posted by Revers Tuna
,

Edit 키 입력 제어

Delphi 2015. 11. 5. 16:53

procedure OnKeyPress(Sender: TObject; var Key: Char);

begin

  if Key in ['제한할 키'] then

    Key := #0;

end;

'Delphi' 카테고리의 다른 글

백업파일(~pas, ~dfm) 자동 생성 제한  (0) 2015.11.19
TWinControl을 동그란 모양으로 깍기  (0) 2015.11.06
폴더 선택  (0) 2015.11.05
StrToInt의 차이  (0) 2015.06.16
[델파이] 숫자를 한글숫자(금액 같은 경우)로...  (2) 2015.05.26
Posted by Revers Tuna
,

폴더 선택

Delphi 2015. 11. 5. 10:55

OpenDialog처럼 Folder를 선택할 수 있는 기능

function SelectDirectory(var Directory: string; Options: TSelectDirOpts; HelpCtx: Longint): Boolean; overload;
function SelectDirectory(const Caption: string; const Root: WideString; var Directory: string): Boolean; overload;

uses FileCtrl;

 

var

  vDir: string;

begin

  // SelectDirectory("Dialog Caption", "Root", "var Directory)

  if SelectDirectory('Select Directory', 'D:\', vDir) then

    Edit1.Text := vDir;

end;

'Delphi' 카테고리의 다른 글

TWinControl을 동그란 모양으로 깍기  (0) 2015.11.06
Edit 키 입력 제어  (0) 2015.11.05
StrToInt의 차이  (0) 2015.06.16
[델파이] 숫자를 한글숫자(금액 같은 경우)로...  (2) 2015.05.26
Application Events Shortcut  (0) 2015.04.30
Posted by Revers Tuna
,

StrToInt의 차이

Delphi 2015. 6. 16. 15:47

StrToInt는 문자로된 숫자를 숫자로 변환하는 function이다.

숫자가 아닌 순수 문자를 변환하게 되면 에러가 발생한다.

일반적으로 문자인지 숫자인지 판별하기 위해서는 StrToIntDef를 사용하지만 이 함수로도 판독이 되지 않는 경우가 있다.

예를 들어 'X01'의 경우 X를 헥사로 인식하기 때문에 StrToInt('X01') = 1이 된다.


'Delphi' 카테고리의 다른 글

TWinControl을 동그란 모양으로 깍기  (0) 2015.11.06
Edit 키 입력 제어  (0) 2015.11.05
폴더 선택  (0) 2015.11.05
[델파이] 숫자를 한글숫자(금액 같은 경우)로...  (2) 2015.05.26
Application Events Shortcut  (0) 2015.04.30
Posted by Revers Tuna
,

function IntToKorNum(AValue: Int64): string;
const
  NumberChar: array['0'..'9'] of string = ('영', '일', '이', '삼', '사', '오', '육', '칠', '팔', '구');
  LevelChar: array[0..3] of string = ('', '십', '백', '천');
  DecimalChar: array[0..5] of string = ('', '만', '억', '조', '경', '현');
var
  vStr: string;
  vDecimal: Boolean;
  i, vLevel: Integer;
begin
  Result := '';

  vStr := IntToStr(AValue);
  vDecimal := False;

  for i := 1 to Length(vStr) do
  begin
    vLevel := Length(vStr) -i;

    if vStr[i] <> '0' then
    begin
      vDecimal := True;

      if vLevel mod 4 = 0 then
      begin
        Result := Result + NumberChar[vStr[i]] + Decimalchar[vLevel div 4];
        vDecimal := False;
      end
      else
        Result := Result + NumberChar[vStr[i]] + LevelChar[vLevel mod 4];
    end
    else if (vLevel mod 4 = 0) and vDecimal then
    begin
      Result := Result + DecimalChar[vLevel div 4];
      vDecimal := False;
    end;

  end;
end;

'Delphi' 카테고리의 다른 글

TWinControl을 동그란 모양으로 깍기  (0) 2015.11.06
Edit 키 입력 제어  (0) 2015.11.05
폴더 선택  (0) 2015.11.05
StrToInt의 차이  (0) 2015.06.16
Application Events Shortcut  (0) 2015.04.30
Posted by Revers Tuna
,