Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: 1 2      [все]
 Присвоить значение строке TcxDBVerticalGrid (ReadOnly DataSet)  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 14759
Компонента TcxDBVerticalGrid привязана к НД TpFibDataSet и используется просто для вывода данных на экран, для отображения данных.

Но появилась нужда добавить 1-2 строки TcxDBEditorRow и заполнить их не из привязанного НД.
Создать строку типа cxCombobox или cxTextEdit не проблема, но получается так, что в cxCombobox ничего выбрать нельзя, а в cxTextEdit ничего ввести нельзя ни ручками, ни программно.

А очень хочется.

P.S. Можно, конечно, заменить сетку на TcxVerticalGrid,но тогда придется все строки заполнять ручками в коде, а мне - леньки
13 ноя 20, 14:21    [22231419]     Ответить | Цитировать Сообщить модератору
 Re: Присвоить значение строке TcxDBVerticalGrid (ReadOnly DataSet)  [new]
Polesov
Member

Откуда:
Сообщений: 790
X11,
Вычисляемые поля в DataSet
13 ноя 20, 14:52    [22231446]     Ответить | Цитировать Сообщить модератору
 Re: Присвоить значение строке TcxDBVerticalGrid (ReadOnly DataSet)  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 14759
И как мне это поможет?
13 ноя 20, 14:56    [22231448]     Ответить | Цитировать Сообщить модератору
 Re: Присвоить значение строке TcxDBVerticalGrid (ReadOnly DataSet)  [new]
Polesov
Member

Откуда:
Сообщений: 790
X11, в событии OnCalcFields датасета этим полям можно присвоить значение.
13 ноя 20, 15:55    [22231487]     Ответить | Цитировать Сообщить модератору
 Re: Присвоить значение строке TcxDBVerticalGrid (ReadOnly DataSet)  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 14759
Я пока по другому сделал.
В строку добавил выпадающую панель и там уже пусть пользователь что-то меняет.
13 ноя 20, 16:01    [22231501]     Ответить | Цитировать Сообщить модератору
 Re: Присвоить значение строке TcxDBVerticalGrid (ReadOnly DataSet)  [new]
ъъъъъ
Member

Откуда:
Сообщений: 1350
Polesov
X11,
Вычисляемые поля в DataSet

Ему нужны "вычисляемые строки", а не поля.
13 ноя 20, 17:23    [22231586]     Ответить | Цитировать Сообщить модератору
 Re: Присвоить значение строке TcxDBVerticalGrid (ReadOnly DataSet)  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 14759
строки в данном случае - это поля, ведь это вертикальная сетка
13 ноя 20, 17:28    [22231588]     Ответить | Цитировать Сообщить модератору
 Re: Присвоить значение строке TcxDBVerticalGrid (ReadOnly DataSet)  [new]
ъъъъъ
Member

Откуда:
Сообщений: 1350
X11,

тогда он прав.
13 ноя 20, 17:34    [22231598]     Ответить | Цитировать Сообщить модератору
 Re: Присвоить значение строке TcxDBVerticalGrid (ReadOnly DataSet)  [new]
DimaBr
Member

Откуда:
Сообщений: 11910
X11
P.S. Можно, конечно, заменить сетку на TcxVerticalGrid,но тогда придется все строки заполнять ручками в коде, а мне - леньки

Что стоит Единожды написать процедуру, заполняющую Грид по НАИМЕНОВАНИЮ колонок из Датасета ?
13 ноя 20, 22:10    [22231759]     Ответить | Цитировать Сообщить модератору
 Re: Присвоить значение строке TcxDBVerticalGrid (ReadOnly DataSet)  [new]
энди
Member

Откуда: Киров, Россия
Сообщений: 1159
Не стоит использовать этот вертикальный грид для показа одной строки данных, он для этого не предназначен как нам сказали. Оказывается мы его неправильно используем, он для отображения сразу многих записей :)
Т.е отобразить он конечно отобразит, но при обновлении единственной отображаемой строки данных тормозить будет беспощадно.
14 ноя 20, 09:11    [22231915]     Ответить | Цитировать Сообщить модератору
 Re: Присвоить значение строке TcxDBVerticalGrid (ReadOnly DataSet)  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 14759
вертикальная сетка довольно удобна для формы редактирования/добавления/показа записи из базы
14 ноя 20, 10:21    [22231925]     Ответить | Цитировать Сообщить модератору
 Re: Присвоить значение строке TcxDBVerticalGrid (ReadOnly DataSet)  [new]
Gluck99
Member

Откуда: Оттуда
Сообщений: 1085
Вопрос в том, надо просто отображать пользователю данные или надо еще их редактировать? Если просто отображать, то что может быть проще OnGetDisplayText Editor'а:
procedure TForm.EditorPropertiesGetDisplayText(Sender: TcxCustomEditorRowProperties; ARecord: Integer; var AText: string);
  Var
        X, Y, M: integer;
begin
      { Получаем данные для отображения }         
           X := 2;
           Y := 2;
           M := X * Y;         
    
      { Выводим } 
           AText := Format('%d умножить на %d равно %d!', [X, Y, M]);
end;

Properties = Label, FieldName пустое.
14 ноя 20, 13:57    [22232033]     Ответить | Цитировать Сообщить модератору
 Re: Присвоить значение строке TcxDBVerticalGrid (ReadOnly DataSet)  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 14759
Непонятно, как это событие работает, как его правильно использовать, в какие моменты. При открытии формы, при перерисовке... когда оно срабатывает?
Ок, сделал строку с выпадающим списком (TcxLookupComboBox) и привязал к НД, выбираю там что-то, но строка пустая, пока она активна, в режиме редактирования. Как только фокус покидает ячейку, вижу результат выбора. Как только щелкаю туда - снова пустая.

Для выбора использую событие EditPropertiesCloseUp, где назначаю выбранное значение глобальной переменной. А потом эту глобальную переменную использую в PropertiesGetDisplayText.


К сообщению приложен файл. Размер - 6Kb
15 ноя 20, 15:21    [22232369]     Ответить | Цитировать Сообщить модератору
 Re: Присвоить значение строке TcxDBVerticalGrid (ReadOnly DataSet)  [new]
Gluck99
Member

Откуда: Оттуда
Сообщений: 1085
X11
Непонятно, как это событие работает, как его правильно использовать, в какие моменты. При открытии формы, при перерисовке... когда оно срабатывает?
Коллега, у вас отладчик не работает? Или религия не позволяет использовать? Создайте точку останова и всё узнаете.

Вообще я в таких случаях делаю очень прямолинейно и просто - создаю два вертикальных грида. Один DB, второй обычный. В DB-гриде отображаю данные из датасета (чтобы руками не прописывать), а второй обычный грид кидаю на форму ниже, под DB-гридом, прямо вплотную, чтобы оба грида составляли как бы одно целое. Для пользователя внешне это будет выглядеть как один вертикальный грид.
Но это работает только в том случае, разумеется, если отображаемые данные и редактируемые данные можно расположить последовательно. Если редактируемые строчки надо вклинить между данными из БД, то этот вариант не подойдёт.
15 ноя 20, 15:41    [22232376]     Ответить | Цитировать Сообщить модератору
 Re: Присвоить значение строке TcxDBVerticalGrid (ReadOnly DataSet)  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 14759
Работает и пользуюсь, и вижу, что переменной выбранное в списке значение присваивается, только вот не отображается, пока не выйдешь из режима редактирования.
Как только снова щелкаю по строке (по ячейке), значение снова исчезает.
15 ноя 20, 15:43    [22232379]     Ответить | Цитировать Сообщить модератору
 Re: Присвоить значение строке TcxDBVerticalGrid (ReadOnly DataSet)  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 14759
Две сетки мне не подходит.
Мой пользователь имеет доступ к редактированию визуально части сетки. Т.е. это кагбэ дизайнер формы.
Поэтому вот.
15 ноя 20, 15:44    [22232381]     Ответить | Цитировать Сообщить модератору
 Re: Присвоить значение строке TcxDBVerticalGrid (ReadOnly DataSet)  [new]
Gluck99
Member

Откуда: Оттуда
Сообщений: 1085
X11
Ок, сделал строку с выпадающим списком (TcxLookupComboBox) и привязал к НД, выбираю там что-то, но строка пустая, пока она активна, в режиме редактирования. Как только фокус покидает ячейку, вижу результат выбора. Как только щелкаю туда - снова пустая.
Коллега, вы троллите что ли? Ничего не пропадает, если Properties->DataBinding->FieldName задано корректно.
15 ноя 20, 16:02    [22232385]     Ответить | Цитировать Сообщить модератору
 Re: Присвоить значение строке TcxDBVerticalGrid (ReadOnly DataSet)  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 14759
Перечитайте ТЗ с самого начала. Намекну, что у меня в этой одной строке нет привязки к НД.
15 ноя 20, 16:13    [22232391]     Ответить | Цитировать Сообщить модератору
 Re: Присвоить значение строке TcxDBVerticalGrid (ReadOnly DataSet)  [new]
Gluck99
Member

Откуда: Оттуда
Сообщений: 1085
X11
Перечитайте ТЗ с самого начала. Намекну, что у меня в этой одной строке нет привязки к НД.
А это кто писал:
X11
сделал строку с выпадающим списком (TcxLookupComboBox) и привязал к НД

Но даже если нет привязки, можно создать фиктивное поле в результате запроса и привязаться к нему. Не знаю, правда, как к этому отнесётся Fib, но проверить можно.
15 ноя 20, 16:26    [22232395]     Ответить | Цитировать Сообщить модератору
 Re: Присвоить значение строке TcxDBVerticalGrid (ReadOnly DataSet)  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 14759
Вы не поняли, это список (ListSource) привязан, т.к. источник отображения списка.
А свойство FieldName пустое.

К сообщению приложен файл. Размер - 13Kb
15 ноя 20, 16:35    [22232396]     Ответить | Цитировать Сообщить модератору
 Re: Присвоить значение строке TcxDBVerticalGrid (ReadOnly DataSet)  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 14759
В общем, решение пока такое, но не очень, после выбора значения из TcxLookupComboBox, в событии EditPropertiesCloseUp добавил строку

cxDBVerticalGrid1.HideEdit;


Сообщение было отредактировано: 15 ноя 20, 16:57
15 ноя 20, 17:02    [22232401]     Ответить | Цитировать Сообщить модератору
 Re: Присвоить значение строке TcxDBVerticalGrid (ReadOnly DataSet)  [new]
Gluck99
Member

Откуда: Оттуда
Сообщений: 1085
X11
Вы не поняли, это список (ListSource) привязан, т.к. источник отображения списка.
А свойство FieldName пустое.
Я всё прекрасно понял. Именно поэтому я и предложил присвоить свойству FieldName значение фиктивного поля из вашего TpFibDataSet.
15 ноя 20, 17:05    [22232402]     Ответить | Цитировать Сообщить модератору
 Re: Присвоить значение строке TcxDBVerticalGrid (ReadOnly DataSet)  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 14759
Возвращаюсь к нашим баранам. НД только для отображения. Поэтому он всегда ReadOnly, т.е. при попытке что-то присвоить полю, будет exception - dataset not in isert or edit mode.
15 ноя 20, 17:09    [22232403]     Ответить | Цитировать Сообщить модератору
 Re: Присвоить значение строке TcxDBVerticalGrid (ReadOnly DataSet)  [new]
Gluck99
Member

Откуда: Оттуда
Сообщений: 1085
X11
Возвращаюсь к нашим баранам. НД только для отображения. Поэтому он всегда ReadOnly, т.е. при попытке что-то присвоить полю, будет exception - dataset not in isert or edit mode.
Всегда ReadOnly - это не аксиома. У FibDataSet есть LocalUpdate, по-моему. Можно его включать. Но вообще лучше всего использовать Calculated Fields, как сразу вам и сказали.
15 ноя 20, 17:58    [22232411]     Ответить | Цитировать Сообщить модератору
 Re: Присвоить значение строке TcxDBVerticalGrid (ReadOnly DataSet)  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 14759
Именно с Calculated Fields я и экспериментировал и получил ошибку, вышеуказанную.
15 ноя 20, 17:59    [22232412]     Ответить | Цитировать Сообщить модератору
 Re: Присвоить значение строке TcxDBVerticalGrid (ReadOnly DataSet)  [new]
Polesov
Member

Откуда:
Сообщений: 790
X11
Именно с Calculated Fields я и экспериментировал и получил ошибку, вышеуказанную.

Какова дальнейшая судьба значений, веденных пользователем?

P.S. В FibDataset-е можно определить UpdateSQL, в котором писать в базу только, что нужно. И куда нужно. Только поля должны содержаться в запросе.

Сообщение было отредактировано: 15 ноя 20, 18:08
15 ноя 20, 18:12    [22232416]     Ответить | Цитировать Сообщить модератору
 Re: Присвоить значение строке TcxDBVerticalGrid (ReadOnly DataSet)  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 14759
Генерируется некая http-ссылка и пользователь по ней переходит, если нажмет вторую кнопку.
Скажем так. Пользователь выбирает имя бота и переходит к нему по нажатию на кнопку, чтобы было чуть понятней.
16 ноя 20, 09:53    [22232625]     Ответить | Цитировать Сообщить модератору
 Re: Присвоить значение строке TcxDBVerticalGrid (ReadOnly DataSet)  [new]
Gluck99
Member

Откуда: Оттуда
Сообщений: 1085
X11
Генерируется некая http-ссылка и пользователь по ней переходит, если нажмет вторую кнопку.
Скажем так. Пользователь выбирает имя бота и переходит к нему по нажатию на кнопку, чтобы было чуть понятней.
Так а почему нельзя генерировать эту ссылку в OnCalcFields?
16 ноя 20, 11:47    [22232729]     Ответить | Цитировать Сообщить модератору
 Re: Присвоить значение строке TcxDBVerticalGrid (ReadOnly DataSet)  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 14759
не проблема, но где, как отображать выбор, имя бота, ссылку и т.д.?

пользователь должен видеть сделанный выбор и возможность нажать кнопку и очень желательно в одной и той же строки сетки
16 ноя 20, 11:59    [22232739]     Ответить | Цитировать Сообщить модератору
 Re: Присвоить значение строке TcxDBVerticalGrid (ReadOnly DataSet)  [new]
Polesov
Member

Откуда:
Сообщений: 790
X11
Генерируется некая http-ссылка и пользователь по ней переходит, если нажмет вторую кнопку.
Скажем так. Пользователь выбирает имя бота и переходит к нему по нажатию на кнопку, чтобы было чуть понятней.


В SQL-запрос добавляем фиктивное поле, например:

       cast( null as varchar( 32 ) ) as BOT_NAME


На добавленное поле назначаем строку в DbVerticalGrid c EditProperties ComboBox, список которого заполняем, например, в OnCreate формы.
Всем строкам, которые нельзя менять, присваиваем Properties.EditProperties.ReadOnly := True;


В UpdateSQL DataSet-а пишем холостой запрос, что бы можно было вводить значения:
select 1
  from RDB$DATABASE


Ниже исходные тексты (D-XE7, ежли чо):
создание таблицы
+

create table B (
    ID   integer not null,
    VAL  varchar( 10 )
);

alter table B
  add constraint PK_B primary key ( ID );

insert into B ( ID, VAL )
       values (  1, 'VALUE #1' );
commit;



текст dpr
+
program Project8;

uses
  Vcl.Forms,
  Unit14 in 'Unit14.pas' {Form14};

{$R *.res}

begin
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Application.CreateForm(TForm14, Form14);
  Application.Run;
end.


текст pas
+


unit Unit14;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, cxGraphics, cxControls, cxLookAndFeels, cxLookAndFeelPainters, cxStyles, cxEdit, dxSkinsCore,
  dxSkinOffice2010Blue, Data.DB, FIBDataSet, pFIBDataSet, FIBDatabase, pFIBDatabase, cxVGrid, cxDBVGrid, cxInplaceContainer, Vcl.StdCtrls, cxLabel,
  cxDropDownEdit, cxTextEdit;

type
  TForm14 = class(TForm)
    cxDBVerticalGrid1: TcxDBVerticalGrid;
    cxDBVerticalGrid1DBEditorRow1: TcxDBEditorRow;
    cxDBVerticalGrid1DBEditorRow2: TcxDBEditorRow;
    rowBotName: TcxDBEditorRow;
    db: TpFIBDatabase;
    tr: TpFIBTransaction;
    ds: TpFIBDataSet;
    sr: TDataSource;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form14: TForm14;

implementation

{$R *.dfm}

procedure TForm14.Button1Click(Sender: TObject);
begin
  Caption := ds.fieldByName( 'BOT_NAME' ).AsString;
end;

procedure TForm14.FormCreate(Sender: TObject);
begin
  with TcxComboBoxProperties( rowBotName.Properties.EditProperties ).Items do
  begin
    Add( 'BOT NAME #1' );
    Add( 'BOT NAME #2' );
    Add( 'BOT NAME #3' );
  end;
end;

end.



текст dfm
+


object Form14: TForm14
  Left = 0
  Top = 0
  Caption = 'Form14'
  ClientHeight = 299
  ClientWidth = 635
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  OldCreateOrder = False
  OnCreate = FormCreate
  PixelsPerInch = 96
  TextHeight = 13
  object cxDBVerticalGrid1: TcxDBVerticalGrid
    Left = 32
    Top = 24
    Width = 417
    Height = 121
    OptionsView.RowHeaderWidth = 154
    Navigator.Buttons.CustomButtons = <>
    TabOrder = 0
    DataController.DataSource = sr
    Version = 1
    object cxDBVerticalGrid1DBEditorRow1: TcxDBEditorRow
      Properties.EditPropertiesClassName = 'TcxTextEditProperties'
      Properties.EditProperties.ReadOnly = True
      Properties.DataBinding.FieldName = 'ID'
      Properties.Options.Editing = False
      ID = 0
      ParentID = -1
      Index = 0
      Version = 1
    end
    object cxDBVerticalGrid1DBEditorRow2: TcxDBEditorRow
      Properties.EditPropertiesClassName = 'TcxTextEditProperties'
      Properties.EditProperties.ReadOnly = True
      Properties.DataBinding.FieldName = 'VAL'
      ID = 1
      ParentID = -1
      Index = 1
      Version = 1
    end
    object rowBotName: TcxDBEditorRow
      Properties.EditPropertiesClassName = 'TcxComboBoxProperties'
      Properties.DataBinding.FieldName = 'BOT_NAME'
      ID = 2
      ParentID = -1
      Index = 2
      Version = 1
    end
  end
  object Button1: TButton
    Left = 480
    Top = 24
    Width = 137
    Height = 25
    Caption = 'Get Bot Name'
    TabOrder = 1
    OnClick = Button1Click
  end
  object db: TpFIBDatabase
    Connected = True
    DBName = 'test'
    DBParams.Strings = (
      'user_name=SYSDBA'
      'password=masterkey'
      'lc_ctype=WIN1251')
    DefaultTransaction = tr
    DefaultUpdateTransaction = tr
    SQLDialect = 3
    Timeout = 0
    LibraryName = 'fbclient.dll'
    WaitForRestoreConnect = 0
    Left = 32
    Top = 168
  end
  object tr: TpFIBTransaction
    Active = True
    DefaultDatabase = db
    Left = 32
    Top = 224
  end
  object ds: TpFIBDataSet
    UpdateSQL.Strings = (
      'select 1'
      '  from RDB$DATABASE')
    SelectSQL.Strings = (
      'select ID,'
      '       VAL,'
      '       cast( null as varchar( 32 ) ) as BOT_NAME'
      '  from B')
    Active = True
    Transaction = tr
    Database = db
    Left = 80
    Top = 168
  end
  object sr: TDataSource
    DataSet = ds
    Left = 128
    Top = 168
  end
end

16 ноя 20, 12:14    [22232765]     Ответить | Цитировать Сообщить модератору
 Re: Присвоить значение строке TcxDBVerticalGrid (ReadOnly DataSet)  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 14759
Polesov
В UpdateSQL DataSet-а пишем холостой запрос


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