-
Здравствуйте, У меня в компоненте есть поле FNextAction: TAction; я его создаю в конструкторе компонента: FNextAction := TAction.Create(Self); Так вот если теперь кинуть, допустим, кнопку на форму, то список Action у кнопки будет пуст. Видимо надо сделать что-то еще(кроме создания). Что? ЗЫ RegisterActions как я понял это не то.
-
When instantiating TAction at runtime, assign a TActionList or TActionManager component to the new action’s ActionList property after calling Create.
-
> assign a TActionList or TActionManager
А если я не хочу?
-
То есть он мне не нужен или подругому никак? То есть я внутри компонента завиду еще поле типа TActionList, создам его и назначу так?
-
Инспектор объектов при открытии св-ва Action некоего контрола с целью редактирования просматривает список существующих объектов класса TActionList, чей Owner есть та же самая форма, которой принадлежит этот контрол. Делай выводы ...
-
> чей Owner есть та же самая форма, которой принадлежит этот > контрол.
То есть при создании TActionList я должен указать Owner не Self , а Self.Owner (Компонент мой не визуяльный). Вроде понятно
-
> То есть при создании TActionList я должен указать Owner > не Self, а Self.Owner
Не Self.Owner, а ссылку на форму, которая прямо или косвенно владеет твоим компонентом.
Заметь, что компонент м.б. "брошен" не непосредственно на форму, а, например, на TPanel на этой форме. В этом случае Owner'ом твоего компонета буде панель, а не сама форма.
Думаю, прежде чем создавать свой TActionList, следует поискать на форме уже существующие ActionList'ы, дабы не плодить лишний.
-
> Заметь, что компонент м.б. «брошен» не непосредственно на > форму
Я о том и спрашиваю. А как её получить эту «сылку на форму»?
-
> как её получить эту «сылку на форму»?
var AOwner: TComponent; .. AOwner := Owner; while Assigned(AOwner) and not (AOwner is TForm) do AOwner := AOwner.Owner;
-
Чтобы стало видно нужно создать его на форме. Имея компонент на форме, очень легко выбрать его в инспекторе и нажать кнопочку Delete. Что будет потом ? Скорее всего AV. Оно вам нужно ??? Попробуйте найти другое решение...
-
> Попробуйте найти другое решение
Что я хочу вообще. Есть объект А и много объектов Б . А знает какой из Б сейчас текущий . И есть кнопка . В А и в каждом Б есть событие. Как они должны создаваться я пока не понимаю. Бросив на фому компонент А человек получает возмлжность установить кнопке событие А . Он это делает
Далее при смене текущего Б событие назначеное кнопке изменяется. Оно берётся из Б . Смыс в чем: 1. Если сейчас текущий объект типа Б = Б1 . То: Б1.Enabled := False дисэйблит кнопку. 2. Допустип у Б2 Caption = 'Привет'. Тогда при установлении Б2 текущим на кнопке появися «Привет». Вот как-то так.
-
> [8] Сергей М. © (09.07.07 11:00)
Ясно.
-
Непонятно? Раньше я использовал такую вешь: TActionState = class(TPersistent)
strict private
FVisible: Boolean;
FEnabled: Boolean;
FChecked: Boolean;
FCaption: string;
strict protected
procedure AssignTo(Dest: TPersistent); override;
public
constructor Create;
published
property Visible: Boolean read FVisible write FVisible default True;
property Enabled: Boolean read FEnabled write FEnabled default True;
property Checked: Boolean read FChecked write FChecked default False;
property Caption: string read FCaption write FCaption;
end; И компонент Б имел свйоство типа TActionState . А в событии OnShow компонента Б писал: NextButton.Caption := Sender.NextActionState.Caption;
NextButton.Visible := Sender.NextActionState.Visible;
NextButton.Enabled := Sender.NextActionState.Enabled; Недостаток 1 если изменил Сво-во Enabled, то оно не вступит в силу пока не произайдет OnShow. А с Action все синхранизируется сразу. Поэтому я с ними и мучаюсь.
-
> Бросив на фому компонент А человек получает возмлжность установить кнопке событие А
несвязанное предложение Вообще непонятен ход вашей мысли. Это что, всё тот же визард ???
-
> Это что, всё тот же визард ???
Да. Я тот использовал в двух проектах. Выявились недостатки. Теперь устроняю. :) Начал с того, что устраняю неудобство [12]. Как с этим разберусь буду мучать вас про коллекции :). Если сан не пойму. > Вообще непонятен ход вашей мысли.
Вот вы кинули на форму TActionList . Создали там Action1 . Смотрике в кнопке в поле Action появилясь возможность выбрать Action1 . Аналогично. Бросили на форму мой визард. Смотрике в кнопке в поле Action появилась возможность выбрать NextStepAction . То есть это действие уже находится и обрабатывается самим визардом. Оно в нем уже есть. Осталось только назначить его контролу.
-
-
Наверное не мешало бы переписать редактор дабы эти Action-ы нельзя было удалить из него.
-
По-моему, логичнее у невизуального визарда опубликовать св-во ButtonNext: TControl для связи с визуальным объектом, отвечающми за кнопку далее, у которой динамически менять обработчик OnClick.
Да и сам визард логичнее унаслежлвать от TActionList - код то пользователь компонента для каждого щага где-то должен писать, да и отпадет вопрос "Как с этим разберусь буду мучать вас про коллекции "
> Недостаток 1 — если изменил Сво-во Enabled, то оно не вступит > в силу пока не произайдет OnShow. > А с Action все синхранизируется сразу. Поэтому я с ними > и мучаюсь.
никто не мешает вызвать метод TMyWizard.Show(Self) в любом другом методе TMyWizard, который может изменить св-ва визуальных контролов, как это делается повсеместно в VCL (напр., Invalidate, Repaint, Refresh)
-
> Тогда при создании компонента создаём нужный Action, и > пересоздаём при удалении в дизайнере если конечно не удаляется > сам визард
Не понял. 1. Смысл то в чем(раз уж вы раскрыли что это визард :) ). У визара есть 3 св-ва Action (назад, вперёд, отмена) книув визард человек получает возможность назначить эти св-ва контролам. 2. Далее у каждого шага визарда есть тоже 3 Action но их назначить нельзя, их чел. меняет как хочет(назвние, видимость). Итак имея возможность (1) чел назначил кнопкам Action'ы визарда. А что надо делать при смене шага? Надо чтобы к кнопкам применились Action'ы из тек. шага. Иначе нельзя будет писать Step.NextAction.Enabled := False; . То есть надо сделать: Wizzard.Action := Step.Action А куда денуться Action визарда? Что-то я неврублюсь ка сделать :(
-
> Наверное не мешало бы переписать редактор дабы эти Action- > ы нельзя было удалить из него.
А разве до него получится добраться? Про наличие ActionList вообще никто не узнает. > По-моему, логичнее у невизуального визарда опубликовать > св-во ButtonNext: TControl
Это вариант проще у Action больше свойств(checked например). Вдруг я не только кнопки менять буду. И потом что делать с Caption ?
|