아래 코드는 몇 가지 문제를 해결합니다.
주요 문제는 사용자가 s
을 올바르게 초기화하지 않았고 선택한 행의 필드를 가져 오는 방법에 결함이 있다는 사실이었습니다.
DataSet.Disable/EnableControls
및 ListBox1.Items.BeginUpdate/EndUpdate
을 호출하면 처리 속도가 빨라집니다.
또한 전염병과 같은 with
구조를 피하십시오. 보시다시피, 로컬 DataSet
변수를 사용하면 여분의 타이핑이 최소화되고 with
을 사용할 때 발생할 수있는 모든 종류의 우발적 인 문제를 피할 수 있습니다.
procedure TForm1.GetSelected;
var
i,
J : Integer;
s : String;
DataSet : TDataSet;
begin
if DBGrid1.SelectedRows.Count>0 then begin
DataSet := DBGrid1.DataSource.DataSet;
// with DBGrid1.DataSource.DataSet do
try
ListBox1.Items.BeginUpdate;
DataSet.DisableControls;
for i:=0 to DBGrid1.SelectedRows.Count-1 do
begin
DataSet.GotoBookmark(Pointer(DBGrid1.SelectedRows.Items[i]));
s := '';
for j := 0 to DataSet.FieldCount - 1 do
begin
if (j>0) then s:=s+', ';
s := s + DataSet.Fields[j].AsString;
//s := s + FindField(Fields.Fields[j].FieldName).AsString;
end;
Listbox1.Items.Add(s);
//s:= '';
end;
finally
DataSet.EnableControls;
ListBox1.Items.EndUpdate;
end;
end;
end;
** 업데이트 : **
그리드의 선택된 행이 저장되는 2
이
DBGrid1.SelectedRows.CurrentRowSelected := True;
업데이트 # 같은 선택으로 당신은 현재의 그리드 행을 설정할 수 있습니다
TBookmarkList
SelectedRow
에 있습니다. 현재 선택을 지우려면, 당신이 할 필요가있는과 같이, 그 Clear
메소드를 호출하는 것입니다
procedure TForm1.btnClearSelectedClick(Sender: TObject);
begin
DBGrid1.SelectedRows.Clear;
end;
마찬가지로, 당신은 당신의 목록 상자를 취소하려는 경우, 당신은 그냥 같이 그 Clear
메소드를 호출
을 당신이 사용하려면 코드를 얻는 데 문제가있는 경우 procedure TForm1.btnClearListBoxClick(Sender: TObject);
begin
ListBox1.Clear;
end;
,이 시도 :
Object Inspector에서
는, T에 DBGrid를 Options 속성 dgMultiSelect
을 설정 후회.
버튼을 폼에 넣고 OnClick
처리기 호출 GetSelected
에 넣습니다.
컴파일하고 실행하십시오. 그리드의 행을 클릭 한 다음 버튼을 클릭하십시오. 아무 반응이 없습니다. 그 이유는 버튼을 클릭하면 포커스가 DBGrid에서 멀리 이동하므로 걱정거리만큼 행이 선택되지 않기 때문입니다. 그런 다음 3 단계를 시도하십시오.
- 앱을 다시 실행하십시오. 이번에는 Ctrl 키를 누른 상태에서 그리드를 누른 다음 버튼을 누릅니다. 이번에는 선택된 행이 ListBox에 나타납니다. Ctrl 버튼이 계속 눌려진 상태에서 그리드의 다른 행을 클릭 한 다음 버튼을 클릭합니다. 이번에는 두 행이 모두 ListBox에 추가됩니다.
무엇이 질문입니까? 각각의 선택된 행에 대해 변수's'를 명시 적으로 초기화하지 않는다는 점에서 명백한 문제가 있습니다 :'GotoBookmark ...'줄 다음에's : = '';'를 추가하십시오. – MartynA