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

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

Непонятки с существованием объекта [D7, WinXP]


Страницы:   1 2

AndrewVolkov ©   (2004-07-19 23:59:00) 

Имеем
   FControlSocket      := TWSocket.Create(Self);

далее незнаю как точно, вообщем где-то отрабатывает событие и выполняется след. функция. Вся фигня в том, что если я убиваю объектъ -  то в этой функции вылетает ошибка Access violation

если я добавляю перед Result

if FControlSocket<>nil then
то эта строка не помогает, Почему?
Как тогда проверить существование объекта, чтобы не было Acess violation, так как объекта уже нету???

function TCustomFtpCli.GetConnected : Boolean;
begin
   try
       Result := FControlSocket.State <> wsClosed;
   except

   end;
end;


Rouse_   (2004-07-20 22:18:00) [1]

> [21] Anatoly Podgoretsky ©   (20.07.04 21:02)
Я FreeandNil именно для массива говорил т.е. Buf: array of TComponent который самостоятельно создается :) а не для того варианта что автор привел :)


Anatoly Podgoretsky   (2004-07-20 21:02:00) [2]

Так нечего занулять в Components[i] компонент физически убирается из списка! А понял, чтобы помучаться :-)


Rouse_   (2004-07-20 20:49:00) [3]

> Какой еще FreeandNil для списка компонентов.
Обычный...
убиваем элемент массива через FreeandNil, затем уменьшаем сам массив со сдвигом...


romeo   (2004-07-20 12:37:00) [4]

2 Defunct

Прервать логику.... Это как?


Andrew   (2004-07-20 10:39:00) [5]

то Defunct
2. а чем плох
Exit?


Григорьев Антон   (2004-07-20 10:32:00) [6]

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


Anatoly Podgoretsky   (2004-07-20 09:04:00) [7]

Какой еще FreeandNil для списка компонентов.


Defunct   (2004-07-20 03:10:00) [8]

AndrewVolkov ©   (19.07.04 23:59)  
Ошибка возникает потому, что где-то дублируется ссылка на экземпляр уничтоженного объекта.

Вывод: программа написана коряво.

Hint 1: Пишите объекты управления, которые обслуживают создание и удаление группы динамически создаваемых компонент. Что-то типа TList, с функциями - поиска/добавления/удаления.

Hint 2: Не пользуйтесь средствами Delphi, которые прерывают логику выполнения программы: (goto, exit - в мусорку).

Hint 3: Всегда можно обойтись без Component.ClassName. Что мешает просто хранить ссылку на объект? Зачем его искать, он ведь вами создавался а не дядями из Pekin Corp.

Hint 4: TFptClient/TSocket может работать с отдельным потоком, перед удалением нужно обязательно вызвать метод Abort (для ftpclient). Потом завершать поток приема/передачи, и только после завершения потока - использовать метод Free.


AndrewVolkov   (2004-07-20 00:55:00) [9]

to Palladin
а при чем здесь это?


Palladin   (2004-07-20 00:53:00) [10]

TComponent.FindComponent


AndrewVolkov   (2004-07-20 00:49:00) [11]

Я тут Exit не написал, на самом деле, после
FreeandNil(TFtpClient(Sender));
идет Exit;


AndrewVolkov   (2004-07-20 00:48:00) [12]

Не ну это то ясно - если имеется ввиду, что компонентов стало меньше. Здесь имеетсяввиду что есть всего 1 компонент подходящий под условие и после всего стоит Exit из функции. Он производит все действия (фри, нил) над компонентом и выходит. Но компонент остается жить и спокойно работает дальше


Rouse_   (2004-07-20 00:45:00) [13]

Угу, убил и потом обращаешся к следующему...  думай...


AndrewVolkov   (2004-07-20 00:43:00) [14]

а в чем бред.
Поясните если не сложно?
Насколько я понимаю - перебираю все компоненты, если нахожу нужный мне то убиваю его. Что не так?


Rouse_   (2004-07-20 00:43:00) [15]

> Если я его нашел - Уничтожил его и присвоил нил, то почему
> он не разрушился?

Он то разрушился... но куда ты будешь иметь доступ на следующей итерации I ?


Rouse_   (2004-07-20 00:40:00) [16]

> [3] AndrewVolkov ©   (20.07.04 00:34)
А вот все что ты тут произвел - заведомый бред...  особенно цикл...


AndrewVolkov   (2004-07-20 00:40:00) [17]

Так если я нахожу нужный мне компонент перебором, как это делаю я - зачем мне создавать массив из компонентов и оттуда их убивать???
Если я его нашел - Уничтожил его и присвоил нил, то почему он не разрушился? и как ни в чем не бывало спокойно функционирует дальше?


Rouse_   (2004-07-20 00:37:00) [18]

Мдя...
Создавай массив компонентов и их из массива тогда уж и убивай...


Rouse_   (2004-07-20 00:35:00) [19]

Ну как ты думаешь, если ты ему сделал Free то существует ли он? Ты же программист - следи за создаваемыми тобой и разрушаемыми тобой же объектами...


AndrewVolkov   (2004-07-20 00:34:00) [20]

Иногда я перестаю что-либо понимать...
имели

procedure TForm1.Button4Click(Sender: TObject);
Var i:integer;
begin
 for i:=0 to Application.ComponentCount-1 do begin
   if Application.Components[i].ClassName='TFtpClient' then begin
     TFtpClient(Application.Components[i]).Free;
   end;
 end;
end;


объект убивался, но я не мог это отловит дальше и получал Виолетион

переписали

procedure TForm1.Button4Click(Sender: TObject);
Var i:integer;
begin
 for i:=0 to Application.ComponentCount-1 do begin
   if Application.Components[i].ClassName='TFtpClient' then begin
     Sender:=TFtpClient(Components[i]);//так сделал, так как в при записи используемой в предыдущем варианте он не давал сделать FreeandNil
     FreeandNil(TFtpClient(Sender));
   end;
 end;
end;


Все красиво пролетает, но объект не удаляется и все продоложает функционировать? Почему объект не удаляется???


Страницы:   1 2

Наверх

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