Предотвратить выбор всех поведения TInplaceEditer в TStringgrid
При выборе ячейки в TStringGrid выбирается все содержимое ячейки с курсором, расположенным в конце выделения. Это проблема.
Моя сетка заполняется через Live Binding к TADOConnnection к базе данных FoxPro, у меня есть TADODataSet с FieldDefs, которые включают в себя Размер и Тип данных полей, например:
object DSProtocol: TADODataSet
Connection = CONProtocol
CursorType = ctStatic
LockType = ltBatchOptimistic
CommandText = 'select jobc from protocol'
FieldDefs = <
item
Name = 'jobc'
Attributes = [faFixed]
DataType = ftFixedChar
Size = 200
end>
end
Я не могу изменить базовую схему базы данных. В большинстве случаев поля имеют слишком большой размер для хранимой информации, наибольшее значение длины, хранящееся в jobc, имеет длину 8 символов и, вероятно, никогда не будет больше 10.
Тогда для пользовательского интерфейса у меня нет причин изменять размер столбца, содержащего jobc, для отображения 200 символов, мне просто нужно, чтобы он был достаточно большим, чтобы отображать 10. Однако ячейка TStringGrid заполнена содержимым этого поля плюс достаточно пробелов для его заполнения. до 200. (Почему? Я не знаю.) При выборе выделяется все содержимое, курсор помещается в конец выделения, и в результате получается, что содержимое исчезло.
Похоже, я не могу использовать любое из событий TSTringGrid, чтобы переопределить это поведение.
Я попытался быстро и грязно исправить (устарело):
keybd_event(VK_HOME, 0, 0, 0);
keybd_event(VK_HOME, 0, KEYEVENTF_KEYUP, 0);
к событию OnGetEditMask, но это событие вызывается несколько раз при начале редактирования и при завершении редактирования. К счастью, это не сработало, так как я хотел бы оставить это в...
Я попытался отследить родительские классы, чтобы точно определить, где вызывается select all, но потерял трассировку через код asm в системном блоке. Я читал, что вы можете добавить директиву D-компилятора к модулю, чтобы отладчик пропускал эти блоки, но я действительно сомневаюсь в том, чтобы модифицировать любой из блоков VCL по очевидным причинам.
Ищите какое-либо решение на данный момент (измените SQL-запрос "свойство живой привязки" - свойство поля "), но в идеале хотелось бы точно знать, где это происходит, чтобы я мог одновременно сохранить начальное значение ячейки. (Я хочу добавить нормальное поведение электронной таблицы типа escape-в то время как редактирование восстанавливает начальное значение).
Похоже, цепочка классов мне нужно следовать TInplaceEdit
-> TCustomMaskEdit
-> TCustomEdit
-> TWinControl
Я предполагаю, что это где-то там.