안녕하세요!

Welcome to WordPress.com. This is your first post. Edit or delete it and start blogging!

카테고리: 분류되지 않음 | 1개의 댓글

TChart 기본정보 및 사용팁

0. 들어가기

 TChart를 처음 접했을때 기초는 도움말과 예제등으로 어느정도 익혔습니다.
 그런데 제가 꼭 필요로 했던 기능들이나 팁들은 자료찾기 어렵더군요.
 이 글이 좀 허접할지라도 한분이라도 도움이 되었으면 좋겠습니다^^

 기본 기능들은 첨부된 예제 소스를 보시면 쉽게 이해하실 수 있고, 몇가지 팁만 서술하겠습니다.
 각 요소들을 다 설명할 수준이 못되서 도움말 참고하시면 좋을 듯 합니다.

1. TChart 중요 요소

 (1) Panel(= TChart)
  – 차트 배경. 색이나 바깥 테두리와 간격등을 설정 가능.
  – TChart.Color, TChart.MarginLeft등

 (2) TChart.Title
  – 차트 제목. 기본 중앙 상단에 표시되며 위치, 글꼴등 변경 가능.

 (3) TChart.Legend
  – 범례. 기본 버전은 기능이 미약하여 거의 사용하지 않고 필요기능(보이기/감추기, 이름/색상변경등)을 추가하여 따로 만들어서 사용하는것이 좋음.

 (4) TChart.Left Axis, TChart.BottomAxis
  – 차트 축. Left(기본 Y축), Bottom(기본 X축) 외에 Right, Top등이 존재.

  – (Property) Automatic, AutomaticMinimum, AutomaticMaximum : 데이터에 따른 축 눈금 자동 조절 여부.
  – (Property) Minimum : 축의 최소 눈금. Maximum보다 크면 Error 발생.
  – (Property) Maximum : 축의 최대 눈금. Minimum보다 작으면 Error 발생.
  – (Property) MinimumOffset, MaximumOffset : 자동 축 조정시 눈금과 데이터간 조절.
   최대 데이터가 10이고 MaximumOffset이 0%면 Maximum은 자동으로 10으로 설정됨.
   최대 데이터가 10이고 MaximumOffset이 20%면 Maximum은 자동으로 12으로 설정됨.
  – (Property) AxisValuesFormat : Label의 Format을 결정.

  – (Function) AdjustMaxMin : 데이터에 따라 축 눈금 자동 조정.
  – (Function) SetMinMax : 축의 최소, 최대 눈금 설정. Property로 설정 할 경우 직접 데이터가 크거나 작은지 체크해야함.
   현재 Y축이 10~20으로 설정되어 있을때,
   1~2로 설정하려면 Minimum을 먼저 설정해야 Error가 안나고,
   100~200으로 설정하려면 Maximum을 먼저 설정해야 하는데 이 함수를 사용하면 직접 체크하지 않아도 됨.
   
 (5) TChart.Series[]
  – 차트의 그래프. Design Time에서 추가한 Series는 자동으로 Source상에 Class가 추가됨.
  TForm1 = class(TForm)
    Chart1: TChart;
    Series1: TLineSeries;

  – 동적으로 생성 가능.
  var
    s: TLineSeries;
  begin
    s := TLineSeries.Create(Chart1);
    s.ParentChart := Chart1;

  – 데이터 속성 : 그래프의 데이터 한개에는 총 4가지의 속성이 있습니다. 이거 이해못해서 한참 해맸습니다^^
  Index : 데이터배열에 필요한 Index 정보. X축 좌측기준 0부터 시작.
  Pos : 차트에 데이터가 위치하는 좌표(윈도우 화면 좌표가 아닌 차트 내부좌표). Double 형식. 스크롤이나 해당 위치에 선 그릴때 필요.
  Value : Y축 데이터 값입니다. Double 형식.
  Label : X축 Label 값입니다. Text 형식.
 
  – (Property) Color : 그래프 색상.
  – (Property) Title : 그래프 이름. 다른 그래프와 중복 가능.
  – (Property) ValueList.ValueList[0] : X축 데이터의 Pos List. 하위 Items[]로 접근 가능.
  – (Property) ValueList.ValueList[1] : X축 데이터의 Value List. 하위 Items[]로 접근 가능.
  – (Property) LabelList : 데이터의 Label List. 하위 Labels[Index]로 접근 가능. 읽기 전용.

2. Scroll 기능 만들기

 (1) 원리
  – 데이터 추가 시, X축 좌표를 직접 입력하여 X축 설정을 통해 Scroll.

 (2) 방법
  1) X축 좌표 입력하여 데이터 추가
   s.AddXY(1, 10, ‘1번’, clRed);
   s.AddXY(2, 20, ‘2번’, clRed);
   s.AddXY(3, 30, ‘3번’, clRed);
   s.AddXY(1.5, 15, ‘1.5번’, clRed);
   s.AddXY(2.5, 25, ‘2.5번’, clRed);
 

  2) X축 범위 설정을 통해 Scroll 구현
   Chart1.BottomAxis.SetMinMax(1.5, 2.5);

3. Label 변경

 (1) 원리
  – 데이터가 추가되고 Label List Class가 있지만 읽기전용으로 수정 불가능.
  – GetAxisLabel Event를 통해 LabelText를 바꿀 수 있음.

 (2) GetAxisEvent
procedure TForm1.Chart1GetAxisLabel(Sender: TChartAxis;
  Series: TChartSeries; ValueIndex: Integer; var LabelText: string);
begin
end;

  – Sender : 어떠한 축에서 Event가 발생되었는지 알 수 있음.
  – Series : 어떠한 Series에서 Event가 발생되었는지 알 수 있음. 단, 데이터 등록시 Label을 입력하지 않으면 Series는 GetAxisLabel Event를 발생하지 않음.
  – ValueIndex : 현재 표시되려는 Label의 Index를 알 수 있어 데이터에 접근 가능. 단, 데이터 등록시 Label을 입력하지 않으면 ValueIndex는 -1로 전송받음.
  – LabelText : 표시 되려는 Label. 이 변수를 변경함으로써 표시되는 Label 변경 가능. 실제 내부 Label값은 변하지 않음. 이 LabelText의 Format은 해당 축의 (Property) AxisValuesFormat으로 결정됨.

 (3) 방법
procedure TForm1.Chart1GetAxisLabel(Sender: TChartAxis;
  Series: TChartSeries; ValueIndex: Integer; var LabelText: string);
begin
    // Y축 Label 변경
    if (Sender = Chart1.LeftAxis) then  // Y축인지 검사
    begin
      LabelText := Format(‘[%s]’, [LabelText]);
    end;

    // X축 Label 변경
    if (Sender = Chart1.BottomAxis) and (Series = Series1) then  // X축인지 검사 // Series 검사를  하지 않으면 예외 Label이 발생 할 수 있음.
    begin
      try
        LabelText := FormatDateTime(‘hh:nn:ss’, StrToDateTime(LabelText));
      except
        LabelText := ‘Wrong Format’;
      end;
    end;
end;

4. 많은 데이터 처리

 (1) 원리
   – 데이터 추가시 Label을 입력하게 되면 데이터 개수가 많아질수록(약 1만개 이상) Chart Class가 전체적으로 느려짐.
   – Label의 길이가 길어지면 더 빨리 느려지고, Label을 입력하지 않으면 속도가 아주 빠름.
   – 데이터 추가시에는 Label을 입력하지 않고, GetAxisLabel을 통해 표현하는 방법이 최고 속도 구현. 이때 GetAxisLabel의 LabelText는 좌표값으로 표시됨.

 (2) 방법
  1) 데이터 추가
for i := 1 to 86400
   s.AddXY(i, i * 10, ”, clRed);
 
  2) Label 변경
procedure TForm1.Chart1GetAxisLabel(Sender: TChartAxis;
  Series: TChartSeries; ValueIndex: Integer; var LabelText: string);
begin
    // X축 Label 변경
    if (Sender = Chart1.BottomAxis) and (Chart1.SeriesCount > 0) then  // X축인지 검사
    begin
      LabelText := Format(‘%s번’, [LabelText]);
    end;
end;

5. 시간 형식 Label 사용 및 시간 기준 Scroll

 (1) 원리
  – X축 Label 시간을 표시하는 방법
  1) 데이터 추가시 Label에 시간 넣기
  2) GetAxisLabel에서 시간 표시하기
  – 빠른 속도를 위해 Label을 입력하지 않고 위치값에 TDateTime값을 입력하여 Label을 TDateTime으로 변환하여 표시
  – 위치값을 시간으로 입력하면 SetMinMax 함수를 통해 시간 기준 Scroll 가능
 
 (2) 방법
  1) 데이터 추가
dtPivot: TDateTime;

var
  i: integer;
  dtAdd: TDateTime;
begin
  Series1.Clear;

  dtPivot := Now; // 전역변수에 마지막 시간을 입력한다.
  dtAdd := dtPivot;

  for I := 1 to 86400 do // 1초마다 24시간 만큼 추가
  begin
    Series1.AddXY(dtAdd, i, ”, clRed);
    dtAdd := dtAdd – (1/24/60/60);  // 1초 감소
  end;
end;
 
  2) 시간 표시
procedure TForm1.Chart1GetAxisLabel(Sender: TChartAxis;
  Series: TChartSeries; ValueIndex: Integer; var LabelText: string);    // Label이 없게 데이터를 추가하면  ValueIndex는 항상 -1로 넘어옴.
var
  dtLabel: TDateTime;
  dDT: double;
begin
  if (Sender = Chart1.BottomAxis) and (Chart1.SeriesCount > 0) then
  begin
    try
      dDT := StrToFloat(LabelText);
      dtLabel := dDT;
      LabelText := FormatDateTime(‘hh:nn:ss’, dtLabel);
    except
      LabelText := ‘Error’;
    end;
  end;
end;

  3) Scroll
var
  dtBegin, dtEnd: TDateTime;
begin
  dtBegin := dtPivot – ((1/24/60/60) * 10); // 마지막 시간 기준 10초 전으로 설정
  dtEnd := dtPivot; // 마지막 시간으로 설정

  if Chart1.Zoomed = false then // Zoom이 안되어 있을때만 스크롤
    Chart1.BottomAxis.SetMinMax(dtBegin, dtEnd);

  4) Zoom 해제 시, Scroll 영역 설정
procedure TForm1.Chart1UndoZoom(Sender: TObject);
var
  dtBegin, dtEnd: TDateTime;
begin
  // Zoom이 풀릴때 스크롤중이라면 범위를 맞춘다.
  if IsScroll then
  begin
    dtBegin := dtPivot – ((1/24/60/60) * 9);
    dtEnd := dtPivot;
    Chart1.BottomAxis.SetMinMax(dtBegin, dtEnd);
  end;

6. 선긋기

 (1) 원리
  – CalcXPosValue, CalcYPosValue 함수를 통해 축의 위치값에 해당하는 화면 좌표를 얻을 수 있음.
  – 해당 좌표를 이용하여 가로선, 세로선, 사각형, 글자를 AfterDraw 이벤트에서 Draw.

 (2) 방법
procedure TFrameLine.Chart2AfterDraw(Sender: TObject);
var
  x, y, i, xcc, ri, j:integer;

  dtBegin, dtEnd: TDateTime;
  sChamber: String;
  sLabel, sLabel2: String;

  // 범위용
  rT: TRect;
begin
  // 가로선
  if IsHorzLine then
  begin
    // Y축 5에 해당하는 좌표얻기
    y := Chart2.LeftAxis.CalcYPosValue(5);
    if (y >= Chart2.ChartRect.Top) and (y <= Chart2.ChartRect.Bottom) then
    begin
      // 선 색상 지정
      Chart2.Canvas.Pen.Color := clPurple;
      // 폰트 색상, 글꼴, 크기 지정
      Chart2.Canvas.Font.Name := ‘Arial’;
      Chart2.Canvas.Font.Color := clPurple;
      Chart2.Canvas.Font.Size := 8;

      // Y축 왼쪽부터 오른쪽까지 선긋기
      Chart2.Canvas.MoveTo(Chart2.ChartRect.Left,y);
      Chart2.Canvas.LineTo(Chart2.ChartRect.Right,y);
      Chart2.Canvas.TextOut(Chart2.ChartRect.Right + 2, y – 6, ‘This is 5’); // +2, -6은 적절한 위치 설정은 위함
    end;
  end;

  // 세로선
  if IsVertLine then
  begin
    // X축 3초전 좌표얻기
    dtBegin := dtPivot – ((1/24/60/60) * 3);
    x := Chart2.BottomAxis.CalcXPosValue(dtBegin);
    if (x >= Chart2.ChartRect.Left) and (x <= Chart2.ChartRect.Right) then
    begin
      // 선 색상 지정
      Chart2.Canvas.Pen.Color := clBlue;
      // 폰트 색상, 글꼴, 크기 지정
      Chart2.Canvas.Font.Name := ‘Arial’;
      Chart2.Canvas.Font.Color := clBlue;
      Chart2.Canvas.Font.Size := 8;

      // X축 위부터 아래까지 선긋기
      Chart2.Canvas.MoveTo(x, Chart2.ChartRect.Bottom);
      Chart2.Canvas.LineTo(x, Chart2.ChartRect.Top);
      Chart2.Canvas.TextOut(x, 10, Format(‘This is %s’, [FormatDateTime(‘hh:nn:ss’, dtBegin)]));
    end;
  end;

  // 범위
  if IsRange then
  begin
    // X축 6초전 좌표얻기
    dtBegin := dtPivot – ((1/24/60/60) * 6);
    // X축 3초전 좌표얻기
    dtEnd := dtPivot – ((1/24/60/60) * 3);

    // 사각 좌표 얻기
    rT.Left := Chart2.BottomAxis.CalcXPosValue(dtBegin);
    rT.Right := Chart2.BottomAxis.CalcXPosValue(dtEnd);

    rT.Top := Chart2.ChartRect.Top;
    rT.Bottom := Chart2.ChartRect.Bottom;

    // Zoom 상태를 감안하여 표시 여부 설정
    if (rT.Left <= Chart2.ChartRect.Right) and (rT.Right >= Chart2.ChartRect.Left) then
    begin
      if rT.Left <= Chart2.ChartRect.Left then rT.Left := Chart2.ChartRect.Left;    // 좌측을 넘어가는 범위 자르기
      if rT.Right >= Chart2.ChartRect.Right then rT.Right := Chart2.ChartRect.Right; // 우측을 넘어가는 범위 자르기

      // 선 색상
      Chart2.Canvas.Pen.Color := clGreen;
      // 채우기 색상, 스타일
      Chart2.Canvas.Brush.Style := bsDiagCross;
      Chart2.Canvas.Brush.Color := clGreen;
      // 상자 그리기
      Chart2.Canvas.Rectangle(rT);

      // 상단 중간에 글자 표시
      Chart2.Canvas.Font.Name := ‘Arial’;
      Chart2.Canvas.Font.Color := clGreen;
      Chart2.Canvas.Font.Size := 8;
      Chart2.Canvas.TextOut(rT.Left, 0, Format(‘This is %s ~ %s’, [FormatDateTime(‘hh:nn:ss’, dtBegin), FormatDateTime(‘hh:nn:ss’, dtEnd)]));
    end;
  end;
end;

카테고리: 델파이 | 댓글 남기기

멀티선택(TAdvStringGrid)

Q10: I want to select multiple rows with Ctrl – mouseclick and Shift – mouse click

A10: In the Options property set goRowSelect = true and set MouseActions.DisjunctRowSelect = true. The desired selection capabilities are enabled now.

카테고리: 볼랜드 | 댓글 남기기

Windows :: 프로세스들을 실행하는 함수들

/*
 http://sosal.tistory.com/
 * made by so_Sal
 */

이번장에서 살펴볼 함수들
1.WinExec()
   CreateProcess()
2.ShellExecute()
   ShellExecuteEx()

================= 1. WinExec(), CreateProcess() =================
아래는 WinExec() 와 CreateProcess()를 살펴보겠습니다.

WinExec() 함수는 Windows 3.x 버전에서
새로운 프로세스 (프로그램)을 실행시키는 유일한 함수였습니다.
상당히 간결하게 사용할 수 있는 함수입니다.

WinExec의 문제점은? ::
프로그램이 실행되고 나면 이전의 프로세스가 새로이 생성된
프로세스에게 간섭할 수 없다. (접근 불가)
(프로그램이 제대로 작동하는지, 종료시 리턴값 등)
아래 첫번째 인자에 대한 보안 위험성도 문제점중 하나이다.
결론 :: 아주 간단하게 프로그램을 실행시키기 위한 경우에만 쓰자!
     :: 그외에는 CreateProcess 함수 호출!!
     :: 아래에서 배울 ShellExecute() 함수는 내부적으로 CreateProcess()를 호출

UINT WinExec(
     LPCSTR lpCmdLine,
     UINT uCmdShow);

LPCSTR lpCmdLine // 실행될 프로그램의 경로를 입력받습니다.

절대 경로를 입력시에 절대경로에 맞춰서 실행됩니다.
그 외에 상대경로를 입력시
1. 함수를 실행하는 프로그램이 존재하는 디렉토리
2. Windows System 디렉토리
3. Windows 디렉토리
4. :: PATH :: 환경변수에 등록된 디렉토리
를 순서로 검색하여 실행합니다.

* lpCmdLine 입력시 보안상 문제가 발생한다.
WinExec( "C:\\Program Files\\Games…. " , …);
이렇게 입력했다고 가정했을때, lpCmdLine으로 넘어가는 인자의 값은
c: -> Program Files -> Games -> 로 검색해서 파일을 찾는다.
하지만 중간에 누군가 악의적으로 "Program.exe"라는 파일을 만들어 놓는다면
위처럼 Program Files를 호출하는 모든 프로세스가 Program.exe 파일을
실행하게 된다. 따라서 인자를 넘길때 " (\" ) 따옴표로 묶는걸 권장한다.
ex)
WinExec( " \"C:\\Program Files\\Games…. \" " , …);

UINT uCmdShow // 실행되어질 프로그램의 상태 Flag를 나타냄
INT nShowCmd                 // 윈도우 상태 옵션
SW_HIDE                           // 숨긴다
SW_SHOWNORMAL            // Normal 크기로 활성화
SW_SHOWMINIMIZED         // 최소화 크기로 활성화
SW_SHOWMAXIMIZED        // 최대화 크기로 활성화
SW_SHOWNOACTIVATE      // 최근의 위치와 크기로 활성화
SW_SHOW                         // 조건 없이 활성화
SW_MINIMIZE                    // 최소화 상태로 활성화
SW_MAXIMIZE                   // 최대화 상태로 활성화
SW_SHOWDEFAULT            // 초기에 윈도우 생성시의 Flag값에 따라 결정
SW_SHOWMINNOACTIVE    // 최소화 상태로 표시, 이미 활성화되어 있다면 내버려둔다
SW_SHOWNA                     // 현상태 유지

프로그램의 실행이 성공시 리턴값은 31보다 크며,
실패시 아래 에러값들이 리턴됩니다.

Error Code                         :: Description
0                                       :: out of memory, out of resource
ERROR_BAD_FORMAT         :: 실행할 수 있는 파일이 아니다.
ERROR_FILE_NOT_FOUND   :: 정해진 경로에 파일이 없다.
ERROR_PATH_NOT_FOUND :: 정해진 경로가 존재하지 않는다.

아래는 CreateProcess 함수입니다.

BOOL CreateProcess(
    LPCTSTR lpApplicationName,
             //생성될 프로세스의 이름 (NULL을 넣고 IpCommandLine로 전달 가능)
     LPTSTR lpCommandLine,
        
   //argc. argv[] 인자로 전달할 문자 매개변수. 표준 검색 경로를 기준으로 찾는다.
     LPSECURITY_ATTRIBUTES lpProcessAttributes, //보안 속성을 지정하는 인자. 보통 NULL
     LPSECURITY_ATTRIBUTES lpThreadAttributes,
                           //쓰레드의 보안 속성 지정. NULL 입력시 기본 보안 속성지정
     BOOL bInheritHandles, // TRUE ::부모 프로세스가 소유하는 상속 가능한 핸들을 상속한다.
     DWORD dwCreationFlags, // 프로세스의 특성을 결정짓는 옵션. 사용 안할경우 0 입력
     LPVOID lpEnvironment, //환경변수 지정. NULL 전달시 부모는 자식에게 환경변수 복사
     LPCTSTR lpCurrentDirectory, //생성하는 프로세스의 현재 디렉터리 NULL시 자식위치 = 부모위치
     LPSTARTUPINFO lpStartupInfo, //STARTUPINFO 구조체 변수 초기화후 변수의 포인터를
               //매개변수 로 전달. STARTUPINFO 구조체 변수들은 프로세스의 속성 정보를 전달한다.
     LPPROCESS_INFORMATION lpProcessInformation
           
//생성하는 프로세스의 정보를 얻기 위한 매개변수.
               //PROCESS_INFORMATION 구조체 변수의 주소값을 받음
);
다들 잘 알고있을거란 생각에..
자세한 내용은 링크로 대신합니다.
LINK_


================= 2. ShellExecute(), ShellExecuteEx() =================

ShellExecute()함수에 대해서 먼저 설명한다.

HINSTANCE ShellExecute(
     HWND hwnd,                  // 부모가 될 윈도우 핸들
     LPCTSTR lpVerb,           // 실행시 행동
     LPCTSTR lpFile,             // 실행 대상 문서
     LPCTSTR lpParameters,  // argv[] 인자
     LPCTSTR lpDirectory,      // 현재 디렉토리
     INT nShowCmd              // 윈도우 상태 옵션
);

HWND hwnd ::
CreateProcess()는 함수를 실행하는 프로세스가 부모 프로세스가 되지만
ShellExecute() 함수는 부모프로세스를 임의로 지정할 수 있습니다.

HWND
hwnd = GetDesktopProcess(); (바탕화면 HWND 리턴. NULL을 집어넣은것과 같음)
HWND hwnd = GetForegroundProcess(); (화면에서 가장 앞에 떠있는 프로세스)

다른 HWND 값을 얻어와서 넣든 간에 IPC 프로그래밍이 아닌 이상
비중있는 인자는 아닙니다. (물론 상황에 따라서.. 중요할수도)

LPCTSTR lpVerb :: <대소문자 관계 없음>
open    // 실제 프로그램을 실행시킨다.
explore // 디렉토리를 lpFile 인자로 전달시에 탐색기로 실행한다.
           // open으로 디렉토리를 실행시키면 단순 풀더만 연다.
           // 실행파일 (.exe 등)을 넣을경우 아무런 반응 없다.
print     // lpFile 매개변수로 들어온 파일을 인쇄한다.
           // 파일의 확장자에 따른 프로그램의 인쇄명령어를 검색하여 실행한다.
           // 프린터나 출력될 포트를 설정하고 싶으면 printto를 사용
find      // lpFile 매개변수로 들어온 디렉토리에 검색창을 띄운다.
           // 디렉토리를 실행할 경우 반응無

LPCTSTR lpParameters,  // argv[] 인자를 넣어준다.
LPCTSTR lpDirectory
     // 현재 디렉토리를 직접 지정할 수 있다.
     // NULL 입력시 프로그램이 실행되는 위치의 Directory가 설정된다.

INT nShowCmd                 // 윈도우 상태 옵션
SW_HIDE                           // 숨긴다
SW_SHOWNORMAL            // Normal 크기로 활성화
SW_SHOWMINIMIZED         // 최소화 크기로 활성화
SW_SHOWMAXIMIZED        // 최대화 크기로 활성화
SW_SHOWNOACTIVATE      // 최근의 위치와 크기로 활성화
SW_SHOW                         // 조건 없이 활성화
SW_MINIMIZE                    // 최소화 상태로 활성화
SW_MAXIMIZE                   // 최대화 상태로 활성화
SW_SHOWDEFAULT            // 초기에 윈도우 생성시의 Flag값에 따라 결정
SW_SHOWMINNOACTIVE    // 최소화 상태로 표시, 이미 활성화되어 있다면 내버려둔다
SW_SHOWNA                     // 현상태 유지

ex)
#include<stdio.h>
#include<tchar.h>
#include<windows.h>

int _tmain(int argc, TCHAR *argv[]){

 HWND hwnd = GetForegroundWindow();
 ShellExecute(hwnd,_T("open"),_T("notepad"),_T("Sosal"),,SW_SHOW);
 ShellExecute(hwnd,_T("find"),_T("c:\\"),NULL,,SW_SHOWMAXIMIZED);
 ShellExecute(hwnd,_T("explore"),_T("c:\\"),NULL,,SW_SHOW);
 //프린트는 제가..;; 없는관계로 ㅇ_ㅇ ;;
Sleep(2000);

 return 0;
}

=== ShellExecuteEx() 함수 설명

BOOL ShellExecuteEx(LPSHELLEXECUTEINFO lpExexInfo);
ShellExecute() 함수에서는, 매개변수로 모든 정보를 넘기는 반면
ShellExecuteEx() 함수는 구조체로 원하는 프로세스의 정보를 모두 담아서
프로세스를 실행시킵니다.

SHELLEXECUTEINFO 구조체의 정의

typedef struct _SHELLEXECUTEINFO {
    DWORD     cbSize;              // 구조체 사이즈(=60)
    ULONG     fMask;               // 옵션
    HWND      hwnd;                // 친 윈도우
    LPCTSTR   lpVerb;             // 동작명
    LPCTSTR   lpFile;              // 파일명
    LPCTSTR   lpParameters;   // 커멘드 라인 파라미터
    LPCTSTR   lpDirectory;       // 기동시 디렉토리
    int       nShow;                   // 표시 형식
    HINSTANCE hInstApp;        // 결과치
    LPVOID    lpIDList;              // 아이템ID리스트
    LPCTSTR   lpClass;           // 클래스명
    HKEY      hkeyClass;          // 파일 클래스의 레지스트리 키
    DWORD     dwHotKey;         // hot key
    union {
        HANDLE  hIcon;             // 파일 클래스의 아이콘
        HANDLE  hMonitor;        // 모니터
    } DUMMYUNIONNAME;
    HANDLE    hProcess;         // 프로세스 핸들
} SHELLEXECUTEINFO, FAR *LPSHELLEXECUTEINFO;

구조체에 대한 자세한 설명은 설명이 잘 되어있는 링크로 넘기겠습니다.
LINK_

cbSize는 전달하는 구조체가 무엇인지 분명히 하기 위한
인자이기 때문에, 꼭 정의해주셔야 합니다.

SHELLEXECUTEINFO sci = {0,};
sci.cbSize = sizeof(SHELLEXECUTEINFO);  // == sizeof(sci);

sci.lpFile = __T("notepad");                // lpFile 역할
sci.nShow = SW_SHOWMAXIMIZED;   // nShowCmd 역할
sci.lpVerb = _T("open");                    // lpVerb 역할

여기까지만 정의해주고 ShellExecuteEx(&sci); 로
함수를 실행해줘도 ShellExecute() 함수와 비슷하게 사용이 가능합니다.

이것 외에 SHELLEXECUTEINFO 구조체를 이용해서
PIDL을 호출하여 더욱 많은 기능을 활용할 수 있다.

//#include<shlobj.h>

LPITEMIDLIST pidl;
SHGetSpecialFolderLocation(NULL, CSIDL_PRINTER, &pidl);

sci.lpIDList = pidl;
sci.fMask = SEE_MASK_INVOKEIDLIST;

ShellExecuteEx(&sci);

fMask에 SEE_MASK_NOCLOSEPROCESS 인자가 들어가있다면
sci 구조체 안에 hProcesss 멤버변수러
새로 생설되어질 프로세스의 핸들을 반환받아
핸들값을 사용할 수 있습니다.
ShellExecute, ShellExecuteEx()
lpverb, lpFile 모두 동적으로 매개변수를 지정할 수 있습니다.

LPITEMIDLIST 구조체와
SHGetSpecialFolderLocation() 함수는..
이번 포스트에 함께 정리하는건 너무 버거울것 같네요..
어영부영 포스트 마치네요.. 나중에 수정이라도 해야겠습니다. ㅠㅠ

카테고리: 볼랜드 | 댓글 남기기

Delphi 2007 라이센스 체크 무시하고 설치 완료하는 방법

 

1. 설치파일 설치가 완료되었다면 " 시작- 프로그램 에서 CodeGear RAD Studio – Check For Updates" 를

   선택하여 업데이트를 한다. 시간이 좀 걸린다.

 

2. 업데이트가 완료 되었다면 설치파일 폴더의 DelphiDistiller.exe 를 실행시킨다.

   그럼 하단의 화면이 나온다. 기본 탭 메뉴는 Packages and Experts Manager 로 되어있다.

   그럼 옆탭인 Tweaks 을 선택하자. 그리고 설명한대로 잘 따라해보자.

 

 

 

 

이방법을 몰라 한동안 해맸다. 정말 삽질 장난 아니다. ㅜㅜ;

 

영어 공부좀 해야겠다. 아무생각없이 하다간 시간을 허송새월 보낼것이 분명하다.

 

부디 꼭 설치완료하길 빌겠다.

 

 

카테고리: 볼랜드 | 댓글 남기기

Invalid BLOB handle in record buffer

만약에 "Invalid BLOB handle in record buffer" 에러가 인덱스를 갖지 않는 활성화 되지 않은(Dead, Canned) Query나 Table에서 발생하면 BDE 4.x 환경설정의 파라미터인 ‘BLOBS TO CACHE’ 의 설정 값을 증가 시키면 해결이 됩니다.

이 설정은 얼마나 많은 BLOB들을 클라이언트 상에 저장할지를 결정합니다.

비활성화된(dead) 테이블을 Open하거나 Query를 사용하여 비활성화된(dead) BLOB들의 조회를 처리하는 Application은 클라이언트상에 유용 가능한 자원에 의존하여 저장할 제한된 BLOB의 수를 설정할 수 있습니다.

설정된 값이 100이라면 이는 Application이 최대 100개의 BLOB 레코드를 저장할 수 있다는 뜻입니다. 만약 100개 이상의 레코드를 조회한다면, 100개의 레코드만 스크롤하고 "Invalid BLOB handle in record buffer" 이라는 메시지를 표출할 것입니다.

주의 : 이 파라미터는 활성화된 테이블을 Open하는 경우에는 적용되지 않습니다.

기본 값 : 64

값의 범위 : 64 ~ 65536

아래에 75242번 델쵸님이 -1로 설정 하면 된다고 하셨는데..

이는 양수의 65536의 값 설정과 동일한 개념이 됩니다. 음수의 값을 설정하면 범위는 -65472 ~ -1이 됩니다.

* 출처 : 델마당
* 참고 : BLOB
A BLOB is a binary large object that can hold a variable amount of data.
Size : 2^16-1(65536) 

카테고리: 볼랜드 | 댓글 남기기

RealGrid 컴포넌트 활용

리얼그리드 복사하기

값이 있는 그리드에서 값이 없는 그리드로 똑같이 복사하기

* realgrid1 : 값이 있는 그리드, realgrid2 : 값이 없는 그리드
* realgrid1 과 realgrid2의 구조는 같아야 한다. 다를시 특별한 에러는 발생안하며 있는 컬럼만 복사가 된다.

ex : realgrid2.AssignData(realgrid1);

복사될 그리드에 컬럼이 생성되지 않은 경우, 아래 소스 실행

procedure TForm1.Button1Click(Sender: TObject);
var
    i : Integer;
    c : TwColumn;
begin

    realgrid1.RowCount := 2;
    realgrid1.Cells[0,0].AsString := ’11’;
    realgrid1.Cells[1,0].AsString := ’11’;
    realgrid1.Cells[2,0].AsString := ’11’;
    realgrid1.Cells[3,0].AsString := ’11’;

    realgrid1.Cells[0,1].AsString := ’11’;
    realgrid1.Cells[1,1].AsString := ’11’;
    realgrid1.Cells[2,1].AsString := ’11’;
    realgrid1.Cells[3,0].AsString := ’11’;

    realgrid2.Clear;
    for i := 0 to realgrid2.ColCount -1 do
    begin
        c := realgrid2.Columns.Add;
        c.Title.Caption := realgrid2.Columns[i].Title.Caption;
    end;

    realgrid2.AssignData(realgrid1);
end;

참고주소 : http://www.realgrid.co.kr/realgrid_tutorial_01.asp

리얼그리드 셀값에 엔터넣기

realgrid1.AddRow;

realgrid1.Cells[0,0].AsString := ‘나의 이름은’+#13#10+’김상만’+#13#10+’입니다.’;

realgrid1.Cells[1,0].AsString := ‘너는’+#13+’나를’+#10+’모른다.’;

 

좌표값을 상수로 처리하여 쉽게 관리하기

 

RealGrid의 셀에 데이타를 삽입할때 "cells[0,2]" 와 같이 직접입력한 숫자로 셀위치에

접근하는것보다 상수로 좌표값을 만들어 셀위치에 접근하게되면 신규개발 시간은 더

걸리지만 수정, 유지보수 시간은 시간이 덜 걸립니다.

 

상수이용 예제

implementation

{$R *.dfm}

const //# 그리드컬럼 가로좌표 상수 #//
  name_value    = 0;
  age_value     = 1;
  address_value = 2;

procedure TForm1.Button1Click(Sender: TObject);
begin
  with realgrid1 do begin

    AddRow;
    cells[name_value,0].AsString := ‘이준식’;
    cells[age_value,0].AsString := ’27’;
    cells[address_value,0].AsString := ‘서초구’;

    AddRow;
    cells[name_value,1].AsString := ‘이영애’;
    cells[age_value,1].AsString := ’25’;
    cells[address_value,1].AsString := ‘서초구’;

  end;
end;

 

2. 하드코딩으로 그리드 타이틀 정렬(Sort) 기능 넣기

 

정렬은 현재 그리드에 출력된 데이타를 대상으로 정렬하게 되며 서버에서 정렬하여 가져오는것이 아닙니다.

타이틀을 클릭하기 위해서는 Title-Clicking속성을 true로 한다음(소스1)에 ColumnTitleClick  이벤트핸들러 프로시저에 아래 소스(소스2)를 코딩하면 됩니다.

 

소스1

procedure TForm1.FormCreate(Sender: TObject);
var
  i : Integer;
begin
  //# Title-Clicking속성을 true #//
  for i:= 0 to realgrid1.ColCount -1 do begin
    realgrid1.Columns[i].Title.Clicking := true;
  end;
end;

 

※ 소스1 을 사용하는 해당 그리드의 모든 컬럼에 Title-Clicking속성을 true로 한것과 같다.

 

소스2

procedure TForm1.RealGrid1ColumnTitleClick(AColumn: TwColumn);
begin

  //# 타이틀 클릭시 정렬하기 #//
  if AColumn.Title.SortMark = wsmAsc then
    realgrid1.Sort(AColumn.Index, true)
  else
    realgrid1.Sort(AColumn.Index);

end;

 

3. 리얼그리드 컬럼에 CheckBox(체크박스) 추가하기

 

1. 그리드에 컬럼 추가

 

2. 추가한 컬럼의 readonly속성은 false, DataType속성은 wdtBool로 각각 설정

 

3. 그리드의 Options-wgoEditing속성을 true로 설정

 

4. 해당 셀에 값 대입하는 방법

ex : realgrid1.cells[0,0].asboolean := True;

ex : realgrid1.cells[0,0].asboolean := False;

 

⊙ 아무셀이나 클릭시 해당 열의 체크박스셀 변경하기

 

procedure TForm1.RealGrid1Click(Sender: TObject);
begin
  with realgrid1 do begin
    Cells[0,Row].AsBoolean := not Cells[0,Row].AsBoolean;
  end;
end;

 

⊙ 체크박스셀만 클릭시 체크박스셀 변경하기

 

기본적으로 해당셀클릭시 체크박스가 변경되게 되어 있다.
(※ 상단의 RealGrid1Click 이벤트프로시저가 있을시 지워야 합니다.)

 

⊙ "전체선택" 체크박스 만들기

 

 if realgrid1.RowCount = 0 then exit;

 

with realgrid1 do begin

   if checkbox1.Checked = true then begin
     for i := 0 to RowCount – 1 do begin
         Cells[0,i].Value:= true;
     end;
   end
   else
   begin
     for i := 0 to RowCount – 1 do begin
         Cells[0,i].Value:= false;
     end;
   end;
 end;

 

⊙ 체크박스한 셀이나 열의 글자색/배경색 변경하기

 

DrawCell이벤트-셀단위로 이벤트 발생

DrawRow이벤트-열단위로 이벤트 발생

 

DrawCell이벤트 사용

 

procedure TForm1.RealGrid1DrawCell(AColumn: TwColumn; ARow: Integer;
  var Text: String; var BCol, FCol: TColor; var FStyle: TFontStyles);
begin

  //# 현재선택된 셀에만 적용한다. #//
  //# AColumn.Index으로 제한을 안하면 행전체에 적용된다. #//
  if AColumn.Index = 0 then begin
    if realgrid1.Cells[0,arow].AsBoolean = true then
      BCol:= ClSkyBlue
    else
      BCol := ClWhite;
  end;

end;

 

또는

 

  if (AColumn.Index = 16) then begin
    if realgrid1.Cells[16,arow].AsString = ‘삭제’ then begin
      FCol:= ClRed;
    end else if realgrid1.Cells[16,arow].AsString = ‘미삭제’ then begin
      FCol:= ClBlue;
    end;
  end;

 

DrawRow이벤트 사용

 

procedure TForm1.RealGrid1DrawRow(Sender: TObject; ARow: Integer; var BCol,
  FCol: TColor; var FStyle: TFontStyles);
begin

  //# 현재선택된 행전체에 적용한다. #//
  if realgrid1.Cells[0,arow].AsBoolean = true then
    BCol:= ClSkyBlue
  else
    BCol:= ClWhite;

end;

 

RealGrid의 컬럼에 체크박스를 추가한후 한번클릭으로 체크/언체크 구현하기

 

기본 설정된 RealGrid는 체크박스 컬럼을 초기1회 클릭하게되면 일반모드상태로 있다가 컬럼의 위치 변경없이 방금 누른 컬럼을 다시 클릭하게되면 편집(수정)모드로 전환됩니다.

그래서 체크박스 컬럼의 경우 2번의 클릭으로 체크/언체크가 됩니다.

하지만 Options/wgoAlwaysShowEditor 속성을 true 로 주면 클릭시 항상 컬럼의 모드가 편집(수정)모드 이므로 체크박스 컬럼의 경우 1번의 클릭으로 체크/언체크가 가능합니다.

 

※ 맨좌측에 포인트가 우츨화살표이면 일반모드이고 문서모양이면 편집모드이다.

 

4. 리얼그리드 컬럼에 ComboBox(콤보박스) 추가하여 변환값을 구현하기

 

0. 콤보박스는 속성창의 DataType 속성값을 변경할 필요가 없다.

 

1. 그리드에 출력하기전에 특정셀에 콤보박스 초기화를 해준다.

 

0 번째 컬럼에 콤보박스 초기화

realgrid1.Columns[0].Items.add(‘이준식’);
realgrid1.Columns[0].Items.add(‘백윤정’);
realgrid1.Columns[0].Values.add(‘1’);
realgrid1.Columns[0].Values.add(‘2’);

 

※ Items.add는 화면에 출력되는 값이며 Values.add는 내부적으로 가지고 있는 값이다.

※ Items.add 와 Values.add 는 순서대로 매칭되며 Values.add 의 값을 변경하면 순서대로 매칭되는 Items.add의 값도 변경됩니다.

 

2. 그리드에 값을 대입한다.

 

addrow;

cells[0,0].AsString := ‘2’;
cells[1,0].AsString := ‘ddddd’;
addrow;

cells[0,0].AsString := ‘1’;
cells[1,0].AsString := ‘ddddd’;

 

※ 콤보박스 적용셀에서 text 메소드는 외부값을 제어하며 asstring은 내부값을 제어한다.

※ 콤보박스 적용셀에서 text 메소드는 읽기만 가능하며 asstring은 읽기,쓰기가 가능하다.

 

3. 주의사항및 추가설명

 

콤보박스가 적용된 컬럼은 ReadOnly속성을 true하여 수정이 불가능하게 해야 합니다.

 

콤보박스가 적용된 셀에 값대입(asstring)시에는 초기에 정의한 Values 값만 대입해준다.

 

초기 정의값 이외의 값을 대입(asstring)하게되면 콤보박스에 출력은 되나 정상적으로 참을 참조 할수 없다.

 

DB에서 변환값(CASE….WHEN)을 이용해 가져오는것보다 그리드에서 변환값을 이용하면 개발시 더편하며 유연성을 가질수 있다.

그이유는 DB에서 변환값을 이용해 값을 가져오면 변환값만 그리드에서 가져오므로 변환되기전에 값이 필요할경우 DB에서 컬럼을 추가해서 가져와야 한다.

하지만 그리드에서 변환값을 이용하면 변환값과 변환되지전에 값을 모두 한꺼번에 그리드에서 참고할수 있다.

 

5. 리얼그리드 컬럼에 Button(버튼), 날짜선택 추가하기

 

버튼을 주고 싶은 컬럼의 속성창에서 EditButton 속성을 true 로 준다.

버튼클릭시 발생 이벤트onEditButtonClick

 

날짜선택을 주고 싶은 컬럼의 속성창에서 DataType 속성을 wdtDate 로 준다.

 

6. 리얼그리드 컬럼에 RadioGroup(라디오그룹) 추가히기

 

그리드 폼디자이너 설정

라디오그룹을 적용할 컬럼의 속성창에서 DataType 속성값을 wdtString 로 주고 EditStyle 속성값을 wesRadioGroup 로 주고 RadioColumns 속성값에 라디오버튼갯수만큼 줍니다.

 

그리드 코드에디터 설정

폼 create 이벤트시에 아래 소스를 넣습니다.

realgrid.Columns[적용컬럼 순서값].Items.add(‘외부값’);
realgrid.Columns[적용컬럼 순서값].values.add(‘내부값’);

※ 콤보박스 추가와 비슷하게 asstring 속성을 이용해 내부값을 대입하고 읽어온다.

※ 콤보박스 추가와 비슷하게 text 속성을 이용해 내부값을 읽어만 온다.

※ 그리드의 Options-wgoEditing 속성값을 true 로 줘야 선택가능하다.

 

7. 리얼그리드 Options 속성값 코딩으로 제어하기

 

realgrid1.Options := [wgoRowSelect,wgoEditing,wgoFocusRect,wgoSkipReadOnly];

 

또는

 

Options := Options – [wgoEditing];
Options := Options + [wgoEditing];

 

※ [] 안에 있는 Option 들만 true 로 설정되고 나머지는 false 로 설정됩니다.

 

8. Realgrid 1.2.4 에서 ctrl+c 단축키를 이용해 해당셀의 값을 클립보드에 저장히기

 

리얼그리드 1.2.4 에서는 Opions – wgoEditing 에 true 을 준후 해당 셀에 realonly 을 true 로 주면 셀안에 문자열이 선택이 안됩니다. 이때는 키보드를 탐지하여 ctrl + c 를 할경우 클립보드에 저장하는 소스를 넣어야 합니다.

아래 소스를 리얼그리드 keydown 이벤트에 넣습니다.

 

# 일반모드일때 사용하는 소스

If (Shift = [ssCtrl]) and (Key = 67) then begin
  with realgrid1 do begin
      //## 클립보드 내용 비우기 ##//
      ClipBoard.Clear;
      //## 클립보드 내용 저장하기 ##//
      ClipBoard.SetTextBuf(PChar(Cells[col,row].AsString));
      //## 클립보드 내용 출력하기 ##//
      ShowMessage(ClipBoard.AsText)
  end;
end;

 

※ uses절에 Clipbrd 추가

 

※ Sender 키워들를 사용한 사용예제

# 일반모드일때 사용하는 소스

If (Shift = [ssCtrl]) and (Key = 67) then

begin

   with (Sender as TRealGridEx) do begin

      if (Sender as TRealGridEx).RowCount = 0 then
      begin
         exit;
      end;

      //## 클립보드 내용 비우기 ##//

      ClipBoard.Clear;

      //## 클립보드 내용 저장하기 ##//

      ClipBoard.SetTextBuf(PChar(Cells[col,row].AsString));

   end;

end;

 

# 그룹모드일때 사용하는 소스

# Fixed Count 속성값을 사용할때 사용하는 소스

If (Shift = [ssCtrl]) and (Key = 67) then
begin
   with (Sender as TRealGridEx) do begin
      if (Sender as TRealGridEx).RowCount = 0 then
      begin
         exit;
      end;

      ClipBoard.Clear;
      //# 그룹모드일때 col 속성값은 무조건 0이다.
      //ClipBoard.SetTextBuf(PChar(Cells[SelectedColumn.Index,row].AsString));
      ClipBoard.SetTextBuf(PChar(Cells[SelectedIndex,row].AsString));
   end;
end;

 

9. 리얼그리드을 그룹모드로 설계하기

 

9-1. 그리드를 폼에 하나 두고 컬럼을 4개 추가한다.

 

9-2. 그리드에서 마우스 오른쪽 버튼으로 ‘Groups Editor’을 클릭하여 그룹을 2개 추가한후 첫번째 그룹 속성에서 Title-Visible을 false로 변경하고 두번째 그룹속성의 Title-Caption을 ‘처리’로 변경한다.

 

9-3. 첫번째, 두번째 컬럼을 선택하고 Group속성에서 첫번째 그룹을 선택한다.

 

9-4. 세번째, 네번째 컬럼을 선택하고 Group속성에서 두번째 그룹을 선택한다.

 

9-5. 그리드에서 마우스 오른쪽 버튼으로 ‘Group Mode’을 클릭하여 현재 그리드상태를 그룹모드로 변경한다.

※ 그룹모드의 그리드설계는 보통 집계화면에 많이 쓰인다.

 

컬럼의 속성

LevelIndex – 특정그룹에 속해졌을때 순서 인덱스값(0부터 시작)

그룹의 속성

Title – Caption – 그룹 타이틀셀의 제목

TItle – Alignment – 그룹 타이틀셀의 제목정렬

 

10. 그리드의 출력내용을 계산하여 소계/총계 구하기

 

GridSMallSumAdd 함수 소스

 

procedure GridSMallSumAdd(grd:TrealGrid;col,Axis:Integer;Scolor,ToTcolor:Tcolor; SumColList:Array of integer;count,type_i:integer   );
Function co_CharDelete(szStr:String;cStr:Char):String;
var
  stemp : String;
begin
  stemp := szStr;
  While Pos(cStr,stemp) > 0 do
    Delete(stemp,Pos(cStr,stemp),1);

  Result := stemp;
end;

var
  str:string;
  i,j:integer;
  flag:boolean;

  CalcField,//소계
  ToTField:Variant;
  Tcount:integer;

begin

  Tcount:=0;
  CalcField :=  VarArrayCreate([Low(SumColList),High(SumColList)],vardouble  ) ;
  TotField  :=  VarArrayCreate([Low(SumColList),High(SumColList)],vardouble  ) ;

  for i:=Low(SumColList) to High(SumColList) do
  begin
    CalcField[i]:= 0;
  end;

  for i:=Low(SumColList) to High(SumColList) do
  begin
    TotField[i]:= 0;
  end;

  flag:=false;
  while 1=1 do
  begin
    flag:=false;
    for i:=0 to grd.RowCount-1 do
    begin
      if (grd.Cells[col,i].AsString='[소  계]’) or (grd.Cells[col,i].AsString='[총  계]’)  then
      begin
        flag:=true;
      end;
    end;

    if flag=false then
    break;

    for i:=0 to grd.RowCount-1 do
    begin
      if grd.Cells[col,i].AsString='[소  계]’ then
      begin
        grd.DeleteRow(i);
        break;
      end;
    end;

    for i:=0 to grd.RowCount-1 do
    begin
      if grd.Cells[col,i].AsString='[총  계]’ then
      begin
        grd.DeleteRow(i);
        break;
      end;
    end;

  end;

  str:=grd.Cells[Axis,0].AsString;

 

 try
  grd.Row:=0;
  str:=grd.Cells[Axis,0].AsString;
  while 1=1 do
  begin
    str:=grd.Cells[Axis,grd.row].AsString;
    if grd.Row=grd.RowCount-1 then
    begin

      //소계,총계
      grd.Addrow;
      grd.Cells[col,grd.Rowcount-1].AsString:='[소  계]’;
      grd.Addrow;
      grd.Cells[col,grd.Rowcount-1].AsString:='[총  계]’;
      break;

    end
    else
    begin
      if str<>grd.Cells[Axis,grd.Row+1].AsString then
      begin
        // 소계  추가
        grd.InsertRow(grd.Row+1);
        grd.Row:=grd.Row+1;
        grd.Cells[col,grd.Row].AsString:='[소  계]’;
        str:=grd.Cells[Axis,grd.row+1].AsString;

      end
      else
      begin
        //넘어가고
      end;

    end;
   grd.Row:=grd.Row+1;
  end;
 except
   showmessage(‘소계,총계 Error!’);
   exit;
 end;

  for i:=0 to grd.RowCount-1 do
  begin

    for J:=Low(SumColList) to High(SumColList) do
    begin
      CalcField[J]:=CalcField[J]+ strtofloatdef(co_chardelete( grd.Cells[SumColList[j],i].Asstring,’,’),0) ;
    end;

    if grd.Cells[col,i].AsString='[소  계]’ then
    begin
      for J:=Low(SumColList) to High(SumColList) do
      begin
        if type_i=1 then
        grd.Cells[SumColList[j],i].AsString:= FormatFloat(‘#,##0’, CalcField[j])
        else
        grd.Cells[SumColList[j],i].AsString:= CalcField[j] ;
      end;

      for j:=Low(SumColList) to High(SumColList) do
      begin
        CalcField[j]:= 0;
      end;

    end;

  end;

  for i:=0 to grd.RowCount-1 do
  begin

    if (grd.Cells[col,i].AsString='[소  계]’) or
       (grd.Cells[col,i].AsString='[합  계]’) or
       (grd.Cells[col,i].AsString='[총  계]’) then
    continue;

    inc(Tcount);
    for J:=Low(SumColList) to High(SumColList) do
    begin
      TotField[J]:=TotField[J]+ strtofloatdef(co_chardelete( grd.Cells[SumColList[j],i].Asstring,’,’),0) ;
    end;
  end;

  for J:=Low(SumColList) to High(SumColList) do
  begin
    grd.Cells[count,grd.RowCount-1].AsString:= ‘총갯수 : ‘+FormatFloat(‘#,##0’,Tcount) ;
    if type_i=1 then
    grd.Cells[SumColList[j],grd.RowCount-1].AsString:= FormatFloat(‘#,##0’,TotField[j])
    else
    grd.Cells[SumColList[j],grd.RowCount-1].AsString:= TotField[j];
  end;

 

end;

 

함수 파라미터 설명

 

소계/총계를출력할그리드명
소계/총계글씨가나올컬럼순서값
소계기준컬럼순서값(정렬축)
색깔(clred)
색깔(clred)
전체로우갯수를출력할컬럼순서값(맨마지막총계에만출력됨)
소계/총계에출력되는숫자를천단위콤마로표시유무(0-미표시,1-표시)

 

※ 색깔 파라미터는 어떤 색깔을 넣어도 동작하지 않는다. 그래서 해당 그리드의 DrawRow 이벤트를 이용해서 글자색과 셀배경색을 변경해야 한다.

 

소계/총계셀 글자색, 배경색 변경하는 프로시져

 

procedure TFw_313.RealGrid1DrawRow(Sender: TObject; ARow: Integer;
  var BCol, FCol: TColor; var FStyle: TFontStyles);
begin

  //# 조회갯수 체크(중요)
  if realgrid1.RowCount = 0 then begin
    exit;
  end;

  //# 합계, 총계 색깔 변경
  if realgrid1.Cells[0 ,ARow].AsString = ‘[소  계]’ then begin
     BCol := clSkyBlue;
  end
  else if (realgrid1.Cells[0 ,ARow].AsString  = ‘[총  계]’) then begin
     BCol := clFuchsia;
     FStyle := [fsBold];
  end;

end;

 

함수 사용예제

 

GridSMallSumAdd(RealGrid1, 0, 0, clred,clred, [1,2],1,1);

 

※ 소계/총계가 출력되는 집계화면에서는 Footer을 사용할 필요가 없다.

※ 보통 데이타조회는 서버에서 하며 소계/총계 계산은 클라이언트에서 한다.

 

11. 맨하단에 Footer 넣기(맨하단 상태바같은 출력영역_보통 총계에 사용)

 

그리드에 Footer 추가하는 방법

 

1. 그리드 클릭후 오른쪽 마우스 누른후 Footers Editor을 클릭하여 Add new 합니다.

 

2. 그리드 클릭후 오른쪽 마우스 누른후 Columns Editor을 클릭하여 Footer를 출력할 컬럼을

선택한후 Footer-Styles속성을 ‘wfmeCustom’ 으로 변경한다.

 

※ Footer 속성 변경(해당 컬럼 선택후 Footer속성)

Footer – Alignment – 해당 Footer의 정렬을 설정

Footer – Color – 해당 Footer의 배경색 설정

Footer – Font – 해당 Footer의 글자 색,스타일 설정

Footer – MarginRight – 해당 Footer의 오른쪽 마진을 설정

 

3. 아래의 소스를 조회시 사용하면 됩니다.

 

procedure GridSumAdd(grd:TrealGrid;colList:Array of Integer;colcount:integer;title:string;position:integer);
function DeleteChar(DestStr : String; Ch : Char) : String;
begin
  while Pos(Ch,DestStr) <> 0 do
    Delete(DestStr,Pos(Ch,DestStr),1);
  Result := DestStr;
end;

var
   Arr_Sum:Array[0..200] of currency;
   i,j:integer;
Begin

   for i:=0 to 200 do
   Arr_sum[i]:=0;
   for i:=0 to grd.RowCount -1 do
   begin
     for j:=0 to colcount -1 do
     begin
       Arr_sum[j]:=Arr_sum[j]+strtofloatdef( Deletechar(grd.Cells[colList[j],i].AsString,’,’),0);
     end;
   end;

   grd.Columns[Position].Footer[0] :=title;
   for i:=0 to colcount-1 do
   begin
     //grd.Cells[colList[i],grd.RowCount-1].AsString:= FormatFloat(‘#,##0’,Arr_sum[i] );
    grd.Columns[colList[i]].Footer[0]  :=  FormatFloat(‘#,##0’, Arr_sum[i]);
   end;

end;

 

※ 위의 프로시져 안에는 함수가 포함되어 있다. 이럴경우는 내부의 함수는 외부의 프로시져에만 호출이 가능하고 원형선언은 프로시져만 하면 된다.

 

Footer의 모든값을 초기화하는 Procedure

 

procedure GridFooterclear(grid:Trealgrid);
var
 i:integer;
 SortMark:TwSortMark;
begin

  if grid.Footers<>nil then
  begin
   for i:=0 to grid.ColCount-1 do
   begin
     //grd.Cells[colList[i],grd.RowCount-1].AsString:= FormatFloat(‘#,##0’,Arr_sum[i] );
    grid.Columns[i].Footer[0]  := ”;
   end;
  end;

end;

사용예 : GridFooterclear(RealGrid1);

 

Footer에 총계를 출력해주는 Procedure

 

사용형식

GridSumAdd(그리드Name,[총계를구할순서값],구할순서값갯수,타이틀이름,타이틀이름출력순서값);

사용예제

GridSumAdd(RealGrid1, [1,2], 0, ‘[총계]’, 0);

 

※ 총계를 구할 순서값과 갯수에는 타이틀이름을 제외한다.

※ 타이틀이름도 Footer에 나오기 위해서 Footer-Styles 속성을 wfmeCustom 으로 설정한다.

 

Footer에 출력되는 값을 가져오는 방법

 

realgrid1.CalcFooters; 명령어 사용후에 아래 명령어로 참조한다.

 

ShowMessage( realgrid1.Columns[0].Footer.Values[0] );

첫번째[]에 값은 컬럼의 순서값이며 두번째[]에 값은 footers의 순서값이다.

 

12. 그리드행의 컬럼셀 수정 유무 체크

 

그리드행의 컬럼셀이 브라우저모드(일반모드) 에서 에디트모드(수정모드)로 전환되려면 먼저 Options/wgoEditing 속성을 True로 변경해야 합니다.

 

그리드 생성

 

procedure TForm1.Button1Click(Sender: TObject);
begin
  with realgrid1 do begin
    AddRow;
    Cells[0,0].AsString := ‘111’;
    Cells[1,0].AsString := ‘111’;
    AddRow;
    Cells[0,1].AsString := ‘111’;
    Cells[1,1].AsString := ‘111’;
  end;
end;

 

버튼생성후 소스기입

 

if (realgrid1.RowState[0] = wrUpdated) then begin
  ShowMessage(‘0번째 행은 수정되었음’);
end
else begin
  ShowMessage(‘0번째 행은 수정안되었음’);
end;

 

그리드에 데이타를 출력하면 모든 행의 RowState[순서값]의 속성값은 wrNormal 이다.

특정 컬럼을 한번 클릭하면 브라우저모드(일반모드)(맨좌측에 오른쪽 화살표)이고 다시 한번 같은 컬럼을 클릭하면 에디트모드(수정모드)(맨좌측에 문서모양)로 변경된다. 이때까지는 RowState[순서값]의 속성값은 wrNormal 이다.

 

편집모드에서 데이타를 수정한후 ESC키를 누르지 않고 엔터나 화살표키로 다른 행으로 이동하게 되면 수정한 행의 RowState[순서값] 속성값은 wrUpdated가 된다.

※ 물론 에디트모드(수정모드)에서 데이타 수정후 ESC키를 누른후 다른행으로 이동하면 그대로 RowState[순서값]의 속성값은 wrNormal 이다.

 

13. 그리드의 셀을 선택한 상태(수정모드)에서 일반모드로 변경하는 소스

 

예를들어 그리드 폼에서 0번째 행에 체크박스가 있어 체크한 로우만 처리하는 업무를 한다면 로우를 순차적으로 클릭하다가 맨마지막 체크박스는 수정모드에서 다른 셀로 이동하여 일반모드로 변경하지 않고 "처리" 버튼을 누를수 있다.

 

이때 맨마지막 체크박스는 수정모드였으므로 체크한것이 언체크되어진다.

 

이럴때 편하게 "내부처리"를 하기전에 realgrid1.post; 명령을 날리면 마지막 수정모드였던 셀선택이 모두 일반모드로 변경된후 처리되어진다.

카테고리: 델파이 | 댓글 남기기

RealGrid 컴포넌트 설명

RealGrid 컴포넌트

 

컴포넌트 설명

 

델파이코리아의 나현호님이 국내 업무특성에 맞게 만드신 StringGird 컴포넌트입니다.

 

명칭 : 타이틀셀(맨상단 레코드의 한칸), 컬럼셀(맨상단을 제외한 모든 레코드의 한칸)

 

메인 속성

 

fixedcount – 실행모드에서 그리드에 가로스크롤이 생길때 스크롤이 움직여도 변하지 않는 셀의 갯수를 말하며 무조건 화면에 출력된 셀의 첫번째 셀부터의 갯수를 말한다. 예를들어 2라면 첫번째 셀과 두번째 셀이 해당된다.

fixedstyle – color – 전체 고정된 컬럼의 배경색을 설정(컬럼마다 따로따로 줄수 없음)

fixedstyle – SelBgColor – 로우를 선택했을때의 셀 배경색

fixedstyle – SelFgColor – 로우를 선택했을때의 셀 글자색

※ 고정된 컬럼의 선택했을때 배경색 글자색 설정은 꼭 fixedstyle – SelBgColor, fixedstyle – SelFgColor 속성을 이용해야 한다.

fixedstyle-options-wfxsizing – 실행모드에서 고정된 컬럼들의 타이틀 크기를 마우스로  조절가능(true면 가로크기 조절가능)

 

※ Fixed Column 수정 가능하게 하기

FixedStyle – Options – wfxEditing – true

FixedStyle – Options – wfxSelecting – true

위의 2 속성값을 true로 수정하면 Fixed Column 에서 F2키나 2번클릭 으로 컬럼 수정이 가능하다.

 

RowCount – 그리드의 세로 레코드 갯수를 지정한다.(읽기, 대입 가능)

읽을때 :현재 그리드의 총 행갯수

대입할대 : 특정 갯수를 전체 행갯수로 새로 넣는다.

 

RowHeight – 그리드에서 값이 나오는 셀의 전체 세로크기를 설정한다.

※ Title의 세로크기는 폼디자이너상태에서 마우스로 조정합니다.

 

Color – 그리드내의 출력셀을 제외한 배경색을 설정

SelBgColor – 선택되어진 셀의 배경색을 설정

SelFgColor – 선택되어진 셀의 글자색을 설정

 

※ 아래의 설정으로 간지나게 그리드 설정가능!!!!

Realgridex1.Lines.VertColor – clSilver – 그리드 출력표의 선의 색깔

Realgridex1.Headers.Lines.VertColor – clGray – 그리드 제목표의 선의 색깔

 

Font – 그리드의 전체 타이틀셀과 데이타 셀에 폰트설정을 한다.

※ Column – Font 속성이 우선순위가 높다.

그리드에 Font 속성에 빨강색으로 설정하고 특정 컬럼에 Font 속성에 파란색을 설정하고 실행하면 특정 컬럼에 글자 색깔이 파란색으로 나온다.

 

Markers– 그리드의 맨좌측 순서값 부분 오른쪽에 수정할수 없는 열을 설정한다.

– Visible – 해당 열을 표시할지 안할지 설정

– Style- 해당 열에 표시할 스타일을 설정

 

Indicators– 그리드의 맨좌측 순서값 열을 설정한다.

– Visible – 순서값열을 표시할지 안할지 설정

– ShowRowNo – 순서값열에 순서값을 표시할지 설정

– ShowState – 순서값열에 상태화살표를 표시할지 설정

– Visible – 순서값열을 표시할지 안할지 설정

– SelDown – 순서값열에 클릭되는 효과를 넣을지 설정

 

Option – 그리드의 전체적인 환경을 설정합니다.

– wgoAlwaysShowEditor – 그리드에 셀클릭시 자동으로 수정모드로 변화게 설정

(true-셀클릭시 자동으로 수동모드로 변화게)

– wgoAlwaysShowSelection – 그리드에 데이타 출력시 자동으로 맨상단행 선택되게 설정

(true-자동선택되게)

 

※ 셀선택시 한번더 클릭이나 F2키로 수정모드로 변경되려면 아래 속성을 TRUE로 설정

 (realgrid 1.2.2 만 가능)

Option-wgoAlwaysShowEditor-true

Option-wgoEditing-false

복사가능할컬럼속성의 ReadOnly-true

 

※ 셀설택시 바로 복사가능하게 Option속성 설정하는법 (realgrid 1.2.2 만 가능)

Option-wgoAlwaysShowEditor-true

Option-wgoEditing-true

복사가능할컬럼속성의 ReadOnly-true

 

– wgoRowSelect – 셀클릭시 전체 가로셀이 클릭되게 할지 설정

(true-전체가로셀선택 가능)

– wgoMultiSelect – 셀선택시 단일가로셀 선택과 다중가로셀 선택을 설정한다.

(true-다중가로셀선택 가능)

– wgoEditing – 셀을 수정을 가능하게 설정

(true-수정모드로변환)

– wgoColSizing – wgoCellSizing – 실행모드에서 타이틀 컬럼의 가로크기를 마우스로 조절가능

(두 속성다 True로 지정시 크기 조절 가능)

– wgoSkipReadOnly – 키보드로 셀을 이동시킬지 설정 여부(false-키보드사용가능)

 

컬럼 속성

 

Title – 해당 컬럼의 타이틀셀 환경을 설정합니다.

– Color – 해당 컬럼의 타이틀셀 배경색을 설정합니다.

– caption – 해당 컬럼의 타이틀셀 제목을 설정합니다.

– alignment – 해당 컬럼의 타이틀셀 제목을 정렬합니다.

 

ListOption – CharWidth – 해당컬럼에 콤보박스사용시 한글을 잘리지 않게 해준다.(MaxWidth)

※ 컬럼에 콤보박스를 사용할때 외부값에 한글이 있다면 꼭 설정해주자

EqualBlank – 해당 컬럼에서 중복되는 값은 공백으로 출력

※ 소계를 사용할때만 제대로 작동합니다.

 

width – 해당 컬럼줄에 셀의 가로크기를 설정합니다.

 

Color – 현재 컬럼의 세로 타이틀셀을 제외하고 데이타셀만 배경색을 설정합니다.

※ Color 속성에 자주 사용하는 색깔

clMoneyGreen – 연한녹색

clSkyBlue – 연한파랑

clSilver – 연한회색

clCream – 연한빨강

clFuchsia – 연한핑크

 

Font – 현재 컬럼의 세로 타이틀셀과 데이타셀 폰트설정을 설정합니다.

 

DataWidth – 셀에 출력할 값의 길이를 제한합니다.

※ 0 입력시 제한없이 출력가능

 

DisplayFormat – 데이타타입이 정수, 실수일때 출력형태를 지정

정수, 실수를 천단위로 콤마를 찍어 출력

,0.;-,0.  

사용 : 2121.212 -> 2,121

,0.0.;-,0.

사용 : 2121.212 -> 2,121.2

,0.00.;-,0.

사용 : 2121.212 -> 2,121.21

 

DataType – 해당 컬럼명에 출력할 값의 타입을 설정합니다.

* 숫자 출력 *

돈에 관련된 값은 wdFloat로 설정하고 DisplayFormat 속성에 ,0.;-,0. 을 입력하면

입력은 asstring 메소드를 이용하고 화면에 출력될때는 자동으로 천단위표시로 출력된다.

 

ReadOnly – 셀값을 읽기전용으로 바꾼다.

(true – 읽기전용으로 바꾼다.)

Visible – 화면에 표시할지 여부를 설정합니다. (true – 화면에 출력)

Alignment – 데이타셀 정렬을 한다.

MarginLeft – 데이타셀에 좌측여백을 줍니다.

MarginRight – 데이타셀에 우측여백을 줍니다.

※ 보통 데이타갯수가 고정적이지 않은 숫자형식이면 오른쪽정렬로 문자형식이면 왼쪽정렬로 하며 데이타갯수가 고정적이면 중앙정렬로 합니다. 물론 왼쪽,오른쪽정렬일때 마진도 5씩 줍니다.

 

메소드 리스트

 

RealGrid1.col –  현재 선택되어있는 셀의 가로좌표 (맨좌측 0부터 시작) (읽기,대입 가능)

※ realgrid1.SelectedIndex – realgrid1.col과 같은 역할을 한다.

※ 조회결과가 있나 없나 기본값은 0 이다.

※ 읽을때와 대입할때는 RealGrid1.row와 같은 개념이다.

※ 히든으로 숨겨져있는 컬럼이 아닌 화면에 보이는 컬럼을 대상으로 가로좌표를 출력한다.

 

RealGrid1.row – 현재 선택되어있는 셀의 세로좌표 (맨상단 0부터 시작) (읽기,대입 가능)

읽을때 : 현재 선택된 데이타의 세로 순서값
대입할때 : 특정 숫자의 세로 순서값으로 다시 데이타가 선택되어 진다.
※ 조회결과가 있나 없나 기본값은 0 이다.

 

※ col, row 메소드는 참조시에는 현재 선택된 셀의 가로, 세로좌표값이 나오지만 대입시에는 해당 가로, 세로좌표값으로 선택커서(레코드포인트)가 이동하게 된다.

 

※ SelectedIndex, row,col 속성값은 셀이 선택되어지지 않은 상태에서는 기본값으로 0 값이 들어있다.

 

RealGrid1.SetFocus – 특정 리얼그리드에 포커스를 준다.

※ 폼의 ActiveControl메소드를 이용해 같은 효과를 낼수 있다.

ActiveControl:= RealGrid1;

 

ReadGrid1.ColCount – 그리드의 컬럼갯수를 출력한다.

ReadGrid1.RowCount – 그리드의 레코드갯수를 출력한다.

※ RowCount, ColCount의 기본값은 0 입니다.

 

realgrid1.SelectedColumn-Title-Caption – 선택한 셀의 컬럼명출력

Realgrid1.SelectedCount – 그리드에 다중선택된 셀의 갯수를 출력한다.

※ SelectedCount 메소드는 Options-wgoMultiSelect 속성이 true 일때만 정상적으로 동작하며 false 일때는 값이 무조건 0 입니다.

 

RealGrid1.AddRow; – 그리드에 맨뒤에 새로운 로우를 추가한다.

RealGrid1.InsertRow(row_num) – 그리드의 특정위치에 로우를 추가한다.

RealGrid1.DeleteRow(row_num); – 그리드의 특정위치에 로우를 삭제한다.

 

RealGrid1.Clear – 현재 그리드의 모든 행을 지운다.

RealGrid1.Cleardata – 현재 그리드의 모든행은 지우지 않고 그안에 값만 지운다.

※ 차이점 : Clear는 그리드를 초기화하는것이며 Cleardata는 행은 놔두고 행안에 값만

지운다.

※ 공통점 : 푸터 부분에 값은 그대로 둔다.

 

RealGrid1.Cells[x,y].AsString – 출력할 그리드의 가로좌표와 세로좌표에 값을 대입한다.

(읽기,대입가능)

RealGrid1.Cells[x,y].Text – 해당 그리드에 가로좌표와 세로좌표에 있는 값을 가져온다.

(읽기전용)

※ 맨좌측상단은 [0,0] 이며 생성되어 있지 않는 셀위치에 대입시에는 에러발생 합니다.

 

RealGrid1.Columns[n].Title.Caption – 셀의 타이틀명(읽기, 쓰기 가능)

사용예제

var

   arrNAME : Array of String;

         i : Integer;

begin

   SetLength(arrNAME, RealGrid1.ColCount);

   for i:= 0 to RealGrid1.ColCount – 1 do

   begin

      arrNAME[i] := RealGrid1.Columns.Items[i].Title.Caption;

   end;

end;

 

RealGrid Tip모음

 

1. 중복컬럼값 안나타내기

 

레코드출력시 특정 컬럼들에 한해서는 같은 값이 출력되면 공백으로 보이게 하는 기능은 해당 컬럼속성의 EqualBlank를 true로 두면 되지만 이건 소계를 사용해야 제대로 작동한다. 소계를 사용하지 않고 중복값을 공백으로 출력하는 방법을 알아보자

 

1. Realgrid 에 안보이는 컬럼을 하나 만든다.

 

2. 데이타를 출력할때 맨마지막 안보이는 컬럼에 중복조건에 포함되는 컬럼값을 모두합쳐서 넣는다.

 

//## 현재 셀연결 문자열 저장 ##//
Cells[20,rowcount-1].AsString :=
  co_DateShow(VartoStr(vList[i, 0])) + co_DecodeCompno(VartoStr(vList[i, 1]),”) +
  VartoStr(vList[i, 2]) + VartoStr(vList[i, 3]) + VartoStr(vList[i, 5]);

 

3. Realgrid의 DrawCell이벤트에 아래 소스를 넣는다.

 

procedure TFw_209.RealGrid1DrawCell(AColumn: TwColumn; ARow: Integer;
  var Text: String; var BCol, FCol: TColor; var FStyle: TFontStyles);
var
  value1 : String;
begin

  //## 중복된 레코드의 특정셀 공백출력 ##//
  //## 20060303 edscom ##//
  with realgrid1 do begin

    value1 :=
      cells[0,arow].AsString + cells[1,arow].AsString +
      cells[2,arow].AsString + cells[3,arow].AsString +
      cells[4,arow].AsString;

    if arow > 0 then begin

        if (value1 = cells[20,arow-1].AsString) then begin

          //## 공백출력 ##//
          cells[0,arow].AsString := ”;cells[1,arow].AsString := ”;
          cells[2,arow].AsString := ”;cells[3,arow].AsString := ”;
          cells[4,arow].AsString := ”;

        end;

    end;

  end;
end;

 

※ drawcell이벤트는 컬럼값에 대입이나 메시지 출력이 들어가면 무한정으로 실행되며 값을 비교하거나 해당 컬럼에 공백을 넣는건은 한번만 실행된다. 꼭 알아두자

 

이벤트 핸들러 설명

 

RowChange, Click 이벤트 차이점

 

Click 이벤트

마우스클릭이나 키보드 상/하 키로 인해 셀의 위치가 세로단위로 변경되면 이벤트가 발생한다.

반드시 행단위로 이동해야 발생합니다.

 

CellEnter 이벤트

셀을 무조건 클릭하게 되면 이벤트가 발생합니다.

 

Click 이벤트와 CellEnter 이벤트 차이점

 

Click 이벤트
셀이동하면서 클릭시 이벤트 발생
같은 셀 계속 클릭시 이벤트 발생
엔터로 셀이동시 이벤트 미발생

 

CellEnter 이벤트
셀이동하면서 클릭시 이벤트 발생
같은 셀 계속 클릭시 이벤트 미발생
엔터로 셀이동시 이벤트 발생

 

onDrawCell 이벤트 핸들러

 

발생 시점

조회화면에 각각의 이 생성되면서 화면에 보일경우 이벤트가 발생한다.

조회화면에 각각의 이 생성되면서 화면에 보이지않는것은 이벤트가 발생하지 않는다.

스크롤바에 가려 화면에 보이지 않는 들을 스크롤바를 이용해 화면에 보일경우 그때마다 이벤트가 발생합니다.

파라미터 설명

acolumn.Index – 셀의 가로좌표 (첫번째 위치는 0 부터 시작합니다.)

acolumn.Title.Caption – 셀의 타이틀명

arow – 셀의 세로좌표 (첫번째 위치는 0 부터 시작합니다.)

BCol – 셀의 배경색

FCol – 셀의 글자색

FStyle – 셀의 글자 스타일

사용예제

//## 컬럼의 순서값(0부터 시작) ##//
if Acolumn.Index = 0 then
    if pos(‘변경’,realgrid1.Cells[0,Arow].AsString)>0 then begin
        Fcol := clblue; //## 글자색
        BCol := clRed;  //## 배경색

        Style := [fsBold]; //# 글자스타일
    end;
end;

활용범위

특정 셀에 글자색, 셀배경색을 다르게 지정해 사용

 

onDrawRow 이벤트 핸들러

 

발생 시점

조회화면에 각각의 로우가 생성되면서 화면에 보일경우 이벤트가 발생한다.

조회화면에 각각의 로우가 생성되면서 화면에 보이지않는것은 이벤트가 발생하지 않는다.

스크롤바에 가려 화면에 보이지 않는 로우들을 스크롤바를 이용해 화면에 보일경우 그때마다 이벤트가 발생합니다.

파라미터 설명

arow – 셀의 세로좌표 (첫번째 위치는 0 부터 시작합니다.)

BCol – 셀의 배경색

FCol – 셀의 글자색

FStyle – 셀의 글자 스타일

사용예제

procedure TForm1.RealGrid1DrawRow(Sender: TObject; ARow: Integer; var BCol,
  FCol: TColor; var FStyle: TFontStyles);
begin
  if arow = 2 then begin
    FCol   := clRed;
    BCol   := clBlue;
    FStyle := [fsBold];
  end;
end;

활용범위

조회결과를 페이징 처리하는데 사용

 

onMouseDown 이벤트 핸들러

 

발생시점

그리드를 클릭했을때 이벤트 발생

활용예제

if (ssDouble in Shift) then

begin

  // 더블클릭일때 처리순서

end;

 

wCombo 컴포넌트

 

속성

 

ListOption – CharWidth – 콤보박스의 외부값에 한글 사용시 한글을 잘리지 않게 해준다.

(-1 axWidth)

※ 콤보박스의 외부값에 한글이 있다면 꼭 설정해주자

items – 콤보박스의 외부값을 설정합니다.(보이는 데이타)

values – 콤보박스의 내부값을 설정합니다.(안보이는 데이타)

※ items와 values를 세트로 생성해야 셀렉트 박스가 화면에 출력됩니다.

※ readonly – true로 설정시 드롭다운 사용 불가능

style-콤보박스 형태를 지정합니다.

csDropDown(드롭다운형태이며 수동입력 가능함)

csDropDownList(드롭다운형태이며 수동입력 불가능)

※ style 속성은 초기 설정 그대로 사용하면 된다. 변경할 필요가 없다.

 

메소드예제

 

with wCombo1 do begin
Items.Clear; // 콤보박스 초기화
Values.Clear; // 콤보박스 초기화
items.Add(‘이준식’);
items.Add(‘백윤정’);
values.Add(‘1’);
values.Add(‘2’);

valueindex := 1;//## 셀렉트의 시작 순서값 지정 (시작순서값은 0 부터 시작) ##//

//# valueindex 사용안할시 콤보박스에 아무것도 나오지 않아 필수 기재

//# valueindex 속성은 참조시에는 현재 선택된 항목의 순서값이 출력되며

//# valueindex 속성은 대입시에는 특정 항목의 순서값으로 변경된다.

 

items.count – 콤보박스의 외부값 갯수

values.count – 콤보박스의 내부값 갯수

 

ShowMessage(AsString); 선택한 셀렉트의 내부값을 출력 ##//

ShowMessage(Text); 선택한 셀렉트의 외부값을 출력 ##//

// asstring,text 메소드 값대입, 값참조 둘다 가능

// wcombo1.asstring 속성은 wcombo1.values.Strings[wcombo1.ValueIndex] 와 같다.

// wcombo1.asstring 처럼 짧게 쓰는게 좋다.^^

end;

 

※ wcombo1.clear; 는 콤보박스 전체 항목 초기화가 아니라 단지 현재 선택된 항목명만 안보여지는 것이다. wcombo1.text := ”; 와 wcombo1.asstring := ”; 와 같은 처리를 한다.

 

자주 사용하는 이벤트 핸들러

 

onChange

콤보컴포넌트의 항목을 변경할때 발생한다.

onCloseUp

콤보컴포넌트의 항목을 변경할때 발생한다.

onChange와 onCloseUp의 차이점

wcombo 컴포넌트의 onChange 이벤트 핸들러는 변경되기전에 ValueIndex속성값들이 참조되지만 onCloseUp 이벤트 핸들러는 변경된후의 ValueIndex속성값들이 참조된다.

onCloseUp 이벤트 핸들러 사용을 권장한다.

 

wCombo의 Asstring, Text 속성 대입선택시 유의할점

 

보통 wcombo에서 text 속성은 외부값(‘한국’,’일본’)을 참조하며 asstring 속성은 내부값(‘korea’,’japan’)을 참조합니다. wcombo를 클릭선택이 아닌 수동대입선택인경우에는 text 속성이 아닌 asstring 속성을 사용해서 대입해야 합니다.

(wcombo1.text = ‘한국’) <- (X)

(wcombo1.asstring = ‘korea’) <- (O)

wcombo의 text 속성에 값을 넣으면 wcombo의 외부값만 변경되고 그에따른 내부적인 값은 변경되지 않지만 wcombo의 asstring 속성에 값을 넣으면 wcombo의 외부값과 그에 따른 내부값도 함께 변경된다.

그래서 현재 text 속성값에 해당하는 제대로된 asstring 속성값을 참조할수 없다.

항상 수동대입선택인경우에는 Asstring 속성만을 사용해야 한다.

 

procedure TForm1.Button1Click(Sender: TObject);
begin
  with wcombo1 do begin
    Items.Add(‘한국’);
    Items.Add(‘일본’);
    Items.Add(‘중국’);
    Values.Add(‘korea’);
    Values.Add(‘japan’);
    Values.Add(‘china’);
    ValueIndex := 0;
    text := ‘일본’;
    ShowMessage(AsString);
  end;
end;

 

위의 예제의 결과는 japan 이어야 하지만 korea 로 출력된다.

항상 수동대입선택인경우에는 Asstring 속성만을 사용해야 한다.

 

wCombo 컴포넌트 자주 사용하는 문법

 

콤보박스의 내부값을 전부 출력하기

 

ShowMessage(wcombo1.Values.Text);

 

콤보박스의 현재 선택한 항목의 Values값 알아내기

 

ShowMessage(wcombo1.AsString);

 

콤보박스의 현재 선택한 항목의 Items값 알아내기

 

ShowMessage(wcombo1.Items.Strings[wcombo1.ValueIndex]);

ShowMessage(wcombo1.text);

 

콤보박스의 value값에 해당하는 item값 알아내기 (많이 사용함)

 

ShowMessage(wcombo1.Items.Strings[wcombo1.Values.IndexOf(‘korea’)]);

 

콤보박스의 items 값으로 그에 맞는 Values 값 알아내기

 

ShowMessage(wcombo1.Values.Strings[wcombo1.Items.IndexOf(‘한국’)]);

 

콤보박스의 순서값에 맞는 Values 와 items 값 알아내기(시작순서값은 0 부터 시작)

 

ShowMessage(wcombo1.Items.Strings[0]);
ShowMessage(wcombo1.Values.Strings[0]);

 

콤보박스의 items, Values 값으로 해당 순서값을 알아내기(시작순서값은 0 부터 시작)

 

ShowMessage(inttostr(wcombo1.items.IndexOf(‘한국’)));

ShowMessage(inttostr(wcombo1.Values.IndexOf(‘korea’)));

 

※ 위의 예제에서 해당하는 항목이 없으면 list index out of bounds 에러 방생

 

wLabel 컴포넌트(labe컴포넌트와 동일,문자전용)

 

속성

 

Chima – 레이블 좌측상단에 꼬리말 출력
ChimaColor – 레이블 좌측상단에 꼬리말 색깔
Caption – 레이블 출력값 대입
BorderStyle – 레이블의 외곽선의 형태 설정
Layout – 레이블 출력값의 세로정렬

Alignment – 레이블 출력값의 가로정렬

 

wNumLabel 컴포넌트(labe컴포넌트와 동일, 숫자만 입력 가능)

 

속성

 

Chima – 레이블 좌측상단에 꼬리말 출력
ChimaColor – 레이블 좌측상단에 꼬리말 색깔
BorderStyle – 레이블의 외곽선의 형태 설정
Value – 레이블 출력값 대입 (숫자만입력가능)
Format – 출력되는 포맷형식 (#,### -> 5,555)
Suffix – 레이블 출력값의 뒤에 붙는 수치
Prefix – 레이블 출력값의 앞에 붙는 수치
MarginRight – value의 오른쪽 여백크기
Layout – 레이블 출력값의 세로정렬

Alignment – 레이블 출력값의 가로정렬

 

wEdit 컴포넌트(Edit컴포넌트와 동일, 포커스 얻을시 자동으로 전체 문자열 선택됨)

 

속성

 

Alignment – 컴포넌트안에 값의 위치 설정(left-좌측에위치, center-중간에위치, right-우측에위치)

CharCase – 입력되는 값이 영문자라면 실시간으로 대문자 또는 소문자로 변환하여 표시된다.

-ecUpperCase – 입력값이 영문자라면 대문자로 변환후 표시

-ecLowerCase – 입력값이 영문자라면 소문자로 변환후 표시

-ecNormal – 입력값이 영문자라면 입력값 그대로 표시

Layout – 출력값의 세로정렬

MarginLeft-입력부분 안에 좌측여백을 준다.

MarginRight-입력부분 안에 우측여백을 준다.

MaxLength-최대입력크기(0 입력시 제한 없음)

 

wNumEdit 컴포넌트(Edit컴포넌트와 동일)

 

특징

 

자동으로 정수에 천단위로 ,가 붙여진다.

정수만 입력가능하며(실수,문자열 입력불가능) 디폴트로 오른쪽정렬로 되어있다.

 

속성

 

Layout – 에디터 출력값의 세로정렬

Value – 에디터 출력값 대입 (정수만입력가능)

※ 에디터값을 문자형으로 변환하여 메시지로 출력방법

ShowMessage(floattostr(wNumEdit1.value));

※ 에디터값에 정수형 데이타 대입방법

wNumEdit1.Value := 245000;

Precision – 에디터 출력값의 소수점 갯수를 설정

※ Precision값이 0이 아닌 경우는 실수대입시 해당 갯수만큼 소수점이 나온다.

카테고리: 볼랜드 | 댓글 남기기

델파이 기본 컴포넌트2

ListBox Component

 

comment

콤보박스형태를 리스트형태로 보여줍니다.

 

property
multiselect-2개이상을 클릭한다.(true)
Sorted-리스트 정렬
속성값이 False인 경우 리스트박스에 추가된 순으로 출력하지만 True인 경우에는 알파벳 순으로 정렬하여 출력한다.
items-리스트 박스에 항목을 추가한다.
method
Items.Delete(클릭한 순서값)-항목 지우기
Items.add(추가항목문자열)-항목 추가하기(무조건 맨뒤에서 추가)
Items.insert(추가순서값,추가항목문자열)-항목 추가하기(원하는 위치에 추가)
items.text(항목의 전체 값)
items.string[index값](index값에 해당하는 항목값 출력)
itemindex-현재 클릭한 순서값
순서는 위에서부터 0으로 출발하여 1씩 더해진게 itemindex의 값이ㅏㄷ.
clear-항목 전체를 지운다.
 
additional 페이지
 
SpeedButton Component
comment
버튼을 평평하게 하거나 버튼명좌측에 원하는 이미지를 넣을수 있습니다.
property
Flat-버튼을 평평하게 합니다.
※ bitbin component와 구별되는 속성입니다.
Glyph-버튼명 좌측에 이미지를 넣습니다.
 
bitbtn Component
comment
확장 버튼으로 비트이미지를 넣을수 있는 버튼이다.
property
glyph-버튼에 bmp이미지를 넣는다.
kind-버튼에 델파이에서 제공하는 이미지를 넣는다.
modalresult-버튼을 눌렸을때 부모창에게 넘겨줄 값을 지정한다.
GroupIndex-비트 버튼들을 한그룹으로 설정
설치된 스피드버튼들(SpeedButton)을 한 그룹으로 설정하려면 ‘GroupIndex’속성을 ’0‘이 아닌 정수로 설정한다. ’GroupIndex’값이 같은 스피드버튼은 같은 그룹으로 인정이 되고 만약 ‘0’인 스피드버튼(SpeedButton)은 단독으로 사용하는 스피드버튼(SpeedButton)이 된다.
 
Scrollbox Component
comment
panel와 비슷한 특성을 가지며 splitter을 사용가능하다.
property
borderstyle-외곽선효과주기(bssingle)외곽선효과안주기(bsnone)

* autosize 속성이 true면 상하좌우 스크롤이 안생긴다. 

splitter Component
(Align속성을 AlNone이 아닌값을 한 컴포넌트와 사용한다.)
comment
scrollbox와 함계 사용하면서 사이즈를 조절합니다.
property
align-splitter의 방향을 결정한다.
※ 값이 alNone이면 동작하지 않는다.
color-배경색을 설정한다.
width-굵기를 설정한다.
Beveled-깍아오른 효과를 준다.
※ 좀더 눈에 잘들어온다.
 
Bevel 컴포넌트
comment
경사진 효과를 내는 모양을 출력한다.
property
style-외곽선에 나온효과를 줄건지 들어간 효과를 줄건지 결정
bsrowered(모양이 들어간 효과를 준다)
bsraised(모양이 튀어나온 효과를 준다)
shape-모양의 종류를 설정
bsSpacer(선을 안보이게합니다.)
bsBox(디폴트 선을 style대로 보입니다.)
bsTopLine(직선으로 보입니다.프로그램 구분선으로 자주 쓰임)
 
CheckListBox Component
Comment
체크박스가 들어간 ListView 입니다.
property
Flat – 체크박스를 평평하게 합니다. (True – 평평하게)

Columns – 가로방향으로 줄을 나누어 항목을 출력시킨다.
※ 0 – 한줄로 출력하며 세로 스크롤바 생김
※ 0 – 한줄로 출력하며 세로 스크롤바 생김
Method
Clear – 항목값을 모두 지운다.
사용예제
 
특정경로의 파일을 출력하기
procedure TForm1.Button8Click(Sender: TObject);
var
  //체크리스트 설정
  SR     : TSearchRec;
  sDir   : string;
  n_Found: Integer;
begin
  CheckListBox1.Clear; // 체크리스트박스 초기화

  sDir := ‘c:\’;       // 조회할 디렉토리
  if sDir[Length(sDir)] <> ‘\’ then begin //# 마지막 문자가 ‘/’ 인지 체크
    sDir := sDir + ‘\’;
  end;

  n_Found := FindFirst(sDir + ‘*.*’, faAnyFile, SR);
  try
    while n_Found = 0 do begin
      if not (SR.Attr in [faVolumeID, faDirectory]) then begin
        if (FileExists(sDir+SR.Name) = True) then begin //# 폴더를 제외한 파일만 출력
          CheckListBox1.Items.Add(SR.Name);
        end;
      end;
      n_Found := FindNext(SR);
    end;
  finally
    FindClose(SR);
  end;
end;

 
체크한 항목갯수 알아내기
procedure TForm1.Button6Click(Sender: TObject);
var
  i, n_Count: Integer;
begin
  n_Count:= 0;
  for i:=0 to CheckListBox1.Items.Count-1 do begin
    if CheckListBox1.Checked[i] then Inc(n_Count);
  end;

  ShowMessage(CheckListBox1.Items[i-1]);
  ShowMessage(Format(‘전체 %d 파일 중 %d 파일 선택’, [CheckListBox1.Count, n_Count]));
end;

현재 선택되어진 항목의 순서값 알아내기(0부터 시작)
procedure TForm1.Button9Click(Sender: TObject);
var
  i:integer;
begin
  for i:=0 to CheckListBox1.Items.Count-1 do begin
    if CheckListBox1.Selected[i] then ShowMessage(inttostr(i));
  end;
end;

전체선택/해제 구현하기
procedure TForm1.Button7Click(Sender: TObject);
var
  i, n_Count: Integer;
begin
  n_Count:= 0;
  if TControl(Sender).Tag=0 then
    TControl(Sender).Tag:=1
  else
    TControl(Sender).Tag:=0;

  for i:=0 to CheckListBox1.Items.Count-1 do begin
    CheckListBox1.Checked[i] := TControl(Sender).Tag = 1;
  end;

end;
 
shape 컴포넌트
comment
다양한 모양을 표현하는 컴포넌트입니다.
property
brush/color-내용선의 색
brush/style-내용선의 모양 종류
pen/color-외곽선 색
pen/style-외곽선의 모양 종류
shape-전체 모양 종류(원,사각형등)

 
Image 컴포넌트
comment
이미지의ㅣ 모습을 화면에 출력합니다.
RXlib 패키지를 설치했다면 GIF, BMP, JPEG, ICO 등의이미지확장자가 등록가능하지만
Rxlib 패키지가 설치되어 있지 않다면 BMP, ICOM 등의 이미지확장자만 등록이 가능합니다.
하지만 런타임시에 image컴포넌트에 gif가 안먹힐때도 있다 ^^
※ Gif 확장자를 사용하려면 RXlib 패키지를 설치해야 한다.
※ Png확장자는 사용 불가능하다.
※ 애니메이션 GIF 이미지는 사용 불가능하다.

jpg 파일을 이미지 컴포넌트에 출력할때 "Unknown picture file extension(.jpg)" 라는 메시지가

뜬다면 해당 유닛의 상단에 Jpeg를 uses처리한후 다시 하면 된다.

property
autosize – 해당 컴포넌트의 크기가 이미지의 오리지널 크기에 맞추어진다.(true)
stretch – Image 컴포넌트의 크기에 딱맞게 이미지 사이트가 변경된다.(true)
※ ico파일을 제외한 이미지파일만 stretch 기능을 사용가능하다.(ico파일 불가능)
transparent-해당 이미지를 투명화합니다.(true)

설명:

델파이에서 투명한 이미지를 표현할때는 timage의 속성에서 transparent를 true로 하면 이미지

에서 하얀부분은 보이지 않게 된다. 하얀부분을 제외한 부분만 보이게 된다.투명한 이미지는

되도록이면 bmp나 gif로 하는게 좋습니다. jpeg는 적합하지 않습니다.
 
method
Picture.LoadFromFile()-파일명을 주어서 이미지를 로딩한다.
Picture.SaveToFile()-파일명을 주어서 이미지를 저장한다.
 
labelededit컴포넌트
comment
레이블과 edit컴포넌트를 합친 컴포넌트이다.
property
labelposition-레이블의 위치를 조정 가능하다.
 
MaskEdit 컴포넌트

Comment

특별한 형식을 가지는 (ex, 전화번호, 우편번호, 날짜등)문자열을 입력받을 때 사용한다.

Property

Text – 입력된 값을 참고한다.

※ MaskEdit 컴포넌트에 6자리만 입력되게 설정한후 4자리만 입력하고 Text 속성을 읽으면

6자리가 읽혀진다. 왜냐하면 입력되지 않은 2자리는 공백으로 인식되어 읽혀지기 때문이다.

그래서 Text 속성을 읽을때는 trim 함수를 사용하여 좌우 공백을 제거해야 정상적인 값을

얻을수 있다. ex : Value1 := trim(MaskEdit1.Text)

Editmask-마스크 에디터를 실행한다.

※ masks클릭한후 Korea.DEM을 클릭하면 한국식의 표기법이 나온다.

Sample mask에서 원하는 표기법을 클릭합니다.

 

Input mask 값에서 끝이 ;1 이면 사용자가 입력한 값과 특수문자(:, – , 년)까지 모두 저장하며 ;0 이면 사용자가 입력한 값만 저장된다.
 
ex :
99:99:99;0;_ <- 숫자만 입력하며 99:99:99 형식으로 받으며 실제로 :는 뺀값만 저장된다.
99:99:99;1;_ <- 숫자만 입력하며 99:99:99 형식으로 받으며 실제로 :는 포함된 값이 저장된다.
999-999;0;_ <- 숫자만 입력하며 999-999 형식으로 받으며 실제로 :는 뺀값만 저장된다.
999.999.999.999;0;_ <- 숫자만 입력하며 999.999.999.999 형식으로 받으며 실제로 .는 뺀값만 저장된다.(IP 입력 포맷)
 
method
clear-모두 지운다.
 
StatusBar 컴포넌트
Comment
폼의 맨하단에 출력되며 상태를 나타내는 상태바 역할을 한다.
Field 만들기
StatusBar 컴포넌트를 더블클릭한 대화상자에서 Add New 버튼으로 필드를 추가한다.
Method
Panels[순서값].Text – 출력값을 설정한다.
※ 순서값은 0 부터 시작한다.
※ 프로그램 버전을 출력하는 용도로도 쓰인다.
 
StatusBar 예제
StatusBar1.Panels.Add;
StatusBar1.Panels[0].Text := ‘버전 : 1’;
StatusBar1.Panels[0].Width := 200;
StatusBar1.Panels[0].Alignment := taRightJustify;

 
Win32 페이지

 

TabControl컴포넌트

comment

한화면에 영역버튼별로 나누어서 볼수있고 영역버튼별로 같은 화면이 나오는 컴포넌트

property topposition-메뉴의 위치를 지정합니다.

tabs-메뉴를 설정합니다.

tabindex-초기실행시 메뉴의 클릭상태(-1:아무것도클릭안함,0:첫번째버튼,1:두번째클릭

순으로)

 

PageControl 컴포넌트

 

Comment

한화면에 영역버튼별로 나누어서 볼수있고 영역버튼별로 각각의 화면이 나오는 컴포넌트

 

Property

topposition-메뉴의 위치를 지정합니다.

tabindex – 현재 선택한 순서값을 출력 또는 원하는 순서값으로 탭을 이동함(0부터 시작)

ActivePageIndex – 현재 선택한 순서값을 출력 또는 원하는 순서값으로 탭을 이동함

(0부터 시작)

※ tabindex 와 ActivePageIndex 차이점

ActivePageIndex은 탭과 해당하는 페이지가 변경되지만 tabindex는 탭만 변경되고 페이지는

그대로 있음

multiline(true)-여러줄로 나누어 page출력

Style-페이지 이동 버튼의 스타일을 설정합니다.

 

※ 각 페이지 삭제방법

삭제를 원하는 TabShee 선택후에 Delete키를 누른다.

 

※ 페이지를 맨끝이 아닌 중간에 삽입하는 방법

new page 명령으로 삽입후에 pageindex 속성을 이용하면 중간에 추가한 페이지를 위치

시킬수 있다.

 

예제 : 탭시트 숨기기
 
//# 첫번째 탭시트 숨기기(False : 숨김)
PAGECONTROL1.Pages[0].TabVisible := False;

 
//# 탭시트의 name값으로 탭시트 숨기기(False : 숨김)
TabSheet1.TabVisible := False;

 
//# 현재 선택한 탭시트의 순서값(0부터 시작)
ShowMessage(inttostr(pagecontrol1.TabIndex));

※ TabVisible 메소드로 숨긴 탭시트는 TabIndex 메소드에서 없는것처럼 계산하여 처리한다.
 
//# 탭시트의 전체 갯수
ShowMessage(IntToStr(pagecontrol1.PageCount));

 
Animate 컴포넌트
comment
원도우에서 정의해둔 여러 애니메이션을 제공한다.
property
commonAVI-애니메이션의 종류를 선택한다.
Active-애니메이션을 활성활할지 체크(true-활성화)
 
RichEdit 컴포넌트
comment
memo컴포넌트(기본)에서 확장된 컴포넌트이다.
property
ScrollBar – 가로/세로 스크롤바를 설정한다.
※ 스크롤바가 정상적으로 동작하려면 WordWrap속성이 false여야 한다.
※ 델파이에 포함되어 있는건 RichEdit 1.0 입니다.
method
lines – clear – 내용을 모두 지운다.
각 라인별로 다르게 글자 속성을 주는 예제
  with richedit1 do begin
    lines.Clear;
    lines.add(‘1111’);

    lines.add(‘2222’);
 
    //# 현재 줄만 폰트 설정 변경
    SelAttributes.Color := clred;
    lines.add(‘하하하하’);
 
    //# 현재 줄만 폰트 설정 변경
    SelAttributes.Style := SelAttributes.Style + [fsBold];
    SelAttributes.Color := clblack;
    SelText := ‘하하하하’;
    lines.add(#13#10);

    //# 0번째 문자부터 10개의 문자의 색깔을 변경한다.
    selstart := 0;
    sellength := 10;
    SelAttributes.Color := clblack;
 
    lines.add(‘2222’);
 
//    Font.Color := clBlue;
//    DefAttributes.Color := clRed; 전체 글자 속성 변경
//    DefAttributes.Style := [fsBold]; 전체 글자 속성 변경
  end;
 
※ 마우스로 특정 문자열을 블럭지정한후 SelAttributes.Color := clblack; 을 사용하면 블럭지정된 문자열의 색깔이 변경된다.
※ 리치에디트 컴포넌트는 각 라인별로 폰트 속성을 다르게 줄수 있습니다.
 
DateTimePicker 컴포넌트

 

Comment

MonthCalendar 컴포넌트을 이용해서 콤보박스안에 날짜를 입력합니다.

Property

parseinput – 직접 날짜를 입력가능하게 한다.(true)

date – 기본 날짜를 지정합니다.

dateformat – 날짜 형식을 조정합니다.(2005-05-05,2005년5월5일)

kind – 날짜 선택 모드인지 시간 선택 모드인지 설정 (날짜/시간 동시에 선택방식 지원안됨)

Method

datetime – 선택된 날짜와 현재 시간을 대입하거나 출력합니다.

date – 선택된 날짜를 대입하거나 출력합니다.

 

※ 사용 예제

ShowMessage(datetostr(DateTimePicker1.Date));

— 출력 : ‘2007-07-05’ 형식의 문자열로 출력됨

 

ShowMessage(datetimetostr(DateTimePicker1.DateTime));

— 출력 : ‘2007-07-05 오전 12:30:15’ 형식의 문자열로 출력됨

 

ShowMessage(FormatDateTime(‘yyyymmdd’, DateTimePicker1.DateTime));

— 출력 : ‘20070705’ 형식의 문자열로 출력됨

 

DateTimePicker1.Date := strtodate(‘2000-02-02’);

— 2000-02-02 대입, ‘-‘ 을 구분자로 무조건 넣어줘야 한다.

 

DateTimePicker1.Date := Date;

— 금일 날짜 대입됨

 

DateTimePicker1.Date := Date – 7;

— 금일 날짜 기준 7일전 날짜 대입됨

 

DateTimePicker1.Date := Date+1;

— 금일 날짜 기준 1일후(익일) 날짜 대입됨

 

DateTimePicker1.Date := Date+2;

— 금일 날짜 기준 2일후 날짜 대입됨

 

DateTimePicker1.Date := Date-1;

— 금일 날짜 기준 1일전 날짜 대입됨

 

DateTimePicker1.Date := IncDay(now, 1);

— 금일 날짜 기준 1일후 날짜 대입됨

DateTimePicker1.Date := IncDay(now, -1);

— 금일 날짜 기준 1일전 날짜 대입됨

DateTimePicker1.Date := IncYear(now, 1);

— 금일 날짜 기준 1년후 날짜 대입됨

— DateUtils 유닛 필요

— DATE +2 와 IncDay(now, 2) 는 같은 역할을 한다.

 

Event

OnChange-달력창에서 날짜를 클릭하면 발생합니다.

 

MonthCalendar컴포넌트
comment
달력에서 날짜를 선택하여 사용한다.
property
MaxDate 선택할수 있는 최대 날짜 설정
MinDate – 선택할수 있는 최소 날짜 설정
date – 기본 날짜를 지정합니다.
method
date – 선택된 날짜를 대입하거나 출력합니다.(시간은 출력되지 않는다.)
※ 사용 예제
MonthCalendar1.Date := strtodate(‘2000-02-02’);
 
Progressbar컴포넌트

comment

현재 진행상태를 게이지로 보여줍니다.

property

max-게이지의 최대 숫자

min-게이지의 최소 숫자

position-게이지의 현재 숫자

smooth-게이지 증가를 부드럽게 할지 여부

step-StepIt메소드 사용시 증가할 값(max로 도달하면 다시 min부터 자동으로 시작됩니다.)

method

StepIt-step속성의 값으로 게이지상태가 한번 증가한다.

(max로 도달하면 다시 min부터 자동으로 시작됩니다.)

※ 보통 타이머의 OnTimer프로시저에 StepIt메소드를 등록하여 조회상태를 나타내는데

사용한다.

소스예제

ProgressBar.Max := 500;

ProgressBar.Position := 0;

ProgressBar.Position := ProgressBar.Position + 1;

 

System 페이지

 

Timer컴포넌트
comment
comment특정 시간 간격으로 로직을 실행합니다. 
property
ebabled-타이머를 시작한다.
Interval-타이머 시간간격(1000-1초)
Events
OnTimer-타이머 시간간격마다 발생 이벤트
 
Dialogs 페이지(컴포넌트 사용법이 거의 동일)

 

SaveDialog 컴포넌트 = OpenDialog 컴포넌트

 

property

defaulext-저장시 파일명뒤에 자동으로 붙는 확장자(ex:*.txt)

※ savedialog에서는 저장시 defaultext의 확장자가 자동으로 붙는다.

Initialdir – 대화상자를 열었을때 보여지는 초기경로

※ OpenDialog.InitialDir := ‘c:\’;

filename – 대화상자를 열었을때 파일이름 항목에 자동으로 입력되는 값

(파일형식 항목 아님)

filter-파일형식을 지정

※ 형식

출력문자열1|내부검색확장자1

출력문자열1|내부검색확장자1-1;내부검색확장자1-2

출력문자열1|내부검색확장자1|출력문자열2|내부검색확장자2

 

Filter – 대화명사의 하단 확장자 부분을 설정

ex : Opendialog.Filter := ‘Excel files(*.xls)|*.XLS’;

 

method

 

Execute – 대황상자를 연후 파일선택후 "확인" 버튼을 누르면 참을 출력, 그외는 거짓 출력

FileName – 대황상자를 연후 선택한 파일의 파일명을 가지고 있음

 

Title := ‘엑셀파일 불러오기’;
–대화상자 제목 설정

 
DefaultExt := ‘*.xls’;
–저장시 파일명뒤에 자동으로 붙는 확장자 설정

 
ShowMessage(inttostr(opendialog1.FilterIndex));
–선택한 확장자의 순서값을 출력(1 부터 시작)
 
Count : 다중 선택한 선택한 파일의 개수
Files.Text : 다중 선택한 모든 파일의 경로명 출력
※ 사용예제
with opendialog1 do begin
  if Execute then begin
    opendialog1.Options := [ofAllowMultiSelect];
    for a:=0 to Files.Count – 1 do begin
      ShowMessage(Files.Strings[a]);
    end;
  end;
end;

 
Files.Strings[n] : 다중 선택한 파일의 경로명 출력
※ n 은 차례대로 선택한 파일을 참조한다.(0 부터 시작)
 
opendialog1.Filter :=
//1개의 항목에 다중 확장자 검색

 
‘워드,텍스트(*.doc,*.txt)|*.doc;*.txt’;
//1개의 항목에 단일 확자자 검색
 
‘워드(*.doc)|*.doc’;
//2개의 항목별로 단일 확장자 검색
 
‘워드(*.doc)|*.doc|엑셀(*.xls)|*.xls’;
//3개의 항목별로 단일 확장자 검색
 
‘워드(*.doc)|*.doc|엑셀(*.xls)|*.xls|모든파일(*.*)|*.*’;
— 대화상자의 검색 확장자 설정
 
Options:= [ofFileMustExist];
— 파일이름 항목에 입력된 파일이름이 실제로 존재하는지 대화상자안에서 검사하도록 옵션을 준다.
※ ofAllowMultiSelect 옵션을 사용하면 위의 실제 파일이 존재하는 옵션을 사용할수 없다.
 
opendialog1.Options := [ofAllowMultiSelect];
— 대화상자에서 파일선택시 Ctrl, Shift 키를 이용해 다중선택이 가능해지도록 옵션을 준다.

카테고리: 델파이 | 댓글 남기기

델파이 기본 컴포넌트1

델파이는 VCL(visual compoment library)이라고 불리는 하나의 객체 지향적인 구조를

사용한다. VCL이라는 말은 Visual Component Library, 즉 볼 수 있는 컴퍼넌트의

집합이라고 할 수 있는데, 컴퍼넌트는 VCL의 계보 중에서  TComponent와 그 자손으로

이어진 계층을 말합니다.

그런데 VCL를 살펴보면 컴퍼넌트 중 에서 볼 수 없는 즉 Visual하지 않는 컴퍼넌트도

많다는 것을 알 수 있습니다.더욱이 컴퍼넌트가 아닌 오브젝트도 많이 볼 수 있습니다.

(TStrings나 TCanvas 같은) 따라서 엄밀하게 VCL은 틀린 말입니다.

그럼에도 불구하고, 델파이에서 왜 VCL이라고 이름을 붙였을까? 그것은 아마도 이들

컴퍼넌트가 가장 핵심적인 역할을 담당하고 있기 때문일 것입니다.

우리가 어플리케이션을 만들어 실행시키면 볼 수 있는 것의 대부분이 이들 컴퍼넌트입니다.

 

컴퍼넌트 정의

 

기술적으로 컴퍼넌트는  VCL 계보에서 TComponent 클래스의 모든 자손 오브젝트를

나타냅니다. 즉 TComponent에서 파생된 모든 오브젝트를 컴퍼넌트라 부릅니다.

그리고 VCL 계보에서 TBitmap, TStringList와 같이 컴퍼넌트에 속하지 않는 것들은

오브젝트라고 부릅니다. 

개념적으로 컴퍼넌트는 그 용어 자체에서 의미하는 바와 같이 부품을 나타냅니다.

즉 어풀리케이션을 만들기 위해 사용하는 부품을 의미합니다. 자동차가 각종 차동차

부품으로 이루어지듯이, 델파이 어플리케이션도 각종 부품(컴퍼넌트)로 이루어지는

것입니다.

물론 자동차나 어플리케이션을 부품(컴퍼넌트)를 조립(사용)하지 않고 만들수도 있습니다.

그러나 그러한 경우 생산성이나 효율성은 무척이나 나빠지게 될 것입니다.

VCL에는 컴퍼넌트가 아닌 다른 많은 오브젝트가 있습니다. 그럼에도 불구하고

컴퍼넌트를 중요시하는 것은 , 설계시에는 이 컴퍼넌트를 사용하기 때문입니다.

즉 설계시에 사용할 수 있는 컴퍼넌트이고, 따라서 컴퍼넌트가 시각적 프로그래밍의

핵심이라 할 수 있습니다.

컴퍼넌트가 아닌 다른 오브젝트는 내부에서 컴퍼넌트를 위해 이용하는 도구이거나

아니면 델파이에서 사용하는 오브젝트들입니다.

 

컴포넌트 종류

 

visual component

시각적으로 표현 가능하며 내부적으로 연산이 가능한 컴포넌트

non-visual component

시각적으로 표현 불가능하며 내부적으로 연산이 가능한 컴포넌트

 

컴포넌트의 기본 속성(컴포넌트에 거의 공통적으로 들어가는 속성이다.)
 
Name
컴포넌트의 이름을 가리킨다. Name 은 반드시 영문이나 밑줄 시작해야 하며 한글, 특수문자 등은 들어갈 수 없다.
Caption
컴포넌트의 제목을 나타내준다. 한글이나 특수문자 등도 모두 쓰일 수 있다.
Alignment
컴포넌트 내부의 문자열이 정렬되는 방식에 대한 속성이다. 디폴트값은 taLeftJustify 이다.
taLeftJustify : 문자열이 컴포넌트의 좌측에 정렬된다.
taCenter : 문자열이 컴포넌트의 중앙에 정렬된다.
taRightJustify : 문자열이 컴포넌트의 우측에 정렬된다.
Autosize
컴포넌트의 내용에 맞게 크기를 자동으로 조정할지를 결정
AutoSelect
사용자가 Edit component나 Memo 컴포넌트로 tab할 때 문자가 자동으로 전체선택될지를 조정

BorderStyle
컴포넌트의 border 형을 결정
CharCase
영문자를 표현하는 방법(입력하는대로 또는 무조건 대문자 또는 무조건 소문자)
Color
컴포넌트의 배경 색을 정한다.
Ctl3D
Control이 3차원인지 2차원인 모양인지 결정
Cursor
컴포넌트가 차지한 영역에서 나타나는 마우스 포인터의 이미지를 결정
DragCursor
끌어당긴 개체를 컴포넌트위에 올려 놓을 때 나타나는 마우스 포인터의 이미지 결정
DragMode
컴포넌트의 끌고 놓는 동작을 결정
Enabled
컴포넌트의 기능을 일시적으로 활성, 또는 비 활성화 시킬 수 있다. 디폴트값은 True이다.
Font
컴포넌트에 나타나는 문자의 글꼴, 색상,크기 등의 여러 속성을 지정한다.
Hint
OnHint event발생시 나타나는 문자열을 결정 (마우스 커서가 컴포넌트나 메뉴 항목에 있을 때 나타남)

Tag
일반적으로 Tag Property는 볼랜드사에서 프로그래머를 위해서 임의로 만들어 놓은 Property 이며 temp변수로도 사용할 수도 있습니다.
LongInt의 형을 가지고 있으며 LongInt로서 할 수 있는 모든 것을 할 수도 있습니다.
일반적인 문자열, 정수, 실수 외에 델파이에서 지원되는 객체나 구조체, 또는 메모리까지도
Tag에 넣어서 사용할수가 있습니다.

Height, width, left, top
Height : 컴포넌트의 크기 조절
width : 컴포넌트의 높이 조절
left : 컴포넌트의 맨 왼쪽 모서리의 위치 조절
top : 컴포넌트의 맨 위쪽 모서리의 위치 조절
HideSelection
개체가 Focus를 잃을 때 선택되어 있던 문자를 반전된 채로 남겨둘지를 결정
MaxLength
Edit 컴포넌트나 Memo 컴포넌트에 입력할 수 있는 최대 문자수를 결정. Zeor(0)은 제한이 없음을 의미
PasswordChar
Password를 입력할 때 Edit 컴포넌트나 Memo 컴포넌트가 어떤 특수문자를 나타낼지를 결정

ParentColor
 다음과 같이 컴포넌트의 색정보를 어디서 찾을지를 결정:
◆ 만약 값이 True면, parent component의 Color property를 사용
◆ 만약 값이 False면, 컴포넌트 자신의 Color property를 사용.
ParentCtl3D
 다음과 같이 Component의 3차원 모양을 어디서 찾을 지를 결정:
◆ 만약 값이 True면, parent component의 three-dimensional property를 사용
◆ 만약 값이 False면, component자신의 three-dimensional property를 사용

ParentFont
 다음과 같은 컴포넌트의 font 정보를 어디서 찾을지를 결정:
◆ 만약 값이 True면, parent component의 font property를 사용
◆ 만약 값이 False면, component자신의 font property를 사용

ParentShowHint
 다음과 같이 컴포넌트의 힌트를 어디서 찾을지 결정:
◆ 만약 값이 True면, parent component의 ShowHint property를 사용
◆ 만약 값이 False면, component자신의 ShowHint property를 사용
ReadOnly
실행시 read-only 컴포넌트를 만들어 사용자가 field나 dataset값을 변경할 수 없도록 함
ShowHint
 힌트가 사용될지 아닐지를 결정:
◆ 만약 값이 True면 힌트사용
◆ 만약 값이 False면, 힌트 사용 안함
Text
컴포넌트나 다른개체에 나타나는 문자열을 기술합니다.

 

TabOrder

 

Tab 키를 눌렀을 때 컴포넌트의 taborder대로 실행이나 입력준비 상태가 변경됨

 

※ taborder 속성값이 0 인 컴포넌트는 폼 생성시 자동으로 포커스를 얻습니다.

※ 아래 소스가 keydown 이벤트에 있다면 엔터 입력시 taborder 값이 0부터 큰값으로

포커스가 이동하게 됩니다.

if key = vk_return then

begin

    //# 엔터 입력시 taborder 값의 순서대로 포커스 이동됨

    SendMessage(self.Handle, WM_NEXTDLGCTL, 0, 0);

end;

 

TabStop

 컴포넌트에 tab를 사용할 지를 결정

※ taborder 값이 동작하려면 tabsop 속성값이 true로 되어 있어야함

 

Tab
 컴포넌트의 property로서 정수값을 저장하도록 함.주의: 델파이에 의해 직접 사용되지는 않지만 응용프로그램의 특별한 목적으로 사용할 수 있다.
Visible
프로그램 실행 시 컴포넌트를 보이게 할 것인지를 지정한다. 디폴트 값은 True이다.

 

컴포넌트의 기본 이벤트(컴포넌트에 거의 공통적으로 들어가는 이벤트이다.)

 

델파이의 이벤트는 콜백함수입니다.

콜백함수란 프로그래머가 그 함수의 사용을 명령해 주는 것이 아닌 이벤트, 메시지 등을

받았을 때 자동으로 실행되는 함수를 말한다.

 

OnChange
개체나 컴포넌트에 지정된 값이 변화될 할 때 발생 
OnClick

컴포넌트를 클릭할 때 발생 
OnDblClick
컴포넌트를 두번 클릭할 때 발생

OnDragDrop
끌어당긴 개체를 놓을 때 발생 
OnDragOver

컴포넌트위로 개체를 끌 때 발생
OnEndDrag
개체를 끄는 것을 끝낼 때 발생
OnEnter
컴포넌트가 활성화될때만 발생 

컴포넌트로 포커스가 들어왔을때 발생
※ 자바스크립트의 onfocus 이벤트 핸들러와 같은 역할을 합니다.

 

OnExit

focus가 다른 컴포넌트로 움직일 때 발생

 

OnKeyDown

key를 눌렀을 때 발생. 특수키(ctrl, alt, shift, tab, enter, backspace,F1~F12 등등)에 반응함

ex1)

if key = 13 then

ShowMessage(‘d’);

 

※ keydown이벤트는 키값을 숫자로 리턴합니다.

※ keydown 이벤트에서 리턴하는 key 값은 10진수 정수입니다.

※ 위의 이벤트가 발생하려면 해당 폼의 Keypreview 속성이 True여야 한다.

※ F1부터 F12의 키값은 112부터 123입니다.

※ OnKeyUp 이벤트 발생하기 전에 발생한다.

※ 10진수 13은 아스키코드에서 엔터입니다.

 

ex0)

if Key = VK_RETURN then

ShowMessage(‘leejunsik’);

※ 엔터키값의 상수는 VK_RETURN 입니다.

 

예제1)

//# ctrl+v 키보드 입력시 발생

if (ssCtrl in Shift) and (Key in [86, 118]) then

begin

 ShowMessage(edit1.Text);

end;

 

예제2)

//# ctrl+c 키보드 입력시 발생

if (ssCtrl in Shift) and (Key in [67, 99]) then

begin

 ShowMessage(edit1.Text);

end;

 

예제3)

//# ctrl+v 키보드 입력시 발생

If (Shift = [ssCtrl]) and (Key = 67) then

begin

 ShowMessage(‘test’);

end;

 

OnKeyPress 이벤트

key를 눌렀을 때 발생. 특수키(ctrl, alt, shift, tab, enter, backspace,F1~F12 등등)에 반응안함

참고 : #13 – 엔터키 #9 – 탭키

ex)

if key = #13 then ShowMessage(‘d’);

※ keypress이벤트는 키값을 문자로 리턴합니다.)

※ 위의 이벤트가 발생하려면 해당 폼의 Keypreview 속성이 True여야 한다.

※ OnKeyUp 이벤트 발생하기 전에 발생한다.

 

StrCopy(@Key, pChar(UpperCase(Key)));

※ 영문자 입력시 자동으로 대문자로 변환됨

소스설명

char형 key를 받아서 UpperCase 함수로 대문자로 변환하여 string 형으로 리턴후

pChar함수에 의해 string형의 끝에 널제로를 붙히고 @Key로 복사한다.

char형 key앞에 @를 붙히면 pChar형으로 변환되며 strCopy는 pChar형 변수를 pChar형

변수로 복사할때 사용하는 함수이다.

 

예제1

//# 키보드 ctrl+c 입력시 발생

if Key = #3 then

begin

   ShowMessage(‘test’);

end;

 

예제2

//# 키보드 ctrl+v 입력시 발생

if Key = #22 then

begin

   ShowMessage(‘test’);

end;

 

OnKeyUp 이벤트

누른 Key를 놓았을 때 발생, 키를 누른후에 발생

※ OnKeyDown와 OnKeyPress 이벤트핸들러가 발생한후 발생하는 이벤트

 

금액 변경 예제

procedure TFw_212.wEdit2KeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  //# "거래후 카드 잔액" 변동 #//
  if (realgrid1.RowCount <> 0) and (wedit2.Text <> ”) then begin
    with realgrid1 do begin
      wedit7.Text := inttostr(strtoint(co_chardelete(Cells[9,row].AsString,’,’)) – strtoint(wedit2.text));

      //# 마이너스 정수 처리 #//
      if strtoint(wedit7.Text) < 0 then begin
        wedit2.Text := co_chardelete(Cells[9,row].AsString,’,’);
        wedit7.Text := ‘0’;
        exit;
      end;
    end;
    //# 0030, 00050 같은 정수에서 맨앞에 필요없는 0 없애기 #//
    wedit2.Text := inttostr(strtoint(wedit2.Text));
  end;
end;

 
procedure TFw_212.wEdit7KeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  //# "거래금액" 변동 #//
  if (realgrid1.RowCount <> 0) and (wedit7.Text <> ”) then begin//# 공백체크 없을시 에러난다. #//
    with realgrid1 do begin
      wedit2.Text := inttostr(strtoint(co_chardelete(Cells[9,row].AsString,’,’)) – strtoint(wedit7.text));

      //# 마이너스 정수 처리 #//
      if strtoint(wedit2.Text) < 0 then begin
        wedit2.Text := ‘0’;
        wedit7.Text := co_chardelete(Cells[9,row].AsString,’,’);
        exit;
      end;
    end;
    //# 0030, 00050 같은 정수에서 맨앞에 필요없는 0 없애기 #//
    wedit7.Text := inttostr(strtoint(wedit7.Text));
  end;
end;

—————————————————————————–

procedure TFw_d00.edit3KeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin

  //# 0부터 99까지만 입력가능하게
  if ((Sender as TEdit).Text <> ”) then
  begin
    if (strtoint((Sender as TEdit).Text) > 99) then
    begin
      (Sender as TEdit).Text := ’99’;
    end;
    //# 앞에 0없애기
    (Sender as TEdit).Text := inttostr(strtoint((Sender as TEdit).Text));
  end
  else
  begin
    (Sender as TEdit).Text := ‘0’;
  end;

end;

 

OnMouseDown
컴포넌트상에서 마우스 버튼을 눌렀을 때 발생 

 
OnMouseMove
컴포넌트상에서 마우스를 움직일 때 발생 

 
OnMouseUp
컴포넌트상에서 눌려있던 마우스 버튼을 놓았을 때 발생 

 
OnStartDrag
끌어당기기를 시작할 때 발생

 
Form(폼) 속성/메소드
 
comment
 
메인폼 객채로써 프로그램 시작시 자동으로 만들어진다.
 
property
 
ActiveControl-form생성시 초기 포커스를 둘 컴포넌트를 지정
 
※ 사용예제(아래 Edit1에 포커스를 주는 두 명령은 같은 역할을 합니다.)

ActiveControl := Edit1;

Edit1.SetFocus;

※ 사용예제2

ActiveControl := RealGrid1;

 

AutoSize-폼에 놓여진 컴포넌트에 맞게 폼의 가로/세로 크기가 딱 맞추어진다.(권장)
PopupMenu-팝업메뉴 컴퍼넌트를 현재 Form에 적용한다.
AutoScroll-프로그램 실행시 폼의 사이즈 조절 유무를 설정한다.(True-조절 가능)
clientwidth – 테두리선을 제외하고 사용가능한 원도우 가로 크기를 설정한다.
clientheight – 캡션바와 테두리선을 제외하고 사용가능한 원도우 세로 크기를 설정한다.

width – 폼의 전체 가로 크기를 지정, 테두리선의 크기를 합친 크기이다.
height – 폼의 전체 세로 크기를 지정, 캡션바와 테두리선의 크기를 합친 크기이다.
 
* clientwidth, clientheight 사용시점
윈도2000에서 개발한 프로그램이 XP(테마사용)에서는 크기가 변경되어 폼에 스크롤바가 생기는 경우가 있다. 이때는 OnCreate시에 ClientWidth와 ClientHeight속성을 강제로 지정하면 된다.
 
Cursor – 해당 폼안에서 컴포넌트를 제외한 곳에서의 커서를 설정한다.
crDefault – 기본적인 커서 모양
crHourGlass – 일반 처리시 커서 모양
crSQLWait – SQL 처리시 커서 모양

* 커서 변경 소스
Screen.Cursor := crDefault; //# 커서 모양이 기본 커서 모양으로 변경
Screen.Cursor := crHourGlass; //# 커서 모양이 모래시계 모양으로 변경

Screen.Cursor := crSQLWait; //# 커서 모양이 모래시계+SQL문자열 모양으로 변경

Keypreview – 이 속성이 True로 설정되면, 폼 위에 컨트롤이 있더라도 키보드와 관련된 이벤트가 발생하는 경우, 폼의 이벤트를 먼저 발생한 후에 컨트롤 이벤트를 발생한다.
HelpFile – 도움말 파일을 지정한다.
FormStyle-폼스타일을 정한다.
fsMDIChild-mid폼 자식으로 만듬
fsMDIForm-mdi폼 부모로 만듬
fsNormal(평범한 폼)
fsStayOnTop(항상 상단에 뜨는 폼)
※ 다른 프로그램과 같이 화면에 떠있더라도 fsStayOnTop를 적용한 프로그램은 항상 상단에 뜬다.
 
BorderStyle-폼의외곽선을 바꾼다.
bsNone(타이틀바가 없음)-제목표시줄과 외곽선이 안보이며 배경만 나온다.
※ 프로그램 시작폼에 많이 사용
bsToolWindow(사이즈조절불가능,타이틀바보임,조금만종료만표시,아이콘안보임)
bsSizeToolWin(사이즈조절가능,타이틀바보임,조금만종료만표시,아이콘안보임)
bsSizeAble(사이즈조절가능,타이틀바보임,종료/최대화/최소화표시,아이콘보임)-default
bsSingle(사이즈조절불가능,타이틀바보임,종료/최대화/최소화표시,아이콘보임)
bsDialog(사이즈조절불가능,타이블바보임,큰종료만표시,아이콘안보임)
※ 혹시 bsSingle설정이면서 최대화/최소화 표시가 안나오게 하려면 BorderIcons속성에서 최대화와 최소화 출력 여부를 체크하면됩니다.
(BorderIcons속성은 BorderStyle속성에 영향을 주지 않습니다.)
 
Icon – 제목표시줄의 아이콘과 실행파일의 아이콘을 설정합니다.

 

WindowState – 해당 폼이 화면에 출력될때의 형태지정

wsMaximized : 폼이 열릴 때 자동으로 최대화됨

wsMinimized : 폼이 생성될때 자동으로 최소화됨

wsNormal : 폼이 생성될때 최대화도 아닌 최소화도 아닌 일반상태로 출력됨

 

Position – 해당 폼이 화면에 출력될때 위치를 설정함

poMainFormCenter : 메인폼 화면의 가로세로의 정가운데에 출력됨

poDesktopCenter : 듀얼 모니터 화면를 합쳐서 가로세로의 정가운데에 출력됨

poScreenCenter : 듀얼 모니터 화면중 메인 화면의 가로세로의 정가운데에 출력됨

※ 듀얼모니터 환경에서 개발후 싱글모니터에 배포시 팝업창의 top, left 속성값이 마이너스

일때 화면에 안보일수도 있다. 이때는 정상적으로 폼이 보이기 위해 poMainFormCenter 값을

사용해야 한다.

poDesigned : 디자인모드시 위치하고 있는 그위치에 출력됨

※ WindowState 속성값이 wsMaximized, wsMinimized 이면 Position 속성값은 크게 의미가

없다.

 

Method

close-해당 품을 종료한다.

 

Standard 페이지

 

MainMenu Component

property

Checked-해당 메뉴를 체크한다.

Enabled-해당메뉴를 비활성화 한다.

Short Cut-바로가는 키 설정

※ Short Cut은 메뉴항목을 빠르게 선택하고자 키보드를 이용하여 조합키로서 해당

메뉴항목을 선택하는 방법이다. 물론 단축키와 유사하지만 Short Cut은 해당 메뉴가

떠있지 않는 상태에서 사용할 수 있지만 단축키는 메뉴가 떠 있을 때 사용하는 방법이다.

 

Label 컴포넌트

property

alignment-출력할 문자열을 정렬한다.

※ 한글이 제대로 출력안될때는 해당 Form의 폰트를 한글폰트로 바꾸면 됩니다.

(굴림체 추천)

transparent-라벨의 배경색을 투명하게 합니다.

※ shape component위에 label component을 놓고 transparents 속성을 true로 하면 이쁘게

디자인이 됩니다.(류님이 알려주셨음^^)

※ 이쁜 영문 폰트 설정 법 : 글꼴 – Verdana, 글꼴스타일 – 보통, 크기 – 20

 

StaticText 컴포넌트

comment

StaticText 과 Label 사이의 차이점은, StaticText 은 TWinControl 로부터 상속받아 윈도우

핸들을 가지고 있다는 점입니다.

※ 이쁜 영문 폰트 설정 법 : 글꼴 – Verdana, 글꼴스타일 – 보통, 크기 – 20

 

CheckBox 컴포넌트

comment

체크박스(CheckBox)가 선택할 수 있는 것은 ‘예’(체크가 된 상태)과 ‘아니오’(체크가 되어있지

않는 상태)이다.

property

Checked-체크박스(CheckBox)안에 ‘V’표시가 나타나게 할것인지를 결정한다.

Enabled-체크박스를 직접체크 가능하게 할지 안할지를 결정(true-직접체크 가능)

※ checkbox 의 Enabled 속성이 false 일때는 직접 체크와 이벤트도 실행 안되지만 대입

및 참조는 가능하다.

※ checkbox 의 Enabled 속성이 false 일때 setFoucs 함수를 사용하면 에러가 난다.

 

RadioButton 컴포넌트

Comment

라디오버튼은 여러개의 라디오버튼에서 오직 하나만 선택이 가능한 컴포넌입니다.
폼안에서는 모든 RadioButton이 자동으로 한그룹이며 다른 그룹으로 하려면 RadioGroup,GroupBox등을 이용해서 사용합니다.

Property

Checked-라디오박스(RadioButton)의 선택을 나타나게 할것인지를 결정한다.
※ 라디오버튼을 따로 그룹화하려면 2가지 방법이 있다.
1. 라디오그룹컴포넌트 사용하기
2. 패널컴포넌트안에 라디오버튼 넣어서 하나의 그룹으로 인식시키기

 

RadioGroup 컴포넌트

 

Comment

라디오그룹(Radio Group)컴포넌트는 그룹박스(Group Box)안에 라디오버튼(Radio Button)을

포함시켜 다른 라디오버튼(Radio Button)과 구분하여 사용할 수 있는 컴포넌트이다.

Property

Checked – 라디오버튼(Radio Button)이 선택되어있는지 여부를 나타낸다.

Columns – 한줄에 나타낼 수 있는 항목의 수를 지정

Items – 항목의 목록을 나타낸다.

ItemIndex – 기본 선택될 항목의 순서값을 나타낸다.(0 이 맨처음)

※ ItemIndex 속성의 리턴 데이타형은 정수형이다.

Method

radiogroup1.items.count-라디오버튼의 갯수

RadioGroup1.Items.Strings[radiogroup1.ItemIndex]-선택한 제목의 문자열 출

RadioGroup1.ItemIndex – 현재 선택된 항목의 순서값을 나타낸다.(0 부터 시작)

Etc

라디오그룹의 순서값으로 순서값에 해당하는 문자열 출력하기

RadioGroup1.Items.Strings[RadioGroup1.ItemIndex];

— 순서값에 해당하는 문자열이 출력됨

RadioGroup1.Items.Strings[1];

— 2번째 항목의 문자열이 출력됨

※ Strings 속성의 인수형은 정수이다.

 

Edit 컴포넌트

Comment

한줄로 입력을 받을 사용합니다.

Property

AutoSize – Edit 컴포넌트의 세로길이가 Font 속성에서 설정한 글자크기의 세로크기로

자동으로 조절된다.

※ TRUE – 자동 조절, 가로크기는 조절안됨

passwordchar-edit컴포넌트에 입력되는 형식을 지정합니다.

#0-입력되는 문자가 그대로 출력됩니다.

#-입력되는 문자가 #로 출력됩니다.

※ #가 아니라 다른 문자를 쓴다면 해당 문자로 출력이 가능함

BorderStyle-edit박스의 테두리선을 선택한다.

Ctrl3D-텍스트 박스를 3차원혹은 2차원 형태로 나타낸다.

ShowHint-팁을 보여줄지 여부

MaxLength-입력크기를 제한한다.

(3 – 3바이트 크기만 입력가능, 10 – 10바이트 크기만 입력가능)

※ 0 입력시 입력크기에 재한이 없음

AutoSelect – 프로그램을 실행시 제일 처음 Edit 컴포넌트에 포커스가 갈때 자동으로 전체

선택되어 질지 아닐지를 설정한다.(TRUE-자동 전체 선택)

Method

 

CanFocus 설명

해당 컴포넌트에 포커스가 가능한지 불가능한지 체크함

사용예제

//# 해당 컴포넌트가 화면에 보이는 상태라면 포커스명령 실행

if Edit1.CanFocus then

begin

  Edit1.SetFocus;

end;

※ CanFocus 명령없이 화면에 보이지 않는 컴포넌트에 setfocus를 주게되면 아래의

에러 메시지가 뜨게 된다.

Cannot focus a disabled or invisible window.

 

focus-입력부분으로 커서가 이동한다.

TIP1

Enabled속성이 false인상태의 Edit 컴포넌트로 SetFocus메소드를 사용했을때 아래의

에러가 납니다. ex) wEdit1.SetFocus;

Cannot focus a disabled or invisible window.

하지만

ReadOnly속성이 false인상태의 Edit 컴포넌트로 SetFocus메소드를 사용할때는

잘작동합니다.

 

TIP2
※ Edt 컴포넌트의 Enabled,ReadOnly 속성이 false 일때는 직접 입력은 안되지만 대입 및 참조는 가능하다.
 
주의1
SelectAll 메소드는 Edit 컴포넌트의 문자열의 전체 선택하는 메소드이다.
근데 이 메소드는 onClick에 사용하면 동작하지만 onEnter에 사용하면 동작하지 않습니다.
포커스를 얻을때 SelectAll 메소드가 동작하는 효과를 얻으려면 RealGrid 패키지의 wEdit 컴포넌트를 사용하면 됩니다.(델6 에서 테스트)

 

 

Memo컴포넌트

comment

2줄 이상 입력받을때 사용합니다.

property

maxlength – 입력 문자수를 제한함

※ 테이블의 크기가 100바이트라면 maxlength 속성값도 100을 주면 된다.

 

Lines-입력상자안에 내용을 입력합니다.
visible-메모컴포넌트를 보일지 여부(false-보임)
align-정렬을 합니다.(altop-상단에붙음,alclient-상하단에붙음)
ReadOnly-읽기만 가능하게 한다.
scrollbard-좌우 스크롤 표시 유무
ssboth(가로세로스크롤바)
ssVertical(세로스크롤바)
ssnone(스크롤바없음)

method
clear-입력상자안에 내용을 모두 지웁니다.
lines-add-입력상자안에 내용의 끝부터 줄단위로 추가합니다.
lines-insert-입력상자안에 원하는 칸에 내용을 줄단위로 추가합니다.
text=입력상자안에 새로 내용을 추가합니다.(글자가 있었다면 자지워지고 새롭게 입력된다.)
LoadFromFile(file)-파일내용을 메모장안에 뿌려준다.

※ 메모 컴포넌트는 각 라인별로 폰트 속성을 다르게 주는것이 불가능합니다.

 

keydown 이벤트에 사용하는 ctrl+a 단축키 클릭시 전체문자역 선택되게

If (Shift = [ssCtrl]) and (Key = 65) then

begin

   (Sender as TMemo).SelectAll;

end;

 

Panel 컴포넌트

 

Comment

특정 모양으로 그룹을 지을수있는 컴포넌트이다.

 

Property

BorderWidth-화면에는 출력되지 않고 panel의 여백을 크기를 지정합니다.

align-상/하/좌/우/전체/사용자정의로 정렬을 시킵니다.

bevelouter-외곽선을 튀어나오게 할것인지 들어가게 할것인지 결정

byraised(외곽선을 튀어나오게 함)

bylowered(외곽선을 들어가게 함)

bynone(외곽선을 안보이게 함)

bevelinner-외곽선을 들어가지도 않고 나오지도 않은 2줄 구분선으로 출력

bsnone(아무 효과도 안준다)

bsrowered(2줄 구분선으로 출력)

 

※ 자주 사용하는 구분선 설정

 

구분선이 들어간 효과의 경우

bevelinner-bvRaised

bevelouter-bvLowered

구분선을 안보이게 하는 경우

bevelinner-bvNone

bevelouter-bvNone

 

※ 항목명으로도 많이 사용되어 진다.

 

Combobox컴포넌트

 

Comment

아이템을 콤보박스형태로 보여줍니다.

 

Property

text-초기 문자열을 지정합니다.

items-리스트 목록을 입력합니다.

ItemIndex-리스트 목록처음이 0부터 1씩 증가되는 아이템 순서 값

style-콤보박스 형태를 지정합니다.

csDropDown(드롭다운형태이며 수동입력 가능함)

csDropDownList(드롭다운형태이며 수동입력 불가능)

 

Method

text-현재 선택되어져 있는 값을 출력(읽기용)

ItemIndex-현재 선태된 리스트순서값을 숫자값으로 입력하여 바꿈(0부터시작)

items.IndexOf-해당 문자열이 있는 리스트 순서값을 알아낸다.

Items.Strings-리스트순서값을 이용해 해당 문자열을 출력(읽기용)

items.insert-리스트목록을 추가합니다.(추가위치를 지정가능)

items.add-리스트목록을 추가합니다.(추가위치지정불가능,무조건 맨뒤부터)

Items.CommaText – 콤마 단위로 문자열을 넣으면 쉽게 리스트목록에 추가할수 있다.

※ CommaText 사용후에는 반드시 ItemIndex 으로 초기값을 준다.

카테고리: 델파이 | 댓글 남기기