Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.12.2008, 13:16   #1
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
Восклицание Ошибка при сохранении текста перед выходом

используя такую процедуру
Код:
procedure TForm1.Exit1Click(Sender: TObject);
var S:TStringList;
begin
if sCBHistory.Checked then
if REChat.Text <> '' then
S:=TStringList.Create;
S.Add(REChat.Text);
S.SaveToFile(ExtractFilePath(ParamStr(0))+'history'+(FormatDateTime('dd/mm/yy_hh/nn/ss', Now)+'.txt'));
S.Free;

CBClose.Checked:=True;
if ClientSocket1.Active then
ClientSocket1.Close;
ClientSocket2.Socket.SendText(DateTimeToStr(Now)+'\'+LDateRel.Caption+'\'+SendVersion+'\exit\'+ENick.Text);
Application.Terminate;
end;
При выходе из программы получаю ошибку
Project Project1.exe raised exception class EAccessViolation with message 'Access violation at adress 0053196C in module 'Project1.exe'. Read of address 00000000'. Process stopped. Use Step or Run to continue.

Так теперь не ругается
Код:
procedure TForm1.Exit1Click(Sender: TObject);
var S:TStringList;
begin
if sCBHistory.Checked then
if REChat.Text <> '' then begin
S:=TStringList.Create;
S.Add(REChat.Text);
S.SaveToFile(ExtractFilePath(ParamStr(0))+'history\'+(FormatDateTime('dd/mm/yy_hh/nn/ss', Now)+'.txt'));
S.Free;

CBClose.Checked:=True;
if ClientSocket1.Active then
ClientSocket1.Close;
ClientSocket2.Socket.SendText(DateTimeToStr(Now)+'\'+LDateRel.Caption+'\'+SendVersion+'\exit\'+ENick.Text);
Application.Terminate;
end;
end;
Если sCBHistory выделен, но REChat пуст прога не закрывается.
Если sCBHistory не выделен, но REChat пуст прога не закрывается.
Если sCBHistory не выделен и REChat не пуст прога закрывается.

Где я допустил косяк?
Shouldercannon вне форума Ответить с цитированием
Старый 17.12.2008, 14:42   #2
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Очень просто. Смотрим первый вариант:
Код:
if REChat.Text <> '' then
S:=TStringList.Create;
S.Add(REChat.Text);
То есть, S:=TStringList.Create иногда происходит, а иногда нет.
Но! В любом случае есть попытка S.Add(...
А что будет, если не было S:=TStringList.Create ?
Правильно - S не создана, а мы к ней обращаемся, то есть обращаемся к несуществующему объекту (Access violation. Read of address 00000000)...
mihali4 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
при помощи метода focus(): запрограммировать прокручивание текста в основной линейке Дмитрий223 JavaScript, Ajax 1 02.12.2008 19:02
Сохраниние документа перед выходом Vladya Помощь студентам 6 09.11.2008 10:30
Обработка Shift+Insert при вставке текста Dux Общие вопросы Delphi 1 20.10.2008 22:10
Ошибка при отключении ОС GREK Операционные системы общие вопросы 1 24.09.2008 16:50
Управление аудио входом/выходом Air Win Api 7 20.09.2008 17:00