2015-10-15 5 views
3

В моем приложении Delphi я использую поля поиска, но необычным образом. На самом деле, я хочу обновить поле в базовом наборе данных, точно так же, как если бы оно было в одной таблице.Получить текущее значение ячейки в DBGrid

Существующие руководства говорят, что нет проблем, просто присоединитесь к столу и вуаля ... Я завидую, если они действительно преуспели в этой задаче с таким простым решением. Я не. Кстати, я думаю, что приближаюсь к своей цели. У меня остался один вопрос: как, черт возьми, я могу получить значение? только зашел в DBGrid Cell?

Я пробовал DBGrid[FieldName].EditValue и .DisplayText, но они показывают то же значение, что и Field.Value, которое не изменяется после выхода из столбца, потому что это поле поиска. Sender.NewValue есть null. Я использую эту функцию для обновления таблицы поиска:

procedure TKDGridForm.LookupFieldChange(Sender: TField); 
begin 
    if not Assigned(Sender) then 
    Exit; 
    Sender.OnChange := nil; 
    if not Assigned(Sender.LookupDataSet) then 
    Exit; 
    if Sender.LookupDataSet.Locate(Sender.LookupKeyFields, Sender.DataSet[Sender.KeyFields], []) then 
    Sender.LookupDataSet.Edit 
    else 
    Sender.LookupDataSet.Append; 
    // how do I get the value I just entered? 
    Sender.Value := KDGrid3[Sender.FieldName].DisplayText; 
    Sender.LookupDataSet.FieldValues[Sender.LookupResultField] := Sender.Value; 
    Sender.LookupDataSet.Post; 
    Sender.OnChange := LookupFieldChange; 
end; 

Вот SQL я использовал, прежде чем я закончил с Lookup полями:

select det.*, 
     od1.T_EQ T_SHABLON_EQ, 
     od1.T_NV T_SHABLON_NV, 
     od1.T_PRIM T_SHABLON_PRIM, 
     od2.T_EQ T_PRAVKA_EQ, 
     od2.T_NV T_PRAVKA_NV, 
     od2.T_PRIM T_PRAVKA_PRIM, 
     od3.T_EQ T_VALCOV_EQ, 
     od3.T_NV T_VALCOV_NV, 
     od3.T_PRIM T_VALCOV_PRIM, 
     od4.T_EQ T_REZKA2_EQ, 
     od4.T_NV T_REZKA2_NV, 
     od4.T_PRIM T_REZKA2_PRIM 
from CMKNEW.details det 
left join CMKNEW.OperDetails od1 
     ON det.nrec = od1.cdetail 
     and 81 = od1.coper 
left join CMKNEW.OperDetails od2 
     ON det.nrec = od2.cdetail 
     and 82 = od2.coper 
left join CMKNEW.OperDetails od3 
     ON det.nrec = od3.cdetail 
     and 83 = od3.coper 
left join CMKNEW.OperDetails od4 
     ON det.nrec = od4.cdetail 
     and 84 = od4.coper 
where det.ckd=:CKD order by det.NREC 

Надеется, что это будет объяснить мою задачу яснее. Если вы хотите mcve, я могу расширить это, хотя я думаю, что это не существенно.

Моя база данных Oracle, связанная через ADO. Я бы хотел, чтобы решение было максимально простым.

ответ

1

Я предполагаю, что вы говорите о стандартном TDBGrid, и то, что вы спрашиваете, - как получить текст, который отображается в ячейке сетки при вводе в нее, но до обновления набора данных сетки. В этот момент индикатор текущей строки в столбце LH будет изменен от треугольника с правым направлением по умолчанию до I-луча

Если это так, то нижеприведенный фрагмент показывает, как получить это текстовое значение. Дело в том, что в описанном мной состоянии то, что в ячейке еще не было отправлено обратно в поле базового набора данных. Случается, что когда вы начинаете редактирование, InplaceEditor (потомком TCustomMaskEdit) динамически создается, и именно это содержит текстовое значение, которое редактируется.

Добавьте TTimer и TMemo в свою форму, а затем запустите код ниже, чтобы посмотреть, что я имею в виду.

type 
    TMyGrid = Class(TDBGrid); 

procedure TMyForm.Timer1Timer(Sender: TObject); 
var 
    S : String; 
    Grid : TmyGrid; 
begin 
    Grid := TmyGrid(DBGrid1); 
    if Grid.InplaceEditor <> Nil then 
    S := Grid.InplaceEditor.Text 
    else 
    S := IntToStr(Grid.Col) + ':' + IntToStr(Grid.Row); 
    Grid.Invalidate; 
    Memo1.Lines.Insert(0, S); 
end; 
+0

На самом деле это работает. И на самом деле это не помогает мне с проблемой X, потому что событие OnFieldChange вызывается непредсказуемым образом :(Я принимаю, потому что это ответ, о котором я просил. – Danatela

+0

Спасибо. Почему бы не попробовать и объяснить проблему, которую вы все еще имеете в new q? – MartynA

+0

Было очень любезно, щедро и задумано, чтобы вы назначили этот ответ за щедрость. Я это ценю. – MartynA

Смежные вопросы