Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #16  
Старый 16.08.2012, 14:16
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,907
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

Цитата:
Сообщение от poli-smen
В какой версии Delphi? У меня в Delphi 7 не проверяет:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  pn, pn2, pn3: TPanel;
begin
  pn:=TPanel.Create(nil);

  pn2:=TPanel.Create(nil);
  pn3:=TPanel.Create(nil);

  pn2.InsertComponent(pn);
  pn3.InsertComponent(pn);

  pn2.Free;
  pn3.Free;
end;
Выдаёт ошибку: Access violation at address 00000000. Read of address 00000000.



XE
Код:
procedure TComponent.InsertComponent(AComponent: TComponent);
begin
  AComponent.ValidateContainer(Self);
  if AComponent.FOwner <> nil then
    AComponent.FOwner.RemoveComponent(AComponent);
  ValidateRename(AComponent, '', AComponent.FName);
  Insert(AComponent);
  AComponent.SetReference(True);
  if csDesigning in ComponentState then
    AComponent.SetDesigning(True);
  Notification(AComponent, opInsert);
end;

и приведенный код не валится.
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
  #17  
Старый 16.08.2012, 14:39
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Aristarh Dark
XE
Код:
procedure TComponent.InsertComponent(AComponent: TComponent);
begin
  AComponent.ValidateContainer(Self);
  if AComponent.FOwner <> nil then
    AComponent.FOwner.RemoveComponent(AComponent);
  ValidateRename(AComponent, '', AComponent.FName);
  Insert(AComponent);
  AComponent.SetReference(True);
  if csDesigning in ComponentState then
    AComponent.SetDesigning(True);
  Notification(AComponent, opInsert);
end;

и приведенный код не валится.
Значит таки "допилили" этот метод
В Delphi 7 всё тоже самое, за исключением отсутствия вот этого:
Код:
  if AComponent.FOwner <> nil then
    AComponent.FOwner.RemoveComponent(AComponent);
Так что всё же лучше не злоупотреблять этим методом.
Ответить с цитированием
  #18  
Старый 16.08.2012, 16:04
Alexs55 Alexs55 вне форума
Прохожий
 
Регистрация: 11.07.2012
Сообщения: 14
Репутация: 10
По умолчанию

Всем огромное СПАСИБО. Очень интересно было читать Вашу переписку. Что ещё ни до конца понял, найду в интернете, в книгах или разберусь сам.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 15:34.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025