Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Динамическое создание объекта TLabel


Автор: Xela 1.9.2006, 13:33
Можно ли на видимой форме (Form1 - для определённости) динамически создать 
и отобразить объект типа TLabel ? Если да то Как если нет то Почему?

Автор: 586 1.9.2006, 13:42
в поиск. Вон внизу ссылки - открой первую

Автор: Akeem 1.9.2006, 18:20
А не проще просто кинуть на форму этот Лабел и сделать его невидимым.  икогда нужно его делать видимым и писать туда данные.
Мне кажется так будет самое ефективное.

Автор: stmamont 3.9.2006, 21:08
Akeem, все зависит от ситуации. Но хранить невидимые элементы - неэффективно, они все равно грузят память.

Автор: Greeen 3.9.2006, 22:08
Код

TLabel* lbl = new TLabel(this);
lbl->Parent = this;
lbl->Caption = "Label";
...

Автор: Akeem 5.9.2006, 18:02
stmamont, 
Я понял. Был не прав. 

Автор: Xela 7.9.2006, 10:06
Цитата(586 @ 1.9.2006,  13:42)
в поиск. Вон внизу ссылки - открой первую

Спасибо  smile  я рассмотрел этот пример

Автор: Xela 7.9.2006, 10:24
Цитата(Greeen @ 3.9.2006,  22:08)
Код

TLabel* lbl = new TLabel(this);
lbl->Parent = this;
lbl->Caption = "Label";
...

 smile - класс! Спасибо за ответ  smile 


Вопрос программистам - чем отличаются код предоставленный Greeen

Код

TLabel* lbl = new TLabel(this);
lbl->Parent = this;
lbl->Caption = "Label";
...


от такого

Код

TLabel* lbl = new TLabel(NULL);
lbl->Parent = this;
lbl->Caption = "Label";
...


??

Автор: Romikgy 7.9.2006, 10:47
Цитата(Xela @  7.9.2006,  09:24 Найти цитируемый пост)
TLabel* lbl = new TLabel(this);


Цитата(Xela @  7.9.2006,  09:24 Найти цитируемый пост)
TLabel* lbl = new TLabel(NULL);

вот разница
а это реализация
Код

constructor TComponent.Create(AOwner: TComponent);
begin
  FComponentStyle := [csInheritable];
  if AOwner <> nil then AOwner.InsertComponent(Self);
end;

Код

constructor TCustomLabel.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  ControlStyle := ControlStyle + [csOpaque, csReplicatable];
  Width := 65;
  Height := 17;
  FAutoSize := True;
  FShowAccelChar := True;
end;

и
if AOwner <> nil then AOwner.InsertComponent(Self);
это не выполнится , мож в этом косяк.

Автор: _hunter 7.9.2006, 10:48
отлияается тем, что в первом owner установлен, а во втором нет.

P.S.
ты видиш какие-то отличия в строказ 2-4? если нет -- зачем их приводить?

Автор: Vyacheslav 7.9.2006, 14:50
Отличается тем, что  при 
Код

TLabel* lbl = new TLabel(this);

назначен владелец, ответственный за уничтожение  созданного Label
Это Label будет автоматически уничтожен при уничтожении владельца (обычно форма).
Если такой вариант устраивает, то  самому уничтожать не надо. То есть  присутствие кода 
Код

delete lbl;

не являетсся обязательным. И даже при отсутсвии последнего CodeGuard утечек памяти не покажет smile


Второй вариант предполагает, что программист берет уничтожение на себя. То есть в коде где-то должно быть обязательно пресловутое
Код

delete lbl;


Добавлено @ 14:52 
Цитата(Romikgy @  7.9.2006,  10:47 Найти цитируемый пост)
if AOwner <> nil then AOwner.InsertComponent(Self);
это не выполнится , мож в этом косяк. 

И тот и другой вариант являются корректными

Автор: Xela 8.9.2006, 15:02
Цитата(Romikgy @ 7.9.2006,  10:47)
Код

constructor TComponent.Create(AOwner: TComponent);
begin
  FComponentStyle := [csInheritable];
  if AOwner <> nil then AOwner.InsertComponent(Self);
end;

Код

constructor TCustomLabel.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  ControlStyle := ControlStyle + [csOpaque, csReplicatable];
  Width := 65;
  Height := 17;
  FAutoSize := True;
  FShowAccelChar := True;
end;


Классно! Я понял  smile 

Практический вопрос:
В Delphi до приведённого Romikgy кода добраться несложно
(путём кликанья с нажатым Ctrl на нужные классы и затем поиска том же окне кода интересующего метода)

Как в С++ Builder быстро можно добраться до кода метода?

Автор: Romikgy 8.9.2006, 15:29
Цитата(Xela @  8.9.2006,  14:02 Найти цитируемый пост)

Как в С++ Builder быстро можно добраться до кода метода? 

имхо также, 
только ты не доберешься до VCL внутреностей так как весь код не был написан на си , а был портирован из дельфи кода( с возможностью подключения к С и небольшой доработкой) 
так что исходников ты не увидишь 
Цитата(Xela @  8.9.2006,  14:02 Найти цитируемый пост)
Я понял

Молодец.

Автор: Xela 8.9.2006, 16:01
Цитата(_hunter @  7.9.2006,  10:48 Найти цитируемый пост)
отлияается тем, что в первом owner установлен, а во втором нет.

Зачем оставлять такие поверхносные ответы? smile 

Цитата(_hunter @  7.9.2006,  10:48 Найти цитируемый пост)

P.S.
ты видиш какие-то отличия в строказ 2-4? если нет -- зачем их приводить?

Потому что так посчитал нужным  smile

Добавлено @ 16:03 
Цитата(Vyacheslav @ 7.9.2006,  14:50)
Отличается тем, что  при 
Код

TLabel* lbl = new TLabel(this);

назначен владелец, ответственный за уничтожение  созданного Label
Это Label будет автоматически уничтожен при уничтожении владельца (обычно форма).
Если такой вариант устраивает, то  самому уничтожать не надо. То есть  присутствие кода 
Код

delete lbl;

не являетсся обязательным. И даже при отсутсвии последнего CodeGuard утечек памяти не покажет smile


Второй вариант предполагает, что программист берет уничтожение на себя. То есть в коде где-то должно быть обязательно пресловутое
Код

delete lbl;


Добавлено @ 14:52 
Цитата(Romikgy @  7.9.2006,  10:47 Найти цитируемый пост)
if AOwner <> nil then AOwner.InsertComponent(Self);
это не выполнится , мож в этом косяк. 

И тот и другой вариант являются корректными

Спасибо  smile 

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