Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Фреймы


Автор: TForumUser 12.6.2008, 10:34
Итак, здрасте!
Я создал 2 фрейма (File -> New -> Frame) (Frame2 и Frame3) и вставил один из них на форму. Автоматически на форме создасля Frame21, представляющий собой Frame2. Теперь вопрос: могу ли я програмно изменить Frame21, чтобы он отобразал Frame3?

Автор: pseud 12.6.2008, 12:28
Код

type
  TForm1 = class(TForm)
    Button1: TButton;
    Panel1: TPanel;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    FFrame: TFrame;
    FFrame2: TFrame2;
    FFrame3: TFrame3;
    procedure SetFrame(const Value: TFrame);
    { Private declarations }
  public
    property Frame: TFrame read FFrame write SetFrame;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  Frame := FFrame2;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  Frame := FFrame3;
end;

procedure TForm1.SetFrame(const Value: TFrame);
begin
  if FFrame <> nil then
    FFrame.Parent := nil;
  FFrame := Value;
  FFrame.Parent := Panel1;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  FFrame2:= TFrame2.Create(Self);
  FFrame3:= TFrame3.Create(Self);
end;

Автор: TForumUser 12.6.2008, 13:48
pseud, хм спасибо, но я уже сам сделал, правда немного иначе. Если кому интересно, могу показать свой ватиант

Код
//Сначала создаем 2 фрейма File -> New -> Frame (Frame1 и Frame2)
//на форму их вставлять не обязательно, далее
uses uFrame1, uFrame2; //модули с фреймами
type
 TForm1 = class(TForm)
  ...
  FFrame: TFrame;
  procedure SetFrame1;
  procedure SetFrame2;
  ...
implementation

procedure SetFrame1;
begin
 if FFrame <> nil then FFrame.Destroy;
 FFrame := TFrame1.Create(self);
 FFrame.Parent := Form1;
 FFrame.Top := 16;
 FFrame.Left := 8;
 FFrame.Height := 201;
 FFrame.Width := 177;  //или другие значения
end;

procedure SetFrame2;
begin
 if FFrame <> nil then FFrame.Destroy;
 FFrame := TFrame2.Create(self);
 //аналогично
end;

procedure Usage;
begin
 SetFrame1; //показать фрейм1
 SetFrame2; //показать фрейм2
end;
вот smile 
Можно доработать, добавив в процедуры параметры, но в рамках моей задачи и этого хватит

Автор: pseud 12.6.2008, 14:02
Цитата(TForumUser @  12.6.2008,  13:48 Найти цитируемый пост)
Если кому интересно, могу показать свой ватиант

ИМХО - плохой вариант.
1. а теперь тебе надо опять Frame1 на поверхность вывалить и что ты будешь вызывать? опять SetFrame1?
2.  FFrame.Parent надо бы назначать в последнюю очередь, чтоб не наблюдать мерцания формы.

Цитата(TForumUser @  12.6.2008,  13:48 Найти цитируемый пост)
При компиляцыи выскакивает ошибка

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

Автор: TForumUser 12.6.2008, 14:06
Цитата(pseud @  12.6.2008,  14:02 Найти цитируемый пост)
предположу что ты FFrame в published запихал.
ну да, так и сделал. Исправил, сунув в private, помогло smile
А если сделать одну процедуру с парамертами, или придумать свойство, то и мой код неплохо будет смотреться

Автор: pseud 12.6.2008, 14:39
Цитата(TForumUser @  12.6.2008,  14:06 Найти цитируемый пост)
А если сделать одну процедуру с парамертами, или придумать свойство, то и мой код неплохо будет смотреться

т.е. ты имеешь ввиду доточить напильником твой код... до моего  smile 
зачем? 
ведь уже есть мой код  smile 

Автор: TForumUser 12.6.2008, 14:44
Будет не совсем твой. Твой код создает на форме все фреймы в начале и присваивает их основному. Мой - динамически пересоздает один, не создавая дополнительных.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)