Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.05.02;
Скачать: CL | DM;

Вниз

При уничтожении класса выпадаю в ошибку почему?   Найти похожие ветки 

 
Fast   (2004-04-13 14:34) [0]

вот класс

Type
  TLogger = class
  private
    LogF:TextFile;
  public
    constructor Create(Name:string);
    destructor  Destroy; Override;
    procedure LogEvent(line:String);
  end;

..................

constructor TLogger.Create(name:string);
  begin
    AssignFile(LogF,name);
   {$IoChecks Off}
    Append(LogF);
   {$IoChecks On}
    if IOResult<> 0 then Rewrite(LogF);
  end;

 destructor  TLogger.Destroy;
   begin
   CloseFile(LogF);
   end;

 procedure TLogger.LogEvent(line:String);
   begin
   WriteLn(LogF,FormatDateTime("ss:mm:hh",now)+#$9+"line");
   end;


Вот вызов
procedure  test;
  var l:Tlogger;
  begin
   L.Create("sample.log");
   L.LogEvent("test");
   L.Free; //AccessVialation!  
 end;




 
clickmaker ©   (2004-04-13 14:35) [1]

Мда...

procedure  test;
 var l:Tlogger;
 begin
  l := TLogger.Create("sample.log");
  try
    L.LogEvent("test");
  finally
    L.Free;  
  end;
end;


 
Ega23 ©   (2004-04-13 14:43) [2]

А кто CloseFile делать будет? Дядя Вася?


 
Amoeba ©   (2004-04-13 14:46) [3]

А кто CloseFile делать будет?

CloseFile у автора вопроса выполняется в деструкторе.


 
Ega23 ©   (2004-04-13 14:50) [4]

Сорри, деструктор-то я и не заметил...
а inherited не надо написать?


 
Fast   (2004-04-13 14:51) [5]

clickmaker ©   (13.04.04 14:35) [1]
Мда...

procedure  test;
var l:Tlogger;
begin
 l := TLogger.Create("sample.log");
 try
   L.LogEvent("test");
 finally
   L.Free;  
 end;


Ну уж не уж это не выход, не надо скрывать ошибки надо их избегать.


 
Reindeer Moss Eater ©   (2004-04-13 14:51) [6]

destructor  TLogger.Destroy;
begin
CloseFile(LogF);
end;

А в каком месте вызывается унаследованный деструктор?


 
Anatoly Podgoretsky ©   (2004-04-13 15:03) [7]

Fast   (13.04.04 14:51) [5]
А где ты видишь сокрытие ошибок, это наоборот защита от появления ошибок, типовая конструция по работе с объектами.

Reindeer Moss Eater ©   (13.04.04 14:51) [6]
На данном этапе классовой борьбы это не важно, деструктор у родителя пустой, но это не красиво и не гарантирует безоблачного будущего.


 
Fast   (2004-04-13 15:06) [8]

Anatoly Podgoretsky ©   (13.04.04 15:03) [7]
Да согласен что вообще конструкции try являют собой защиту, но в данном случае меня интресует почему я не могу обойтись без них?

Reindeer Moss Eater ©   (13.04.04 14:51) [6]
destructor  TLogger.Destroy;
begin
CloseFile(LogF);
inherited Destroy;
end;

Совершенно не меняет ситуацию


 
Ega23 ©   (2004-04-13 15:08) [9]

Кстати, #$9 - это что за символ?
И (к ошибке это не относится) зачем line в апострофы брать (WriteLn...)?


 
Fast   (2004-04-13 15:14) [10]

#9 это табулянт
а нашет line это да .......тестил


 
Fay ©   (2004-04-13 15:49) [11]

А так пашет?
uses Windows, SysUtils;

type
 TLogger = class
 private
   FLog : THandle;
 public
   constructor Create(Name : string);
   destructor Destroy; override;
   procedure LogEvent(line : string);
 end;

implementation

constructor TLogger.Create(Name : string);
begin
 FLog := CreateFile(PChar(Name), GENERIC_WRITE, FILE_SHARE_READ, nil, OPEN_ALWAYS, 0, 0);
 if FLog = INVALID_HANDLE_VALUE then raise Exception.Create("&Egrave;&ccedil;&igrave;&aring;&iacute;&agrave;!")
 else SetFilePointer(FLog, 0, nil, FILE_END);
end;

destructor TLogger.Destroy;
begin
 if FLog <> DWORD(-1) then CloseHandle(FLog);
 inherited;
end;

procedure TLogger.LogEvent(line : string);
var
 st : TSystemTime;
 s : string;
 n : Cardinal;
begin
 GetLocalTime(st);
 s := Format("%2.2d:%2.2d:%2.2d"#9"%s"#13#10, [st.wSecond, st.wMinute, st.wHour, line]);
 WriteFile(FLog, PChar(s)^, Length(s), n, nil);
end;


 
Anatoly Podgoretsky ©   (2004-04-13 15:58) [12]

А так
// CloseFile(LogF);


 
Тимохов ©   (2004-04-13 16:08) [13]


> Ega23 ©   (13.04.04 14:50) [4]

не надо


 
Fast   (2004-04-13 16:23) [14]

Fay ©   (13.04.04 15:49) [11]
странно, но таже история...
причем трасировка показывает что в метод Destroy программа даже не попадет.


 
Тимохов ©   (2004-04-13 16:26) [15]


> Fast   (13.04.04 16:23) [14]

Я так не понял, как вы используете свой класс?
Как clickmaker в [1] написал или все-таки как в исходном вапросе описано вами?


 
Fay ©   (2004-04-13 16:30) [16]

Использовать так.
var
L : TLogger;
begin
 inherited;
 L := TLogger.Create("c:\Logger.log");
 L.LogEvent("Ky-Ky!!!");
 l.Free;
end;


А почему Вы не указываете полное имя файла?


 
Fay ©   (2004-04-13 16:31) [17]

var
L : TLogger;
begin
L := TLogger.Create("c:\Logger.log");
L.LogEvent("Ky-Ky!!!");
l.Free;
end;


 
Fast   (2004-04-13 16:46) [18]

Тимохов ©   (13.04.04 16:26) [15]
Действительно как в исходном тексте.
И конечно нужно защищать конструкции блоками try, однако меня в первую очередь волновало почему возникает исключительная ситуация.

Fay ©   (13.04.04 16:30) [16]
А почему Вы не указываете полное имя файла?

Я при инициализации выставляю
SetCurrentDir(ExtractFileDir(Application.ExeName));
удобнее потом работать с относительными путями


 
Fay ©   (2004-04-13 16:55) [19]

SetCurrentDir не поможет. Броневик лишь на миг.


 
Тимохов ©   (2004-04-13 16:55) [20]


> Fast   (13.04.04 16:46) [18]

так делать нельзя
 procedure  test;
 var
    L:Tlogger;
 begin
    L.Create("sample.log");
    L.LogEvent("test");
    L.Free; //AccessVialation!  
end;

AccessViolation тут будет с огромной вероятностью (близко к 100 процентам). Делайте как в ответе [1].


 
Fay ©   (2004-04-13 16:56) [21]

SetCurrentDir не поможет. Броневик лишь на миг.

Мой пример работает?


 
Тимохов ©   (2004-04-13 16:57) [22]


> Fast   (13.04.04 16:46) [18]


> И конечно нужно защищать конструкции блоками try, однако
> меня в первую очередь волновало почему возникает исключительная
> ситуация.

Причем тут защита. Почитайте книжечки. Точно поможет.

В исходном тексте AV может быть на любой из трех строк после begin.


 
Fast   (2004-04-13 16:59) [23]

Все, я прошу прощения за данный листинг но если у когонить есть возможность вставте его целиком в пустую программу и проверитье работает ли, потому-что я уже грешу на компилер дельфи.

unit Unit1;

interface

uses
 Windows, SysUtils, Classes,  Forms,
  StdCtrls, Controls;

type
 TForm1 = class(TForm)
   Button1: TButton;
   procedure Button1Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

type
TLogger = class
private
  FLog : THandle;
public
  constructor Create(Name : string);
  destructor Destroy; override;
  procedure LogEvent(line : string);
end;

var
 Form1: TForm1;

implementation

{$R *.dfm}
constructor TLogger.Create(Name : string);
begin
FLog := CreateFile(PChar(Name), GENERIC_WRITE, FILE_SHARE_READ, nil, OPEN_ALWAYS, 0, 0);
if FLog = INVALID_HANDLE_VALUE then raise Exception.Create("Eciaia!")
else SetFilePointer(FLog, 0, nil, FILE_END);
end;

destructor TLogger.Destroy;
begin
if FLog <> DWORD(-1) then CloseHandle(FLog);
// inherited;
end;

procedure TLogger.LogEvent(line : string);
var
st : TSystemTime;
s : string;
n : Cardinal;
begin
GetLocalTime(st);
s := Format("%2.2d:%2.2d:%2.2d"#9"%s"#13#10, [st.wSecond, st.wMinute, st.wHour, line]);
WriteFile(FLog, PChar(s)^, Length(s), n, nil);
end;

procedure TForm1.Button1Click(Sender: TObject);
var L:Tlogger;
begin
L.Create("c:\sample.log");
L.LogEvent("test");
L.Free;
end;

end.


 
Anatoly Podgoretsky ©   (2004-04-13 17:00) [24]

Fast   (13.04.04 16:23) [14]
Не ответил на [12]


 
Семен Сорокин ©   (2004-04-13 17:00) [25]

Fast   (13.04.04 16:59) [23]
ты что-ли прикалываешься?
тебе же в 1 посте уже ответили.


 
Fast   (2004-04-13 17:01) [26]

Тимохов ©   (13.04.04 16:57) [22]

> Fast   (13.04.04 16:46) [18]

> И конечно нужно защищать конструкции блоками try, однако
> меня в первую очередь волновало почему возникает исключительная
> ситуация.

Причем тут защита. Почитайте книжечки. Точно поможет.

В исходном тексте AV может быть на любой из трех строк после begin.


 
Fast   (2004-04-13 17:02) [27]

Просте за неописанное сообщение выше
Я просто хотел знать почему в данном конкреном случае возникает AV. А то что ее можно обработать через try я знаю.


 
Тимохов ©   (2004-04-13 17:04) [28]


> Fast   (13.04.04 17:02) [27]

Почему AV понятно.
Просто хочу, чтобы вы не говорили о try в данном контексте - он тут ни при чем.

AV случается т.к. идет обращение к неинициализированной переменной L - вот и все.


 
Семен Сорокин ©   (2004-04-13 17:06) [29]

хочешь чтобы не было сообщения AV делай так:

type
 TLogger = class
 public
   class procedure Create(Name : string);
   class procedure Destroy; override;
   class procedure LogEvent(line : string);
 end;

var
 FLog : THandle;


тогда не будет :))


 
Fay ©   (2004-04-13 17:19) [30]

2Семен Сорокин ©   (13.04.04 17:06)
Это применимо только в том случае, если не используется более 1 экземпляра одновременно.
Блин. Не по-русски как-то написал... 8(


 
Fast   (2004-04-13 17:23) [31]

Прошу прошения
>Anatoly Podgoretsky ©   (13.04.04 17:00) [24]
>Fast   (13.04.04 16:23) [14]
>Не ответил на [12]

//CloseFile не меняет ситуацию.

-----------------------------------------------------------------Тимохов ©   (13.04.04 17:04) [28]

>> Fast   (13.04.04 17:02) [27]

>Почему AV понятно.
>Просто хочу, чтобы вы не говорили о try в данном контексте - он >тут ни при чем.

>AV случается т.к. идет обращение к неинициализированной >переменной L - вот и все.

Как не инициализированна а L.Create(); ?

-----------------------------------------------------------------
Fay ©   (13.04.04 17:19) [30]
в точку!


 
Тимохов ©   (2004-04-13 17:28) [32]


> Fast   (13.04.04 17:23) [31]
> Как не инициализированна а L.Create(); ?

Вы издеваетесь?
Мне действительно интересно, не уж то за 30 ответов у вас не сложилось понятие, что что-то вы не дочитатли, неужели у вас нет желания спросить "Братцы, где мне про это почитать, я ничего не понимаю"?


 
Anatoly Podgoretsky ©   (2004-04-13 17:33) [33]

А ты отладчиком прошелся, с точками останова в конструкторе и деструкторе?


 
Fay ©   (2004-04-13 17:35) [34]

Блин! Я старая толстая лысая больная обезьяна!!!
До сих пор не обратил внимание на L.Create()!
Пора на свалку 8((


 
Тимохов ©   (2004-04-13 17:36) [35]


> Fay ©   (13.04.04 17:35) [34]

вот и я думаю... ( я не про свалку, и не про обезьяну - про то, что не обратили внимание) :))))))))


 
Fast   (2004-04-13 17:37) [36]

А все мотрят и смеються :) а господин Тимохов просто издеваеться.
Ребята вы что не могли поправить мне ону строку кода еще в самом начале?
L:=TLogger.Create("chjtob_ego.log");
Я просто недосмотрел но могли бы и ткунуть пальцем........
Всем спасибо.


 
Семен Сорокин ©   (2004-04-13 17:40) [37]

Fast   (13.04.04 17:37) [36]
а у меня лично сложилось впечатление что это ты издевался :))


 
Тимохов ©   (2004-04-13 17:41) [38]


> Fast   (13.04.04 17:37) [36]

Вам перечислить места, где вас именно тыкнули (их было 3 или 4).
Внимательнее читайте ответы.


 
Тимохов ©   (2004-04-13 17:41) [39]

издевался издевался, точно...


 
Fast   (2004-04-13 17:46) [40]

И ведь для сорказма еще и мне приводят примеры с той же ошибкой, а я уже серьезно решил едльфю пресношать :)
И самое обидное что я не новичек в прогамминге, пару часов бьюсь
головой об монитор.........
Сошлемя на творчискую усталость :)



Страницы: 1 2 вся ветка

Текущий архив: 2004.05.02;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.034 c
1-1082030465
Mol
2004-04-15 16:01
2004.05.02
ComboBox


14-1081224495
Vlad Oshin
2004-04-06 08:08
2004.05.02
Уважаемые Питерцы! Помогите с жильем...


14-1081336643
Домарощинер
2004-04-07 15:17
2004.05.02
Сборка собственного пакета


4-1079008062
saska
2004-03-11 15:27
2004.05.02
Shell_NotifyIcon


3-1080893541
Zoloto
2004-04-02 12:12
2004.05.02
Перевод локальной базы в сетевой вариант