Конференция "Компоненты" » Кнопка с предустановленными координатами [D7, WinXP]
 
  • Михаил74 © (22.12.08 12:08) [0]
    Добрый день!
    Создаю свой компонент - кнопку!
    Имеются ли способы предустановки координат кнопки в конструкторе компонента относительно формы-владельца?
    Отрывок кода...
    ...
    constructor TColorBtn.Create(AOwner: TComponent);
    begin
     inherited Create(AOwner);
     ...
     Left:=round((GetParentForm(Aowner as TControl).Name.Left)/2)-round(left/2); - ошибка компиляции "Record, object or class type required " - понятно чем вызвана! Но а как иначе реализовать это?
     ...
    end;
    ...
    Пример: "Мы кидаем на форму кнопку и она центруется посредите формы!" Какой способ поможет реализовать это?

    Спасибо!
  • Медвежонок Пятачок © (22.12.08 12:14) [1]
    Удалено модератором
  • {RASkov} © (22.12.08 12:15) [2]
    Left:=Round(GetParentForm(self).Width/2 - Width/2);
    :) А зачем такая кнопка(компонент)?)
  • Медвежонок Пятачок © (22.12.08 12:16) [3]
    Удалено модератором
  • Медвежонок Пятачок © (22.12.08 12:21) [4]
    Удалено модератором
  • Михаил74 © (22.12.08 12:24) [5]
    >>{RASkov} ©   (22.12.08 12:15) [2]
    Left:=Round(GetParentForm(self).Width/2 - Width/2);
    :) А зачем такая кнопка(компонент)?)
    << Так тоже пробовал...  - ошибка - Acces Violation... на этапе выполнения!

    >>Медвежонок Пятачок ©   (22.12.08 12:16) [3]
    и даже если получил парент форму, то накой тебе её лефт?
    для мебели?
    <<Продвинутый дизайн формы при динамическом создании экземпляров класса!
  • Медвежонок Пятачок © (22.12.08 12:24) [6]
    Удалено модератором
  • Медвежонок Пятачок © (22.12.08 12:26) [7]
    Удалено модератором
  • Медвежонок Пятачок © (22.12.08 12:29) [8]
    Удалено модератором
  • Михаил74 © (22.12.08 12:29) [9]
    Удалено модератором
  • Медвежонок Пятачок © (22.12.08 12:30) [10]
    Удалено модератором
  • Михаил74 © (22.12.08 12:30) [11]
    >>Медвежонок Пятачок ©   (22.12.08 12:29) [8]
    Так тоже пробовал...  - ошибка - Acces Violation... на этапе выполнения!
    нет парента вот и ав

    << Вот в том то и суть!
    Поэтому и спрашиваю сдесь!
  • Медвежонок Пятачок © (22.12.08 12:31) [12]
    Поэтому и спрашиваю сдесь!

    парент есть в сетпарент.
    а еще есть оунер, который в дизайнере есть всегда.
  • {RASkov} © (22.12.08 13:01) [13]
    Перекрой SetParent, там и центруй свою кнопку... по паренту - это может даже и лучше будет, чем по форме...
  • {RASkov} © (22.12.08 13:03) [14]
    Удалено модератором
  • Михаил74 © (22.12.08 13:16) [15]
    >>Во сказанул.... еще и поверят. :) В любом случае условие задачи - не в дугу)
    Нафик такие "продвинутые" компоненты не нужны :)
    <<В мире ИТ есть гласные и негласные законы, например ITIL и прочее..
    В Windows corp. есть негласный стандарт качества в сфере дизайна форм...
    Сравните оформление программ Windows и HP, например...
    В винде никаких кнопок-коротышек, сокращенных(порой непонятных надписей). В хъюлетский же Servce Desk-е порой не поймещь, что к чему!
    Но это к вопросу: "Нафига козе боян"!
    А на практике очень полезно иметь набор визуальных smart компонентов, которые сами аккуратно ложаться на форму с учетом расположения других компонентов...
  • {RASkov} © (22.12.08 13:21) [16]
    Удалено модератором
  • Михаил74 © (22.12.08 13:27) [17]
    Удалено модератором
  • Михаил74 © (22.12.08 14:13) [18]

    > Перекрой SetParent, там и центруй свою кнопку... по паренту
    > - это может даже и лучше будет, чем по форме...


    Ну хорошо, пусть будет вот так
    ...
    procedure TColorBtn.SetParent(AParent: TWinControl);
    begin
     inherited SetParent(AParent);
    end;
    ...
    Но дальше то что? Мне по-прежнему надо обращаться к методам и свойствам, но какой "переменной"? Ведь я все еще в режиме construktor<?
  • DimaBr © (22.12.08 14:19) [19]
    Решение довольно простое. Перекрыть SetBounds, в котором и отследить размеры и положение

    TMyButton = class(TButton)
     protected
       procedure SetBounds(ALeft, ATop, AWidth, AHeight: Integer);override;
       procedure SetParent(AParent: TWinControl);override;
    end;

    implementation

    { TMyButton }

    procedure TMyButton.SetBounds(ALeft, ATop, AWidth, AHeight: Integer);
    begin
     if Assigned(Parent) then begin
       ALeft := (Parent.Width - Width) div 2;
       ATop := (Parent.Height - Height) div 2;
     end;
     inherited;
    end;

    procedure TMyButton.SetParent(AParent: TWinControl);
    begin
     inherited;
     Left := Left;
    end;

    procedure TForm1.FormClick(Sender: TObject);
    begin
     TMyButton.Create(self).Parent := Form1;
    end;

  • DimaBr © (22.12.08 14:41) [20]
    Если же нужно именно в конструкторе и при заброске на форму, то естественно по другому, например так

    procedure TMyButton.CreateWnd;
    var f: TCustomForm;
    begin
     inherited;
     f := GetParentForm(self);
     if F is TCustomForm then begin
       Left := (TCustomForm(F).width - Width) div 2
     end;
    end;

  • Михаил74 © (22.12.08 16:17) [21]
    Всем огромное спасибо за помощь...
    Особенно DimaBr...
    Даже перекрывать ничего не пришлось...
    Последний пример очень помог, только вместо self - GetParentForm(Aowner as TControl)
    Вот что в итоге получилось, :
    ...
    constructor TColorBtn.Create(AOwner: TComponent);
    var f: TCustomForm;
    begin
     inherited Create(AOwner);
     ...
     f := GetParentForm(GetParentForm(Aowner as TControl));
     if F is TCustomForm then begin
       Left := (TCustomForm(F).width - Width) div 2;
     end;
     ...
    end;
  • Игорь Шевченко © (22.12.08 23:32) [22]

    > procedure TMyButton.SetParent(AParent: TWinControl);
    > begin
    >  inherited;
    >  Left := Left;
    > end;


    Left:=Left не нравится.

    Может AdjustSize ?
 
Конференция "Компоненты" » Кнопка с предустановленными координатами [D7, WinXP]
Есть новые Нет новых   [134464   +62][b:0][p:0.001]