2016-09-02 87 views
-3

dbgrid가 있습니다. 내 데이터 소스에서 datachanged 이벤트에 오류가 발생하면 현재 CELL에 초점을 설정하고 싶습니다. OndataChanged 경우에델파이 DBGrid가 현재 셀에 포커스를 설정했습니다.

내 코드는 다음과 같습니다

if (Field.Text = '') then 
begin     

     Application.MessageBox('ERROR','',MB_ICONWARNING); 
     Field.Tag:= Field.DataSet.RecNo; 
     Abort; 
end 

내가 어떻게 할 수 있습니까?

+1

가) datachanged 이벤트가 그리드에서 내부 편집을하는 사용자에 의해 촉발되고 있습니까? b) "현재"세포가 무엇을 의미합니까? 오류가 발생하기 직전에 초점을 맞춘 세포입니까? – MartynA

+0

a) 내 데이터 소스에 이벤트 'OnDataChanged'가 있습니다 ... b) 현재 셀 : 잘못된 데이터를 입력하면 셀이됩니다 – userPro

+0

b) 예 : 마우스로 다음 셀을 클릭하면 .. 오류 : 이전 셀 일부 형식이 될 수 없습니다 .. – userPro

답변

1

아래 코드

  • 예컨대 DBGrid를, 글로벌 예외 핸들러

  • 포커스를 소정의 셀을 설치하는 방법을 도시 예외가 발생했을 때 현재 있었던 것. FocusGridCell

  • TF Whitefield가 제안한 TField의 Required 속성을 True로 설정하십시오.

당신이 볼 수 있듯이, 된 TForm1의 OnException가 으로 현재 그리드의 행과 열을 저장하는 변수 ERow 및 ECOL 그래서 나중에 그들에게 반환 할 수 있습니다.

FocusGridCell은 저장된 값으로 그리드 셀에 포커스를 되돌릴 수 있습니다. 그리드에서 포커스를 떼어 낸 후에 ERow 및 ECol 값. OnDataChange 핸들러에 Application.MessageBox이 있습니다.

바라는 바는 원하는 작업 만 수행하면됩니다. 이 응용 프로그램의 메시지 큐에 자신에게 사용자 정의 메시지를 게시하는 것이 좋습니다와의 팝업을 할 :

, BTW는 TDataSet의 이벤트 핸들러에서 물건을 표시하는 팝업 메시지를 사용하는 것이 일반적 나쁜 생각 사용자 지정 메시지의 처리기를 사용하면 이후에 팝업이 발생하고 데이터 집합 이벤트가 완료됩니다.

코드 :

TForm1 = class(TForm) 
    [...] 
    protected 
    ERow, 
    ECol : Integer; 
    procedure OnException(Sender : TObject; E : Exception); 
    procedure FocusGridCell(ACol, ARow: Integer); 
    public 
    end; 

[...] 

type 
TMyDBGrid = class(TDBGrid); 

procedure TForm1.FormCreate(Sender: TObject); 
begin 
    ERow := -1; 
    ECol := -1; 
    Application.OnException := OnException; 
end; 

procedure TForm1.OnException(Sender: TObject; E: Exception); 
begin 
    ERow := TMyDBGrid(DBGrid1).Row; 
    ECol := TMyDBGrid(DBGrid1).Col; 
    // the following shows a non-intrusive way to display status info without 
    // interfering with what's focused on the form, etc 
    Caption := Format('Row: %d, Col: %d', [ERow, ECol]); 
end; 

procedure TForm1.FocusGridCell(ACol, ARow : Integer); 
begin 
    // Unless the grid's dgAlwaysShowSelection is True, the following 
    // call to DBGrid1.SetFocus is necessary, otherwise 
    // the call to SetFocus has no visible effect. 
    if not (dgAlwaysShowSelection in DBGrid1.Options) then 
    DBGrid1.SetFocus; 
    TMyDBGrid(DBGrid1).FocusCell(ACol, ARow, True); 
end; 
+0

'TMyDBGrid (DBGrid1) .FocusCell (ACol, ARow, True)를 얻습니다; '선언되지 않은 식별자 FocusCell – userPro

+1

@userPro : 어떤 Delphi 버전을 사용하고 있습니까? – MartynA

+0

"선언되지 않은 식별자 FocusCell"장치가 DBGrid뿐만 아니라 Grid를 사용하는지 확인하십시오. 그것은 자동으로해야합니다. 'FocusCell'은 TCustomGrid의 protected-scope 메소드이고, 내 코드의'TMyDBGrid' 선언은 컴파일러가 여러분 유닛에 접근 할 수 있도록 허용해야합니다. – MartynA