Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Проблемма в компоненте


Автор: Ak47black 20.9.2006, 21:19
Здравствуйте у меня следушая проблемма.
Когда я пытаюсь создать компоненты в процедуре Create и заполнить их параметры собсвенными свойствами компонента, то они оказываются пустые  smile
Вот примерно что я делю. 
Код

constructor TUnitedLabel.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FPicture := TPicture.Create;
  Self.ControlStyle:= Self.ControlStyle + [csAcceptsControls];
  FLabelT:= TFlashLabel.Create(Self);
  FImage:= TImage.Create(Self);
  FLabelT.Parent:= Self;
  FImage.Parent:= Self;
  FImage.Left:= 12;
  FImage.Top:= 0;
  FImage.Width:= 16;
  FImage.Height:= 16;
  FLabelT.Left:= 35;
  FLabelT.Top:= 8;
  FLabelT.Caption:= FText;
  FImage.Picture:= FPicture;
  Self.ControlStyle:= Self.ControlStyle - [csAcceptsControls];
  Showmessage(FText); //тут выдаеться сообшение строки FText которая должна содержать текст но она пустая  :(
end;

В чем тут дело.

Автор: Romikgy 20.9.2006, 21:46
Цитата(Ak47black @  20.9.2006,  20:19 Найти цитируемый пост)
FText

А откуда возьмется в этой переменой строка?

Автор: Ak47black 20.9.2006, 21:47
Цитата(Romikgy @ 20.9.2006,  21:46)
Цитата(Ak47black @  20.9.2006,  20:19 Найти цитируемый пост)
FText

А откуда возьмется в этой переменой строка?

Код

type
  TUnitedLabel = class(TCustomControl)
  private
    procedure SetPicture(Value: TPicture);
  protected
    FPicture: TPicture;
    FImage: TImage;
    FLabelT: TFlashLabel;
    FText: String;
    procedure Click; override;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    procedure AfterConstruction; override;
  published
    property Picture: TPicture read FPicture write SetPicture;
    property Text: string read FText write FText;
  end;

Автор: Romikgy 20.9.2006, 21:54
дык при конструтровании /создании все переменые имхо нулевые, а потом ты их заполняешь!
Код

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

FText:='Vasya pupkin';

  FPicture := TPicture.Create;
  Self.ControlStyle:= Self.ControlStyle + [csAcceptsControls];
  FLabelT:= TFlashLabel.Create(Self);
  FImage:= TImage.Create(Self);
  FLabelT.Parent:= Self;
  FImage.Parent:= Self;
  FImage.Left:= 12;
  FImage.Top:= 0;
  FImage.Width:= 16;
  FImage.Height:= 16;
  FLabelT.Left:= 35;
  FLabelT.Top:= 8;
  FLabelT.Caption:= FText;
  FImage.Picture:= FPicture;
  Self.ControlStyle:= Self.ControlStyle - [csAcceptsControls];
  Showmessage(FText); //тут выдаеться сообшение строки FText которая должна содержать текст но она пустая  :(
end;

Автор: Ak47black 20.9.2006, 21:56
А при какой или после какой процедуры они запалняються ?
Ранее установленые в редакторе delphi.

Автор: Snowy 20.9.2006, 21:58
Цитата(Ak47black @  20.9.2006,  21:19 Найти цитируемый пост)
тут выдаеться сообшение строки FText которая должна содержать текст но она пустая
Ну так, а где в коде ты присваиваешь ей значение?

Автор: Romikgy 20.9.2006, 21:59
А как ты создаешь компонент? кидаешь на форму?

Автор: Snowy 20.9.2006, 22:01
Цитата(Ak47black @  20.9.2006,  21:56 Найти цитируемый пост)
Ранее установленые в редакторе delphi.
А при чём тут FText?
Где он установлен?
То, что установлено в редакторе работает только на published свойства.
Причем эти данные подгружаются после создания компонента.
то есть в конструкторе назначаются дефолтовые свойства.
А назначенные в design-time назначаются уже после отработки конструктора.

Автор: Ak47black 20.9.2006, 22:01
А какая процедура идет после конструктора ?
Что-бы можно было присвойть к созданому компаненту.
Или как по другому делать ?
Цитата

А как ты создаешь компонент? кидаешь на форму? 

Да.

Автор: Romikgy 20.9.2006, 22:10
Цитата(Ak47black @  20.9.2006,  21:01 Найти цитируемый пост)
А какая процедура идет после конструктора ?
Что-бы можно было присвойть к созданому компаненту.

навернок onPaint надо обрабатывать

Автор: Ak47black 20.9.2006, 22:18
onPaint заработало.
Появилась следушая проблемма при 
Код

  FLabelT.Caption:= FText;
  FImage.Picture:= FPicture; //с этой строкой начинает вистуть 

Я предполаю что это происходит потому-что начинает OnPaint повторяеться и зависает в итоге.
Что мне тут делать?

Добавлено @ 22:32 
Решил при помоши 
Код

  Canvas.Draw(0,0,FPicture.Graphic);

Спасиба всем кто участовал.

Автор: Romikgy 20.9.2006, 22:35
Цитата(Ak47black @  20.9.2006,  21:18 Найти цитируемый пост)
 FImage.Picture:= FPicture; 

поставь условие если одно и тоже то не выполняй присваивание, но вроде есть что то типа UpdateBegin &Updateend

Автор: Snowy 20.9.2006, 22:46
В конструкторе создай все компоненты и назначь дефолтовые свойства.
Всё остальное за тебя подгрузят.
Если есть зависимости - используй инкапсуляцию.
Поставь функцию на установку проперти - она вызовется при загрузке.

Добавлено @ 22:47 
Вешать на онпаинт - некрасиво.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)