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

Вниз

Непонятки с существованием объекта   Найти похожие ветки 

 
AndrewVolkov ©   (2004-07-19 23:59) [0]

Имеем
   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 00:05) [1]

FreeAndNil, а по идее в сокетах нужно вообще по другому логику строить...


 
AndrewVolkov ©   (2004-07-20 00:24) [2]

А если я только использую метод Free, как мне узнать существует Объект после или его уже нет?


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

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

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;


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


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

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


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

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


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

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


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

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


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

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

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


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

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


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

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


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

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


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

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


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

TComponent.FindComponent


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

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


 
Defunct ©   (2004-07-20 03:10) [15]

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.


 
Anatoly Podgoretsky ©   (2004-07-20 09:04) [16]

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


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

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


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

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


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

2 Defunct

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


 
Rouse_ ©   (2004-07-20 20:49) [20]

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


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

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


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

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



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

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

Наверх




Память: 0.52 MB
Время: 0.065 c
14-1088772941
Иксик
2004-07-02 16:55
2004.08.01
Имена


14-1089609082
Rouse_
2004-07-12 09:11
2004.08.01
Двух маститых программистов с днем рождения !!!


4-1087581512
Вася
2004-06-18 21:58
2004.08.01
Как определить закртыт или открыт CDROM


3-1089133164
sirsergio
2004-07-06 20:59
2004.08.01
Ошибка открытия базы Oracle


1-1089749097
Mazer
2004-07-14 00:04
2004.08.01
Есть ли StringGrid с возможностями, наподобие DBGridEh?