-
Ув. Мастера, помогите, пожалуйста, разобраться с состряпанным мной компонентом в качестве изучения, проблема в том, что при вызове из программы с помощью create компонент виден и вроде бы все нормально, в при перетаскивании из палитры компонентов появляется панель произвольных размеров, гды я промахнулся?
unit EditButton;
interface
uses
Forms, Buttons, StdCtrls, SysUtils, Classes, Controls, ExtCtrls;
type
TRecDirectorySelect = class(TCustomPanel)
private
ReEdit1: TEdit;
ReSpdBtn1: TSpeedButton;
ReSpdBtn2: TSpeedButton;
FMyInteger: Integer;
protected
public
constructor Create (AOwner: TComponent);
published
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.
-
Что значит произвольных? При заброске на форму должен быть размер 200x21
-
Вот это, как то не стыкуется со следующим property MyInteger: Integer read FMyInteger write FMyInteger default 2; FMyInteger := 1;
-
Контролы, особенно наследников TControl, желательно создавать на уже созданном окне, так как они просто не могут "жить" без Parent-а. По этому лучше код создания контролов перенести в CreateWnd или SetParent
-
> Вот это, как то не стыкуется со следующим > property MyInteger: Integer read FMyInteger write FMyInteger > default 2; > FMyInteger := 1;
это добавлено позже и под экспериментом.
Предложения по изменению или добавлению строк будет?
-
Каких строк ?
-
По использованию CreateWnd или SetParent. Закончим пример скольким поможем.
-
Не понимаю, какой пример вам нужен ? Вот ваша ошибка constructor Create (AOwner: TComponent); override
-
Отлично! Спасибо. Теперь небольшой пример по использованию параметра SpeedButton: Flat в данной композиции. Был-бы очень признателен. Еще раз спасибо!
-
У SpeedButton нет никакого параметраю Flat указывает на отображение кнопки (плоская/объёмная)
-
Хорошо. Как наследовать свойство Flat (ReSpdBtn1, ReSpdBtn2) в данном компоненте.
-
Или свойство Text у TEdit.
-
-
Вот вариант работает все, кроме CountButton, который отказывается переключаться на форме, в программе - нормально. Может кто знает что сделать.
unit EditButton;
interface
uses
Forms, Buttons, StdCtrls, SysUtils, Classes, Controls, ExtCtrls;
type
TCountButton = 1..2;
TRecDirectorySelect = class(TCustomPanel)
private
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
public
constructor Create (AOwner: TComponent); override;
published
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.
-
> Игорь Шевченко © (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'ом , Клипером'ом и т.д.. Объекты только входили в языки). Может не правильно и задал вопрос, но вы же поняли о чем спрашиваю, не хотите не отвечайте. Зачем же мордой в грязь?
-
> но вы же поняли о чем спрашиваю
не понял
-
Код вполне рабочий. На вопрос почему кнопки не прячутся в дизайнере отвечу.
Свойство Visible в дизайнере не действует. Это сделано намеренно, поскольку представьте, что вы бросили на форму панель, устанавливаете ей свойсто Visible := false и она пропадает с формы. Как после этого её редактировать.
Для того чтобы прятать кнопки в дизайнере можно в момет изменения свойства CountButton: 1. Создавать и уничтожать кнопки 2. Изменять их ширину (на нулевую) и позиционировать
-
> 2. Изменять их ширину (на нулевую) и позиционировать
По всей видимости это самый подходящий вариант, т.к. не придется манипулировать свойствами и событиями отсутствующей кнопки.
Еще хотелось спросить, как реализовать вложенные свойства подобно Font, Constraints и т.п. Необходимо для свойств ReSpdBtn1 и ReSpdBtn12? Спасибо за понимание.
-
Посмотрите на реализацию кода самого свойства Font. Главное: 1. Это должен быть наследник TPersistent 2. Создаём свойство в конструкторе и уничтожаем в деструкторе (желательно обнулить) 3. В критических случаях, при обращении к возможно не созданному или возможно уже уничтоженному свойству, проверяем его на NIL 4. Перекрытия метода Assign у свойства, дабы возможно было производить присваивание.
-
Если вы хотите вынести все свойства кнопок на поверхность компоента, сделайте два свойства-кнопки в секции published. Тогда они в инспекторе будут выглядеть как раскрывающиеся списки, и почитайте по SetSubComponent
|