Конференция "Компоненты" » Изменение размеров наследников от TControl в run-time. [D7, WinXP]
 
  • Алёнка (10.04.07 07:45) [0]
    Плиз помогите. В универе препод достал. Кто-нить знает, как реализовать возможность, изменения размеров визуальных компонентов (например TPanel) за маркеры в Run - Time.
  • DimaBr (10.04.07 13:34) [1]
    Отвечаю на вопрос - Я знаю !
  • Алёнка (11.04.07 05:21) [2]
    Примерчик можно. А то от того что ты знаешь мне легче не стало.
  • Алёнка (11.04.07 06:40) [3]
    Блин, что-то накопала... ведь правильно говорят, если кто-то(DimaBr) знает, то он все равно не подскажет.

    Есть свойство у TControl'a наследуемое от TComponent:

    type TComponentState = set of (csLoading, csReading, csWriting, csDestroying, csDesigning, csAncestor, csllpdating, csFixups, csFreeNotification, cslnline, csDesignlnstance); property ComponentState: TComponentState;

    Которое дает представление о текущем состоянии компонента. Состояние может измениться в результате получения компонентом некоторого сообщения, действий разработчика, выполнения акции и т. д. Это свойство активно используется средой разработки.

    Вопрос как Run-Time (во время выполнения программы)  в классе TControl,  в свойство ComponentState включит csDesigning (ведь свойство доступно только для чтения). Тогда, я предполагаю, должны появиться маркеры, за которые можно менять размеры любого визуального компонента при помощи мышки... Я права? Плиз помогите....
  • DimaBr (11.04.07 09:11) [4]

    > ведь правильно говорят, если кто-то(DimaBr) знает, то он все равно не подскажет.

    Вот тут вы ошибаетесь... неправильно говорят. Я просто ответил на ваш вопрос.

    > "большая тирада....."
    >  Я права? Плиз помогите....

    Не не правы. Свойство ComponentState изменить нельзя. Оно показывает в каком состоянии находится компонент и предназначено в основном для разработчиков компонентов, дабы изменить поведение в тот или иной промежуток времени.

    В вашем случае нужно создать "дизайнер форм" - некий редактор который будет отрисовывать (скорее всего позиционировать восемь маленьких чёрненьких панелек) вокруг Активного контрола и изменять его размеры.

    Где-то я видел готовый "дизайнер" с исходниками.
  • Алёнка (11.04.07 10:31) [5]
    Есть не визуальный компонент Runtime Edition Components (Trial версия). Вот там есть все то, что мне нужно. Я его скачала, но там нет исходников тока .dcu файлы... так, что вопрос остается открытым...
  • Юрий Зотов © (11.04.07 12:46) [6]
    > Алёнка   (11.04.07 10:31) [5]

    Никакие свойства никаких контролов сами по себе этого не позволяют. Это делает среда разработки, она же создает и маркеры. Вот среду Вам и нужно писать.

    Задачка это среднему студенту вряд ли по зубам (видимо, сильно Вы достали этого препода, раз он тоже решил Вас достать и подкинул такую каверзу). Поэтому вижу лишь один выход - найти готовое решение (правда, надо будет еще в нем разобраться, иначе могут быть проблемы с защитой).

    Загляните, например, сюда: http://www.dream-com.com
  • DimaBr (11.04.07 14:17) [7]
    Думаю ничего сложного.
    Создаём компонент, который перехватывает событие Screen.OnActiveControlChange

    procedure TMyComponent.Create(AOwner: TComponent);
    begin
     OldActiveControlChange = Screen.OnActiveControlChange;
     Screen.OnActiveControlChange := MyActiveControlChange;
    end;

    procedure TMyComponent.MyActiveControlChange(Sender: TObject);
    begin
     OldActiveControlChange(Sender);
     ActiveControl := TControl(Sender);   // запомним в свойстве
    //  тута мы отловили изменение активного контрола на форме
    //  нужно спозиционировать 8 заранее созданных квадратиков по размерам
    //  нового контрола
     FocusSizeMark;
    end;

  • Юрий Зотов © (11.04.07 14:32) [8]
    > DimaBr   (11.04.07 14:17) [7]

    Осталось только научить этот компонент перехватывать еще и графические контролы, в также создавать удалять маркеры, таскать контролы и группы контролов, менять размеры контролов перетаскиванием маркеров. И чтобы щелчок по самому маркеру не вызывал нашего события. И чтобы юзер не вздумал это событие перекрыть.
    :о)

    Дима, я думаю, что каждому из нас тут работы хватит дней на несколько. И что средний студент с такой задачкой вряд ли вообще справится.
  • DimaBr (11.04.07 15:01) [9]

    >  каждому из нас тут работы хватит дней на несколько

    Согласен, просто обидно за фразу
    ведь правильно говорят, если кто-то(DimaBr) знает, то он все равно не подскажет
  • Юрий Зотов © (11.04.07 15:52) [10]
    > DimaBr   (11.04.07 15:01) [9]

    Дык... сам ведь напросился... в [1]... на что же обижаться-то?
    :о)
  • DimaBr (11.04.07 16:28) [11]

    > на что же обижаться-то?

    Просто зачастую на форумах много флейма из чего и вытекает такая предубеждённость. Однако глядя на количесто закрытых тем и порезанных сообщений видно что модератор не спит. Ура модератору !!!
  • Алёнка (12.04.07 08:43) [12]
    Спасибо DimaBr и Юрию Зотову. Событие Screen.OnActiveControlChange и http://www.dream-com.com это уже кое что... уже на Вашу помощь и не надеялась... приятно удивлена... попробую сама написать... хоть и “середничек” (звучит обидно) По ходу написания (думаю в ближайшие два-три дня) буду задавать вопросы по это теме и прошу всех кто хоть как-то может помочь, не стесняться...
  • DimaBr © (12.04.07 10:20) [13]
    Учтите, что Screen.OnActiveControlChange срабатывает при смене фокуса, а для TGraphicsControl фокус не меняется, так как они вообще окном не обладают
  • Алёнка (13.04.07 09:37) [14]
    Все вроде наконец сделала... правда кое-то помогал.
 
Конференция "Компоненты" » Изменение размеров наследников от TControl в run-time. [D7, WinXP]
Есть новые Нет новых   [134428   +40][b:0][p:0.001]