Delphi는 데이터베이스 애플리케이션 설계를 용이하게 하기 위해 강력한 DBGrid 구성 요소를 제공합니다. 하지만 DBGrid 컴포넌트만 사용한다면 각 포커스(Grid)는 단순한 텍스트 편집 상자에 불과해 사용자가 데이터를 입력하기에는 불편합니다. Delphi는 사용자 입력을 용이하게 하기 위해 DBComboBox, DBCheckBox 및 기타 구성 요소와 같은 몇 가지 다른 데이터 구성 요소도 제공하지만 이러한 구성 요소는 DBGrid만큼 강력하지 않습니다. Visual FoxPRO와 마찬가지로 Delphi에서는 사용자의 편의를 위해 DBGrid의 포커스 그리드가 다른 시각적 데이터 구성 요소가 되도록 허용할 수 있습니까? 실제로 DBGrid에 다른 시각적 구성 요소를 삽입하여 이를 달성할 수 있습니다.
DBGrid를 처리하기 위한 Delphi의 내부 메커니즘은 그리드에 구성 요소(DBEdit 구성 요소)를 띄우는 것입니다. 데이터를 입력하는 그리드는 실제로 부동 DBEdit 구성 요소이고 초점을 맞추지 못하는 다른 영역은 단지 이미지입니다. 따라서 DBGrid에 다른 시각적 구성 요소를 삽입하는 것은 그리드에 시각적 구성 요소를 떠 있는 것과 같습니다. 따라서 간단한 DbCheckBox부터 복잡한 대화 상자까지 모든 구성 요소를 DBGrid에 삽입할 수 있습니다. 다음은 DBComboBox 컴포넌트를 DBGrid에 삽입하는 방법에 대한 단계입니다. 다른 컴포넌트도 동일한 방법으로 삽입할 수 있습니다.
1. Delphi 4.0에서 새 프로젝트를 생성합니다.
2. 데이터 액세스 컴포넌트 보드의 DataSource 및 Table과 데이터 컨트롤 컴포넌트 보드의 DBGrid 및 DBComboBox의 네 가지 컴포넌트를 각각 Form1로 드래그합니다.
3. 각 구성 요소의 속성을 다음과 같이 설정합니다.
rcf1 객체 속성 설정 플랜트
Form1 캡션 'DBGrid에 SpinEdit 구성 요소를 삽입하는 예'
DataSource1 데이터세트 테이블1
테이블1 데이터베이스 이름 DBDEMOS
테이블 이름 '선생님.DBF'
활성 참
DBGrid1 데이터소스 데이터소스1
DBComboBox1 DataField SEX
데이터소스 데이터소스1
보이는 거짓
문자열 항목 '남성' |
참고: 여기서는 "남성" 또는 "여성"만 될 수 있는 교직원의 성별을 반영하는 Teacher.dbf를 사용했습니다.
4. DrawDataCell 이벤트는 포커스된 그리드에 해당하는 필드가 콤보박스에 해당하는 필드와 일치하면 콤보박스를 포커스된 그리드로 이동시킨 후 셀을 그리는 이벤트입니다.
DBGrid의 지정된 열에 DBComboBox를 표시하는 기능을 수행하려면 콤보 상자를 표시하십시오. DBGrid1의 OnDrawDataCell 이벤트를 다음과 같이 설정합니다.
절차 TForm1.DBGrid1DrawDataCell(Sender: TObject; const Rect: TRect; Field: TField; State: TGridDrawState);
시작하다
if (gdFocused in State) then
시작하다
if (Field.FieldName = DBComboBox1.DataField ) 그러면
시작하다
DBComboBox1.Left := Rect.Left + DBGrid1.Left;
DBComboBox1.Top := Rect.Top + DBGrid1.top;
DBComboBox1.Width := Rect.Right - Rect.Left;
DBComboBox1.Height := Rect.Bottom - Rect.Top;
DBComboBox1.Visible := 참;
끝;
끝;
끝;
5. DBGrid의 지정된 셀이 포커스를 받지 못하는 경우 DBComboBox가 표시되지 않습니다. DBGrid1의 OnColExit 이벤트를 다음과 같이 설정합니다.
절차 TForm1.DBGrid1ColExit(송신자: TObject);
시작하다
DBGrid1.SelectedField.FieldName = DBComboBox1.DataField인 경우
시작하다
DBComboBox1.Visible := 거짓;
끝;
끝;
6. DBGrid의 지정된 열이 포커스를 받으면 DrawDataCell 이벤트는 셀만 그리고 DBComboBox를 표시하지만 DBComboBox는 포커스를 얻지 못하고 여전히 셀에 데이터 입력이 수행됩니다. DBGrid1의 KeyPress 이벤트에서 SendMessage Windows API 함수를 호출하여 DBComboBox에 입력된 데이터를 전송함으로써 DBComboBox에 데이터를 입력합니다. 따라서 KeyPress 이벤트도 다음과 같이 설정합니다.
절차 TForm1.DBGrid1KeyPress(Sender: TObject; var Key: Char);
시작하다
if (key < > chr(9)) 그러면
시작하다
if (DBGrid1.SelectedField.FieldName =DBComboBox1.DataField) then
시작하다
DBComboBox1.SetFocus;
SendMessage(DBComboBox1.Handle, WM_Char, Word(Key), 0);
끝;
끝;
끝;
프로그램은 중국어 Windows 98 및 Delphi 4.015에서 디버깅을 통과했습니다. 이 글을 통해 여러분이 데이터베이스 애플리케이션을 보다 편리하고 빠르게 개발할 수 있기를 바랍니다.