Как ссылаться на DBGrid из другой формы

#delphi #dbgrid

#delphi #dbgrid

Вопрос:

У меня есть основная форма с DBGrid, и у меня есть вторая форма с контрольным списком, в котором отображаются все столбцы DBGrid, которые пользователь может выбрать. Мне нужно ссылаться в Form2 на DBGrid, который у меня есть в MainForm. Я бы хотел, чтобы эта вторая форма обрабатывала все процедуры, связанные со столбцами dbdgrid, чтобы я мог легко использовать ее повторно. Это была идея, но я не нашел способа передать ссылку на DBGrid. Возможно ли это?

Ответ №1:

Отвечая на вопрос, который вы задали, в вашем Form2 определите свойство

 TForm2 

[...]
private
  FGrid : TDBGrid
public
  property Grid : TDBGrid read FGrid write FGrid;
  

Затем, после того, как вы создали экземпляр TForm2, просто выполните

 Form2.Grid := MainForm.DBGrid1;
  

Затем в Form2 вы можете сделать все, что хотите изменить Grid , и изменения будут внесены в MainForm.DBGrid1.

Комментарии:

1. Спасибо за предложение. Я попробовал, и, похоже, это работает. Теперь, в form2, мне нужно что-то сделать, когда столбцы DBGrid в основной форме перемещаются. В основной форме я бы использовал OnColumnMoved …

2. Что ж, я ответил на ваш первоначальный вопрос, поэтому было бы хорошо, если бы вы приняли его, нажав на зеленый значок «галочка». Для вашего события OnColumMoved вы предоставляете Form2 процедуру с той же сигнатурой параметров, записываете в нее свой код и присваиваете ему OnColumnMoved MainForm.DBGrid1 .

Ответ №2:

Возможно ли это?

Вопрос скорее должен быть в том, есть ли лучший способ достичь того, чего я хочу?

  • Будет ли это поддерживаться, если Form2 работать в основном с элементом управления из другой формы? Что, если другие формы также должны содержать ссылки на компоненты в других формах?
  • Насколько сложно было бы через год найти ошибку, если элементы управления используются в разных формах?
  • Будет ли такое решение соответствовать принципам SOLID?

Ответы на эти вопросы должны помочь вам найти другой подход.

Вам следует подумать о разделении пользовательского интерфейса и бизнес-логики. A TDBGrid кажется удобным способом получения данных из базы данных в ваше приложение, но это нарушает принцип единой ответственности, поскольку он загружает и отображает данные одновременно. Не используйте его в качестве основного поставщика данных внутри вашего приложения. Выполняйте SQL-запросы из более глубокого, независимого от пользовательского интерфейса уровня вашего программного обеспечения. Сохраняйте результаты в контейнерах и отображайте их всеми способами, которые вы хотите, в своих разных формах.

Комментарии:

1. Я думаю, что вы правы в принципе, но я бы не знал, с чего начать, чтобы найти лучший способ. Более того, это тот случай, когда вторичная форма, отображающая расположение столбцов DBGrid, всегда идет с DBGrid..