Синтаксис будет:
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;
}
Похоже, фреймы - отличный выбор для этого сценария. Я хотел бы добавить, что вы можете использовать базовый фрейм и визуальное наследование для создания общего интерфейса.
И ко второй части: вы проектируете фрейм как форму, но используете его как элемент управления, очень мало ограничений. Обратите внимание, что вы можете так же легко использовать Create / Free вместо Show / Hide. Что лучше, зависит от их ресурсоемкости.
Есть лучший способ обработки фреймов, которые не занимают почти столько же памяти. Очень элегантным решением может быть динамическое создание рамок. Вот как я это делал раньше.
В форме добавьте свойство и сеттер, который обрабатывает его размещение в форме:
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;
Это работает очень хорошо.
]У меня есть для вас слово: 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 потребовалось совсем немного времени. А у меня приложение работает как мечта.
Тимбо