Связь между формами и фреймами - PullRequest
2 голосов
/ 11 октября 2010

Я работал над программой на Delphi 2009. Она очень похожа на программу Mimics от материализовать, где вы можете создавать и манипулировать трехмерными сетками. Есть 4 панели с различными аспектами для просмотра 3D-объекта (XY, YZ, XZ и 3D-перспектива). Каждая из панелей является экземпляром пользовательской рамки, которую я сделал для просмотра 3D-объектов. Затем 4 панели загружаются в форму с кнопками и другими компонентами.

Проблема, с которой я сталкиваюсь, заключается в том, что кадры должны иметь доступ к подпрограммам той формы, в которой они находятся. НАПРИМЕР. Если я что-то изменяю в сетке, над которой я работаю в одном из фреймов, ВСЕ фреймы должны быть обновлены (обновлены), что является процедурой, доступной в родительской форме. Но чтобы вызвать процедуры в родительской форме, я должен включить файл модуля родительской формы в условие использования реализации трехмерного фрейма. Это нормально, и это в целом работает без каких-либо проблем. Проблема в том, что я не могу использовать родительскую форму для наследования. Если я создаю унаследованный класс из родительской формы, имя модуля и имя формы изменяются, и я должен затем изменить 3D-кадр, чтобы ссылаться на эту новую измененную форму.

Это действительно суть моей проблемы. Я не знаю, как ссылаться на атрибуты родительской формы из ее дочерних фреймов без явного указания имени формы. Я хочу иметь возможность повторно использовать и расширять родительскую форму, но я не понимаю, как это возможно, не изменяя также 3D-кадры, используемые формой.

Любая помощь будет принята с благодарностью. Спасибо.

Ответы [ 4 ]

9 голосов
/ 11 октября 2010

То есть у вас есть автономный компонент (фрейм), который должен иметь возможность вызывать код из формы, в которой он находится, без знания самой формы во время компиляции?Похоже на TButton, который не знает, что делать с формой, в которой он находится, когда вы щелкаете по нему, и решение остается тем же: используйте обработчик событий.Добавьте свойство события OnChangeMesh (или что-то в этом роде) в свой фрейм, и пусть ваша форма назначит соответствующий метод при создании фреймов.

6 голосов
/ 12 октября 2010

Другим вариантом может быть определение интерфейса, который реализует родительская форма. Он должен иметь все свойства и методы, к которым вы хотите получить доступ из дочернего фрейма, что-то вроде:

ImyFormInterface=interface
['{08BD9B3C-C48E-47B7-AE67-279277C7E024}']
  function GetValue1: integer;
  function GetValue2: integer;
  procedure SetValue1(val: integer);
  procedure SetValue2(val: integer);

  procedure SomeMethod;
  function GetSomeValue: integer;


  property Value1: integer read GetValue1 write SetValue1;
  property Value2: integer read GetValue2 write SetValue2;
end;

Затем заставьте вашу основную форму реализовать этот интерфейс:

TForm1 = class(TForm, ImyFormInterface)
private
  { Private declarations }
public
  // Implement ImyFormInterface
  function GetValue1: integer;
  function GetValue2: integer;
  procedure SetValue1(val: integer);
  procedure SetValue2(val: integer);

  procedure SomeMethod;
  function GetSomeValue: integer;
public
  { Public declarations }
end;

Тогда в вашем кадре вы можете использовать что-то вроде:

procedure Tframe1.Button1Click(Sender: TObject);
var pform: TcustomForm;
i: ImyFormInterface;
begin
  pform:=GetParentForm(self);
  if (pform.GetInterface(ImyFormInterface, i)) then
  begin
    i.SomeMethod;

    i.Value1:=i.Value1+10;

    Self.SomeProperty:=i.GetSomeValue;
  end;
end;

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

3 голосов
/ 12 октября 2010

Вы можете использовать структуру подписки. Поддерживать глобальный список рамок вида. Если необходимо обновить кадры, просто зациклите этот список и вызовите процедуру обновления для каждого из кадров. Это позволяет вам обновлять 1,2 или 100 кадров, если что-то изменилось.

Если вы хотите пройти все ООП и по-настоящему радоваться этому: это шаблон наблюдателя.

http://en.wikipedia.org/wiki/Observer_pattern

0 голосов
/ 12 октября 2010

Окончательным решением может быть проверка визуальной формы / наследования фреймов.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...