![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
удаление ранее созданных динамических объектов [D7, XP]
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;
НО мне нужно, чтобы удаление происходило на событие закрытия окна. С мемо одному из событий присваивалась своя функция в которой и будет происходить обработка события для каждого мемо поля. А как сделать для панели, если событие закрытия окна не относится к событиям связанным с панелью?