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