Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 TcxDBTreeList.DataController.IsEditing возвращает False во время редактирования  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 12559
Хочу, чтобы по нажатию на Enter заканчивалось редактирование дерева и данные сохранялись в базу.

Код на событии OnKeyDown
  if TcxDBTreeList(sender).DataController.IsEditing and (key = VK_RETURN) then
    TcxDBTreeList(sender).DataController.Post;

Но IsEditing почему-то False, хотя дерево явно в режиме редактирования. Это видно также и по курсору в индикаторе

Картинка с другого сайта.

Левая рука не ведает, что делает правая?
1 дек 18, 19:31    [21751096]     Ответить | Цитировать Сообщить модератору
 Re: TcxDBTreeList.DataController.IsEditing возвращает False во время редактирования  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 12559
Хочу добавить, то DataSet.State возвращает dsEdit, т.е. ещё одно подтверждение.
1 дек 18, 19:34    [21751099]     Ответить | Цитировать Сообщить модератору
 Re: TcxDBTreeList.DataController.IsEditing возвращает False во время редактирования  [new]
Фэйтл Эра
Member

Откуда:
Сообщений: 226
X11
Хочу, чтобы по нажатию на Enter заканчивалось редактирование дерева и данные сохранялись в базу...
 ...TcxDBTreeList...
...

Просто для соответсвующих колонок твоего TcxDBTreeList установи флажок Properties.ImmediatePost, и все.
1 дек 18, 20:12    [21751111]     Ответить | Цитировать Сообщить модератору
 Re: TcxDBTreeList.DataController.IsEditing возвращает False во время редактирования  [new]
JaDi
Member

Откуда: Сызрань, Россия
Сообщений: 3935
Универсальное лечение девок для любителей извратиться -- PostMessage.
1 дек 18, 20:14    [21751113]     Ответить | Цитировать Сообщить модератору
 Re: TcxDBTreeList.DataController.IsEditing возвращает False во время редактирования  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 12559
JaDi, ???
1 дек 18, 20:20    [21751115]     Ответить | Цитировать Сообщить модератору
 Re: TcxDBTreeList.DataController.IsEditing возвращает False во время редактирования  [new]
JaDi
Member

Откуда: Сызрань, Россия
Сообщений: 3935
X11,

Когда нужно сделать какие-то вещи в реалтайме, то надо дождаться пока компоненты девок закончат все обработки внутри. Т.е. мы ловим событие OnKeyDown и делаем свои вещи, например, пост в контроле/дереве -- после чего отслыаем сообщение на форму через PostMessage (гугл ит), ловим его на форме и уже смотрим результат. Это гарантирует нам, что девки закончили свои данные сохранять и сделали всё, что положено.

В противном случае могут быть вот такие вещи типа устаревших данных в EditValue или еще что.

Конечно, этим надо пользоваться в крайнем случае, когда не хватает стандартной функциональности вроде ImmidiatePost, как написали выше.
1 дек 18, 21:01    [21751124]     Ответить | Цитировать Сообщить модератору
 Re: TcxDBTreeList.DataController.IsEditing возвращает False во время редактирования  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 12559
Фэйтл Эра, у TextEdit нет свойства ImmediatePost, даже если и было бы, а что ImmediatePost - это реакция на Enter?
1 дек 18, 21:07    [21751129]     Ответить | Цитировать Сообщить модератору
 Re: TcxDBTreeList.DataController.IsEditing возвращает False во время редактирования  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 12559
Переделал так
  if (TcxDBTreeList(sender).DataController.DataSource.DataSet.State in [dsEdit, dsInsert]) and (key = VK_RETURN) then
    TcxDBTreeList(sender).DataController.Post;
1 дек 18, 21:13    [21751133]     Ответить | Цитировать Сообщить модератору
 Re: TcxDBTreeList.DataController.IsEditing возвращает False во время редактирования  [new]
JaDi
Member

Откуда: Сызрань, Россия
Сообщений: 3935
X11,

при нажатии на энтер он должен закончить редактирование в ячейки, после чего в ней сработает событие EditValueChanged.
1 дек 18, 21:14    [21751134]     Ответить | Цитировать Сообщить модератору
 Re: TcxDBTreeList.DataController.IsEditing возвращает False во время редактирования  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 12559
JaDi, кто "он"
1 дек 18, 21:18    [21751136]     Ответить | Цитировать Сообщить модератору
 Re: TcxDBTreeList.DataController.IsEditing возвращает False во время редактирования  [new]
JaDi
Member

Откуда: Сызрань, Россия
Сообщений: 3935
X11,

контрол/редактор/трилист... в данном случае это текстовое поле, которое по энтеру делает Post (это про контрол, не датасет) нового значения и сохраняет его в дереве в конкретной ячейке (в датаконтроллере).
1 дек 18, 21:54    [21751149]     Ответить | Цитировать Сообщить модератору
 Re: TcxDBTreeList.DataController.IsEditing возвращает False во время редактирования  [new]
Фэйтл Эра
Member

Откуда:
Сообщений: 226
X11
Фэйтл Эра, у TextEdit нет свойства ImmediatePost...

Может быть, оно не опубликовано, но оно как минимум паблик. То есть, доступно из кода.
1 дек 18, 22:27    [21751160]     Ответить | Цитировать Сообщить модератору
 Re: TcxDBTreeList.DataController.IsEditing возвращает False во время редактирования  [new]
Фэйтл Эра
Member

Откуда:
Сообщений: 226
X11
... а что ImmediatePost - это реакция на Enter?
Это реакция на завершение редактирования отдельного поля. Для текстовых полей это обычно Enter, для чекбоксов - просто клик.
1 дек 18, 22:29    [21751161]     Ответить | Цитировать Сообщить модератору
 Re: TcxDBTreeList.DataController.IsEditing возвращает False во время редактирования  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 12559
JaDi
в данном случае это текстовое поле, которое по энтеру делает Post


В том-то и дело, что не делает. Ничего не происходит вообще. Я же не ради забавы допиливаю сам.
1 дек 18, 23:33    [21751176]     Ответить | Цитировать Сообщить модератору
 Re: TcxDBTreeList.DataController.IsEditing возвращает False во время редактирования  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 12559
Фэйтл Эра, нет такой реакции, т.е. завершение редактирования не происходит автоматически.
1 дек 18, 23:34    [21751178]     Ответить | Цитировать Сообщить модератору
 Re: TcxDBTreeList.DataController.IsEditing возвращает False во время редактирования  [new]
JaDi
Member

Откуда: Сызрань, Россия
Сообщений: 3935
X11,

в датасет и не будет завершения -- надо на oneditvaluechanged вызвать (или еще как), например, focusednode.endedit -- тогда все данные попадут в датаконтроллер-датасет (произойдет то самое окончание рдактирования текущей записи).
1 дек 18, 23:40    [21751181]     Ответить | Цитировать Сообщить модератору
 Re: TcxDBTreeList.DataController.IsEditing возвращает False во время редактирования  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 12559
Я не про датасет. Вы же пишите про дерево, как я понял. Что дерево по Интеру должно само завершать редактирование.
1 дек 18, 23:47    [21751185]     Ответить | Цитировать Сообщить модератору
 Re: TcxDBTreeList.DataController.IsEditing возвращает False во время редактирования  [new]
JaDi
Member

Откуда: Сызрань, Россия
Сообщений: 3935
X11,

надо понимать структуру в момент редактирования:
- девовский контрол, где работает пользователь (создается каждый раз заново при начале редактирования прямо, прямо поверх грида/трилиста);
- трилист, который просто отображает данные и ничего не хранит;
- датаконтроллер, который хранит и синхронизирует данные (это как хранилище временных данных, так и просто посредник между датасетом и редактором/деревом);
- датасет, к которому подключен датаконтроллер.

Так вот, в процессе редактирования все изменения происходят в виртуальном контроле. И данные из него попадут дальше по цепочке только после того, как пользователь в нем завершит редактирование (для текстового поля это тот же enter, смена фокуса, для комбобокса с ImmidiatePost это выбор из выпадающего списка, вызовет EndEdit/PostEdit/Аналог и т.д.).

Как только контрол закончил редактирование его данные передаются дальше по цепочке в датаконтроллер, который и решает, что с ними делать. Во-первых, эти данные он сохраняет к себе (НЕ в датасет). На временное хранение. И только если мы поменяем строку на новую, вызовем у нода EndEdit или еще как -- они эти данные перешлет в датасет.

Может кто поправит, если где неточности есть.

Т.е. последовательность, чтобы данные реально попали в датасет:
- сделать принудительное сохранение у текущего редактора (какой-нибудь control.PostEditingValue);
- сделать принудительное окончания редактирования у датаконтроллера (текущего нода -- EndEdit).
2 дек 18, 00:20    [21751210]     Ответить | Цитировать Сообщить модератору
 Re: TcxDBTreeList.DataController.IsEditing возвращает False во время редактирования  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 12559
JaDi
(для текстового поля это тот же enter,


Я нажимаю Enter и ничего не происходит. Редактирование не завершается.
2 дек 18, 00:27    [21751214]     Ответить | Цитировать Сообщить модератору
 Re: TcxDBTreeList.DataController.IsEditing возвращает False во время редактирования  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 12559
JaDi, я уже запутался. Сначала ты пишешь, что по Enter`у данные должны сохраниться, потом это отрицаешь.

Или по Enter`у данные сохраняются не где-то внутри виртуального хранилища? И программист должен добавить свой код, чтобы из виртуального хранилища сохранение пошло дальше в базу?
2 дек 18, 00:30    [21751219]     Ответить | Цитировать Сообщить модератору
 Re: TcxDBTreeList.DataController.IsEditing возвращает False во время редактирования  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 12559
Ещё по поводу ImmidiatePost и чекбокса в cxGrid`е: тоже самое я утверждаю, что мышкой чекбокс меняет свое значение. Но всё равно нужно дописывать код, чтобы редактирование завершилось и данные попали в базу.

Но в cxGrid DataController.IsEditing возвращает TRUE, в оличие от cxDBTreeList.
2 дек 18, 00:33    [21751220]     Ответить | Цитировать Сообщить модератору
 Re: TcxDBTreeList.DataController.IsEditing возвращает False во время редактирования  [new]
JaDi
Member

Откуда: Сызрань, Россия
Сообщений: 3935
X11,

Сейчас проверил грид и трилист с настройками по умолчанию -- постинг измененных значений и синхронизация с датасетом идет сразу, даже по enter, ничего настраивать не надо. Т.е. начинаем редактировать текст, жмем ентер -- всё, редактирование прекратилось и текст сохранился.

Пример (трилист, дбгрид и cxгрид):
http://i67.tinypic.com/28vwphy.gif
2 дек 18, 01:12    [21751235]     Ответить | Цитировать Сообщить модератору
 Re: TcxDBTreeList.DataController.IsEditing возвращает False во время редактирования  [new]
JaDi
Member

Откуда: Сызрань, Россия
Сообщений: 3935
Гифка не приложилась:

Картинка с другого сайта.
2 дек 18, 01:12    [21751236]     Ответить | Цитировать Сообщить модератору
 Re: TcxDBTreeList.DataController.IsEditing возвращает False во время редактирования  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 12559
это привязано к базе?
2 дек 18, 08:14    [21751264]     Ответить | Цитировать Сообщить модератору
 Re: TcxDBTreeList.DataController.IsEditing возвращает False во время редактирования  [new]
JaDi
Member

Откуда: Сызрань, Россия
Сообщений: 3935
X11,

да, обычные db-трилист и дб-вьюха для грида. Без доп настроек, просто кинутые на форму и подключенные к общему датасету (dxmemdata).
2 дек 18, 09:41    [21751271]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Delphi Ответить