어떻게 cxgrids 레코드를 반복합니까? 즉, 델파이 프로그램이 위에서/아래로 cxgrid의 각 레코드를 검사/통과하도록합니다.cxgrid에서 레코드를 반복하는 방법 - Delphi xe2
나는 이것이 어쨌든 도움이된다면 데이터베이스 테이블과 이야기하고있는 tadquery로부터 레코드를 표시하는 cxgrid를 가지고있다.
어떻게 cxgrids 레코드를 반복합니까? 즉, 델파이 프로그램이 위에서/아래로 cxgrid의 각 레코드를 검사/통과하도록합니다.cxgrid에서 레코드를 반복하는 방법 - Delphi xe2
나는 이것이 어쨌든 도움이된다면 데이터베이스 테이블과 이야기하고있는 tadquery로부터 레코드를 표시하는 cxgrid를 가지고있다.
TcxGrid의 TcxGridDBTableView에서이를 수행하고 아래의 DataSet을 반복하는 샘플 코드. 이 두 샘플은 DataSet의 필터링 여부와 관계없이 작동합니다.
TcxGrid의 샘플에서는 팔레트에서 그리드를 가져 와서 TcxDBTableView를 추가하고, 데이터 세트의 열을 추가 한 다음 Object Inspector에서 모든 그리드 속성을 기본값으로 남겨 둡니다 (KeyFieldNames는 제외). 내 경우 "FilesID"DataSet의 기본 키 설정이 필요한 TableView.
ID := cxGrid1DBTableView1.DataController.GetRecordId(TopRowIndex + Row);
의 ID 값은 다음 호출에 의해 사용됩니다 그래서 같은 행에 대해, 당신은 키 값을 얻을 ID를 - 이것은있는 TableView에서 주어진 행에 대한 데이터 세트의 레코드를 식별 할 수 있도록이다 CDS1.Locate()를 사용하여 레코드를 검색하십시오.
TBookmark는 작업 전에 현재 CDS 레코드를 기록한 후 나중에 다시 읽는 데 사용됩니다. DisableControls 및 EnableControls에 대한 호출은 작업이 진행되는 동안 cxGrid (및 CDS에 연결된 다른 DB 인식 컨트롤)가 변경되는 것을 방지하기위한 것입니다.
procedure TForm1.IterateVisibleGridRows;
var
BM : TBookmark;
TopRowIndex : Integer;
VisibleCount : Integer;
Row : Integer;
ID : Integer;
Controller : TcxGridTableController;
ViewInfo : TcxGridTableViewInfo;
begin
BM := CDS1.GetBookmark;
try
Controller := cxGrid1DBTableView1.Controller;
ViewInfo := TcxGridTableViewInfo(Controller.ViewInfo);
TopRowIndex := Controller.TopRowIndex;
VisibleCount := ViewInfo.RecordsViewInfo.VisibleCount;
CDS1.DisableControls;
Row := 0;
while Row < VisibleCount do begin
ID := cxGrid1DBTableView1.DataController.GetRecordId(TopRowIndex + Row);
if CDS1.Locate('FilesID', ID, []) then begin
// Do what you want here
end;
Inc(Row);
end;
finally
CDS1.GotoBookmark(BM);
CDS1.FreeBookmark(BM);
CDS1.EnableControls;
end;
end;
는, BTW 난 당신이 무엇을 요구이 하지 알지만, 당신은 TcxGrid를 사용하여하지 않고 데이터 집합을 반복 할 경우, 실제로는 훨씬 더 간단 :
procedure IterateDataSetRows(DataSet : TDataSet);
var
BM : TBookmark;
begin
BM := CDS1.GetBookmark;
try
// delete the following 2 lines and the one in the finally block if you don't want a "Wait" cursor
Screen.Cursor := crSqlWait;
Screen.ActiveForm.Update;
DataSet.DisableControls;
DataSet.First;
while not DataSet.Eof do begin
// Do what you want here
DataSet.Next;
end;
finally
DataSet.GotoBookmark(BM);
DataSet.FreeBookmark(BM);
DataSet.EnableControls;
Screen.Cursor := crDefault;
end;
end;
당신은 didn를 '
이 엑사을 :
모든 방법을 heres 모두 수행하는 예입니다 : 그것은 당신의 그리드의 모든 기록하거나 눈에 보이는 것들 어디 t 말 mple은 cxGrid, cxButton 및 cxMemo가있는 양식을 사용합니다. 플러스 dxMemdataset 여기
는 DFM 코드 :
object Form20: TForm20
Left = 0
Top = 0
Caption = 'Form20'
ClientHeight = 299
ClientWidth = 462
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'Tahoma'
Font.Style = []
OldCreateOrder = False
OnCreate = FormCreate
DesignSize = (
462
299)
PixelsPerInch = 96
TextHeight = 13
object cxGrid1: TcxGrid
Left = 0
Top = 0
Width = 299
Height = 299
Align = alLeft
TabOrder = 0
ExplicitHeight = 635
object cxGrid1DBTableView1: TcxGridDBTableView
Navigator.Buttons.CustomButtons = <>
DataController.DataSource = DataSource1
DataController.Summary.DefaultGroupSummaryItems = <>
DataController.Summary.FooterSummaryItems = <>
DataController.Summary.SummaryGroups = <>
object cxGrid1DBTableView1RecId: TcxGridDBColumn
DataBinding.FieldName = 'RecId'
Visible = False
end
object cxGrid1DBTableView1Field1: TcxGridDBColumn
DataBinding.FieldName = 'Field1'
end
object cxGrid1DBTableView1Field2: TcxGridDBColumn
DataBinding.FieldName = 'Field2'
end
end
object cxGrid1Level1: TcxGridLevel
GridView = cxGrid1DBTableView1
end
end
object cxButton1: TcxButton
Left = 305
Top = 8
Width = 154
Height = 25
Caption = 'Do the trick'
TabOrder = 1
OnClick = cxButton1Click
end
object cxMemo1: TcxMemo
Left = 305
Top = 39
Anchors = [akLeft, akTop, akRight, akBottom]
Lines.Strings = (
'cxMemo1')
TabOrder = 2
Height = 260
Width = 154
end
object dxMemData1: TdxMemData
Indexes = <>
SortOptions = []
Left = 160
Top = 144
object dxMemData1Field1: TIntegerField
FieldName = 'Field1'
end
object dxMemData1Field2: TIntegerField
FieldName = 'Field2'
end
end
object DataSource1: TDataSource
DataSet = dxMemData1
Left = 168
Top = 152
end
end
첫 번째 양식에서
우선 내가 어떤 임의의 데이터 생성 생성 :
procedure TForm20.FormCreate(Sender: TObject);
var
i: Integer;
begin
randomize;
dxMemData1.DisableControls;
try
dxMemData1.Open;
for i := 0 to 999 do
dxMemData1.AppendRecord([i, Random(500), Random(500)]);
finally
dxMemData1.EnableControls;
end;
end;
내 그리드가 표시됩니다 데이터 세트의 데이터에 바인딩되어 있기 때문에이 화면에. 그런 다음
type
TForm20 = class(TForm)
dxMemData1: TdxMemData;
dxMemData1Field1: TIntegerField;
dxMemData1Field2: TIntegerField;
cxGrid1DBTableView1: TcxGridDBTableView;
cxGrid1Level1: TcxGridLevel;
cxGrid1: TcxGrid;
DataSource1: TDataSource;
cxGrid1DBTableView1RecId: TcxGridDBColumn;
cxGrid1DBTableView1Field1: TcxGridDBColumn;
cxGrid1DBTableView1Field2: TcxGridDBColumn;
cxButton1: TcxButton;
cxMemo1: TcxMemo;
procedure FormCreate(Sender: TObject);
procedure cxButton1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
그냥 버튼을 눌러해야합니다 : 여기
내 양식 정의 당신이 필터링 기록를 볼 그래서이procedure TForm20.cxButton1Click(Sender: TObject);
var
RecNo, i: Integer;
cxCustomGridRecordViewInfo: TcxCustomGridRecordViewInfo;
s: string;
begin
s := Format(
'You have' + sLineBreak +
' %d records in your Dataset' + sLineBreak +
' %d records in your grid' + sLineBreak +
' %d VISIBLE records in your grid'
, [
cxGrid1DBTableView1.DataController.RecordCount,
cxGrid1DBTableView1.DataController.FilteredRecordCount,
cxGrid1DBTableView1.ViewInfo.VisibleRecordCount
]
);
MessageDlg(s, mtInformation, [mbOK], 0);
cxMemo1.Lines.BeginUpdate;
cxMemo1.Lines.Clear;
cxMemo1.Lines.Add(' *** Filtered Records ***');
for i := 0 to cxGrid1DBTableView1.DataController.FilteredRecordCount - 1 do
begin
RecNo := cxGrid1DBTableView1.DataController.FilteredRecordIndex[i];
cxMemo1.Lines.Add(cxGrid1DBTableView1.DataController.Values[RecNo, 1]);
end;
cxMemo1.Lines.Add(' *** Visible Records ***');
for i := 0 to cxGrid1DBTableView1.ViewInfo.VisibleRecordCount - 1 do
begin
cxCustomGridRecordViewInfo := cxGrid1DBTableView1.ViewInfo.RecordsViewInfo[i];
cxMemo1.Lines.Add(cxCustomGridRecordViewInfo.GridRecord.Values[1]);
end;
cxMemo1.Lines.EndUpdate;
end;
입니다 당신이 후 그리드에있는 하나 필터가 적용된 후에도 가능합니다. 가시적 인 레코드은 실제로 화면에 보이는 onec입니다.
데이터 세트 레코드를 반복합니다 (앞서 언급 한 'TADQuery').완료되면'DisableControls'와'EnableControls'을 잊지 마세요. – TLama
@TLama가 말한 내용. GUI에서 데이터를 표시하는 데 사용되는 컨트롤이 아닌 GUI이면의 데이터 세트 측면에서 이러한 종류의 작업에 대해 생각하는 습관을 갖는 것이 가장 좋습니다. – MartynA
Btw, "각 레코드"라고 말하면 데이터 집합의 모든 레코드를 의미합니까, 아니면 현재 TcxGrid에 표시된 레코드를 의미합니까? 큰 차이 ... – MartynA