천객만래 [千客萬來] (It has an interminable succession of visitors)

Windows 7 에서 델파이 도움말 사용하기


ARCHITECTURE에 따라 x86 (32bits)    x64 (64bits) 설치


Windows6.1-KB917607-x64.msu

Windows6.1-KB917607-x86.msu



'IT - 개발' 카테고리의 다른 글

마이랩뷰 사이트 운영 종료 안내  (0) 2018.10.30
Windows 7 에서 델파이 도움말 사용하기  (0) 2018.10.29
PI System  (0) 2018.10.13
DAS, NAS, SAN 개념  (0) 2018.09.27
IaaS PaaS SaaS  (0) 2018.09.19
2017 가장 멋진 앱 개발 플랫폼 Top 10  (0) 2018.08.13
Posted by SB패밀리

델파이 메모리 누수 리포트 하기






https://youtu.be/rTkQt5CK4bw

Posted by SB패밀리

Rad Studio XE 버전별 멀티디바이스 지원 정보




안드로이드, iOS, Android, 아이오에스, RAD Studio, DELPHI, 모바일,

Posted by SB패밀리

[워터마킹] DCT영역에서의 적응적 워터마킹 구현 예

2001.07.31



제목 : DCT영역에서의 적응적 워터마킹 구현 프로그램 
개발언어 : 델파이 
플랫폼 : Win9x/NT 
제작자 : 배경환(97),김해권(93),이재근(94),이정환(Prof) 
제작일 : 1999년11월 3일 Watermarking simulator 0.1.119 버젼이 드디어 공개되었습니다. 사정상 소스의 공개는 불가능함을 알려드리며, 가장 단순화 시켜서 적응적 워터마킹을 구현하는 예를 보여드립니다. 11월 3일자로 공개하며, Hue의 "Hidden Digital Watermarking in Images" 논문을 참조하여 만들었습니다. 



19991103_public.zip



Posted by SB패밀리

Delphi 설치 후 TADOConnection(dbgo)이 없다?



델파이(Rad Studio)를 설치했는데


프로젝트를 로딩하는 중에 TADOConnection이 없다고 나온다면.?


황당하지만 어쩔 수 없이 수동으로 등록을 해주어야 한다.


<Delphi 2010 기준>

TADOConnection

C:\Program Files (x86)\Embarcadero\RAD Studio\7.0\bin\dclado140.bpl

* install package 메뉴를 선택해서 위의 bpl을 등록한다.



아래의 방법도 있다.

설치 DVD(ISO)에서 dbpack_setup.exe를 실행해서 modify 옵션으로 설치하면 package가 델파이에 등록된다.


Database package

[DVD Drive]:\Install\dbpack_setup.exe

(RAD Studio 설치후 데이터베이스(ex:adodb)패키지가 없을 실행해서 modify 실행)





Posted by SB패밀리

델파이 컴포넌트

delphi VCL



http://sf.net/projects/graphics32http://www.graphics32.org/wiki/
February 25, 2005: Release of Graphics32 1.7.1. 
개발환경 : D4,5,6,7,2005 C5,6

Graphics32 is a library designed for fast 32-bit graphics handling on Delphi and Kylix. Optimized for 32-bit pixel formats, it provides fast operations with pixels and graphic primitives, and in most cases Graphics32 outperforms the standard TCanvas? classes. It is almost a hundred times faster in per-pixel access and about 2–5 times faster in drawing lines. 

Features
Some of Graphics32 features include: 

Fast per-pixel access up to 100 times faster compared to standard TBitmap?; 
High-performance Bitmap alpha blending (including per-pixel alpha blending); 
Pixel, line and polygon antialiasing with sub-pixel accuracy (combined with alpha blending); 
Arbitrary polygon transformations and custom fillings; 
Bitmap resampling with high quality reconstruction filters (e.g. Lanczos, Cubic, Mitchell); 
A unique state-of-the-art rasterization system; 
Affine transformations of bitmaps: rotations, scaling, etc with sub-pixel accuracy; 
Arbitrary projective transformations of bitmaps; 
Arbitrary remapping transformations of bitmaps (e.g. for Warping, Morphing); 
Flexible supersampling implementation for maximum sampling quality; 
Flicker-free image displaying components with optimized double buffering via advanced MicroTiles? based repaint optimizer; 
Multiple customizible easy-to-use overlay layers; 
Locking of bitmaps for safe multithreading; 
A property editor for RGB and alpha channel loading; 
Design-time loading of image formats supported by standard TPicture; 
Works on Borland Delphi, C++ Builder and Kylix. 

As of version 1.5.1b Graphics32 is licensed under the terms of the Mozilla Public License. 

+++++ 설치

Graphics32 supports Delphi versions 4, 5, and 6, and C++ Builder 5.

Note, because some properties of range bars and gage bars have been changed, you can obtain some error messages while opening your previous Graphics32 projects. Just ignore these messages and Delphi will fix DFM files automatically.



Unzip the files; 
Add location of main installation directory to Tools | Environment Options | Library | Library Path. 
Select File | Open... on the menu bar. Set Files of type to Delphi package source, locate and open GR32_DSGN_D6.dpk (GR32_DSGN_D5 for Delphi5, GR32_DSGN_D4 for Delphi4 or GR32_DSGN_B5 for C++ Builder); 
A package editor window will appear. Click Compile, then click Install; 
If compiler asks whether you want to save changes, usually it is a good idea to choose No. 



+++++ 설명:

Additional Topics
Line Patterns

Using TImage32

Classes (Alphabetical)
TAffineTransformation

TArrowBar

TBitmap32

TBitmap32Collection

TBitmap32Item

TBitmap32List

TBitmapLayer

TByteMap

TCustomGaugeBar

TCustomImage32

TCustomImgView32

TCustomLayer

TCustomMap

TCustomPaintBox32

TCustomRangeBar

TGaugeBar

TImage32

TImgView32

TIVScrollProperties

TLayerCollection

TPaintBox32

TPaintStages

TPolygon32

TPositionedLayer

TProjectiveTransformation

TRangeBar

TRubberbandLayer

TThreadPersistent

TTransformation
Classes (Hierarchy)
TArrowBar

TCustomGaugeBar

TGaugeBar

TCustomRangeBar

TRangeBar

TBitmap32Collection

TBitmap32Item

TBitmap32List

TCustomLayer

TPositionedLayer

TBitmapLayer

TRubberbandLayer

TCustomPaintBox32

TCustomImage32

TCustomImgView32

TImgView32

TImage32

TPaintBox32

TIVScrollProperties

TLayerCollection

TPaintStages

TPolygon32

TThreadPersistent

TCustomMap

TBitmap32

TByteMap

TTransformation

TAffineTransformation

TProjectiveTransformation


Routines
AlphaComponent  Creating Points  Lighten  
AlphaToGrayscale  Creating Rectangles  OffsetRect  
ApplyLUT  EMMS  Polygon  
Blend  EqualRect  Polyline  
BlendEx  Fixed Point Math  PolyPolygon  
BlockTransfer  Gray32  PolyPolyline  
BlueComponent  GreenComponent  PtInRect  
Color32  HSLtoRGB  RedComponent  
ColorAdd  InflateRect  RGBtoHSL  
ColorMax  Intensity  SetAlpha  
ColorMin  IntensityToAlpha  SetBorderTransparent  
ColorModulate  IntersectRect  SetGamma  
ColorSub  Invert  StretchTransfer  
ColorToGrayScale  InvertRGB  Transform  
Combine  IsRectEmpty  WinColor  

Types
Arrays  TFloatMatrix  TRBHandles  
Color Types  TLUT8  TRBStyle  
Point Types  TPaintBoxOptions  TRectRounding  
Rectangle Types  TPaintStage  TSize  
TConversionType  TPixelCombineEvent  TSizeGripStyle  
TDrawMode  TPolyFillMode  TStretchFilter  
TFixed  TRBBackgnd  

Variables
MMX_ACTIVE  

Constants
Color Constants  IdentityMatrix  Paint Stage Constants  
G32Version  Layer Options Bits  

Units
GR32  GR32_Filters  GR32_Polygons  
GR32_Blend  GR32_Image  GR32_RangeBars  
GR32_ByteMaps  GR32_Layers  GR32_Transforms  



Graphics32_1_7_1.zip


Posted by SB패밀리

델파이 영상처리 VCL Sobakcc Lab [2003.10.16 ver 0.1.10]







SB_Lab

제작: 소백촌닭(sobakcc@nate.com) http://sb.pe.kr
내용: 영상처리 관련 컴포넌트

/****************************************************************************

[비고]

컴포넌트 상에 버그나 개선할 점이 있다면 홈페이지나 메일로 알려주시면
고맙겠습니다.

/****************************************************************************

[VERSION HISTORY]

### 2003.10.16 ver 0.1.10

  - Added: TSBImageEffect: Brighten,SharpenEdge,Spray추가.

### 2003.10.14 ver 0.1.9

  - Added: SB_ImageEffect: Source 이미지로 원본과 사용본 선택가능.
  - Added: SB_ImageEffectView: Source 이미지로 원본과 사용본 선택가능.
  - Added: CropMode 추가로 CropRect(영역) 리턴가능.
  - Fixed: UseOriginalBitmap = False 일경우 DblClick() 기능 버그 수정.

### 2003.10.09 ver 0.1.8

  - Added: TSBImageEffectView VCL - Image View기능. (Zoom, FittoWindow, Aspect, Image Effect기능)

### 2003.10.08 ver 0.1.7

  - Added: TSBImage32 VCL

### 2003.10.07 ver 0.1.6

  - Added: Sharpening, Free Rotate.

### 2003.10.06 ver 0.1.5

  - Added: Zoom(AntiAlias 포함), Cropping, Blurring.

### 2003.10.02 ver 0.1.4

  - Added: Flip-Horizontal, Flip-Vertical.

### 2003.10.01 ver 0.1.3

  - Added: 'Gaussian Blur', 'SplitBlur', 'Add Color-Noise', 'Add Mono-Noise',
           'AntiAlias', 'Contrast', 'FishEye', 'Lightness', 'Darkness',
           'Saturation', 'Mosaic', 'Twist', 'SplitLight', 'Tile', 'SpotLight',
           'Trace', 'Emboss', 'Solarize', 'Posterize', 'Grayscale', 'Invert'.



Sobakcc_Lab.zip


Posted by SB패밀리






소백촌닭 : 델파이에서 암호화 DLL 생성
델파이/씨빌더에서 암호화 DLL 사용 예제

DLL 작성 : 델파이 5 버전




Posted by SB패밀리

아래의 과정을 거치는 것 외에 특별한 것은 없음..

클립보드 이미지 데이터 -> 비트맵 -> JPEG






uses 에 Jpeg, ClipBrd 추가해야 함.


procedure SaveClipBoardPicture(ImgPath: String);

var

  Btm: TBitmap;

  Jpg: TJpegImage;


begin  

  Btm:=TBitmap.Create;

  Jpg:=TJpegImage.Create;

  try

      // 1. 클립보드 -> 비트맵

      Btm.Assign(ClipBoard);

      // 2. 비트맵 -> JPEG

      Jpg.Assign(Btm);


      // 압축퀄리티 설정

      Jpg.CompressionQuality:=50;

      // 파일로 저장

      Jpg.SaveToFile(ImgPath);

  finally

    FreeAndNil(Jpg);

    FreeAndNil(Btm);

  end;

end;

Posted by SB패밀리

[DELPHI TIP] TAdvStringGrid에 Combobox 사용하는 방법..




두가지 방법이 있습니다.
셀을 수정할때 콤보박스나 기타 컨트롤이 표시되는방법과
첨부터 나와있는방법....

두가지다 해보면요...
GetEditorType 이벤트를 이용하시면 에디트하실 때만 보입니다. 1번컬럼을 그렇게 만들어보겠습니다.

그리고 2,3번은 radio버튼으로 만들어보겠습니다. 
첨부터 보이실려면 Formcreate이벤트나 기타 함수에서 한번 만들어주시면됩니다.
Formcreate에서 만들어보죠.

먼저 폼생성시

procedure TForm1.FormCreate(Sender: TObject);
var
i:integer;

begin
radopt1:=tstringlist.Create;
radopt1.Add('Delphi');
radopt1.Add('C++Builder');
radopt1.Add('JBuilder');
radopt2:=tstringlist.Create;
radopt2.Add('Std');
radopt2.Add('Prof');
radopt2.Add('C/S');
with Grid do
begin
ColCount := 4;
RowCount := 10;
for i:=1 to rowcount-1 do
begin
addradio(2,i,0,-1,radopt1);
addradio(3,i,1,-1,radopt2);
end;
DefaultRowHeight := 70;
DefaultColWidth := 120;
Options := Options + [goEditing];

end;
end;

다음과 같이 해줍니다.
Grid함수중 addradio함수를 이용해서 radio버튼이 나와야 할곳에 for문으로 미리 다 출력해서 만들어두는 방식입니다.
Options에 goEdting속석이 들어가있어야 수정이 가능하므로 그때 수정시 column1에 콤보박스가 보입니다.

클릭했을때 내용을 보시기 위해서는 

Grid이벤트중 OnGetEditorType 이벤트를 만들어주시면됩니다.
procedure TForm1.gridGetEditorType(Sender: TObject; ACol,
ARow: Integer; var AEditor: TEditorType);
begin
With Grid do begin
case ACol of
1: begin
aEditor := edComboList;
ClearComboString;
AddComboString('대구');
AddComboString('대전');
AddComboString('서울');
AddComboString('평양');
end;
end; // case
end; // with
end; // procedure



지원가능한 컨트롤은 ...
TEditorType = (edNormal,edSpinEdit,edComboEdit,edComboList,edEditBtn,edCheckBox,
edDateEdit,edDateEditUpDown,edTimeEdit,edButton,edDataCheckBox,edNumeric,
edPositiveNumeric,edFloat,edCapital,edMixedCase,edPassword,edUnitEditBtn,
edLowerCase,edUpperCase,edFloatSpinEdit,edTimeSpinEdit,edDateSpinEdit,
edNumericEditBtn,edFloatEditBtn,edCustom,edRichEdit,edNone
{$IFDEF TMSUNICODE}
, edUniEdit,edUniComboEdit,edUniComboList,edUniEditBtn, edUniMemo
{$ENDIF}
);
이렇습니다. 참고하시고요.

창훈 wrote:
> 안녕하세요..

> TAdvStringGrid.. 예제만 보더라도.. 그 기능이 정말로 막강하지않나 싶습니다.. 그래서 그런지 프로퍼티 창에 나열된 속성만 하더라도 정말 많네요..

> 그 중에 가장 기본이 될 만한 Combobox를 쎌 안에 넣는 방법이 필요해서.. 데모프로그램도 보았습니다만.. 그리고, 해당 사이트에 있는 설명도 보았습니다만.. 영어가 짧아서 인지.. 어떤 프로퍼티가 어떤 값으로 설정되어야 한다는 명확한 이야기를 찾지 못했고, 그래서 결국 여러분께 다시 도움을 청합니다..

> Combobox 를 넣기 위한 프로퍼티 속성은 어떻게 되어야 하는지요..?





출처: http://cyhome.cyworld.com/?home_id=a4202130&postSeq=7853519

Posted by SB패밀리

MS Access SQL IIF 함수 - SQL Case 함수


MS Access 에서 SQL문으로 경우에 따른 필드값을 출력하고 싶을 때


IIF (expression, resulttrue, resultfalse) 함수를 사용한다.


expression = 비교구문

resulttrue = 맞다면 출력할 값

resultfalse = 다르다면 출력할 값


여러개의 경우 수가 나오면 


IIF()함수를 여러개를 사용하면 된다.


IIF (expression, resulttrue, IIF (expression, resulttrue, resultfalse))



    -- Access: 
    SELECT alias = IIF(Column<>0, "Yes", "No") 
        FROM table 
     
    -- SQL Server: 
    SELECT alias = CASE WHEN Column<>0 THEN 'Yes' Else 'No' END 
        FROM table
     
    SQL Server's CASE also supports multiple outcomes, for example: 
     
    SELECT alias = CASE 
        WHEN Column='a' THEN 'US' 
        WHEN Column='b' THEN 'Canada' 
        ELSE 'Foreign' 
        END 
    FROM table


델파이에서 TADOQuery에서 SQL문으로 구현하고자 할 때에는 다음과 같은 예로 사용하면 된다.


  ADOQryUnit.SQL.Close;

  ADOQryUnit.SQL.Clear;

  ADOQryUnit.SQL.Add('SELECT *, ');

  ADOQryUnit.SQL.Add('IIF(VCT = 0, "방향", IIF(VCT = 1, "비례", IIF(VCT = 2, "서보", ""))) AS CType ');

  ADOQryUnit.SQL.Add('FROM DeviceModelUnitInfo UI ');








Posted by SB패밀리

Delphi7에서 GIF 파일을 핸들링하는 법에 대해 간단히 포스팅해보겠습니다.

 

먼저 Rx Library가 같이 설치된 상태라고 가정하고 진행하겠습니다.

(RX Library - http://sourceforge.net/projects/rxlib/ )

 

가장 먼저 할일은 사용할 파일을 use에 아래와 같이 넣어줍니다.

 

view plaincopy to clipboardprint?

uses Animate, GIFCtrl;   

 

다음으로는 객체를 생성해야 겠죠. 여기서는 동적으로 생성

(폼을 사용하지 않고 생성하는 법에 대해 기술하겠습니다)

 

 

view plaincopy to clipboardprint?

GIFtest := TRxGIFAnimator.Create(ParentImage);  

with GIFtest do  

begin  

    Parent := ParentImage;  

    AutoSize := True;  

    Left := 0;  

    Top := 0;  

    Animate := False;  

    Visible := True;  

    Image.LoadFromFile('C:\test.gif');  

end;  

 

위와 같이 객체를 생성해주는 부분에서

객체를 생성하고 부모와 좌표를 적당히 설정하면 끝!

 

그리고 애니메이션이 필요한 경우에는  Animate속성을 True로 설정하면 됩니다.


팁 출처: 인터넷



Posted by SB패밀리

delphi TPanel or TForm 을 투명하게



procedure TForm1.Button1Click(Sender: TObject);
begin
ClearPanel(TPanel(panel1));//전달인수를 폼으로 하면 폼또한 투명효과를 줄 수 있다. 
end;

procedure TForm1.ClearPanel(var panel : TPanel);
var  I : Integer;
    FullRgn, ClientRgn, ControlRgn : THandle;
    Margin, MarginX, MarginY, X, Y : Integer; 
begin 
    Margin := (panel.Width - panel.ClientWidth) div 2; 
    FullRgn := CreateRectRgn(0, 0, panel.Width, panel.Height); 
    MarginX := Margin; 
    MarginY := panel.Height - panel.ClientHeight - Margin; 
    ClientRgn := CreateRectRgn(MarginX, MarginY, MarginX + panel.ClientWidth, 
                                                 MarginY + panel.ClientHeight); 
    CombineRgn(FullRgn, FullRgn, ClientRgn, RGN_DIFF); 
    for I:=0 to panel.ControlCount-1 do begin 
        X := MarginX + panel.Controls[I].Left; 
        Y := MarginY + panel.Controls[I].Top; 
        ControlRgn := CreateRectRgn(X, Y, X + panel.Controls[I].Width, 
                                          Y + panel.Controls[I].Height); 
        CombineRgn(FullRgn, FullRgn, ControlRgn, RGN_OR); 
    end; 
    SetWindowRgn(panel.Handle, FullRgn, True); 
end;


Posted by SB패밀리

TList의 활용.

많은 데이터들을 관리하기 위해서는 리스트를 사용해야 한다.

C++과는 다르게 델파이는 TList라는 클래스가 이를 도와준다.

실제로 TList는 다른 비슷한 기능의 부모 클래스이기도 하다.

일단 데이터를 관리하기 위해서 따로 유닛을 만들어 관리하는 것이 편리하다. 폼의 중간에 던져 놓으면 참 보기 힘들다.

기본 뼈대를 먼저 만들어보자.

unit uMyDataList;
 
interface
 
uses classes;
 
type
  TMyDataList = class(TList)
    private
    protected
    public
  end;
 
implementation
 
end.

짠, 이렇게 간단하다.

이제 담은 동적인 데이터의 형식을 만들어여 한다. 왜냐면 TList는 포인터만 가지고 있을 뿐 데이터 자체를 가지지 않는다.
알고보면 당연한 것이다.

  // type 절에 추가된다.
  PMyDataItem = ^TMyDataItem;  // 포인터 형의 데이터 형식을 정의
  TMyDataItem = record         // 데이터 형식의 정의
     value : integer;          // 넣고자 하는 데이터 형식을 넣는다. 임의로 내용을 정의했다.
    offset : integer;
    others : pointer;         
  end;

데이터 형식의 정의에 대해서는 더 설명하지는 않겠다.

데이터들은 동적으로 관리된다.

자, 이제는 데이터를 추가/삽입/삭제을 하는 루틴이 필요하다.

// interface
...
type
  TMyDataList = class(TList)
    private
    protected
      function GetItem(Index : integer):PMyDataItem;
      procedure SetItem(Index : integer; Item : PMyDataItem);
    public
      // destructor
      // destructor Destroy; override; // 소멸자
      // functions
     function AddItem(Value, offset : integer; others : pointer):integer; // 데이터 추가
      procedure InsertItem(Index : integer; Value, offset : integer; others : pointer); // 데이터 삽입
      procedure DeleteItem(Index : integer); // 데이터 삭제
      procedure Clear; override; // 리스트를 모두 삭제
      //
      property ItemList[Index : integer]:PMyDataItem read GetItem write SetItem; // 해당 데이터이 포인터를 가져온다
  end;
...

아쉽게도 override를 할 수 있는 함수가 몇개 없다.

위와 관련된 부모 클래스 TList의 선언은 아래와 같다. 한번 확인해보자.

    // destructor Destroy; override; // 소멸자. TObject에서 상속된다.
    function Add(Item: Pointer): Integer; // 데이터 추가
    procedure Clear; virtual; // 데이터를 모두 삭제
    procedure Delete(Index: Integer); // 데이터를 삭제
    procedure Insert(Index: Integer; Item: Pointer); // 데이터 삽입
    property Items[Index: Integer]: Pointer read Get write Put; default; // 데이터의 포인터를 가져온다.

정렬과 같은 기능도 있으나 그냥 생략하기로 하겠다.

사실 데이터의 포인터를 가져오는 것은 필요가 없을수도 있다.

type이 없는 Pointer는 다른 type을 가지는 pointer에 타입캐스팅없이 바로 대입이 된다.

먼저 데이터를 추가/삽입하는 부분을 만들어보자.

implementation
...
function TMyDataList.AddItem(Value, offset : integer; others : pointer):integer; // 데이터 추가
var
  NewItem : PMyDataItem; // 동적 생성을 위한 포인터형 변수를 선언.
begin
  result := -1; //  되돌림값 초기 설정. 되돌값은 새로이 추가된 데이터의 인덱스를 되돌린다.
  New(NewItem); // 동적 데이터 생성
  if NewItem<;>;nil then
  try
    // 데이터의 대입.
    NewItem.Value := Value;
    NewItem.offset := offset;
    NewItem.others := others;
    // 리스트에 추가
     result := Add(NewItem);
  except
    // 에러가 나면 추가 작업을 포기한다. 
    // 이미 동적 데이터를 생성했으므로 추가가 실패한 경우에는 생성한 동적 데이터를 없앤다.
    Dispose(NewItem);
  end;
end;
...
procedure TMyDataList.InsertItem(Index : integer; Value, offset : integer; others : pointer); // 데이터 삽입
var
  NewItem : PMyDataItem; // 동적 생성을 위한 포인터형 변수를 선언.
begin
  New(NewItem); // 동적 데이터 생성
  if NewItem<;>;nil then
  try
    // 데이터의 대입.
    NewItem.Value := Value;
    NewItem.offset := offset;
    NewItem.others := others;
    // 리스트에 삽입
     Insert(Index, NewItem);
  except
    // 에러가 나면 삽입 작업을 포기한다. 
    // 이미 동적 데이터를 생성했으므로 삽입이 실패한 경우에는 생성한 동적 데이터를 없앤다.
    Dispose(NewItem);
  end;
end;

New/Dispose는 같이 동적 변수를 생성시키는데 사용한다. 다르게 GetMem/FreeMem을 이용해도 된다.

동적 변수를 생성하고 그 변수의 값을 할당시키는 것으로 함수는 끝난다.

거의 일어날 가능성이 없지만 도중에 예외가 발생하면 동적 변수를 해제하도록 만드는게 좋다.

하지만 string이나 인터페이스 등등이 있는 경우에는 Getmem/Freemem은 사용하지 않는게 좋다.

삽입과 추가는 별로 다르지 않다.

이제는 데이터의 참조하는 프로퍼티(property)를 작성해보자.

interface
...
      property ItemList[Index : integer]:PMyDataItem read GetItem write SetItem; // 해당 데이터이 포인터를 가져온다
      // 이 선언의 의미는 간단하다. 
     // 배열형식으로 접근할 수 있는 데이터의 인덱스는 integer형이며 PMyDataItem이 얻어지며,
     // GetItem 함수로 읽고, SetItem 프로시져로 쓴다는 의미이다.
     // 꼭 선언한 필요는 없지만, 편하게 클래스를 사용하기 위해서는 선언해주는 것이 좋다.
...
implementation
...
// 데이터 포인터를 읽어온다.
function TMyDataList.GetItem(Index : integer):PMyDataItem;
begin
  result := PMyDataItem(Items[Index]);
end;
// 데이터 포인터를 새로운 값으로 써넣는다.
procedure TMyDataList.SetItem(Index : integer; Item : PMyDataItem);
begin
  Items[Index] := Item;
end;
...

아주 간단하다. 그냥 타입 캐스팅과 대입만 하면 끝이다.

파스칼은 형식에 민감해서 포인터를 다룰 때도 이러한 고생이 조금 따르지만,

몇자 더 써넣는다고 손가락이 부러지는 것은 아니라고 생각된다.

이제는 데이터를 삭제할 부분을 만들어보자.

...
procedure TMyDataList.DeleteItem(Index : integer); // 데이터 삭제
var
  Item : PMyDataItem;
begin
  // 데이터를 가져온다
  Item := ItemList[Index];
  // 동적 생성된 변수를 해제한다.
  if Item<;>;nil then begin
    try
      // others는 포인터로 다른 동적 데이터를 담을려고 포인터로 선언한 것이다. 
      // 만약 다른 용도이거나 일반 변수라면 해제할 필요가 없다.
      // 단지 동적 변수 안에 동적 변수를 관리하는 방법을 보여주기 위해 선언한 것 뿐이다.
      if Item.others<;>;nil then Dispose(Item.others);
    except
    end;
    // 동적 변수를 해제한다. 
    // 이후에 리스트에 담긴 ItemList[Index] 포인터는 의미없는 값이 된다.
    dispose(Item);
  end;
  // 리스트에 동적 변수를 가리키는 포인터를 삭제한다.
  // 필요에 따라 ItemList[Index] := nil; 을 부가적으로 넣어도 된다.
  Delete(Index);
end;
...

삭제를 하는 경우에는 생성된 동적 변수의 해제가 필요하다. 그렇지 않으면 메모리에 계속 남아있게 된다.

마지막으로 객체가 파괴되거나 리스트 내용을 모두 삭제할 때 필요한 Clear 프로시저를 만든다.

TList의 소멸자 Destroy는 Clear를 호출한다. 그래서 따로 소멸자를 선언하지 않았다.

...
procedure TMyDataList.Clear; // 리스트를 모두 삭제
var
  Index : integer; // 루프를 위해 선언
  Item : PMyDataItem;
begin
  if Count>;0 then
    for Index:=0 to Count-1 do begin
      Item := ItemList[Index];
      if Item<;>;nil then begin
        try
          // others는 포인터로 다른 동적 데이터를 담을려고 포인터로 선언한 것이다. 
          // 만약 다른 용도이거나 일반 변수라면 해제할 필요가 없다.
          // 단지 동적 변수 안에 동적 변수를 관리하는 방법을 보여주기 위해 선언한 것 뿐이다.
          if Item.others<;>;nil then Dispose(Item.others);
        except
        end;
        // 동적 변수를 해제한다. 
        // 이후에 리스트에 담긴 ItemList[Index] 포인터는 의미없는 값이 된다.
        dispose(Item);
      end;
    end;
  // 부모 클래스의 Clear를 호출한다.
  inherited Clear;
end;
...

Clear 프로시저는 Delete와 마찬가지로 간단하다.

다른 점이라면 루프를 돌면서 각각의 데이터를 해제시킨 후 부모 클래스의 Clear를 호출한다는 점이다.

DeleteItem을 호출해서 해결할 수도 있지만 오버헤드(overhead)를 줄이기 위해 그냥 직접 구현을 했다.

실제로 이 클래스를 사용하면 아래와 같이 할 수 있다.

...
var
  MyOwnList : TMyDataList;
...
  MyOwnList := TMyDataList.Create;
  ...
  MyOwnList.AddItem(10,20,nil);
  MyOwnList.InsertItem(0,10,20,nil);
  MyOwnList.DeleteItem(1);
  Writeln(MyOwnList.ItemList[0].Value);
  ...
  MyOwnList.Free;
...

검색의 구현을 위해서는 루프를 돌려 해당값을 비교하게 만들면 된다.

이로써 간단히 TList를 사용해서 자신만의 데이터들을 담는 리스트를 사용할 수 있게 되었다.

보다 많은 기능들의 구현은 좀 더 깊이 연구하면 직접할 수 있을 것이다.

말주변이 없는 글이지만 도움이 되었기를.



출처: http://blog.naver.com/PostView.nhn?blogId=barcoder&logNo=60053164009


Posted by SB패밀리

sobakcc Control Package v 1.0


2005.01.03


컨트롤 팩키지 버전 1.0이 공개되었습니다.


벌써 만들어 놓은지는 몇년이 지났지만 그동안 구석에 놔두다가 이렇게 올려봅니다.
비주얼 컴포넌트의 컨트롤을 모아둔 팩키지입니다.
이 컴포넌트들은 Flat-Style의 모양으로 각종 컨테이너 컴포넌트 상에 위치하게 됩니다.



* FlatStyle의 비주얼 컴포넌트
* 전체 31개의 컴포넌트가 팩키지 안에 들어 있습니다.


* TCCAboutBox, TCCAlignEdit, TCCAnimation, TCCAnimWnd, TCCButton, 
TCCCheckBox, TCCCheckListBox, TCCColorComboBox, TCCComboBox, TCCDBComboBox,
TCCDBEdit, TCCDBLookupComboBox, TCCDBMemo, TCCEdit, TCCGauge, 
TCCGroupBox, TCCHint, TCCLinkText, TCCListBox, TCCMaskEdit,
TCCMemo, TCCPanel, TCCProgressBar, TCCRadioButton, TCCShape,
TCCSound, TCCSpeedButton, TCCSpinEditFloat, TCCSpinEditInteger, TCCSplitter, TCCTabControl


팩키지를 등록할 수 있는 팩키지 파일 *.bpl과 각 컨트롤의 컴파일된 파일인 *.dcu 파일들이 포함되어 있습니다.

컴포넌트 팔레트에 있는 팩키지의 모습입니다.

Win32 버전에 대해서 자주는 아니지만 지속적으로 컴포넌트를 추가할 예정입니다.
버그가 몇개가 있을지는 모르겠습니다만 버그가 발견된다면 게시판으로 알려주시면 감사하겠습니다.

*.bpl을 포함한팩키지 파일이 무료배포 됩니다








Posted by SB패밀리




Form에서 어느 포커스에 있어도 키 입력을 받아, ESC 키를 누르면 Form 이 닫히도록 할 수 있다.


방법은 다음과 같다.


- Form 의 Key Preview 속성을 True 로 설정한다.

- Form 의 OnKeyPress 이벤트 핸들러에 다음 코드를 작성한다.


if ( Key = #27 ) then

  begin

    Form1.Close;

  end;


위와 같이 OnKeyPress 이벤트 핸들러를 작성하면 Form 의 어느 곳에서나 ESC 키를 누렀을 때 Form1 이 Close 된다.







 

비슷한 방법으로 Edit 컨트롤에서 Enter 키나 Tab키를 눌렀을 때 특정 동작을 수행하도록 할 수도 있다. 

이 때는 Edit 컨트롤의 OnKeyPress 이벤트 핸들러를 위와 같이 작성한다.



if ( Key = #13 ) then

  begin

    Button1.Click;

  end;


만약 위와 같이 Edit 컨트롤의 OnKeyPress 이벤트 핸들러를 작성하면 Edit 컨트롤에서 문자열을 입력한 후 엔터키를 누르면 Button1 의 Click 메소드를 호출할 수 있다.

Posted by SB패밀리

델파이에서 그래픽 파일(JPG, GIF, PNG) 다루기



델파이에서는 기본적으로 TImage 라는 컴포넌트로 이미지를 다루는데,

이것은 그냥 BMP 파일을 다루는 것 같습니다.


델파이 2007에서는 JPG와 GIF 형식을 바로 보여줄 수 있습니다.

델파이 2009에서는 PNG 형식을 추가로 바로 보여줄 수 있게 되었습니다.


PNGImage 라는 오픈소스를 아예 Embarcadero에서 사버렸습니다.

머, GIF쪽은 저자가 직접 기증?한거이지만...


델파이 2009에서 TImage 컴포넌트에 각각의 그래픽 파일을 보여주는 예제는 다음과 같습니다.

각각의 이미지 파일을 처리하기 위해서는 

uses PNGImage, JPEG, GIFImg;


구문을 앞부분에 사용하여야만 합니다.





procedure TForm1.Button1Click(Sender: TObject);

var

  Extension : String;

  PNG : TPNGImage;

  JPG : TJPEGImage;

  GIF : TGIFImage;

begin


  // 저장된 파일의 확장자명을 추출한다.

  Extension := ExtractFileExt(OutputFilePath);

  Extension := LowerCase(Extension);


  // GIF 파일 형식인 경우,

  if Extension = '.gif' then

  begin

    GIF := TGIFImage.Create;

    try

      GIF.LoadFromFile(OutputFilePath);

      Image1.Picture.Assign(GIF);

      Image1.Stretch := True;

      Image1.Visible := True;

    finally

      GIF.Free;

    end;



  end

  // JPG 파일 형식인 경우,

  else if Extension = '.jpg' then

  begin

    JPG := TJPEGImage.Create;

    try

      JPG.LoadFromFile(OutputFilePath);

      Image1.Picture.Assign(JPG);

      Image1.Stretch := True;

      Image1.Visible := True;

    finally

      JPG.Free;

    end;

  end

  // PNG 파일 형식인 경우,

  else if Extension = '.png' then

  begin

    PNG := TPngImage.Create;

    try

      PNG.LoadFromFile(OutputFilePath);

      Image1.Picture.Assign(PNG);

      Image1.Stretch := True;

      Image1.Visible := True;

    finally

      PNG.Free;

    end;

  end;

end;


출처: http://hook.tistory.com/181?srchid=BR1http://hook.tistory.com/181

Posted by SB패밀리



델파이에서 쓰는 Format의 간단한 사용례

Format 함수 정의

class function Format ( Const StrFormat : string; Const Args : array of const ) :string;

StrFormat 정의 형식

%[Index:][-][표시할 자리수][.0을 채울 자리수]Type

■ 타입 종류

  d = 정수

  e = 지수표시

  f = 소수점 두번째 자리 이후 반올림

  g = 입력된 대로 표시

  m = 통화

  n = 수치 쉼표 표시(소수점 두번째 자리 이후 반올림)

  p = 포인터

  s = 문자열

  u = 부호없는 정수

  x = 16진수

■ 포멧 형식 관련 사용례

  sMsg:String;

  sMsg := '';

  sMsg := sMsg + #13#10 + Format('<%%10d>   = <%10d>', [12345]);

  sMsg := sMsg + #13#10 + Format('<%%-10d>  = <%-10d>', [12345]);

  sMsg := sMsg + #13#10 + Format('<%%.7d>   = <%.7d>', [12345]);

  sMsg := sMsg + #13#10 + Format('<%%10.5d> = <%10.5d>', [12345]);

  sMsg := sMsg + #13#10;

  sMsg := sMsg + #13#10 + Format('<%%7.4d>, [123]       = <%7.4d>', [123]);

  sMsg := sMsg + #13#10 + Format('<%%*.4d>, [7, 123]    = <%*.4d>', [7, 123]);

  sMsg := sMsg + #13#10 + Format('<%%*.*d>, [7, 4, 123] = <%*.*d>', [7, 4, 123]);

  sMsg := sMsg + #13#10;

  sMsg := sMsg + #13#10 + Format('Index Usage = %s %s %s %1:s %s',

                     ['A', 'B', 'C', 'D', 'E']);

▶ 결과

<%10d>   = <     12345>

<%-10d>  = <12345     >

<%.7d>   = <0012345>

<%10.5d> = <     12345>

<%7.4d>, [123]       = <   0123>

<%*.4d>, [7, 123]    = <   0123>

<%*.*d>, [7, 4, 123] = <   0123>

Index Usage = A B C B C

■ 포멧 타입 관련 사용례

  sMsg:String;

  sMsg := '';

  sMsg := sMsg + #13#10 + Format('%%d = %d', [-12345]);

  sMsg := sMsg + #13#10 + Format('%%e = %e', [12345.6789]);

  sMsg := sMsg + #13#10 + Format('%%f = %f', [123.456789]);

  sMsg := sMsg + #13#10 + Format('%%g = %g', [12.3456789]);

  sMsg := sMsg + #13#10 + Format('%%n = %n', [12345.6789]);

  sMsg := sMsg + #13#10 + Format('%%m = %m', [12345.6789]);

  sMsg := sMsg + #13#10 + Format('%%p = %p', [addr(sMsg)]);

  sMsg := sMsg + #13#10 + Format('%%s = %s', ['FormatTest']);

  sMsg := sMsg + #13#10 + Format('%%u = %u', [12345]);

  sMsg := sMsg + #13#10 + Format('%%x = %x', [12345]);

▶ 결과

%d = -12345

%e = 1.23456789000000E+004

%f = 123.46

%g = 12.3456789

%n = 12,345.68

%m = \12,346

%p = 0012F5B4

%s = FormatTest

%u = 12345

%x = 3039

 

Posted by SB패밀리

델파이 날짜 함수




// include 

uses DateUtils


// declaration


//일자를 추출한다.
function DateOf(const AValue: TDateTime): TDateTime; 

//시간을 추출한다.
function TimeOf(const AValue: TDateTime): TDateTime;

//평년,윤년을 구분하다.
function IsInLeapYear(const AValue: TDateTime): Boolean;

//오전,오후를 구분한다.
function IsPM(const AValue: TDateTime): Boolean;

//Word형의 년,월,일 파라메타의 유효성을 체크한다.
function IsValidDate(const AYear, AMonth, ADay: Word): Boolean;

//Word형의 시,분,초,밀리초 파라메타의 유효성을 체크한다.
function IsValidTime(const AHour, AMinute, ASecond, AMilliSecond: Word): Boolean;

//Word형의 년,월,일,시,분,초,밀리초  파라메타의 유효성을 체크한다.
function IsValidDateTime(const AYear, AMonth, ADay, AHour, AMinute, ASecond, AMilliSecond: Word): Boolean;

//ex) IsValidDateDay(2006,45) : 2006년의 45번째날이 유효한지를 체크한다.
function IsValidDateDay(const AYear, ADayOfYear: Word): Boolean;

//ex) IsValidDateWeek(2006,42) : 2006년의 42주차가 유효한지를 체크한다.
function IsValidDateWeek(const AYear, AWeekOfYear,  ADayOfWeek: Word): Boolean;

//년,월,월의주차,요일  이  유효한지를  체크한다.
//ex) IsValidDateMonthWeek(2006,2,1,2) : 2006년 2월의 1주차의 화요일이 유효한지를 체크한다.
function IsValidDateMonthWeek(const AYear, AMonth, AWeekOfMonth, ADayOfWeek: Word): Boolean;

//ex) WeeksInYear(Today) : 오늘이 년의 몇주차인지 리턴한다.
function WeeksInYear(const AValue: TDateTime): Word;                 
function WeeksInAYear(const AYear: Word): Word;            

//ex) DaysInYear(Today) : 오늘이 년의 몇일째인지 리턴한다.           
function DaysInYear(const AValue: TDateTime): Word;
function DaysInAYear(const AYear: Word): Word;

//ex) DaysInMonth(Today) : 오늘이 월의 몇일째인지 리턴한다.
function DaysInMonth(const AValue: TDateTime): Word;
function DaysInAMonth(const AYear, AMonth: Word): Word;

//오늘-
function Today: TDateTime;

//어제-
function Yesterday: TDateTime;

//내일-
function Tomorrow: TDateTime;

//AValue의 값이 오늘이면 True를 리턴한다.
function IsToday(const AValue: TDateTime): Boolean;

//AValue, ABasis 같은날이면 True를 리턴한다.
function IsSameDay(const AValue, ABasis: TDateTime): Boolean;


//년을 추출한다.
function YearOf(const AValue: TDateTime): Word;

//월을 추출한다.
function MonthOf(const AValue: TDateTime): Word;

//년의 몇주차인지를 추출한다.
function WeekOf(const AValue: TDateTime): Word;          

//일자만 추출한다.
//ex) DayOf(StrToDate('2006-06-27')) : 27을 리턴한다.
function DayOf(const AValue: TDateTime): Word;

//시간을 추출한다(24시간단위)
function HourOf(const AValue: TDateTime): Word;

//분을 추출한다.
function MinuteOf(const AValue: TDateTime): Word;

//초를 추출한다.
function SecondOf(const AValue: TDateTime): Word;

//밀리초를 추출한다.
function MilliSecondOf(const AValue: TDateTime): Word;

//년도의 시작일
function StartOfTheYear(const AValue: TDateTime): TDateTime;
function StartOfAYear(const AYear: Word): TDateTime;

//년도의 마지막일
function EndOfTheYear(const AValue: TDateTime): TDateTime;
function EndOfAYear(const AYear: Word): TDateTime;

//월의 시작일
function StartOfTheMonth(const AValue: TDateTime): TDateTime;
function StartOfAMonth(const AYear, AMonth: Word): TDateTime;

//월의 마지막일
function EndOfTheMonth(const AValue: TDateTime): TDateTime;
function EndOfAMonth(const AYear, AMonth: Word): TDateTime;

//주의 시작일
function StartOfTheWeek(const AValue: TDateTime): TDateTime;    

//주의 시작일(기준요일을 정할수 있다.)
//1:월요일, 2:화요일, 3:수요일, 4:목요일 ,5:금요일 , 6:토요일 ,7:일요일
function StartOfAWeek(const AYear, AWeekOfYear: Word; const ADayOfWeek: Word = 1): TDateTime;

//주의 마지막일
function EndOfTheWeek(const AValue: TDateTime): TDateTime;      

//주의 마지막일(기준요일을 정할수 있다.)
//1:월요일, 2:화요일, 3:수요일, 4:목요일 ,5:금요일 , 6:토요일 ,7:일요일
function EndOfAWeek(const AYear, AWeekOfYear: Word; const ADayOfWeek: Word = 7): TDateTime;



function StartOfTheDay(const AValue: TDateTime): TDateTime;
function StartOfADay(const AYear, AMonth, ADay: Word): TDateTime; overload;
function StartOfADay(const AYear, ADayOfYear: Word): TDateTime; overload;
function EndOfTheDay(const AValue: TDateTime): TDateTime;
function EndOfADay(const AYear, AMonth, ADay: Word): TDateTime; overload;
function EndOfADay(const AYear, ADayOfYear: Word): TDateTime; overload;


//ex) MonthOfTheYear(Today) : 오늘일자를 Word형으로 리턴한다.
function MonthOfTheYear(const AValue: TDateTime): Word;

//ex) WeekOfTheYear(Today) : 오늘일자가 몇주차인지를 Word형으로 리턴한다.
function WeekOfTheYear(const AValue: TDateTime): Word; overload; 
function WeekOfTheYear(const AValue: TDateTime;  var AYear: Word): Word; overload;

//ex) DayOfTheYear(Today) : 오늘일자가 올해의 몇일째인지를 Word형으로 리턴한다.
function DayOfTheYear(const AValue: TDateTime): Word;

//년의 시작일부터  해당일자까지의 시간을  모두 더해서 Word형으로 리턴한다.
function HourOfTheYear(const AValue: TDateTime): Word;

//년의 시작일부터  해당일자까지의 분을 모두 더해서 Word형으로 리턴한다.
function MinuteOfTheYear(const AValue: TDateTime): LongWord;

//년의 시작일부터  해당일자까지의 초을  모두 더해서 Word형으로 리턴한다.
function SecondOfTheYear(const AValue: TDateTime): LongWord;

//년의 시작일부터  해당일자까지의 밀리초을  모두 더해서 Word형으로 리턴한다.
function MilliSecondOfTheYear(const AValue: TDateTime): Int64;

//이달의 몇번째주 인지를 리턴한다.
function WeekOfTheMonth(const AValue: TDateTime): Word; overload; 
function WeekOfTheMonth(const AValue: TDateTime; var AYear, AMonth: Word): Word; overload;

//이달의 몇일째인지를 리턴한다.
function DayOfTheMonth(const AValue: TDateTime): Word;

//월의 시작일부터 해당일자까지의 시간의 합을 리턴한다.
function HourOfTheMonth(const AValue: TDateTime): Word;

//월의 시작일부터 해당일자까지의 분의 합을 리턴한다.
function MinuteOfTheMonth(const AValue: TDateTime): Word;

//월의 시작일부터 해당일자까지의 초의 합을 리턴한다.
function SecondOfTheMonth(const AValue: TDateTime): LongWord;

//월의 시작일부터 해당일자까지의 밀리초의 합을 리턴한다.
function MilliSecondOfTheMonth(const AValue: TDateTime): LongWord;

//해당일의 요일을 리턴한다.
//1:월요일, 2:화요일, 3:수요일, 4:목요일 ,5:금요일 , 6:토요일 ,7:일요일
function DayOfTheWeek(const AValue: TDateTime): Word;

//AValue날짜의 주의 시작일부터 AValue날짜까지의 시간의 합을 계산한다.
function HourOfTheWeek(const AValue: TDateTime): Word;               

//AValue날짜의 주의 시작일부터 AValue날짜까지의 분의 합을 계산한다.
function MinuteOfTheWeek(const AValue: TDateTime): Word;             

//AValue날짜의 주의 시작일부터 AValue날짜까지의 초의 합을 계산한다.
function SecondOfTheWeek(const AValue: TDateTime): LongWord;         

//AValue날짜의 주의 시작일부터 AValue날짜까지의 밀리초의 합을 계산한다.
function MilliSecondOfTheWeek(const AValue: TDateTime): LongWord;    

//ex) HourOfTheDay(Time) : 24시간 단위로 Time까지의 시간의 합을 계산한다.
function HourOfTheDay(const AValue: TDateTime): Word;

//ex) MinuteOfTheDay(Time) : 24시간 단위로 Time까지의 분의 합을 계산한다.
function MinuteOfTheDay(const AValue: TDateTime): Word;

//ex) SecondOfTheDay(Time) : 24시간 단위로 Time까지의 초의 합을 계산한다.
function SecondOfTheDay(const AValue: TDateTime): LongWord;

//ex) MilliSecondOfTheDay(Time) : 24시간 단위로 Time까지의 밀리초의 합을 계산한다.
function MilliSecondOfTheDay(const AValue: TDateTime): LongWord;

//ex) MinuteOfTheHour(13:28:43:345) : 시간을 기준으로 분의 합을계산한다.
function MinuteOfTheHour(const AValue: TDateTime): Word;

//ex) SecondOfTheHour(13:28:43:345) : 시간을 기준으로 초의 합을계산한다.
function SecondOfTheHour(const AValue: TDateTime): Word;

//ex) MilliSecondOfTheHour(13:28:43:345) : 시간을 기준으로 밀리초의 합을계산한다.
function MilliSecondOfTheHour(const AValue: TDateTime): LongWord;

//ex) SecondOfTheMinute(13:28:43:345) : 분을 기준으로 초의 합을 계산한다.
function SecondOfTheMinute(const AValue: TDateTime): Word;

//ex) SecondOfTheMinute(13:28:43:345) : 초을 기준으로 밀리초의 합을 계산한다.
function MilliSecondOfTheMinute(const AValue: TDateTime): LongWord;
function MilliSecondOfTheSecond(const AValue: TDateTime): Word;

{ Range checking functions }

function WithinPastYears(const ANow, AThen: TDateTime;
 const AYears: Integer): Boolean;
function WithinPastMonths(const ANow, AThen: TDateTime;
 const AMonths: Integer): Boolean;
function WithinPastWeeks(const ANow, AThen: TDateTime;
 const AWeeks: Integer): Boolean;
function WithinPastDays(const ANow, AThen: TDateTime;
 const ADays: Integer): Boolean;
function WithinPastHours(const ANow, AThen: TDateTime;
 const AHours: Int64): Boolean;
function WithinPastMinutes(const ANow, AThen: TDateTime;
 const AMinutes: Int64): Boolean;
function WithinPastSeconds(const ANow, AThen: TDateTime;
 const ASeconds: Int64): Boolean;
function WithinPastMilliSeconds(const ANow, AThen: TDateTime;
 const AMilliSeconds: Int64): Boolean;

{ Range query functions }

//두날짜(시간) 사이에 년수를 리턴한다.
function YearsBetween(const ANow, AThen: TDateTime): Integer;

//두날짜(시간) 사이의 월수를 리턴한다.
function MonthsBetween(const ANow, AThen: TDateTime): Integer;

//두날짜(시간) 사이의 주수를 리턴한다.
function WeeksBetween(const ANow, AThen: TDateTime): Integer;

//두날짜(시간) 사이의 일수를 리턴한다.
function DaysBetween(const ANow, AThen: TDateTime): Integer;

//두날짜(시간) 사이의 시간을 리턴한다.
function HoursBetween(const ANow, AThen: TDateTime): Int64;

//두날자(시간) 사이의 분을 리턴한다.
function MinutesBetween(const ANow, AThen: TDateTime): Int64;

//두날짜(시간) 사이의 초를 리턴한다.
function SecondsBetween(const ANow, AThen: TDateTime): Int64;

//두날짜(시간) 사이의 밀리초를 리턴한다.
function MilliSecondsBetween(const ANow, AThen: TDateTime): Int64;


//두날짜(시간) 사이를  Double형으로 리턴한다.
function YearSpan(const ANow, AThen: TDateTime): Double;
function MonthSpan(const ANow, AThen: TDateTime): Double;
function WeekSpan(const ANow, AThen: TDateTime): Double;
function DaySpan(const ANow, AThen: TDateTime): Double;
function HourSpan(const ANow, AThen: TDateTime): Double;
function MinuteSpan(const ANow, AThen: TDateTime): Double;
function SecondSpan(const ANow, AThen: TDateTime): Double;
function MilliSecondSpan(const ANow, AThen: TDateTime): Double;


//AValue일자에서 ANumberOfYears만큼의 년도를 증가한다.
function IncYear(const AValue: TDateTime; const ANumberOfYears: Integer = 1): TDateTime;

//AValue일자에서 ANumberOfWeeks만큼의 주를 증가한다.
function IncWeek(const AValue: TDateTime; const ANumberOfWeeks: Integer = 1): TDateTime;

//AValue일자에서 ANumberOfDays만큼의 일를 증가한다.
function IncDay(const AValue: TDateTime;  const ANumberOfDays: Integer = 1): TDateTime;

//AValue일자(시간)에서 ANumberOfHours만큼의 시간를 증가한다.
function IncHour(const AValue: TDateTime; const ANumberOfHours: Int64 = 1): TDateTime;

//AValue일자(시간)에서 ANumberOfMinutes만큼의 분를 증가한다.
function IncMinute(const AValue: TDateTime; const ANumberOfMinutes: Int64 = 1): TDateTime;

//AValue일자(시간)에서 ANumberOfSeconds만큼의 초를 증가한다.
function IncSecond(const AValue: TDateTime; const ANumberOfSeconds: Int64 = 1): TDateTime;

//AValue일자(시간)에서 ANumberOfMilliSeconds만큼의 밀리초를 증가한다.
function IncMilliSecond(const AValue: TDateTime; const ANumberOfMilliSeconds: Int64 = 1): TDateTime;

//년,월,일,시,분,초,밀리초  ---> 날짜(시간)형으로 리턴한다.
function EncodeDateTime(const AYear, AMonth, ADay, AHour, AMinute, ASecond, AMilliSecond: Word): TDateTime;

//날짜(시간)형 ---> 년,월,일,시,분,초,밀리초 Word형으로 리턴한다.
procedure DecodeDateTime(const AValue: TDateTime; out AYear, AMonth, ADay,  AHour, AMinute, ASecond, AMilliSecond: Word);

//ex) EncodeDateWeek(2006,25,2) : 2006년 25주차의 첫번째 화요일의  날자를 리턴한다.
function EncodeDateWeek(const AYear, AWeekOfYear: Word; const ADayOfWeek: Word = 1): TDateTime;

//ex) DecodeDateWeek(Today) : 오늘은 몇년 몇째주의 무슨요일인지를 리턴한다.
procedure DecodeDateWeek(const AValue: TDateTime; out AYear, AWeekOfYear, ADayOfWeek: Word);

//AYear년의 ADayOfYear번째일이 며칠인지 리턴한다.
function EncodeDateDay(const AYear, ADayOfYear: Word): TDateTime;

//AValue일자가 몇년의 몇일째인지를 구한다.
procedure DecodeDateDay(const AValue: TDateTime; out AYear, ADayOfYear: Word);

//년,월,월의몇주차,화요일 의 날짜를 리턴한다.
function EncodeDateMonthWeek(const AYear, AMonth, AWeekOfMonth, ADayOfWeek: Word): TDateTime;

//AValue의 년,월,월의몇주차, 요일 구한다.
procedure DecodeDateMonthWeek(const AValue: TDateTime; out AYear, AMonth, AWeekOfMonth, ADayOfWeek: Word);

//년,월,일,시,분,초,밀리초의 유효성을 체크하고 날짜를 구한다.
function TryEncodeDateTime(const AYear, AMonth, ADay, AHour, AMinute, ASecond,  AMilliSecond: Word; out AValue: TDateTime): Boolean;

//AYear년의 AWeekOfYear주에 ADayOfWeek요일에 유효성을 체크하고 날짜를 리턴한다.
function TryEncodeDateWeek(const AYear, AWeekOfYear: Word;  out AValue: TDateTime; const ADayOfWeek: Word = 1): Boolean;

//AYear년의 ADayOfYear번째날에 유효성을 체크하고  날짜를 구한다.
function TryEncodeDateDay(const AYear, ADayOfYear: Word;  out AValue: TDateTime): Boolean;

//AYear(년) AMonth(월) AWeekOfMonth(월의주차)  ADayOfWeek(요일) 유효성을 체크하고 날짜를 구한다.
function TryEncodeDateMonthWeek(const AYear, AMonth, AWeekOfMonth,  ADayOfWeek: Word; var AValue: TDateTime): Boolean;


function RecodeYear(const AValue: TDateTime; const AYear: Word): TDateTime;
function RecodeMonth(const AValue: TDateTime; const AMonth: Word): TDateTime;
function RecodeDay(const AValue: TDateTime; const ADay: Word): TDateTime;
function RecodeHour(const AValue: TDateTime; const AHour: Word): TDateTime;
function RecodeMinute(const AValue: TDateTime; const AMinute: Word): TDateTime;
function RecodeSecond(const AValue: TDateTime; const ASecond: Word): TDateTime;
function RecodeMilliSecond(const AValue: TDateTime; const AMilliSecond: Word): TDateTime;
function RecodeDate(const AValue: TDateTime; const AYear, AMonth,  ADay: Word): TDateTime;
function RecodeTime(const AValue: TDateTime; const AHour, AMinute, ASecond,  AMilliSecond: Word): TDateTime;
function RecodeDateTime(const AValue: TDateTime; const AYear, AMonth, ADay,  AHour, AMinute, ASecond, AMilliSecond: Word): TDateTime;
function TryRecodeDateTime(const AValue: TDateTime; const AYear, AMonth, ADay,  AHour, AMinute, ASecond, AMilliSecond: Word; out AResult: TDateTime): Boolean;

//A.날짜(시간) B.날짜(시간) 을 비교한다. A=B(0) ,  A>B(1) ,  A<B(-1)
function CompareDateTime(const A, B: TDateTime): TValueRelationship;
function CompareDate(const A, B: TDateTime): TValueRelationship;
function CompareTime(const A, B: TDateTime): TValueRelationship;


//A.날짜(시간) B.날짜(시간) 을 비교한다
function SameDateTime(const A, B: TDateTime): Boolean;
function SameDate(const A, B: TDateTime): Boolean;
function SameTime(const A, B: TDateTime): Boolean;

//오늘이 이달의 몇번째주인지 리턴한다.
function NthDayOfWeek(const AValue: TDateTime): Word;

//AValue날이 몇년,몇월,월의몇번째주,무슨요일 인지를 구한다.
procedure DecodeDayOfWeekInMonth(const AValue: TDateTime; out AYear, AMonth, ANthDayOfWeek, ADayOfWeek: Word);

//AYear(년), AMonth(월), ANthDayOfWeek(월의몇번째주),  ADayOfWeek(요일) ----> 해당일자를 리턴한다.
function EncodeDayOfWeekInMonth(const AYear, AMonth, ANthDayOfWeek,  ADayOfWeek: Word): TDateTime;

//AYear(년), AMonth(월), ANthDayOfWeek(월의몇번째주),  ADayOfWeek(요일) 의 유효성을 체크하고 날짜를 구한다.
function TryEncodeDayOfWeekInMonth(const AYear, AMonth, ANthDayOfWeek,  ADayOfWeek: Word; out AValue: TDateTime): Boolean;


procedure InvalidDateTimeError(const AYear, AMonth, ADay, AHour, AMinute,  ASecond, AMilliSecond: Word; const ABaseDate: TDateTime = 0);
procedure InvalidDateWeekError(const AYear, AWeekOfYear, ADayOfWeek: Word);
procedure InvalidDateDayError(const AYear, ADayOfYear: Word);
procedure InvalidDateMonthWeekError(const AYear, AMonth, AWeekOfMonth,  ADayOfWeek: Word);
procedure InvalidDayOfWeekInMonthError(const AYear, AMonth, ANthDayOfWeek,  ADayOfWeek: Word);


//날짜를 Double형으로 리턴한다.
//0001년01월01일  --->  1721425 
function DateTimeToJulianDate(const AValue: TDateTime): Double;

//Double형을 날짜로 리턴한다.
//1721425 ---> 0001년01월01일
function JulianDateToDateTime(const AValue: Double): TDateTime;

//AValue의 유효성을 체크하고 날짜를 리턴한다.
function TryJulianDateToDateTime(const AValue: Double;  out ADateTime: TDateTime): Boolean;

//날짜를 Double형으로 리턴한다.
//0001년01월01일  --->  ( -678575  )
function DateTimeToModifiedJulianDate(const AValue: TDateTime): Double;

//Double형을 날짜로 리턴한다.
//( -678575  ) ---> 0001년01월01일
function ModifiedJulianDateToDateTime(const AValue: Double): TDateTime;

//AValue의 유효성을 체크하고 날짜를 리턴한다.
function TryModifiedJulianDateToDateTime(const AValue: Double;  out ADateTime: TDateTime): Boolean;


function DateTimeToUnix(const AValue: TDateTime): Int64;
function UnixToDateTime(const AValue: Int64): TDateTime; 




Posted by SB패밀리

PC와 노트북 윈도우 크기 변형 문제 해결하기


PC에서 개발한 윈도우 어플리케이션의 화면이 노트북에서는 이상하게 다르게 나오는 경우가 있다.



운이 나쁘게 이런 경우가 생기면 어떻게 해결해야할까?


각 visible window 의 가로, 세로 크기가 다르게 나오는 건 pixel per inch 때문이다.


그래서 이러한 문제에 관계없이 윈도우 크기가 유지되도록 개발하면 된다....


이러한 기능이 어디에 있을까?


델파이 IDE화면에서 Object Inspector를 찾아보자. 여기에서

Scaled property를 찾아서 그 값을 False 로 설정한다.


 



이제 노트북에서의 어떠한 해상도에서도 내가 만든 어플리케이션은 제대로 실행될 것이다.


Posted by SB패밀리