사람들이 Delphi를 사용하여 데이터베이스 응용 프로그램을 개발할 때 종종 테이블 컨트롤을 사용하여 보고서를 작성합니다. 테이블 컨트롤의 OnDrawCell 이벤트를 유연하게 사용하면 일부 특수 효과가 표시되어 사용자 요구를 더 잘 충족시킬 수 있습니다. 이 기사는 OnDrawCell 이벤트를 사용하여 유연하게 사용하기위한 세 가지 팁을 소개합니다.
테이블 행의 색상을 동적으로 업데이트하십시오
때로는 보고서에서 테이블 행의 색상을 동적으로 업데이트해야합니다. 예를 들어, 공급 업체 목록에서 선호하는 공급 업체는 녹색으로 표시되고 다른 공급 업체는 빨간색으로 표시됩니다. 현재 다음 코드를 사용하여 OnDrawCell 이벤트에서이를 구현할 수 있습니다.
if table1.fieldByName ( 'custno'). Asinteger> 1500
dbgrid1.canvas.font.color : = clred;
dbgrid1.DefaultDrawColumncell (rect, datacol,
열, 상태)
위의 코드는 응용 프로그램의 요구에 따라 확장 될 수 있습니다. 예를 들어, 굵게 표시해야 할 때 해당 라인을 다음과 같이 변경하십시오.
dbgrid1.canvas.font.style : = [fsbold];
테이블에 다른 시각적 컨트롤을 삽입하십시오
데이터베이스 프로그래밍에서 외국 주요 제약은 데이터베이스의 데이터가 사용자 요구 사항에 따라 저장되도록하는 효과적인 방법입니다. 예를 들어, 주문 처리 환경에는 주문 테이블과 고객 테이블 사이에 외국의 주요 제약 조건이 있습니다. 즉, 주문 테이블의 각 레코드에는 고객 테이블에 해당 항목이 있어야합니다. 이러한 방식으로 주문 양식을 작성할 때 고객 목록이 입력 초점에서 선택할 수 있도록 고객 목록이 제공되면 데이터의 정확성이 효과적으로 보장됩니다.
DBGRID 컨트롤과 StringGrid 컨트롤은 DBGRID 컨트롤이 데이터를 입력 할 수있는 TcustomGrid에서 파생됩니다. DBGRID 처리를위한 Delphi의 내부 메커니즘은 그리드에 DBEDIT 제어를 떠 다니는 것입니다. 초점과 입력 데이터를 얻을 수있는 그리드는 실제로 초점을 옮기면 편집 상자의 텍스트가 테이블에 표시되지 않습니다. 따라서 데이터가 테이블에 입력됩니다. 따라서 다른 시각적 컨트롤을 테이블에 삽입하는 방법은 그리드의 시각적 컨트롤을 떠 다니는 것입니다. 따라서 원칙적으로 모든 컨트롤은 테이블에 삽입 될 수 있습니다. 이 기사는 테이블에 드롭 다운 상자를 삽입하여 그리드에 다른 컨트롤을 삽입하기위한 특정 단계를 소개하는 예를 가져옵니다.
1. 속성을 설정하십시오
클라이언트 목록의 항목 속성을 드롭 다운 상자에 읽으십시오.
2. OnDrawCell 이벤트 설정
OnDrawCell 이벤트는 테이블의 셀을 그릴 때 발사됩니다. 초점을 얻는 셀에 해당하는 필드가 드롭 다운 상자에 해당하는 필드와 일치하는 경우 드롭 다운 상자를 그리드로 이동하여 초점을 얻고 드롭 다운 상자를 가시로 만들어 표시 기능을 달성합니다. 테이블의 지정된 열의 드롭 다운 상자. 테이블 설정을위한 OnDrawCell 이벤트는 다음과 같습니다.
if (gdfocused state)
시작하다
// 해당 필드가 일관된 경우 실행하십시오
if (grid.cells [acol, 0] = 'company')
시작하다
// 드롭 다운 상자를 지정된 위치로 이동합니다
combobox1.left : = rect.left + grid.left;
combobox1.top : = rect.top + grid.top;
combobox1.width : = rect.right-rect.left;
combobox1.Height : = rect.bottom-rect.top;
// 드롭 다운 상자를 보이고 초점을 맞추십시오
combobox1. Visible : = true;
combobox1. 세트 포커스;
끝;
끝;
3. Onclick 이벤트 설정
초점을 얻는 셀에 해당하는 필드가 드롭 다운 상자에 해당하는 필드와 일치하지 않으면 드롭 다운 상자가 보이지 않습니다. 이렇게하려면 다음과 같이 테이블의 onclick 이벤트를 설정하십시오.
if (grid.cells [grid.col, 0] <> 'Company')
시작하다
combobox1. Visible : = false;
끝;
4. OnChange 이벤트 설정
OnDrawCell 이벤트에서는 셀 드로잉 작업 및 드롭 다운 상자 표시 작업 만 완료되며 데이터는 테이블에 입력 할 수 없습니다. 이렇게하려면 드롭 다운 상자의 Onchange 이벤트를 다음과 같이 설정하십시오.
grid.cells [grid.col, grid.row] : = combobox1.
항목 [combobox1.itemindex];
이렇게하면 테이블에 드롭 다운 상자를 삽입하는 작업이 완료됩니다.
테이블에 그래픽 필드를 표시하십시오
프로그램 개발에서 때때로 일부 비 전통적인 문자를 보고서에 표시해야합니다. 예를 들어, 파트 검사 보고서의 검사 항목 필드에는 부품 가공 거칠기 및 가공 공차와 같은 비 전통적인 문자가 포함되어 있습니다. 이 문제를 해결하는 일반적인 아이디어는 이러한 비 전통적인 문자를 SQL Server 데이터베이스에 이미지 필드와 같은 그래픽 필드로 저장하는 것입니다. 그러나 StringGrid 컨트롤이든 DBGrid 컨트롤이든, 문자열 만 직접 표시 할 수있어 테이블 컨트롤에 그래픽 필드를 표시하는 방법의 문제를 만듭니다.
언뜻보기에,이 문제는 위의 방법을 사용하여 dbimage 컨트롤을 테이블에 삽입하여 해결할 수 있습니다. 그러나 레코드와 동일한 숫자의 컨트롤을 삽입해야합니다. 더 중요한 것은 OnDrawCell 이벤트가 매우 자주 트리거되므로 삽입 된 DBIMAGE 컨트롤은 데이터베이스에 계속 연결하려고합니다. 또한 그래픽 필드에서 분명히 깜박입니다. 더 나은 솔루션은 데이터베이스에 연결할 때 DBimage 컨트롤을 동적으로 생성하고 데이터베이스의 이미지 필드를 읽고 클라이언트 하드 디스크에 임시 파일로 저장하는 것입니다. 테이블의 OnDrawCell 이벤트에서 임시 파일을 읽고 클라이언트가 종료되면 임시 파일이 삭제됩니다. 다음은 테이블에 그래프 필드를 표시하는 특정 단계입니다.
1. 이미지 필드를 저장하십시오
쿼리를 실행할 때 모든 이미지 필드를 읽고 클라이언트 하드 디스크에 저장하십시오.
시작하다
... // 쿼리 문을 생략합니다
filename : = 'd : emp'; // 임시 파일 경로를 초기화합니다
mydbimage : = tdbimage.create (self); // dbimage를 만듭니다
mydbimage.parent : = 자기;
mydbimage.datasource : = dataSource1;
mydbimage .datafield : = 'description'; // "description"필드로 지정합니다
색인 : = 1;
ClientData.eof는 아니지만 시작합니다 // 데이터베이스를 읽습니다
s : = inttostr (index);
filename1 : = filename+s;
filename1 : = filename1+'. bmp';
// 임시 파일을 저장합니다
mydbimage .picture .bitmap .savetofile (filename1);
grid.cells [1, index] : = '';
// 양식을 채우십시오
grid.cells [2, index] : = clientData.fieldByName ( '측정 데이터'). Asstring;
clientData.next;
색인 : = 색인+1;
끝;
mydbimage.destroy ();
끝;
2. 그래픽을 복사하십시오
OnDrawCell 이벤트를 설정하고 임시 파일을 읽은 다음 그래픽을 지정된 테이블 열에 복사하십시오.
if ((acol = 1) 및 (arow> 0) 및 (grid.colcount> 2)))
// 테이블에는 두 개 이상의 열이 필요합니다
filename : = 'd : emp';
s : = inttostr (arow);
filename : = filename+s;
filename : = filename+'. bmp';
myimage : = timage.create (self); // 이미지 제어를 만듭니다
myimage.parent : = 자기;
// 임시 파일을 읽습니다
myimage.picture.bitmap.loadfromfile (filename);
// 그래픽을 복사합니다
grid.canvas.draw (rect.left, rect.top, myimage.
그림. 그라프);
myimage.destroy (); // 이미지 컨트롤 릴리스
끝;