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

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

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

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

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

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

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

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

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

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

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

Откуда: Kharkiv, Ukraine
Сообщений: 12558
Переделал так
  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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

да, обычные db-трилист и дб-вьюха для грида. Без доп настроек, просто кинутые на форму и подключенные к общему датасету (dxmemdata).
2 дек 18, 09:41    [21751271]     Ответить | Цитировать Сообщить модератору
 Re: TcxDBTreeList.DataController.IsEditing возвращает False во время редактирования  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 12558
Вижу по анимашке, что сохранение происходит только после перехода на др. запись.
2 дек 18, 09:44    [21751272]     Ответить | Цитировать Сообщить модератору
 Re: TcxDBTreeList.DataController.IsEditing возвращает False во время редактирования  [new]
JaDi
Member

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

сохранение в базу (dataset.Post) -- да, после перехода на новую строчку (можно наблюдать по дб-навигатору или значку редактирования строки в дб-грида)... Сохранение в датасет же -- после перехода на соседнюю ячейку или нажатие энтер (там есть и то, и то на анимации -- проверяется по изменению этого же значения в других контролах).
2 дек 18, 09:52    [21751274]     Ответить | Цитировать Сообщить модератору
 Re: TcxDBTreeList.DataController.IsEditing возвращает False во время редактирования  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 12558
Так я о чем и пишу. Что нужно самому дописывать код отправки данных.
При этом, во время редактирования IdEditing в дереве возвращает False, а в сетке - True. Как-то нелогично.
2 дек 18, 10:08    [21751275]     Ответить | Цитировать Сообщить модератору
 Re: TcxDBTreeList.DataController.IsEditing возвращает False во время редактирования  [new]
JaDi
Member

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

в этом тестовом приложении нет ни одной строчки кода, только dfm.

+ pas
unit Unit24;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, cxGraphics, cxControls, cxLookAndFeels, cxLookAndFeelPainters, cxCustomData,
  cxStyles, cxTL, cxMaskEdit, cxTextEdit, cxTLdxBarBuiltInMenu, cxFilter, cxData, cxDataStorage, cxEdit, cxNavigator,
  Data.DB, cxDBData, dxmdaset, cxGridLevel, cxGridCustomTableView, cxGridTableView, cxGridDBTableView, cxClasses,
  cxGridCustomView, cxGrid, Vcl.ExtCtrls, Vcl.DBCtrls, Vcl.Grids, Vcl.DBGrids, cxInplaceContainer, cxDBTL, cxTLData;

type
  TForm24 = class(TForm)
    cxDBTreeList1: TcxDBTreeList;
    dxMemData1: TdxMemData;
    DataSource1: TDataSource;
    dxMemData1a1: TStringField;
    dxMemData1a2: TIntegerField;
    dxMemData1a3: TSmallintField;
    cxDBTreeList1RecId: TcxDBTreeListColumn;
    cxDBTreeList1a1: TcxDBTreeListColumn;
    cxDBTreeList1a2: TcxDBTreeListColumn;
    cxDBTreeList1a3: TcxDBTreeListColumn;
    DBGrid1: TDBGrid;
    DBNavigator1: TDBNavigator;
    cxGrid1DBTableView1: TcxGridDBTableView;
    cxGrid1Level1: TcxGridLevel;
    cxGrid1: TcxGrid;
    cxGrid1DBTableView1RecId: TcxGridDBColumn;
    cxGrid1DBTableView1a1: TcxGridDBColumn;
    cxGrid1DBTableView1a2: TcxGridDBColumn;
    cxGrid1DBTableView1a3: TcxGridDBColumn;
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form24: TForm24;

implementation

{$R *.dfm}

end.


+ dfm
object Form24: TForm24
  Left = 0
  Top = 0
  Caption = 'Form24'
  ClientHeight = 456
  ClientWidth = 1044
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  OldCreateOrder = False
  PixelsPerInch = 96
  TextHeight = 13
  object cxDBTreeList1: TcxDBTreeList
    Left = 8
    Top = 8
    Width = 337
    Height = 129
    Bands = <
      item
      end>
    DataController.DataSource = DataSource1
    DataController.ParentField = 'RecId'
    DataController.KeyField = 'RecId'
    Navigator.Buttons.CustomButtons = <>
    RootValue = -1
    TabOrder = 0
    object cxDBTreeList1RecId: TcxDBTreeListColumn
      Visible = False
      DataBinding.FieldName = 'RecId'
      Position.ColIndex = 0
      Position.RowIndex = 0
      Position.BandIndex = 0
      Summary.FooterSummaryItems = <>
      Summary.GroupFooterSummaryItems = <>
    end
    object cxDBTreeList1a1: TcxDBTreeListColumn
      PropertiesClassName = 'TcxTextEditProperties'
      DataBinding.FieldName = 'a1'
      Position.ColIndex = 1
      Position.RowIndex = 0
      Position.BandIndex = 0
      Summary.FooterSummaryItems = <>
      Summary.GroupFooterSummaryItems = <>
    end
    object cxDBTreeList1a2: TcxDBTreeListColumn
      DataBinding.FieldName = 'a2'
      Position.ColIndex = 2
      Position.RowIndex = 0
      Position.BandIndex = 0
      Summary.FooterSummaryItems = <>
      Summary.GroupFooterSummaryItems = <>
    end
    object cxDBTreeList1a3: TcxDBTreeListColumn
      DataBinding.FieldName = 'a3'
      Position.ColIndex = 3
      Position.RowIndex = 0
      Position.BandIndex = 0
      Summary.FooterSummaryItems = <>
      Summary.GroupFooterSummaryItems = <>
    end
  end
  object DBGrid1: TDBGrid
    Left = 351
    Top = 8
    Width = 320
    Height = 129
    DataSource = DataSource1
    TabOrder = 1
    TitleFont.Charset = DEFAULT_CHARSET
    TitleFont.Color = clWindowText
    TitleFont.Height = -11
    TitleFont.Name = 'Tahoma'
    TitleFont.Style = []
  end
  object DBNavigator1: TDBNavigator
    Left = 351
    Top = 143
    Width = 240
    Height = 25
    DataSource = DataSource1
    TabOrder = 2
  end
  object cxGrid1: TcxGrid
    Left = 8
    Top = 143
    Width = 337
    Height = 250
    TabOrder = 3
    object cxGrid1DBTableView1: TcxGridDBTableView
      Navigator.Buttons.CustomButtons = <>
      DataController.DataSource = DataSource1
      DataController.Summary.DefaultGroupSummaryItems = <>
      DataController.Summary.FooterSummaryItems = <>
      DataController.Summary.SummaryGroups = <>
      object cxGrid1DBTableView1RecId: TcxGridDBColumn
        DataBinding.FieldName = 'RecId'
        Visible = False
      end
      object cxGrid1DBTableView1a1: TcxGridDBColumn
        DataBinding.FieldName = 'a1'
      end
      object cxGrid1DBTableView1a2: TcxGridDBColumn
        DataBinding.FieldName = 'a2'
      end
      object cxGrid1DBTableView1a3: TcxGridDBColumn
        DataBinding.FieldName = 'a3'
      end
    end
    object cxGrid1Level1: TcxGridLevel
      GridView = cxGrid1DBTableView1
    end
  end
  object dxMemData1: TdxMemData
    Active = True
    Indexes = <>
    Persistent.Data = {
      5665728FC2F5285C8FFE3F030000001400000001000300613100040000000300
      030061320002000000020003006133000108000000F1F2F0EEEAE02031011700
      00000100000108000000F1F2F0EEEAE0203201580100000101000108000000F1
      F2F0EEEAE0203301060000000100000108000000F1F2F0EEEAE0203401370000
      00010000}
    SortOptions = []
    Left = 320
    Top = 32
    object dxMemData1a1: TStringField
      FieldName = 'a1'
    end
    object dxMemData1a2: TIntegerField
      FieldName = 'a2'
    end
    object dxMemData1a3: TSmallintField
      FieldName = 'a3'
    end
  end
  object DataSource1: TDataSource
    DataSet = dxMemData1
    Left = 320
    Top = 72
  end
end
2 дек 18, 10:36    [21751278]     Ответить | Цитировать Сообщить модератору
 Re: TcxDBTreeList.DataController.IsEditing возвращает False во время редактирования  [new]
JaDi
Member

Откуда: Сызрань, Россия
Сообщений: 3934
Если надо, чтобы в базу передавались значения после изменения в каждой ячейки, то можно на событии дерева OnEdited вызывать tree.Post:


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

Откуда: Kharkiv, Ukraine
Сообщений: 12558
JaDi, я это и доказываю с самого начала, что нужно самому заботиться, а TcxDBTreeList(sender).DataController.IsEditing возвращает false.
2 дек 18, 12:06    [21751304]     Ответить | Цитировать Сообщить модератору
 Re: TcxDBTreeList.DataController.IsEditing возвращает False во время редактирования  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 12558
JaDi
то можно на событии дерева OnEdited вызывать tree.Post:


ок, попробую, спасибо
2 дек 18, 12:06    [21751305]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: 1 2      [все]
Все форумы / Delphi Ответить