Я должен использовать Дельфи tframes для форм мультистраниц?

Синтаксис будет:

icon: (area == 1) ? icon1 : (area == 2) ? icon2 : icon0,

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

icon: getIcon(area),

...

function getIcon(area) {
  if (area == 1) { 
    return icon1; 
  } else if (area == 2) { 
    return icon2; 
  }

  return icon0;
}
9
задан Lepidosteus 7 June 2009 в 17:17
поделиться

3 ответа

Похоже, фреймы - отличный выбор для этого сценария. Я хотел бы добавить, что вы можете использовать базовый фрейм и визуальное наследование для создания общего интерфейса.

И ко второй части: вы проектируете фрейм как форму, но используете его как элемент управления, очень мало ограничений. Обратите внимание, что вы можете так же легко использовать Create / Free вместо Show / Hide. Что лучше, зависит от их ресурсоемкости.

17
ответ дан 4 December 2019 в 07:23
поделиться

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

В форме добавьте свойство и сеттер, который обрабатывает его размещение в форме:

TMyForm = class(TForm)
private
  FCurrentFrame : TFrame;
  procedure SetCurrentFrame(Value : TFrame);
public
  property CurrentFrame : TFrame read FCurrentFrame write SetCurrentFrame;
end;

procedure TMyForm.SetCurrentFrame(Value : TFrame)
begin
  if Value <> FCurrentFrame then
  begin
    if assigned(FCurrentFrame) then
      FreeAndNil(FCurrentFrame);
    FCurrentFrame := Value;
    if assigned(FCurrentFrame) then
    begin
      FCurrentFrame.Parent := Self;  // Or, say a TPanel or other container!
      FCurrentFrame.Align := alClient;
    end;
  end;
end;

Затем, чтобы использовать его, вы просто устанавливаете свойство в созданный экземпляр кадра, например, в событии OnCreate:

MyFrame1.CurrentFrame := TSomeFrame.Create(nil);

Если вы хотите избавиться от кадра, просто присвойте nil свойству CurrentFrame:

MYFrame1.CurrentFrame := nil;

Это работает очень хорошо.

]
10
ответ дан 4 December 2019 в 07:23
поделиться

У меня есть для вас слово: TFrameStack. Просто то, что следует из названия.

У него есть несколько методов: PushFrame (AFrame), PopFrame, PopToTop (AFrame), PopToTop (Index), и несколько свойств: StackTop; Кадры [Индекс: Целое число]; Count;

  • Должно быть понятно.

Фрейм в StackTop является видимым. При выполнении таких операций, как Back / Previous, вам не нужно знать, какой кадр был перед текущим :) При создании кадра вы можете создать и отправить его за один раз. FrameStack.Push (TAFrame.Create) и т. Д., Который создает его, вызывает процедуру BeforeShow и делает его видимым, возвращая его индекс в стеке :)

Но он полагается сильно унаследовал ваши кадры от общего предка. Все эти кадры (в моем случае) имеют процедуры: BeforeShow; BeforeFree; Перед Скрыть; BeforeVisible. Они вызываются объектом FrameStack во время push, pop и top;

Из вашей основной формы вам просто нужно получить доступ к FrameStack.Stacktop.whatever. Я сделал свой стек глобальным :), поэтому к нему действительно легко получить доступ из дополнительных диалогов / окон и т. Д.

Также не забудьте создать переопределение метода Free, чтобы освободить все фреймы (если владелец - nil) в стеке когда приложение закрывается - еще одно преимущество, вам не нужно их явно отслеживать :)

Для создания объекта TFrameStack List потребовалось совсем немного времени. А у меня приложение работает как мечта.

Тимбо

3
ответ дан 4 December 2019 в 07:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: