Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.08.01;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.5 MB
Время: 0.043 c
1-1089981987
CAMCOH
2004-07-16 16:46
2004.08.01
Как реализовать запись в лог использования принтера ?


1-1090399342
johny
2004-07-21 12:42
2004.08.01
как загрузить в IMAGE рисунок из инета!


1-1090292484
Phoenix
2004-07-20 07:01
2004.08.01
ListView, как изменить значение субсубсуб итема?


4-1087995049
Samael6
2004-06-23 16:50
2004.08.01
Хук на закрытие и свертывание окна


1-1090259508
Sphinx
2004-07-19 21:51
2004.08.01
Основная форма программы





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский