2016-10-05 11 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 = имя формы, содержащей TDBMemo DBMemoCelula = имя из TDBMemo dbmodule.comenziDataSet = comenziDataSet это имя DataSet и dbmodule это имя data module (единицы, подобные формы) - в DataSet находится на data module, поэтому, dbmodule.comenziDataSet dbmodule. comenziSource = Такой же, как набор данных, DataSource в модуле данных, источник имени comenziSource

Итак, что делает этот код:

Как только я щелкните ячейку на моем DBGrid она всплывает form (названный dbgridCelulaForm) который содержит TBMemo (названный DBMemoCelula), и он показывает мне информацию, содержащуюся в этой ячейке (например, имя клиента или, что то, что держит ячейка в моем db)

Это хорошо, моя проблема в том, что я не могу выбрать строки сейчас в DBGrid, ну, я могу, но как только я сделаю первое место, я нажимаю (ячейку, любое) на определенную строку, которую я хочу выбрать с помощью мыши, затем активируется ячейка, и появляется сообщение form.

Можно ли использовать этот код в DBGrid - OnDblClick событие вместо OnCellClick? Значение, когда я дважды щелкаю строку/ячейку, должен появиться form и показать мне информацию, но дважды щелкните - не один клик.

Таким образом, я все еще могу выбрать строку и по-прежнему просматривать информацию в ячейке, если мне нужно.

Или любым другим способом/местом использования/получения этой функции. Любые мысли?

Я могу опубликовать видеоролик обо всем, если мое объяснение неоднозначно, и вы думаете, что это поможет, просто скажите мне в комментарии/ответе.

Кроме того, я использую компоненты RAD Studio 10 Seattle и dbexpress для базы данных - если это помогает.

Спасибо!

+0

Нет неоднозначности вообще ... Я так реализован схожую функциональность через кнопку редактирования столбцов сетки - стреляет OnEditButtonClick событие на сетке. Установите стиль кнопки cbsEllipsis, чтобы было очевидно, что при нажатии на него появляется диалоговое окно. Может также запускаться с помощью Alt + Down. –

+0

Здравствуйте, спасибо за ваш ответ. Я уже использую OnEditButtonClick для чего-то другого, поэтому не могу этого использовать. Ответ Мартина помогает, так же, как и ваш комментарий SelectedField, спасибо! – Petzy

ответ

1

В следующем коде показано, как получить доступ к координатам столбца и строки ячейки dbl-clicked TDBGrid и строкового значения содержимого ячейки.

Как указано, он отображает содержимое столбца и строки строки + строки ячейки в заголовке формы. До вас, что вы на самом деле делаете с этими значениями.

Он работает, потому что курсор набора данных на наборе данных, подключенном к DBGrid, перемещается в строку набора данных, соответствующую ячейке, в которой находится указатель мыши.

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; 

Обратите внимание, что я использовал свойство Caption формы для отображения информации ячейки сетки так же, как быстро малоэффективный способ показать информацию где-то. Конечно, вы могли бы одинаково хорошо отображать его на другой области формы или где-то в другой форме. Вышеприведенный код будет работать одинаково хорошо в событии OnCellClick сетки, кстати.

Как отмечено в комментарии, вы можете использовать свойство сетки SelectedField вместо указанного выше, но лично я считаю, что вышеизложенное более поучительно относится к работе с DBGrid, поскольку оно показывает, как получить столбцы и строки ячейки координаты. Дополнительные сведения о полезных свойствах TDBGrid см. В файлах DBGrid SelectedField, SelectedIndex и SelectedRows в интерактивной справке.

Обновление Вы запросили в комментарии пример показа информации о другой форме. Предположим, что эта форма называется OtherForm, находится в блоке OtherFormu.Pas и создается до вызова DBGrid1DblClick. Вы должны использовать это устройство в списке использования устройства, которое содержит DBGrid. Предположим, что эта другая форма содержит элемент управления TMemo под названием Memo1. Тогда вы могли бы написать 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: Итак? Он иллюстрирует, как это сделать с нуля, что полезно знать, imo и подсказывает, как это сделать, когда выбранная ячейка не выбрана. – MartynA

+1

* «Итак?» * - Потому что код не нужен. Кажется, это является веской причиной для комментариев ко мне. –