Форум: "Основная";
Текущий архив: 2004.08.01;
Скачать: [xml.tar.bz2];
ВнизНепонятки с существованием объекта Найти похожие ветки
← →
AndrewVolkov © (2004-07-19 23:59) [0]Имеем
FControlSocket := TWSocket.Create(Self);
далее незнаю как точно, вообщем где-то отрабатывает событие и выполняется след. функция. Вся фигня в том, что если я убиваю объектъ - то в этой функции вылетает ошибка Access violation
если я добавляю перед Resultif 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.038 c