Перейти к содержанию
Fire Monkey от А до Я
  • 0

Как связать колонку нового типа в FMX TGrid с полем средствами LiveBindings?


asd

Вопрос

Всем доброго дня!

 

Задавал этот вопрос на Stackowerflow, но ответа не получил даже с учетом выделенного bounty http://stackoverflow.com/q/32258525/5043424. Сущность вопроса в следующем. Создается колонка для FMX TGrid: 

type
  TDatecell = class(TCalendarEdit)
  end;

  TDateColumn = class(TColumn)
  private
    function CreateCellControl: TStyledControl; override;
  public
    constructor Create(AOwner: TComponent); override;
  end;
...
constructor TDateColumn.Create(AOwner: TComponent);
begin
  inherited;
end;

function TDateColumn.CreateCellControl: TStyledControl;
begin
  Result := TDatecell.Create(Self);
end;

Все работает. Такую колонку можно добавить в TGrid. Не получается ее связать с полем FDQuery, получающим данные из поля MySQL типа date. 

Пробовал в runtime вызывать нечто такое:

LinkGridToDataSourceBindSourceDB1.Columns.Add;
LinkGridToDataSourceBindSourceDB1.Columns.Items
[LinkGridToDataSourceBindSourceDB1.Columns.Count-1].
MemberName:='date_set_by_user';

но этот код удаляет все колонки (если они не были определены и определялись автоматически согласно списка полей) и добавляет вместо них колонку - экземпляр класса TColumn. Подскажите, как связать колонку своего типа с TDataSet или как указать свой тип колонки в LinkGridToDataSourceBindSourceDB1.Columns? Я представляю, как заполнить TGrid вручную, но, мне кажется, это замедлит код и вынудит писать обработчики изменения DataState и вручную прописывать все изменения во всех ячейках в DataSet, а также реакцию DS на изменение выделения строки в TGrid. OnGetValue не срабатывает, если есть LiveBindings Link... Подскажите, пожалуйста, как это сделать. Застрял...

Изменено пользователем asd
Ссылка на комментарий

Рекомендуемые сообщения

  • 0

Всем доброго дня!

 

Задавал этот вопрос на Stackowerflow, но ответа не получил даже с учетом выделенного bounty http://stackoverflow.com/q/32258525/5043424. Сущность вопроса в следующем. Создается колонка для FMX TGrid: 

type
  TDatecell = class(TCalendarEdit)
  end;

  TDateColumn = class(TColumn)
  private
    function CreateCellControl: TStyledControl; override;
  public
    constructor Create(AOwner: TComponent); override;
  end;
...
constructor TDateColumn.Create(AOwner: TComponent);
begin
  inherited;
end;

function TDateColumn.CreateCellControl: TStyledControl;
begin
  Result := TDatecell.Create(Self);
end;

Все работает. Такую колонку можно добавить в TGrid. Не получается ее связать с полем FDQuery, получающим данные из поля MySQL типа date. 

Пробовал в runtime вызывать нечто такое:

LinkGridToDataSourceBindSourceDB1.Columns.Add;
LinkGridToDataSourceBindSourceDB1.Columns.Items
[LinkGridToDataSourceBindSourceDB1.Columns.Count-1].
MemberName:='date_set_by_user';

но этот код удаляет все колонки (если они определялись автоматически по списку полей) и добавляет единственную колонку - экземпляр класса TColumn. Подскажите, как связать колонку своего типа с TDataSet или как указать свой тип колонки в LinkGridToDataSourceBindSourceDB1.Columns? Я представляю, как заполнить TGrid вручную, но, мне кажется, это замедлит код и вынудит писать обработчики изменения DataState и вручную прописывать все изменения во всех ячейках в DataSet, а также реакцию DS на изменение выделения строки в TGrid. OnGetValue не срабатывает, если есть LiveBindings Link... Подскажите, пожалуйста, как это сделать. Застрял...

 

я свои типы не проталкиваю пока, но связка у меня норм работает...ниже мой код, может вам и сгодиться...

альясы запроса у меня с шириной сразу, это очень удобно - к примеру пишите select name as ФИО_150 from...вот и вам и имя и ширина сразу )

важно подчеркивание ставить просто в конце...

var
  vSp: МойДатасет;
  c: TLinkGridToDataSourceColumn;
  i,k: integer;
begin
    LinkGrd.Columns.Clear;
    for i := 0 to vSp.FieldCount - 1 do
    begin
      c := LinkGrd.Columns.Add;
      c.MemberName := vSp.Fields[i].FullName;
      k := Pos('_',c.MemberName);
      if k > 0 then
      begin
        c.Width := copy(c.MemberName,k+1,length(c.MemberName)-k).ToInteger;
        c.Header := copy(c.MemberName,1,k-1);
      end
      else
      begin
        c.Width := 100;
        c.Header := c.MemberName;
      end;
    end;
end;
Ссылка на комментарий
  • 0

 

Всем доброго дня!

 

Задавал этот вопрос на Stackowerflow, но ответа не получил даже с учетом выделенного bounty http://stackoverflow.com/q/32258525/5043424. Сущность вопроса в следующем. Создается колонка для FMX TGrid: 

type
  TDatecell = class(TCalendarEdit)
  end;

  TDateColumn = class(TColumn)
  private
    function CreateCellControl: TStyledControl; override;
  public
    constructor Create(AOwner: TComponent); override;
  end;
...
constructor TDateColumn.Create(AOwner: TComponent);
begin
  inherited;
end;

function TDateColumn.CreateCellControl: TStyledControl;
begin
  Result := TDatecell.Create(Self);
end;

Все работает. Такую колонку можно добавить в TGrid. Не получается ее связать с полем FDQuery, получающим данные из поля MySQL типа date. 

Пробовал в runtime вызывать нечто такое:

LinkGridToDataSourceBindSourceDB1.Columns.Add;
LinkGridToDataSourceBindSourceDB1.Columns.Items
[LinkGridToDataSourceBindSourceDB1.Columns.Count-1].
MemberName:='date_set_by_user';

но этот код удаляет все колонки (если они определялись автоматически по списку полей) и добавляет единственную колонку - экземпляр класса TColumn. Подскажите, как связать колонку своего типа с TDataSet или как указать свой тип колонки в LinkGridToDataSourceBindSourceDB1.Columns? Я представляю, как заполнить TGrid вручную, но, мне кажется, это замедлит код и вынудит писать обработчики изменения DataState и вручную прописывать все изменения во всех ячейках в DataSet, а также реакцию DS на изменение выделения строки в TGrid. OnGetValue не срабатывает, если есть LiveBindings Link... Подскажите, пожалуйста, как это сделать. Застрял...

 

я свои типы не проталкиваю пока, но связка у меня норм работает...ниже мой код, может вам и сгодиться...

альясы запроса у меня с шириной сразу, это очень удобно - к примеру пишите select name as ФИО_150 from...вот и вам и имя и ширина сразу )

важно подчеркивание ставить просто в конце...

var
  vSp: МойДатасет;
  c: TLinkGridToDataSourceColumn;
  i,k: integer;
begin
    LinkGrd.Columns.Clear;
    for i := 0 to vSp.FieldCount - 1 do
    begin
      c := LinkGrd.Columns.Add;
      c.MemberName := vSp.Fields[i].FullName;
      k := Pos('_',c.MemberName);
      if k > 0 then
      begin
        c.Width := copy(c.MemberName,k+1,length(c.MemberName)-k).ToInteger;
        c.Header := copy(c.MemberName,1,k-1);
      end
      else
      begin
        c.Width := 100;
        c.Header := c.MemberName;
      end;
    end;
end;

 

Здравствуйте, Rustam_D! Спасибо за внимание к моей проблеме, но, к сожалению, Ваш код не дает ответа на мой вопрос. Я могу создать колонку(и) - экземпляр(ы) TColumn и делал это точно таким же образом. Пример такого кода присутствует в моем вопросе. Я не знаю, как сделать так, чтобы колонка была экземпляром именно объявленного мной класса TDateColumn а не стандартного TColumn.

Ссылка на комментарий
  • 0

 

 

 

но этот код удаляет все колонки 

просто у меня такого нет

 

Видимо, я не точно выразился. Я имел в виду, что если колонки были определены автоматически (не определялись в designtime), то добавление новой колонки в runtime удаляет их и создает единственную новую колонку. Это не означает, что добавление новых колонок (>1) невозможно.

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...