Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как добавлять объекты динамически? ??????????? 
:(
    Опции темы
denmoroz
Дата 7.2.2006, 16:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 49
Регистрация: 10.12.2005

Репутация: нет
Всего: нет



Как добавлять объекты динамически? (Ну как в самом Delphi. Юзер кликнул на лэйбл и он появился на форме. Захотел ещё один - ещё раз кликнул. И тоже самое с Image.) smile smile smile smile smile
PM MAIL   Вверх
Демо
Дата 7.2.2006, 16:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 30
Всего: 50



Код

var
  Label: TLabel;
begin
  Label := TLabel.Create(Form1);
  Label.Caption := 'новая метка';
  Label.Left := 10;
  Label.Top := 20;
  Label.Parent := Form1;



--------------------
    
PM MAIL ICQ Skype   Вверх
StranikS
Дата 7.2.2006, 16:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 1.2.2006

Репутация: 1
Всего: 2



Код

var 
      MyLabel:TLabel;
      MyImage:TImage;

procedure FormClick(Sender: TObject);
begin
MyLabel:=TLabel.Create(Form1);
with MyLabel do begin
  Visible:=false;
  настраивам свойства
  ....
  Visible:=true;
  end;
end;


Аналогично для MyImage;

Для удаления:
Код

MyLabel.Destroy; MyLabel:=nil;

PM MAIL   Вверх
Romikgy
Дата 7.2.2006, 16:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 26
Всего: 146



Цитата(StranikS @ 7.2.2006, 15:33 Найти цитируемый пост)

MyLabel:=nil;

А это нужно? Разве
Цитата(StranikS @ 7.2.2006, 15:33 Найти цитируемый пост)

MyLabel.Destroy;

не делает этого?


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Демо
Дата 7.2.2006, 17:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 30
Всего: 50



Цитата(StranikS @ 7.2.2006, 17:33 Найти цитируемый пост)

Код

      MyLabel:TLabel;    
      MyImage:TImage;    
procedure FormClick(Sender: TObject);    
begin    
MyLabel:=TLabel.Create(Form1);    
with MyLabel do begin    
  Visible:=false;    
  настраивам свойства    
  ....    
  Visible:=true;    
  end;    
end;




Это рабочий код?

1. Строка с Visible := False не нужна, так как MyLabel и так не будет виден, пока свойство Parent не будет присвоено.
2. Visible:=true; - не поможет. Необходимо использовать свойство Parent.


--------------------
    
PM MAIL ICQ Skype   Вверх
Snowy
Дата 7.2.2006, 17:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Цитата(StranikS @ 7.2.2006, 16:33 Найти цитируемый пост)
MyLabel.Destroy; MyLabel:=nil;
Код

FreeAndNil(MyLabel);
- так безопасней.

Цитата(Romikgy @ 7.2.2006, 16:48 Найти цитируемый пост)
MyLabel.Destroy;
не делает этого?

Нет. Для этого и существует FreeAndNil.
PM MAIL   Вверх
Romikgy
Дата 7.2.2006, 17:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 26
Всего: 146



Цитата(Snowy @ 7.2.2006, 16:38 Найти цитируемый пост)

Для этого и существует FreeAndNil.

А разница между Free , Destroy, & FreeAndNil smile


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Snowy
Дата 7.2.2006, 18:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Цитата(Romikgy @ 7.2.2006, 17:56 Найти цитируемый пост)
А разница между Free , Destroy, & FreeAndNil

В любой книге по дельфи.
Destroy - уничтожает объект.
Free: if Self <> nil then Self.Destroy - безопасное уничтожение с проверкой.
FreeAndNil: Self.Free; Self:=nil; - безопасное уничтожение, с назначением nil для будующей корректной работы Free.
Код

  Obj.Destroy; // вызывает ошибку, если Obj <> nil;
  ObjFree; // убивает с проверкой
  Obj := TMyClass.Create;
  Obj.Free; // убивает с проверкой
  Obj.Free; // Ошибка - Obj <> nil, но и не существует.
  Obj := TMyClass.Create;
  FreeAndNil(Obj); // Убивает и зачищает
  Obj.Free; // не вызывает ошибки 

PM MAIL   Вверх
denmoroz
Дата 7.2.2006, 21:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 49
Регистрация: 10.12.2005

Репутация: нет
Всего: нет



Snowy набрал:


Код

var
MyLabel:TLabel;

procedure TForm1.TexturePanel1MouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
if form2.Image3.Visible=true then
begin
MyLabel:=TLabel.Create(Form1);
with MyLabel do begin
mylabel.Caption:=edit1.text;
mylabel.Left:=x;
mylabel.Top:=y;
mylabel.Parent := Form1;
end;
end;
end;


НЕ РАБОТАЕТ!!!!
PM MAIL   Вверх
Snowy
Дата 7.2.2006, 21:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Цитата(denmoroz @ 7.2.2006, 21:20 Найти цитируемый пост)
Snowy набрал:
Ничего я не набирал.

Могу предложить только типовой вариант:
Код
  with TLabel.Create(Form1) do begin
    Caption:='Муха';
    Left:= 10;
    Top := 10;
    Parent := Form1;
  end;

А в твоем коде у тебя похоже имага не висибле.
PM MAIL   Вверх
Romikgy
Дата 8.2.2006, 09:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 26
Всего: 146



Цитата(Snowy @ 7.2.2006, 17:17 Найти цитируемый пост)

с назначением nil

А для чего это нужно, если не секрет? smile


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Демо
Дата 8.2.2006, 10:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 30
Всего: 50



Цитата(Romikgy @ 8.2.2006, 10:53 Найти цитируемый пост)

А для чего это нужно, если не секрет?


Я думаю, что для повторно используемых переменных при создании объектов.


--------------------
    
PM MAIL ICQ Skype   Вверх
Snowy
Дата 8.2.2006, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Цитата(Romikgy @ 8.2.2006, 09:53 Найти цитируемый пост)
с назначением nil
А для чего это нужно, если не секрет?

Чтобы не получить ошибку на следующей попытке освободить.
Например:
Код

var
  MyLabel: Tlabel;
.....
procedure KillLabel;
begin
  FreeAndNil(MyLabel);
end;

procedure CreateLabel;
begin
  KillLabel;
  MyLabel := TLabel.Create;
  with MyLabel do begin    
    Caption:='Муха';    
    Left:= Random(Form1.Width);
    Top := 10;    
    Parent := Form1;    
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  CreateLabel;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  KillLabel;
end;

Например такая ситуация.
Мы можем сколько угодно убивать лабел - ничего не случится.
А вот, если мы заменим на MyLabel.Free - на втором же убийстве получим глюк.
В данном примере можно хоть обнажиматься второй батон - ничего не случится.
Принцип даже не в батоне, а в том, что мы логически в программе можем попытаться убить один объект несколько раз.
Вот для этого его и нужно зачищать.
PM MAIL   Вверх
Romikgy
Дата 8.2.2006, 11:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 26
Всего: 146



Тоесть при использовании Free & Destroy у нас указатель не обнуляется, а остается указывать на предыдущее место занятия памяти?


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Демо
Дата 8.2.2006, 11:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 30
Всего: 50



Цитата(Romikgy @ 8.2.2006, 12:51 Найти цитируемый пост)

а остается указывать на предыдущее место занятия памяти?


Так точно.
При этом стандартная функция Assigned() вернет True, хотя объект уже не существует.


--------------------
    
PM MAIL ICQ Skype   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0605 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.