Update: Я нашел, что это сложнее, чем я ожидал, чтобы изменить свой первоначальный ответ надежно удовлетворить ваши требования, чтобы иметь выберите количество отображается когда форма первых концертов.
Ниже приведены основы тестового проекта, который, я надеюсь, надежно ведет , как вы просили. В дополнение к DBGrid форма имеет TEdit, который я использую , чтобы гарантировать, что dbgrid изначально не сфокусирован (чтобы было легче наблюдать поведение dbgrid) и 3 TButtons, функции должны быть очевидны из их обработчики OnClick.
Вы заметите, что код, который ловит меняющийся счетчик подсчета выбора в DBGrid является срабатывают только в OnDrawColumnCell события DBGrid в. Тем не менее, это называется слишком часто (в моем случае более 700 раз перед тем, как форма сначала отображается), чтобы делать что-то еще в gui при каждом его запуске. Таким образом, вместо этого форма имеет переменную , которая отслеживает счетчик выборки и обновляет ее только при изменении счета (в Set SetelectedCount setter).
type
TForm1 = class(TForm)
[...]
private
FSelectedCount: Integer;
procedure SetSelectedCount(const Value: Integer);
public
procedure ShowSelectedCount;
property SelectedCount : Integer read FSelectedCount write SetSelectedCount;
end;
[...]
procedure TForm1.btnClearSelectedClick(Sender: TObject);
begin
DBGrid1.SelectedRows.Clear;
end;
procedure TForm1.btnGetSelectedClick(Sender: TObject);
begin
ShowSelectedCount;
end;
procedure TForm1.btnSetSelectedClick(Sender: TObject);
begin
DBGrid1.SelectedRows.CurrentRowSelected := True;
end;
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
SelectedCount := DBGrid1.SelectedRows.Count;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
ActiveControl := Edit1; // so the grid does not have focus when the form is first shown
SelectedCount := -1;
end;
procedure TForm1.SetSelectedCount(const Value: Integer);
begin
if FSelectedCount <> Value then begin
FSelectedCount := Value;
ShowSelectedCount;
end;
end;
procedure TForm1.ShowSelectedCount;
begin
Caption := IntToStr(DBGrid1.SelectedRows.Count);
end;
Оригинальный ответ следует
Я обычно использую DataSet.AfterScroll
для этого не-GUI вещи, которые должны быть синхронизированы с его текущей строки. К сожалению, это не так хорошо работает с DBGrid, как вы, очевидно, нашли, не в последнюю очередь потому, что состояние выбора текущей строки в сетке можно изменить (например, нажав на нее) без прокрутки набора данных.
К сожалению,
procedure TForm1.DBGrid1CellClick(Column: TColumn);
begin
Caption := IntToStr(DBGrid1.SelectedRows.Count);
end;
не совсем делать работу, либо, по довольно очевидной причине, что вы можете расширить выбор из текущей строки без использования мыши - например, Shift + Вниз сделают это тоже.
Однако, если вы просто добавить
procedure TForm1.DBGrid1KeyUp(Sender: TObject; var Key: Word; Shift:
TShiftState);
begin
Caption := IntToStr(DBGrid1.SelectedRows.Count);
end;
, который принимает использование клавиатуры, чтобы изменить выбор (ы) во внимание и до сих пор сопротивлялся моим попыткам неправильности ноги его. Если вы разрешаете пользователю делать редактирование на месте в сетке, вам может потребоваться отфильтровать значения Key
, которые используются для обновления отображения количества выбранных.
Btw, принимая клавиатуру морщин, а также проблему с AfterScroll во внимание, ваш q, похоже, не заслуживает (для меня, во всяком случае) нисходящего потока, он получил, поэтому я дал ему +1.
Пробовал ли вы событие 'OnClick()'? Обычно это нормальное событие для большинства элементов управления. В некоторых элементах управления это также срабатывает в случаях, которые на самом деле не являются кликом, например, с помощью прокрутки со списком клавиш вверх/вниз. Кроме того, я думаю, вы должны изменить название своего вопроса на «Data Grid» или «TDBGrid», потому что я получил большую часть вашего вопроса, думая, что это «TStringGrid», о котором вы говорили, а затем пришлось повторно -прочитайте его как 'TDBGrid'. –
Кроме того, вам может быть полезно использовать флажки. Я не могу вспомнить последнее приложение, которое я использовал, когда мне нужно было держать управление или переключиться на мультивыбор. Помимо древнего кода я получил один раз, который я действительно переписал, чтобы использовать флажки. –
@Jerry: Um ... Проводник Windows? Перспективы? Excel? Вы не можете вспомнить, используя какие-либо из них (все из которых являются приложениями, для которых требуется сочетание клавиш Ctrl или Shift). Есть миллионы корпоративных пользователей Windows 7, которые не согласятся с тем, что вы написали. –