Конференция "Компоненты" » Как это делается? [D7, WinXP]
 
  • logslava (26.07.07 16:07) [0]
    Подскажите пожалуйста..

    Мне необходимо создать компонент состоящий из двух МЕМО и одного СКРОЛЛБАРА. При движении СКРОЛЛБАРА оба МЕМО должны двигаться синхронно.

    Вопрос вот в чем. Как организовать наследование? Создать класс, включающий оба МЕМО, тогда от кого наследовать? Или как-то иначе, например наследника от TMemo, включающего другой MEMO?

    Как лучше?
  • Darvin © (26.07.07 16:22) [1]
    Наследоваться от TCustomPanel?
    Рисовать на них два мемо пропорционально размером панели?
    Справа общий скроллбар.
    Обрабатывать события от скроллбара и двигать мемо
  • logslava (26.07.07 16:28) [2]
    А МЕМО создавать на панели динамически в конструкторе?

    А в дизайнере как такой компонент будет выглядеть или как некая панель? Действительно, как два мемо?
  • Darvin © (26.07.07 16:33) [3]
    >А МЕМО создавать на панели динамически в конструкторе?
    да

    >А в дизайнере как такой компонент будет выглядеть или как некая панель? Действительно, как два мемо?
    Думаю, как два мемо со скроллбаром. Пробовать надо...
  • Darvin © (26.07.07 16:35) [4]
    Можно другой контейнер использовать, не панель, и на нем выводить.

    А почему именно компонент? Почему не фрейм?
  • Kolan © (26.07.07 16:35) [5]
    Как на счёт ScrollBox вместо панели?
  • Darvin © (26.07.07 16:37) [6]
    можно и ScrollBox
  • logslava (26.07.07 16:53) [7]
    Попробовал через фрейм - то что надо. Щас попробую наследоваться от панели...
  • logslava (26.07.07 17:12) [8]
    чегой-то не отображается мое мемо (на форме выглядит как чистая панель):

    // это сам компонент
    type
     TTestPanel = class(TCustomPanel)
         Memo1 : TMemo;
         public constructor Create(AOwner: TComponent);
     end;

    implementation

    { TTestPanel }

    constructor TTestPanel.Create;
    begin
       Memo1 := TMemo.Create(AOwner);
       Memo1.Parent := Self;
    end;

    // это использование
    type
     TForm1 = class(TForm)
         TestPanel1: TTestPanel;
     end;

    Конструктор почему-то не выполняется??
  • Darvin © (26.07.07 17:27) [9]
    >Попробовал через фрейм - то что надо
    Вот и пользуйся на здоровье ;-)
  • Kolan © (26.07.07 22:29) [10]
    > TTestPanel = class(TCustomPanel)
    >     Memo1 : TMemo;
    >     public constructor Create(AOwner: TComponent);
    > end;

    Ужасная запись. Расставляте секции правлино…

    constructor TTestPanel.Create;
    begin
      Memo1 := TMemo.Create(AOwner);
      Memo1



    А координаты и ширину задал?
  • {RASkov} © (27.07.07 05:20) [11]
    > А координаты и ширину задал?

    Да они вообще-то уже заданы в предках.... Что-то он(автор) темнит в [8]... так как там синтаксически верно написано....
    кроме, конечно, вот этого:

    > // это использование
    > type
    > TForm1 = class(TForm)
    >     TestPanel1: TTestPanel;
    > end;

    Какое-ж это использование :) Это описание....

    Подозреваю, что это все пробывалось автором без установки компонента, ручным созданием своего "детища" и не указав ему родителя....

    > logslava
    А нужен он вообще этот компонент, зачем писать "никчемные" компоненты, все что в [0] написано - все это именно так и решаеться, т.е. взять пару Мемо и скролбар и все, зачем их лепить в один компонент?
    В соседней ветке наподобие компонент "лепился", т.н. "переляпывался"... наподобие - это к тому, что "никчемный"...)
  • {RASkov} © (27.07.07 05:26) [12]
    > Подозреваю, что это все пробывалось автором без установки
    > компонента, ручным созданием своего "детища" и не указав
    > ему родителя....

    Хотя говорит, что

    > чегой-то не отображается мое мемо (на форме выглядит как
    > чистая панель
    ):

    Тогда фик его знает, что там у него не так....(
  • DimaBr © (27.07.07 11:24) [13]

    type
    TMyControl = class(TWinControl)
     private
       Memo1,Memo2: TMemo;
       Scroll: TScrollBar;
     public
       constructor Create(AOwner: TComponent);override;
    end;

    constructor TMyControl.Create(AOwner: TComponent);
    begin
     inherited Create(AOwner);
     Memo1 := TMemo.Create(self);
     Memo1.Align := alLeft;
     Memo1.Parent := self;
     Memo2 := TMemo.Create(self);
     Memo2.Align := alClient;
     Memo2.Parent := self;
     Scroll := TScrollBar.Create(self);
     Scroll.Kind := sbVertical;
     Scroll.Align := alRight;
     Scroll.Parent := self;
     SetBounds(0,0,300,200);
    end;

  • logslava (27.07.07 13:08) [14]
    Отчет о проделанной работе: :)

    Вся проблема была в том, что я не указал оверрайд для конструктора (а в посте [8] еще и инхеритед).

    После добавления компонент кидается на форму и выглядит действительно как два мемо, т.к. тело конструктора выполняется в момент "кидания" на форму.

    Спасибо DimaBr, ваш пример показал в каком месте я дурак,
    Darvin, спасибо за ответы!

    2 {RASkov} > зачем писать "никчемные" компоненты
    затем, я полагаю, чтобы потом уметь написать "кчемные" :)

    2 Kolan
    За стиль уж простите, ляпил на скорую руку
  • DimaBr © (27.07.07 15:18) [15]
    В принципе, я тоже думаю что компонент вряд ли будет жить. Первое что приходит на ум - допустим в первом мемо 10000 строк а во втором 100. Корректно спозиционироваться с помощью сколера будет тяжеловато
  • logslava (27.07.07 15:26) [16]
    2 DimaBr
    согласен полностью - все это далеко от совершенства,
    но повторюсь "я ведь енто не для денег, я ведь енто для души" (цитируя Л.Филатова)
  • {RASkov} © (27.07.07 15:36) [17]
    > [14] logslava   (27.07.07 13:08)
    > 2 {RASkov} > зачем писать "никчемные" компоненты
    > затем, я полагаю, чтобы потом уметь написать "кчемные" :)

    Хорошо.... тогда напиши этот по полной.... например учитывай, что одно из Мемо(ы):) можно проскролировать с, например, клавиатуры... или мышью в режиме выделения, или еще как.... вообщем чтоб второй скролировался синхронно....
    Так же по поводу разницы кол-ва Lines из [15] (совет: можно скролинг сделать процентным и со значением у скролбара Мин=0 и Макс=100 делать соответствующий скрол обоим Мемо), и еще много другого учти.....
    Или всего этого не надо? Тогда лучше возьми более полезную задумку для написания и изучения......

    ЗЫ Ну сам посмотри.... ничего "полезного" или нового в твоем компоненте реально нет, более того, такой компонент нигде практически не используется, а если понадобится, то все реализуется с уже готовыми компонентами в программе... Удачи.
 
Конференция "Компоненты" » Как это делается? [D7, WinXP]
Есть новые Нет новых   [119261   +45][b:0][p:0.001]