Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

удаление ранее созданных динамических объектов [D7, XP]


Страницы:   1 2 3 4

Zloi_Funtik ©   (2008-04-09 16:30:00) 

скажите, пожалуйста, каким образом удалить некторое, каждый раз различное число динамически созданных мемо полей? Спасибо.


Gydvin   (2008-04-15 08:44:00) [1]

а) Понятно. Впринципе согласен.

Б)

>  Какие же это наследники? Это дочерние контролы.


Да дочерние.


> И ограничение - все должно лежать на одной панели. И очищать
> не так удобно (особенно, если на этой панели лежит еще что-
> то). Да и к чему здесь вообще какие-то панели? не нужны
> они здесь вовсе. Использование визуального контейнера вместо
> невизуального - очень дурная практика.


Возможно. Зависит от поставленной задачи. Имхо


Семеныч   (2008-04-15 08:05:00) [2]

> Gydvin ©   (15.04.08 07:14) [69]

а). Динамический массив в данном случае просто менее удобен, с ним будет больше ручной писанины. Со списком TComponentList в код нужно добавить ровно 5 коротеньких строчек (объявление в классе, создание в конструкторе, уничтожение в деструкторе, добавление в список, очистка списка. Попробуйте уложиться в те же 5 строк с массивом - сами все увидите.

б). Какие же это наследники? Это дочерние контролы. И ограничение - все должно лежать на одной панели. И очищать не так удобно (особенно, если на этой панели лежит еще что-то). Да и к чему здесь вообще какие-то панели? не нужны они здесь вовсе. Использование визуального контейнера вместо невизуального - очень дурная практика.


Gydvin   (2008-04-15 07:14:00) [3]


> Семеныч   (14.04.08 20:14) [67]


a) MemoArray: array of TMemo
b) Panel1.Controls[], Panel1.ControlCount

Ну это так в качестве общего развития (моего есно)


Zloy_Funtik   (2008-04-14 20:18:00) [4]

Всё, сделал, работает :))) Всем спасибо!


Семеныч   (2008-04-14 20:14:00) [5]

> Gydvin ©   (14.04.08 17:17) [66]

> ну и чем этот пример лучше использования массива компонентов или уже
> встроенного массива наследников?

С удовольствием отвечу на Ваш вопрос, если Вы поясните, что Вы имеете в виду под:
а). массивом компонентов;
б). встроенным массивом наследников.


Gydvin   (2008-04-14 17:17:00) [6]


> Семеныч   (10.04.08 11:26) [61]

ну и чем этот пример лучше использования массива компонентов или уже встроенного массива наследников?
Автор сам чего-то намутил в своем коде.


> А оператор as тут для прикола вставили?


вообщето is нужен :)


MsGuns   (2008-04-14 16:33:00) [7]

А почему нельзя создать одну-единственную панель (причем в дизайне, ессно), которую показывать точно в прямоугольнике активной ячейки стрингрида (если уж так непременно хочется стрингрид), а на ней расположить три эдита, куда записывать перед показом значения трех переменных, соответствующих строке-ячейке ? Переменные можно завернуть в рекорды. Рекорды (точнее, указатели на них) в свою очередь засунуть в список (списки), "привязанный" к источнику данных, из которого заполняется сетка.
Визуально можно сделать так, что эта панелька будет смотреться точно как ячейка стрингрида


{RASkov}   (2008-04-14 13:34:00) [8]

> [63] Zloy_Funtik   (14.04.08 13:24)
> В этом случае создается одно мемо поле с последними координатами,
> т.е. последний проход цикла :(

Дык тыж сам один его(Мемо) создал, а потом издеваешься над ним в циклах...
Что-то до тебя вообще ничего не доходит :(
:)


Zloy_Funtik   (2008-04-14 13:24:00) [9]

Делаю по аналогии примера :

> var
>  M: TMemo;
> begin
>  M := TMemo.Create(Self);
>  with M do
>  begin
>    // Здесь то же, что у Вас
>  end;


при создании панели, на которой находятся все мемо такой способ работает :)
Но при создании мемо полей, создается одно мемо поле :(
Выглядит вот так:

m:=Tmemo.Create(Self);
  for k:=0 to E1 do
       begin
     nach_left:=nach_left+87 ;
      for i:=0 to E2 do
  with  m
   do begin
  OnDblClick := YourOnChangeHandler;
    Parent := z;
    Left := nach_left;
    Top := nach_top;
      Width:=86;
     height:=45;
     BorderStyle:=bsNone;
      nach_top:=nach_top+46;
      if i=E2 then nach_top:=0;
        end;
       end;

В этом случае создается одно мемо поле с последними координатами, т.е. последний проход цикла :(


{RASkov}   (2008-04-10 11:49:00) [10]

Можно этот List: TComponentList; из [61] "развить" до того что он сам будет создавать эти мемы, например так:
List.CreateGridTo(AParent: TWinControl; ColCount, RowCount: Integer);
и еще много чего рутинного можно с помощью менеджера делать... нечто об этом я и говорил в [32]...
Но.... опять же. Помоему слихвой автору достаточно стандартного СтрингГрида... и ни к чему все эти извращения с мемами, листами...менеджерами...
И по ресурсоемкости +, да много еще плюсов.... а на каждый + к стринггриду идет минус к мемам.... Автор одумайся, Колян переживает :)


Семеныч   (2008-04-10 11:26:00) [11]

Я офигеваю, дорогая редакция. Полсотни постов о чем угодно, но только не о том, о чем вопрос.

> Zloi_Funtik

Для того, чтобы удалить объект, нужно вызвать его метод Free. Чтобы вызвать метод Free, нужно иметь ссылку на объект. А чтобы иметь эту ссылку, ее надо получить при создании объекта и запомнить в переменной.

Пример:
var
 M: TMemo;
begin
 M := TMemo.Create(Self);
 with M do
 begin
   // Здесь то же, что у Вас
 end;

После этого ссылка на объект хранится в переменной M и если теперь написать M.Free, то объект будет уничтожен. А в Вашем коде эта ссылка нигде не запоминалась, поэтому и было непонятно, а что же нужно удалять.

Если нужно создавать и удалять несколько оъектов, то надо запоминать ссылку на каждый из них. Для этого можно использовать массив или любой другой список, но в Вашем случае удобно использовать уже готовый список под названием TComponentList.

type
 TForm1 = class(TForm)
   ...
 private
   List: TComponentList;
   ...
 end;

1. В OnCreate надо список создать:  List := TComponentList.Create(True);
2. В OnDestroy список надо уничтожить вместе со всеми Memo: List.Free;
3. При создании Memo его надо добавить в список:

var
 M: TMemo;
begin
 M := TMemo.Create(nil);
 List.Add(M);
 with M do
 begin
   // Здесь то же, что у Вас
 end;
end;

4. После этого в любом месте, где Вам надо уничтожить сразу все Memo, Вы просто пишете List.Clear. Список очистится и сам уничтожит все Memo.


Kolan   (2008-04-10 11:07:00) [12]

> А оператор as тут для прикола вставили?

А типа для проверки… Лучше уж ShowMessage(Sender.ClassName) вставить…


Плохиш   (2008-04-10 10:59:00) [13]


> Kolan ©   (10.04.08 10:33) [58]
> > Попробуй заменить это на
> > (Sender as TPanel).Free
> > и посмотри, что получится.
>
> Ничего не измениться Free — статический метод TObject. Как
> не приводи вызовется одно и тоже.

А оператор asтут для прикола вставили?


Kolan   (2008-04-10 10:33:00) [14]

> Попробуй заменить это на
> (Sender as TPanel).Free
> и посмотри, что получится.

Ничего не измениться Free — статический метод TObject. Как не приводи вызовется одно и тоже.


{RASkov}   (2008-04-10 09:14:00) [15]

> [55] Loginov Dmitry ©   (10.04.08 07:51)
> А должно что вылетать? "Убийся аб стену"?

В его случае именно это и должно "вылетать" :(
:)


Loginov Dmitry   (2008-04-10 07:56:00) [16]

1. Для вызова Free не нужно делать приведение к классу!
2. Уничтожение формы в ее обработчиках зачастую чревато
3. Для того, чтобы после вызова FormClose форма уничтожилась, следует воспользоваться аргументом Action
4. Откуда вообще здесь TPanel взялся?


Loginov Dmitry   (2008-04-10 07:51:00) [17]

> Когда закрываешь форму, то вылетает ошибка :(


А должно что вылетать? "Убийся аб стену"? Нет ведь! Так что радуйся! Дельфя седня цензурная! :)


Amoeba   (2008-04-10 00:12:00) [18]


> Tpanel(Sender).free;

Ну и что здесь выступает в роли Sender? Какие основания для такого приведения типов?

Попробуй заменить это на
(Sender as TPanel).Free
и посмотри, что получится.


Zloi_Funtik   (2008-04-09 20:32:00) [19]

вот процедура закрытия формы:

procedure TSostoyaniya.FormClose(Sender: TObject;
 var Action: TCloseAction);
 var
 i:integer;
begin
 with Sender as Tpanel
 do    
Tpanel(Sender).free;
   
end;

Когда закрываешь форму, то вылетает ошибка :(


Zloi_Funtik   (2008-04-09 20:27:00) [20]

делал так же как и с мемо,
 for i:=0 to E2 do
  with   tmemo.Create(Self)
   do begin
    OnDblClick := YourOnChangeHandler;
     Parent := Self;

НО мне нужно, чтобы удаление происходило  на событие закрытия окна. С мемо одному из событий присваивалась своя функция в которой и будет происходить обработка события для каждого мемо поля. А как сделать для панели, если событие закрытия окна не относится к событиям связанным с панелью?


Страницы:   1 2 3 4

Наверх

Титульная страница Поиск, карта сайта Написать письмо