Lazarus: как по TDataSource получить TDBGrid?

tunknown
Дата: 23.09.2019 16:54:06
Ясно, что на TDataSource может смотреть несколько TDBGrid. Как получить любой или первый?

В Delphi был TDataSource.DataLinks+TGridDataLink.Grid, в Lazarus вместо него TDataSource.DataLinks+TComponentDataLink, но в нём Component/Control не упоминается.
Док
Дата: 23.09.2019 18:51:04
procedure TForm1.FormCreate(Sender: TObject);
var
  i: Integer;
begin
  Label1.Caption:= 'DS_1 -->';
  Label2.Caption:= 'DS_2 -->';
  for i:= 0 to Pred(Self.ControlCount) do
  if Self.Controls[i].InheritsFrom(TDBGrid) then
  begin
    if TDBGrid(Self.Controls[i]).DataSource = DS_1 then
    Label1.Caption:= Label1.Caption + ' ~' + TDBGrid(Self.Controls[i]).Name;
    if TDBGrid(Self.Controls[i]).DataSource = DS_2 then
    Label2.Caption:= Label2.Caption + ' ~' + TDBGrid(Self.Controls[i]).Name;
  end;
end;  
ёёёёё
Дата: 23.09.2019 19:49:25
tunknown,

В Delphi:
type TDS = class(TDataSource);
...

var
  fDS: TDS;
  i: Integer;
  fDL: TDataLink;
  fGrid: TDBGrid;
begin
  fDS := TDS(DataSource1);

  fGrid := nil;

  for i := 0 to fDS.DataLinks.Count - 1 do begin
    fDL := fDS.DataLinks[i];
    if fDL is TGridDataLink then begin
      TCustomDBGrid(fGrid) := TGridDataLink(fDL).Grid;
      break;
    end;
  end;

  if Assigned(fGrid) then
    ShowMessageFmt('%s : %s here', [TDBGrid.ClassName, fGrid.Name])
  else
    ShowMessageFmt('%s : not found', [TDBGrid.ClassName])
ёёёёё
Дата: 23.09.2019 20:13:19
ёёёёё,

но сие опасно, завязано на то, что знаешь устройство TDBGrid.
tunknown
Дата: 24.09.2019 09:25:04
Док
  if Self.Controls[i].InheritsFrom(TDBGrid) then
Сейчас и сделано перебором по всему приложению, т.к. TDataSource может лежать на TDataModule или на другой форме. Надо было мне сразу сказать это.

ёёёёё
В Delphi:
Нужно-то в Lazarus.
Док
Дата: 24.09.2019 23:43:26
tunknown
Сейчас и сделано перебором по всему приложению, т.к. TDataSource может лежать на TDataModule или на другой форме.

а в чем конечная цель сабжа?
tunknown
Дата: 25.09.2019 09:38:17
Док
tunknown
Сейчас и сделано перебором по всему приложению, т.к. TDataSource может лежать на TDataModule или на другой форме.

а в чем конечная цель сабжа?
Переделывать нет возможности, а портировать на Lazarus нужно.
Док
Дата: 25.09.2019 15:11:37
tunknown
портировать на Lazarus нужно.

в Лазаре есть утилита для конвертации дельфийских компонентов/пакетов/проектов/файлов форм (Tools --> Delphi Conversion). Не пробовал?
tunknown
Дата: 26.09.2019 10:07:55
Док
в Лазаре есть утилита для конвертации дельфийских компонентов/пакетов/проектов/файлов форм (Tools --> Delphi Conversion). Не пробовал?
Ей и пользуюсь. Но она не добавляет совместимости компонентам. LCL/FPC RTL совместимы с VCL на верхнем уровне, но внутреннее устройство достаточно различается, например, для поддержки кросплатформенности.
Gator
Дата: 26.09.2019 17:56:44
Док
tunknown
Сейчас и сделано перебором по всему приложению, т.к. TDataSource может лежать на TDataModule или на другой форме.

а в чем конечная цель сабжа?
По идее никак. Не важно, где лежит DataSource - в датамодуле или на десятой форме. ДБГрида может вообще не быть нигде, а датасорсом пользуются другие dbaware компоненты.
Связь между дбгридом на форме FA и датасорсом на форме(модуле) FB находится легко даже в дизайнере.
Главное, чтобы формы эти формы друг друга видели.