Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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? А то тут видно только уничтожение объекта и куча вообще постороннего кода.


Наверх

Титульная страница Поиск, карта сайта Написать письмо