DELPHI의 DBGrid에서 행의 위치 지정 및 색상 지정 구현
데이터베이스 시스템을 운영할 때 DBGrid 컨트롤에서 데이터 행의 위치를 지정할 수 없고 특정 행을 찾은 후 현재 행을 명확하게 표시할 수 없는 현상(예: 색상 변경)을 발견했습니다. 정보를 보니 기본적으로 일부 동적 맨 윗줄 색상을 포함하여 이 콘텐츠에 대한 소개가 없습니다. Se 등의 기사에서는 데이터 초기화 중에 수행되는 작업에 대해 설명했지만 데이터 소스를 새로 고친 후 위치 변경 기능이 없어서 아침에 DELPHI에 대해 조사하고 관련 정보를 검토한 후 이 문제를 해결하기로 결정했습니다. Xiaocheng, 이제 그것을 기록하고 모든 동료들과 함께 배우십시오. 부적절한 부분에 대해 조언을 부탁드립니다.
먼저 Ttable과 Tquery 컨트롤을 검색해봐도 데이터 행을 직접 찾을 수 있는 메소드가 없었습니다. 또한 DBGrid를 검색해도 특정 데이터 행을 직접 찾을 수 있는 해당 함수가 없었습니다. 그런 다음 클래스에서 검색했습니다. 지속적인 노력 끝에 마침내 TdataSet: GoToBookmark에서 메서드를 찾았습니다. 이 메서드는 현재 DBGrid의 레코드 포인터가 지정해야 하는 행을 가리키도록 할 수 있습니다.
이 방법을 찾은 후에는 문제가 절반만 해결되었습니다. 현재 포인터가 가리키는 데이터 행의 색상도 변경되어야 합니다. 즉, 현재 선택된 행을 명확한 방법으로 표시해야 합니다(작은 부분 제외). (명백한 북마크 제외) 이는 DBGrid 컨트롤에 분명히 구현되어 있습니다. 이 메서드를 오버로드하면 지정된 데이터 행의 색상이 변경될 수 있습니다.
구체적인 사용 과정은 다음과 같습니다.
(1) 데이터 행을 동적으로 배치
//================================================ ===============
//프로세스 이름: DyDbgDataLine
//저자: 아이티안
//날짜: 2003-02-22
//기능: 사용자가 지정한 조건에 따라 이 조건을 만족하는 DBGrid 컨트롤의 데이터 행으로 자동 이동합니다.
//입력 매개변수:
// sValue: 현재 이동해야 하는 행의 값;
// tab: 현재 DBGrid에 있는 해당 테이블의 데이터;
// dsr: 현재 동작해야 하는 데이터소스;
//반환값: 없음
//기록 수정:
//================================================ ================
PROcedure DyDbgDataLine(sValue:string;tab:Ttable;dsr:TDatasource)
var
북마크:TBookMark;
시작하다
//현재 표시된 줄을 기록합니다.
북마크:=self.tab.GetBookmark;
self.tab.first;
self.tab.Eof가 아닌 동안
시작하다
self.tab.FieldByName('cpbh').AsString= sValue이면
시작하다
북마크:=self.tab.GetBookmark;
부서지다;
끝;
self.tab.다음;
끝;
self.dsr.DataSet.GotoBookmark(pointer(bookmark));
끝;
설명: 사용된 테이블은 현재 디스플레이 인터페이스의 DBGrid에 바인딩되었습니다.
(2) 현재 데이터 행을 표시하는 색상을 변경합니다.
먼저 DBGrid의 Default드로잉 속성을 false로 설정한 후 OnDrawDataCell 이벤트 함수에서 다음 함수를 호출합니다.
//================================================ ===============
//프로세스 이름: DrawLine
//저자: 아이티안
//날짜: 2003-02-22
//기능: Dbgrid에서 지정된 행의 색상을 마크로 변경합니다.
//입력 매개변수:
// zdm: 필드 이름;
// Rect : 들어가고 나가야 하는 행의 단위.
// 필드: 현재 표시된 필드;
// 상태: 현재 행의 표시 상태;
// zdz: 현재 이동해야 하는 행의 값;
// tab: 현재 DBGrid에 있는 해당 테이블의 데이터;
// dbg: 현재 동작해야 하는 DBGrid;
//반환값: 없음
//기록 수정:
//================================================ ================
procedurDrawLine(탭:Ttable;const Rect:Tect;Field:Tfield;state:TgridDrawState;dbg:TDBGrid)
시작하다
if (tab.fieldbyname(zdm).asstring=zdz)then
시작하다
dbg.canvas.font.color:=clred;
dbg.canvas.brush.color:=clyellow;
끝;
dbg.DefaultDrawDataCell(Rect,Field,State);
끝;