Конференция "Компоненты" » Помогите разобраться с компонентом
 
  • recop © (23.12.09 01:04) [0]
    Ув. Мастера, помогите, пожалуйста, разобраться с состряпанным мной компонентом в качестве изучения, проблема в том, что при вызове из программы с помощью create компонент виден и вроде бы все нормально, в при перетаскивании из палитры компонентов появляется панель произвольных размеров, гды я промахнулся?


    unit EditButton;

    interface

    uses
     Forms, Buttons, StdCtrls, SysUtils, Classes, Controls, ExtCtrls;

    type
     TRecDirectorySelect = class(TCustomPanel)
     private
       { Private declarations }
       ReEdit1: TEdit;
       ReSpdBtn1: TSpeedButton;
       ReSpdBtn2: TSpeedButton;
       FMyInteger: Integer;

     protected
       { Protected declarations }
     public
       { Public declarations }
       constructor Create (AOwner: TComponent);
     published
       { Published declarations }
       //property Align;
       property Left;
       property Top;
       property Width;
       property Height;
       property Visible;
       property BevelOuter;
       property BevelInner;
       property Constraints;
       property BorderStyle;
       property ctl3D;
       property MyInteger: Integer read FMyInteger
         write FMyInteger default 2;
     end;

    procedure Register;

    implementation

    constructor TRecDirectorySelect.Create (AOwner: TComponent);
    begin
    inherited;

     Visible := true;
     Width := 200;
     Height := 21;
     FMyInteger := 1;
     Top:= 1;
     Left := 1;
     Constraints.MaxHeight := 23;
     Constraints.MinHeight := 21;

     BevelInner := bvNone;
     BevelOuter := bvNone;
     BorderStyle:= bsNone;
     BevelWidth := 1;
     Ctl3D := True;

     ReEdit1:= TEdit.Create(Self);
     ReEdit1.Parent := Self;
     ReEdit1.Align := alClient;
     ReEdit1.Visible := true;
     ReEdit1.ParentFont := False;
     ReEdit1.Top := 1;
     ReEdit1.Left := 1;
     ReEdit1.BevelOuter := bvNone;
     ReEdit1.BevelInner := bvNone;
     ReEdit1.ctl3D := True;

     ReSpdBtn1:= TSpeedButton.Create(Self);
     ReSpdBtn1.Parent := Self;
     ReSpdBtn1.Align := alRight;
     ReSpdBtn1.Flat := False;
     ReSpdBtn1.Caption := '1';

     ReSpdBtn2:= TSpeedButton.Create(Self);
     ReSpdBtn2.Parent := Self;
     ReSpdBtn2.Align := alRight;
     ReSpdBtn2.Flat := False;
     ReSpdBtn2.Visible := FMyInteger = 2;
     ReSpdBtn2.Caption := '2';

    end;

    procedure Register;
    begin
     RegisterComponents('recop', [TRecDirectorySelect]);
    end;

    end.


  • DimaBr © (23.12.09 08:56) [1]
    Что значит произвольных? При заброске на форму должен быть размер 200x21
  • DimaBr © (23.12.09 08:57) [2]
    Вот это, как то не стыкуется со следующим
    property MyInteger: Integer read FMyInteger write FMyInteger default 2;


    FMyInteger := 1;

  • DimaBr © (23.12.09 09:01) [3]
    Контролы, особенно наследников TControl, желательно создавать на уже созданном окне, так как они просто не могут "жить" без Parent-а. По этому лучше код создания контролов перенести в CreateWnd или SetParent
  • recop © (23.12.09 10:43) [4]

    > Вот это, как то не стыкуется со следующим
    > property MyInteger: Integer read FMyInteger write FMyInteger
    > default 2;
    > FMyInteger := 1;

    это добавлено позже и под экспериментом.

    Предложения по изменению или добавлению строк будет?
  • DimaBr © (23.12.09 12:50) [5]
    Каких строк ?
  • recop © (23.12.09 13:07) [6]
    По использованию CreateWnd или SetParent.
    Закончим пример скольким поможем.
  • DimaBr © (23.12.09 13:22) [7]
    Не понимаю, какой пример вам нужен ?

    Вот ваша ошибка
    constructor Create (AOwner: TComponent); override

  • recop © (23.12.09 14:15) [8]
    Отлично! Спасибо.
    Теперь небольшой пример по использованию параметра SpeedButton: Flat
    в данной композиции. Был-бы очень признателен. Еще раз спасибо!
  • DimaBr © (23.12.09 14:42) [9]
    У SpeedButton нет никакого параметраю Flat указывает на отображение кнопки (плоская/объёмная)
  • recop © (23.12.09 20:19) [10]
    Хорошо. Как наследовать свойство Flat (ReSpdBtn1, ReSpdBtn2) в данном компоненте.
  • recop © (23.12.09 20:34) [11]
    Или свойство Text у TEdit.
  • Игорь Шевченко © (23.12.09 21:58) [12]
  • recop © (23.12.09 23:01) [13]
    Вот вариант работает все, кроме CountButton, который отказывается переключаться на форме, в программе - нормально. Может кто знает что сделать.


    unit EditButton;

    interface

    uses
     Forms, Buttons, StdCtrls, SysUtils, Classes, Controls, ExtCtrls;

    type
     TCountButton = 1..2;
     TRecDirectorySelect = class(TCustomPanel)
     private
       { Private declarations }
       ReEdit1: TEdit;
       ReSpdBtn1: TSpeedButton;
       ReSpdBtn2: TSpeedButton;
       FCountButton: TCountButton;
       FText: string;
       FFlat: boolean;
       procedure SetCountButton(Value: TCountButton);
       procedure SetText(Txt: string);
       procedure SetFlat(Flat: boolean);
     protected
       { Protected declarations }
     public
       { Public declarations }
       constructor Create (AOwner: TComponent); override;
     published
       { Published declarations }
       property CountButton: TCountButton read FCountButton
       write SetCountButton;
       property Text: string read FText  write SetText;
       property Flat: boolean read FFlat  write SetFlat;
       property Left;
       property Top;
       property Width;
       property Height;
       property Visible;
       property BevelOuter;
       property BevelInner;
       property Constraints;
       property BorderStyle;
       property ctl3D;
     end;
    procedure Register;

    implementation

    constructor TRecDirectorySelect.Create (AOwner: TComponent);
    begin
    inherited Create(AOwner);
     AutoSize := False;
     Visible := true;
     Width := 200;
     Height := 21;
     Top:= 1;
     Left := 1;

     Constraints.MaxHeight := 23;
     Constraints.MinHeight := 21;
     FCountButton := 2;
     BevelInner := bvNone;
     BevelOuter := bvNone;
     BorderStyle:= bsNone;
     BevelWidth := 1;
     Ctl3D := True;

     ReEdit1:= TEdit.Create(Self);
     ReEdit1.Parent := Self;
     ReEdit1.Align := alClient;
     ReEdit1.Visible := true;
     ReEdit1.ParentFont := False;
     ReEdit1.Top := 1;
     ReEdit1.Left := 1;
     ReEdit1.BevelOuter := bvNone;
     ReEdit1.BevelInner := bvNone;
     ReEdit1.ctl3D := True;

     ReSpdBtn1:= TSpeedButton.Create(Self);
     ReSpdBtn1.Parent := Self;
     ReSpdBtn1.Align := alRight;
     ReSpdBtn1.Flat := False;
     ReSpdBtn1.Caption := '1';

     ReSpdBtn2:= TSpeedButton.Create(Self);
     ReSpdBtn2.Parent := Self;
     ReSpdBtn2.Align := alRight;
     ReSpdBtn2.Flat := False;
     ReSpdBtn2.Caption := '2';
     ReSpdBtn2.Visible := FCountButton = 2;

    end;

    procedure TRecDirectorySelect.SetCountButton(Value: TCountButton);
    begin
     if FCountButton <> Value then
     begin
       FCountButton := Value;
       ReSpdBtn2.Visible := FCountButton = 2;
       Repaint;
     end;
    end;

    procedure TRecDirectorySelect.SetText(Txt: string);
    begin
     if FText <> Txt then
     begin
       FText := Txt;
       ReEdit1.Text := Txt;
       Repaint;
     end;
    end;

    procedure TRecDirectorySelect.SetFlat(Flat: boolean);
    begin
     if FFlat <> Flat then
     begin
       FFlat := Flat;
       ReSpdBtn1.Flat := Flat;
       ReSpdBtn2.Flat := Flat;
       Repaint;
     end;
    end;

    procedure Register;
    begin
     RegisterComponents('recop', [TRecDirectorySelect]);
    end;

    end.

  • recop © (23.12.09 23:13) [14]

    > Игорь Шевченко ©   (23.12.09 21:58) [12]
    > recop ©   (23.12.09 20:19) [10]
    >
    > http://ln.com.ua/~openxs/articles/smart-questions-ru.html


    Ну вообще-то, я не программист, я только учусь, так, для себя ( в прошлом столетии увлекался в Dos'e Assembler'ом , Клипером'ом и т.д.. Объекты только входили в языки). Может не правильно и задал вопрос, но вы же поняли о чем спрашиваю, не хотите не отвечайте. Зачем же мордой в грязь?
  • Игорь Шевченко © (24.12.09 00:32) [15]

    > но вы же поняли о чем спрашиваю


    не понял
  • DimaBr © (24.12.09 12:03) [16]
    Код вполне рабочий. На вопрос почему кнопки не прячутся в дизайнере отвечу.

    Свойство Visible в дизайнере не действует. Это сделано намеренно, поскольку представьте, что вы бросили на форму панель, устанавливаете ей свойсто Visible := false и она пропадает с формы. Как после этого её редактировать.

    Для того чтобы прятать кнопки в дизайнере можно в момет изменения свойства CountButton:
    1. Создавать и уничтожать кнопки
    2. Изменять их ширину (на нулевую) и позиционировать
  • recop © (24.12.09 20:37) [17]

    > 2. Изменять их ширину (на нулевую) и позиционировать

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

    Еще хотелось спросить, как реализовать вложенные свойства подобно Font,  Constraints и т.п. Необходимо для свойств ReSpdBtn1 и ReSpdBtn12?
    Спасибо за понимание.
  • DimaBr © (25.12.09 08:39) [18]
    Посмотрите на реализацию кода самого свойства Font.
    Главное:
    1. Это должен быть наследник TPersistent
    2. Создаём свойство в конструкторе и уничтожаем в деструкторе (желательно обнулить)
    3. В критических случаях, при обращении к возможно не созданному или возможно уже уничтоженному свойству, проверяем его на  NIL
    4. Перекрытия метода Assign у свойства, дабы возможно было производить присваивание.
  • DimaBr © (25.12.09 08:42) [19]
    Если вы хотите вынести все свойства кнопок на поверхность компоента, сделайте два свойства-кнопки в секции published. Тогда они в инспекторе будут выглядеть как раскрывающиеся списки, и почитайте по SetSubComponent
  • recop © (25.12.09 22:35) [20]

    > сделайте два свойства-кнопки в секции published.


    А можно сослаться на пример или черкнуть строчку? Спасибо.
  • recop © (26.12.09 11:46) [21]

    > DimaBr ©   (25.12.09 08:42) [19]
    > Если вы хотите вынести все свойства кнопок на поверхность
    > компоента, сделайте два свойства-кнопки в секции published.
    >  Тогда они в инспекторе будут выглядеть как раскрывающиеся
    > списки, и почитайте по SetSubComponent


    Спасибо все получилось.
  • recop © (26.12.09 11:57) [22]
  • recop © (26.12.09 19:41) [23]
    Остался открыт единственный вопрос

    > DimaBr ©   (25.12.09 08:39) [18]
    >...
    > 2. Создаём свойство в конструкторе и уничтожаем в деструкторе
    >...


    Как?
  • DimaBr © (28.12.09 08:38) [24]
    Это высказывание относится к свойству наследника TPersistent, а не к свойству типа TComponent
 
Конференция "Компоненты" » Помогите разобраться с компонентом
Есть новые Нет новых   [134466   +3][b:0][p:0.004]