Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.05.11;
Скачать: CL | DM;

Вниз

удаление ранее созданных динамических объектов   Найти похожие ветки 

 
Zloi_Funtik   (2008-04-09 17:54) [40]

С панелькой всё работает как надо :)
Спасибо!


 
Gydvin ©   (2008-04-09 18:01) [41]


> Kolan ©   (09.04.08 17:44) [38]
> > а я говорил создай массив tmemo"в…Вот кто извращенец!


даа это ЙА. :)

а массив для того чтоб отделить наших тараканов от статистических тараканов


> {RASkov} ©   (09.04.08 17:44) [39]
> > [37] Gydvin ©   (09.04.08 17:41)> а затем> panel1.controls[x].
> free;Просто panel1.free; А у мемо"sов владелец и родитель
> эта самая панель...


а может ненужно ему убивать панель )


 
{RASkov} ©   (2008-04-09 18:08) [42]

> [41] Gydvin ©   (09.04.08 18:01)
> а может ненужно ему убивать панель )

А что с ней с пустой делать-то? :)
Сейчас попробую угадать - создать на ней очередных Мемосов...
Это типа Клир такой
:о)


 
Gydvin ©   (2008-04-09 18:10) [43]

возможно и так :0)


 
Kolan ©   (2008-04-09 18:19) [44]

> С панелькой всё работает как надо :)
> Спасибо!

RASkov, Gydvin — молодцы, наставили Фунтика на путь истинный.

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


 
Gydvin ©   (2008-04-09 18:30) [45]


> RASkov, Gydvin — молодцы, наставили Фунтика на путь истинный


да не переживай ты так - одумается... когда нибуть. ;0)

И встретит своего доброго клоуна


 
{RASkov} ©   (2008-04-09 18:53) [46]

> [44] Kolan ©   (09.04.08 18:19)

Я никого никуда не наставлял.... Если человек выбрал не верный, хотя ему всю дорогу про верный путь говорили, и я в том числе, то это его право...
Упрямый, настырный... но иногда и это полезно.... а чаще становится привычкой.... так что если твой Фунтик не одумается, то всю дорогу будет все по два раза делать :о)


 
{RASkov} ©   (2008-04-09 18:56) [47]

> хотя ему всю дорогу про верный путь говорили

Может не совсем так, но альтернатива была... т.е. два пути на выбор... Фунтик упрямо шел точно не по тому пути...


 
Zloi_Funtik   (2008-04-09 19:15) [48]

Ребят, спасибо большое! Респект и от Фунтика и от Клоуна и злой тётушки :))))


 
Kolan ©   (2008-04-09 19:21) [49]

> твой Фунтик не одумается

Сам ты Белодонна. :)


 
Zloi_Funtik   (2008-04-09 20:02) [50]

ХА, а ведь с панелью точно такие же проблемы начались, если её делать статической, то после первого удаления её при обращении к этой форме возникает ошибка. А если делать её динамически, то так же как и с мемо удалить её не получается никак...:(


 
Gydvin ©   (2008-04-09 20:17) [51]

перепроверяй код где-то у тя ошибка


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

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

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


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

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

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

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


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


> Tpanel(Sender).free;

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

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


 
Loginov Dmitry ©   (2008-04-10 07:51) [55]

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


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


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

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


 
{RASkov} ©   (2008-04-10 09:14) [57]

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

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


 
Kolan ©   (2008-04-10 10:33) [58]

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

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


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


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

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


 
Kolan ©   (2008-04-10 11:07) [60]

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

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


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

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

> 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.


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

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


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

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

> 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-14 13:34) [64]

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

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


 
MsGuns ©   (2008-04-14 16:33) [65]

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


 
Gydvin ©   (2008-04-14 17:17) [66]


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

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


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


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


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

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

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

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


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

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


 
Gydvin ©   (2008-04-15 07:14) [69]


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


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

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


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

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

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

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


 
Gydvin ©   (2008-04-15 08:44) [71]

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

Б)

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


Да дочерние.


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


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



Страницы: 1 2 вся ветка

Текущий архив: 2008.05.11;
Скачать: CL | DM;

Наверх




Память: 0.62 MB
Время: 0.024 c
2-1208170710
djaUser
2008-04-14 14:58
2008.05.11
Загрузка файлов с инет.


2-1207809049
TRSteep
2008-04-10 10:30
2008.05.11
Классы и ошибки


15-1206869807
sauron
2008-03-30 13:36
2008.05.11
Чьё у меня с монитором?


15-1206602366
@!!ex
2008-03-27 10:19
2008.05.11
VNC не хочет подключаться по интернету


2-1207804307
Chorniy
2008-04-10 09:11
2008.05.11
ReadProcessMemory читает всегда с одного адреса... где-то ошибка?