Форум: "Основная";
Текущий архив: 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("Èçìåíà!")
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.054 c