![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Fs.free [D7, WinXP]
MRAk © (2005-11-15 23:08:00)if s='down:'+ExtractFileName(putfail) then
begin
socket.Close;
Application.MessageBox(Pchar('файл '+putfail+' Успешно отправлен'), 'Внимание!!!');
fs.Free;
end;
Вот кусок кода... это окончание приема файла(не надо переносить в сети... вопрос не по ним=) ) так вот при попытке освободить fs постоянно появляется ошибка... почему?
Digitman (2005-11-16 15:23:00) [1]
> fs само уничтожается после отправки... странно канешно но
> это так! =)))(для меня странно...)
стандартная справка на эту тему писана не для Пушкина, а для тебя.
там черным по белому написано про уничтожение потока.
и "допирать" не надо при этом - достаточно справку почитать внимательно.
> не надо переносить в сети... вопрос не по ним
много ты еще шишек набъешь себе при таком подходе).. именно в справке по TCustomWinSocket написано про SendStream() ... а использование TCustomWinSocket имеет практически прямое отношение к "Сетям"
MRAk (2005-11-16 02:26:00) [2]Всмысле я выдрал небольшой кусок кода с полоской прогресса и руки ещё не дошли исправить!
MRAk (2005-11-16 02:24:00) [3]да до меня доперло перед тем как я прочитал твое сообшение...
fs само уничтожается после отправки... странно канешно но это так! =)))(для меня странно...)
на счет глобальных.. это я просто у когодо выдрал и код ещё не правил...
Извените за несправедливый гнев... просто я хотел сказать не надо просто насехатся над чужими ошибками покажи и обясни... может и я чегонить не понял!
Спасибо большое
Джо (2005-11-16 02:13:00) [4]Пункт 1 немного дополню.
На одном уровне означает не только уровень одной процедуры, но, иногда и уровень класса и даже модуля.
Джо (2005-11-16 02:10:00) [5]Сообщение об ошибке говорит о том, что где-то в коде происходит обращение к нулевому указателю. То есть, ты ожидаешь, что в переменной на момент вызова содержится ссылка на объект, в то время, когда в ней содержится значение nil (0).
Самое лучшее, что можно предложить - начинай переделывать код, руководствуясь некоторомы простейшими правилами:
1. Уничтожай объект только на том же уровне кода, в котором он был создан. В одной процедуре создал, В ЭТОЙ ЖЕ и уничтожай. Желательно с использованием секций try/finally.
2. Не маскируй ошибки - не делай пустых блоков except.
3. Сведи к самому минимуму использование глобальных переменных, например существует совсем немного причин, по которым код, указанный Плохишем в [6] имел бы право на существование.
П.С. Совсем не нужно хамить, тебе действительно указали на твои ошибки.
MRAk (2005-11-16 02:00:00) [6]Джо это обрашение было не к тебе прости если не так высказался в твою сторону
Джо (2005-11-16 01:57:00) [7]
> [7] MRAk (16.11.05 01:44)
> блин кажется я попросил помоши
После этого решай свои проблемы сам. Хотя, в принципе, с учетом кода, приведенного в [7] и некоторых моментов в [2] твоя ошибка уже достаточно очевидна. Но не думаю, что ее решение кому-нибудь будет интересно.
MRAk (2005-11-16 01:48:00) [8]хм... возможно часть причины была в том что я в private посадил присвоение типа.. но если не в привате то в делфи такая ошибка:
Project test.exe raised exception class EAccsessVioaltion whith message 'Access violation at address 00000000. Read of address 00000000'. Process stopped use...
MRAk (2005-11-16 01:44:00) [9]блин кажется я попросил помоши и если я не такой СУПЕР МЕГА КРУТОЙ ПРОГРАММеР как ты то извени.
Project test.exe raised exception class EPrivelege whith message 'Privileged Instructions'. Process stopped use...
это если через делфю пускать а так такая ошибка:
Access violation at address 00000000. Read of address 00000000
Вот создание:
fs.free;
fs := TMyFileStream.Create(Putfail,fmOpenRead);
try
fs.Position:= 0;
except
end;
Плохиш (2005-11-16 00:52:00) [10]
> unit2.Form2.Label2.Caption:=ExtractFileName(putfail);
Можно дальше не читать.
Джо (2005-11-15 23:50:00) [11]Где СОЗДАЕТСЯ объект? К чему эта вся совершенно посторонняя куча кода? Ты сюда все свои исходники запостить хочешь? \;>
И,ты так и не сказал, что за "ошибка" была.
MRAk (2005-11-15 23:44:00) [12]хм да тока там без try except и fs типа TMyFileStream
MRAk (2005-11-15 23:26:00) [13]да сюда стоит добавить:
function TMyFileStream.Read(var Buffer; Count: Longint):Longint;
begin
Result := inherited Read(Buffer, Count);
obsh:=obsh+result;
unit2.Form2.Gauge1.Progress:=round((Obsh/Size)*100);
if round((Obsh/Size)*100)=100 then
unit2.Form2.Label3.caption:='Файл успешно отправлен... ожидаем конца приема';
end;
MRAk (2005-11-15 23:25:00) [14]procedure TForm6.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
var
s:string;
begin
s:=Socket.ReceiveText;
if s='!.Readyfordata' then
Socket.SendText('#$!Data'+ExtractFileName(putfail) + #0 +inttostr(fs.Size) + #0 + edit2.Text + #0)
else
if s='OTKAZ' then
begin
Showmessage('В приеме файла было отказано');
hide;
end
else
if s='OJIDAYU' then
begin
unit2.Form2.Label2.Caption:=ExtractFileName(putfail);
unit2.Form2.show;
form3.Enabled:=false;
form6.Enabled:=false;
fs.Position:= 0;
obsh:=0;
Socket.SendText('#$!file'+IntToStr(fs.Size) + #0 +ExtractFileName(putfail)+ #0);
Socket.SendStream(fs);
end
else
if s='down:'+ExtractFileName(putfail) then
begin
socket.Close;
Application.MessageBox(Pchar('файл '+putfail+' Успешно отправлен'), 'Внимание!!!');
try
fs.Free;
except
end;
unit2.Form2.Label3.caption:='';
unit2.Form2.Hide;
form3.Enabled:=True;
form6.Enabled:=True;
form6.Hide;
end
else
if s ='SBROS' then
begin
clientsocket1.Active:=false;
Application.MessageBox(Pchar('Соеденение прерванно'), 'Внимание!!!');
unit2.Form2.Hide;
try
fs.Free;
except
end;
form3.Enabled:=True;
form6.Enabled:=True;
form6.Hide;
end;
end;
Вот весь код отправки
Джо (2005-11-15 23:13:00) [15]А где создается и используется сей fs? А то тут видно только уничтожение объекта и куча вообще постороннего кода.