Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.06.2008, 18:45   #1
Черничный
Форумчанин
 
Регистрация: 27.01.2007
Сообщений: 293
По умолчанию Динамичесое создание объекта

объект.Create(owner) ?
объект.Create(nil) ?
объект.Create(handle) ?
Черничный вне форума Ответить с цитированием
Старый 29.06.2008, 18:49   #2
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Цитата:
Сообщение от Черничный Посмотреть сообщение
объект.Create(owner) ?
объект.Create(nil) ?
объект.Create(handle) ?
объект.Create(owner) или объект.Create(nil) в зависимости от того, как Вы хотите управлять объектом. Если Owner указан, то он и удаляет объект. Если nil, то удалять его Вы будете сами.
alexBlack вне форума Ответить с цитированием
Старый 29.06.2008, 19:21   #3
Черничный
Форумчанин
 
Регистрация: 27.01.2007
Сообщений: 293
По умолчанию

у меня был pagecontrol было owner. на первой странице я давил батн и создавалась еще одна страница и на ней кнопка с для удаления этой страницы. Все работало. а активной вкалдкой становилась последняя. Но когда было много вкалдоки я давил удалить удалить на последней стрнице, то вылетало ругательство delphi.
Черничный вне форума Ответить с цитированием
Старый 29.06.2008, 19:50   #4
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Цитата:
Сообщение от Черничный Посмотреть сообщение
... создавалась еще одна страница и на ней кнопка с для удаления этой страницы...
То есть при нажатии кнопки удалялась страница вместе с этой кнопкой ?
Из OnClick вызывается метод удаления, который вызывает страницу, кнопку и управление возвращается в метод OnClick (уже удаленной кнопки). Если я правильно понял Ваше сообщение, то в этом и проблема.
Попробуйте отправлять ссобщение форме - пусть она освобождает страницу. Вот простенький пример:

Код:
const WM_DeletePage = WM_User + 1;
type
  TForm1 = class(TForm)
    PageControl1: TPageControl;
    TabSheet1: TTabSheet;
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
  private
    procedure ClickDelete(Sender: TObject);
    procedure DeletePage(T:TTabSheet);
    procedure WMDeletePage(var Msg:TMessage); message WM_DeletePage;
  public
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

// Button1 на TabSheet1 - для создания новой вкладки
procedure TForm1.Button1Click(Sender: TObject);
var T:TTabSheet;
    B:TButton;
begin
   T := TTabSheet.Create(nil);
   T.PageControl := PageControl1;
   T.Caption := '-----';

   B := TButton.Create(T);
   B.Caption := 'delete tabsheet';
   B.OnClick := ClickDelete;
   B.Parent := T;                        // (1)

   PageControl1.ActivePage := T;
end;

procedure TForm1.DeletePage(T:TTabSheet);
begin
   PageControl1.ActivePage := PageControl1.Pages[0];

   T.PageControl := nil;
   T.Free;
end;

procedure TForm1.ClickDelete(Sender: TObject);
begin
   postMessage(form1.handle, WM_DeletePage, 0, integer((Sender as TButton).Parent)); // см. (1)
end;

procedure TForm1.WMDeletePage(var Msg:TMessage);
var T:TTabSheet;
begin
   T := TTabSheet(Msg.LParam);
   DeletePage(T);
end;
alexBlack вне форума Ответить с цитированием
Старый 29.06.2008, 19:57   #5
Черничный
Форумчанин
 
Регистрация: 27.01.2007
Сообщений: 293
По умолчанию

да удалялась страница с этой так же созданной кнопкой. Все работало. Но когда страниц больше десятка и начинал удалять... delphi ругался иногда
Черничный вне форума Ответить с цитированием
Старый 29.06.2008, 20:04   #6
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Цитата:
Сообщение от Черничный Посмотреть сообщение
да удалялась страница с этой так же созданной кнопкой. Все работало. Но когда страниц больше десятка и начинал удалять... delphi ругался иногда
Когда управление вернулось в метод удаленного объекта все может пройти нормально, т.к. менеджер памяти не сразу использует только что освобожденную память и все данные объекта еще на месте и ими можно пользоваться еще некоторое время. А может не пройти - это как повезет. Лучше не рисковать и не вызывать метод free (прямо или косвенно) из методов самого объекта.
alexBlack вне форума Ответить с цитированием
Старый 29.06.2008, 20:19   #7
Черничный
Форумчанин
 
Регистрация: 27.01.2007
Сообщений: 293
По умолчанию

а я destoy писал, а онпка сама удалялась
Черничный вне форума Ответить с цитированием
Старый 29.06.2008, 20:52   #8
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Free вызывает Destroy, но после проверки на nil, во избежание ошибки. Free использовать предпочтительно.

Скорее всего ошибка из за неполного освобождения памяти. Присваивай кнопке nil, после вызова Free. Free убирает объект с формы, но не освобождает полностью память, бывают ошибки обращения к памяти, сам с таким сталкивался.

p.s. Это в общем, учитывая что методы вызываются оттуда, откуда надо.
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог

Последний раз редактировалось mutabor; 29.06.2008 в 20:56.
mutabor вне форума Ответить с цитированием
Старый 29.06.2008, 23:01   #9
Черничный
Форумчанин
 
Регистрация: 27.01.2007
Сообщений: 293
По умолчанию

я там что то типа масива изобретал, по нажатию на кнопку прибавлял + 1 новое имя и name... а видимо когда удалял, в памяти оставались старые данные и application читал их от туда...
Черничный вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Динамическое создание объекта ANGa Помощь студентам 3 10.04.2008 18:14
Динамическое создание объекта Fruit Общие вопросы Delphi 5 24.01.2008 11:00
Динамическое создание объекта Fruit Общие вопросы Delphi 2 16.01.2008 21:18
Динамичесое создание WebBrowser LeoN Компоненты Delphi 8 01.12.2007 14:40
Свойства объекта KBak Win Api 5 15.08.2007 20:21