Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.05.02;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.55 MB
Время: 0.036 c
1-1081708270
Артем
2004-04-11 22:31
2004.05.02
"Canvas does not allow drawing"


3-1080903042
bushmen
2004-04-02 14:50
2004.05.02
MS SQL и DBF


1-1081845095
Islander
2004-04-13 12:31
2004.05.02
Как загрузить иконку с определенным индексом из ico-файла


1-1081860107
Анонимщик
2004-04-13 16:41
2004.05.02
Допустимо ли имя файла


3-1081331841
31512
2004-04-07 13:57
2004.05.02
MIDAS и LookUp





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский