2016-10-05 14 views
0

나는 다음과 같은 코드 내 DBGrid를 추가 사용하고 있습니다 - OnCellClick 이벤트DBGrid를 - OnCellClick 및 OnDblClick가 포함 된 양식/TBMemo을 반환 세포/열 값/s의

procedure TForm2.DBGrid1CellClick(Column: TColumn); 
begin 
if dbmodule.comenziDataSet.Active then 
    begin 
    if not Assigned(dbgridCelulaForm) then 
    begin 
     dbgridCelulaForm := TdbgridCelulaForm.Create(Self); 
     dbgridCelulaForm.DBMemoCelula.DataSource := dbmodule.comenziSource; 
    end; 

    dbgridCelulaForm.Visible := False; 
    dbgridCelulaForm.Visible := True; 
    dbgridCelulaForm.DBMemoCelula.DataField := Column.FieldName; 
    dbgridCelulaForm.Caption := Format('%s/randul: %d',[Column.FieldName, DBGrid1.DataSource.DataSet.RecNo]); 
    end; 
end; 

dbgridCelulaForm =를 포함하는 형태의 이름 dbmodule.comenziDataSet dbmodule 상기 DataSetdata module에 있으므로 - TDBMemo dbmodule.comenziDataSet = comenziDataSet의 TDBMemo DBMemoCelula = 이름 DataSet의 이름이고 dbmodule는 (형태와 마찬가지로 부)를 data module의 이름이다. comenziSource = 소스가 comenziSource

라는 데이터 세트, 데이터 모듈에 데이터 소스, 같은 가

좋아, 그래서이 코드는 무엇을 :

일단 내가 그것을 팝업 DBGrid에 셀을 클릭 form (dbgridCelulaForm 이름) TBMemo (DBMemoCelula라는)이 들어 있으며 해당 셀에 들어있는 정보를 보여줍니다 (예 : 고객 이름 또는 셀이 보유하고있는 것, 내 데이터베이스에 있음)

괜찮습니다, 제 문제는 지금은 DBGrid에있는 행을 선택할 수 없습니다. 한 번만 마우스를 클릭하여 특정 행의 셀 (any cell)을 클릭하면됩니다. 세포가 활성화되고 form이 나타납니다.

OnCellClick 대신 DBGrid - OnDblClick 이벤트에서이 코드를 사용할 수 있습니까? 의미 일단 행/셀을 두 번 클릭하면 form이 나에게 정보를 보여 주지만 두 번 누르기 만하면됩니다.

그런 식으로 필자는 여전히 행을 선택하고 필요한 경우 셀의 정보를 볼 수 있습니다.

또는이 기능을 사용하거나 수신하는 다른 방법/장소. 의견이 있으십니까?

내 설명이 모호하고 도움이된다고 생각하면 댓글/답변에 나와있는 모든 것을 빠른 동영상으로 게시 할 수 있습니다.

또한 데이터베이스에 RAD Studio 10 Seattle과 dbexpress 구성 요소를 사용하고 있습니다.

감사합니다.

+0

전혀 모호성을 ... 나는 비슷한 기능을 구현하는 방법은 그리드 컬럼의 편집 버튼을 통해 - 그리드에 OnEditButtonClick 이벤트가 발생합니다. 단추 모양을 cbsEllipsis로 설정하면 클릭 할 때 대화 상자가 튀어 나오는 것이 분명해집니다. Alt + Down으로 트리거 할 수도 있습니다. –

+0

안녕하세요. 회신 해 주셔서 감사합니다. 이미 다른 용도로 OnEditButtonClick을 사용하고 있으므로 사용할 수 없습니다. Martyn의 답변은 SelectedField 의견과 마찬가지로 도움이됩니다. 감사합니다! – Petzy

답변

1

다음 코드는 TDBGrid의 dbl 클릭 된 셀의 열과 행 좌표 및 셀 내용의 문자열 값에 액세스하는 방법을 보여줍니다.

작성된 것처럼 양식의 캡션에 셀의 열과 행 번호 + 문자열 내용을 표시합니다. 이 값으로 실제로 무엇을 할 것인가?

DBGrid에 연결된 데이터 집합의 데이터 집합 커서가 마우스 포인터가있는 셀에 해당하는 데이터 집합 행으로 이동 되었기 때문에 작동합니다. 난 그냥 어딘가에 정보를 보여주는 빠른 아주 간단한 방법으로 그리드 셀 정보를 표시하는 폼의 Caption 속성을 사용했습니다

type 
TMyDBGrid = class(TDBGrid); 

procedure TForm1.DBGrid1DblClick(Sender: TObject); 
var 
    ARow, 
    ACol : Integer; 
    Pt : TPoint; 
    CellValue : String; 
begin 
    // First, get the mouse pointer coordinates 
    Pt.X := Mouse.CursorPos.X; 
    Pt.Y := Mouse.CursorPos.Y; 
    // Translate them into the coordinate system of the DBGrid 
    Pt := DBGrid1.ScreenToClient(Pt); 

    // Use TDBGrids inbuilt functionality to identify the Column and 
    // row number. 
    ACol := DBGrid1.MouseCoord(Pt.X, Pt.Y).X -1; 
    ARow := DBGrid1.MouseCoord(Pt.X, Pt.Y).Y; 
    CellValue := DBGrid1.Columns[ACol].Field.AsString; 

    Caption := Format('Col:%d Row:%d Cell Value:%s', [ACol, ARow, CellValue]); 
end; 

참고. 물론 폼의 다른 영역이나 다른 폼의 다른 곳에 똑같이 잘 표시 할 수 있습니다. 위의 코드는 그리드의 OnCellClick 이벤트 (btw)에서도 똑같이 작동합니다.

설명에서 언급했듯이 위의 표 대신에 SelectedField 속성을 사용할 수 있지만 개인적으로는 위의 내용이 셀의 열과 행을 가져 오는 방법을 보여주기 때문에 DBGrid를 사용하는 방법을 더 잘 이해할 수 있다고 생각합니다. 좌표. TDBGrid의 유용한 속성에 대한 자세한 내용은 온라인 도움말에서 DBGrid의 SelectedField, SelectedIndexSelectedRows 속성을 참조하십시오.

업데이트 다른 양식에 정보를 표시하는 예에 대한 의견을 물었습니다. 이 형식이 OtherForm이고 단위가 OtherFormu.Pas이고 evenbt가 호출되기 전에 DBGrid1DblClick이 만들어지면이 양식을 가정 해 봅시다. DBGrid가 포함 된 장치의 사용 목록에서이 장치를 사용해야합니다. 이 다른 폼에 Memo1이라는 TMemo 컨트롤이 있다고 가정 해 봅시다. 그런 다음,이처럼 DBGrid1DblClick hanndler를 작성할 수

procedure TForm1.DBGrid1DblClick(Sender: TObject); 
[as above] 
begin 
    [ as above ] 
    CellValue := DBGrid1.Columns[ACol].Field.AsString; 

    OtherForm.Memo1.Lines.Add(Format('Col:%d Row:%d Cell Value:%s', [ACol, ARow, CellValue])); 
end; 
+1

그 셀 찾기 코드가 모두 필요하지는 않습니다. 그리드의 SelectedField를 사용할 수 있습니다. –

+0

@SertacAkyuz : 그럼? 관심 셀이 현재 선택되지 않은 경우이를 수행하는 방법을 알고, 알아보고, 힌트를 얻는 데 유용한 처음부터 다시 수행하는 방법을 보여줍니다. – MartynA

+1

* "그래서?"* - 코드가 꼭 필요한 것은 아니기 때문에. 나에게 논평하는 정당한 이유 인 것처럼 보입니다. –