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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.07.2009, 18:25   #1
inkubus
 
Регистрация: 13.07.2009
Сообщений: 3
По умолчанию access violation at address in module.

здравствуйте. помогите определить, где ошибка.
Код:
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, PerlRegEx, StdCtrls;

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

var
  Form1: TForm1;
  Regular:TStringList;
     FList: TStringList;
implementation

{$R *.dfm}
//условие
function TForm1.Regit(metin:string):boolean;
var
r: TPerlRegEx;
begin
  r:=TPerlRegEx.Create(nil);
  r.Options := [preCaseless];
  r.RegEx:='^mama';
  Regular := TStringList.Create;
  try
  if r.Match then
    begin
      repeat
        Regular.Add(r.MatchedExpression);
      until not r.MatchAgain;
    end
else
Result:=False;
  except
     Result:=False;
  end;
   end;

procedure TForm1.Button2Click(Sender: TObject);
var
  Index: Integer;
  Temp: TStringList;
begin
Temp:= TStringList.Create();
//if Regit(FList.GetText)=False then //не нужно
//Temp.Add('данные не обнаружены') //не нужно
//else //не нужно
for Index:= 0 to Regular.Count - 1 do
begin
if (Regular[Index] <> '') and (Temp.IndexOf(Regular[Index]) = -1) then
Temp.Add(Regular[Index])
end;
try
begin
Temp.SaveToFile('result.txt');
  finally
    Temp.Free();
  end;
     end;
 //открыть
procedure TForm1.Button1Click(Sender: TObject);
var
  Temp: TStringList;
  Index: Integer;
begin
  if not OpenDialog1.Execute()
    then Exit;
     FList:= TStringList.Create();
  try
    for Index:= 0 to OpenDialog1.Files.Count - 1 do
      try
        Temp.LoadFromFile(OpenDialog1.Files[Index]);
        FList.AddStrings(Temp);
      except
      end;
  finally
    Temp.Free();
  end;
end;

end.
при нажатии на кнопку Button2Click, без открытия файла, появляется ошибка:
Код:
Acces violation at address 0046А899 in module 'Project1.exe'.
Read of Address 00000000
раньше такого небыло, а тут появилось как избавиться?

Последний раз редактировалось inkubus; 14.07.2009 в 09:05.
inkubus вне форума Ответить с цитированием
Старый 13.07.2009, 18:29   #2
Dj_smart
Капсула от спама
Форумчанин
 
Аватар для Dj_smart
 
Регистрация: 04.03.2008
Сообщений: 779
По умолчанию

Во первых функция Regit которая регистрирует жизненно важный огран вообще нигде не используется
Если данный ответ не столь конкретен, как Вы желаете его увидеть, возможно необходимо поразмыслить, стоит ли вопрос того, чтобы о нём спрашивать на форуме?
CncFiles.ru - бесплатный файловый хостинг
Dj_smart вне форума Ответить с цитированием
Старый 13.07.2009, 18:33   #3
uberchel
Участник клуба
 
Аватар для uberchel
 
Регистрация: 19.01.2009
Сообщений: 1,453
По умолчанию

И зачем скобки там где не надо, это же не C++!

Код:
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, PerlRegEx, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    OpenDialog1: TOpenDialog;
    function Regit(metin:string):boolean;
    procedure Button2Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  Regular:TStringList;
     FList: TStringList;
implementation

{$R *.dfm}
//условие
function TForm1.Regit(metin:string):boolean;
var
r: TPerlRegEx;
begin
  r:=TPerlRegEx.Create(nil);
  r.Options := [preCaseless];
  r.RegEx:='^mama';
  r.Subject:=metin;
  Regular := TStringList.Create;
  try
  if r.Match then
    begin
      repeat
        Regular.Add(r.MatchedExpression);
      until not r.MatchAgain;
      Result:=True;
    end
else
Result:=False;
  except
     Result:=False;
  end;
   end;

procedure TForm1.Button2Click(Sender: TObject);
var
  Index: Integer;
  Temp: TStringList;
begin
Temp:= TStringList.Create;
Regular := TStringList.Create;
//if Regit(FList.GetText)=False then //не нужно
//Temp.Add('данные не обнаружены') //не нужно
//else //не нужно
for Index:= 0 to Regular.Count - 1 do
begin
if (Regular[Index] <> '') and (Temp.IndexOf(Regular[Index]) = -1) then
Temp.Add(Regular[Index]);
Regular.Ree;
end;
try
Temp.SaveToFile('result.txt');
  finally
    Temp.Free;
  end;
     end;
 //открыть
procedure TForm1.Button1Click(Sender: TObject);
var
  Temp: TStringList;
  Index: Integer;
begin
  if not OpenDialog1.Execute
    then Exit;
     FList:= TStringList.Create;
  Temp:= TStringList.Create;
  try
    for Index:= 0 to OpenDialog1.Files.Count - 1 do
      try
        Temp.LoadFromFile(OpenDialog1.Files[Index]);
        FList.AddStrings(Temp);
      except
      end;
  finally
    Temp.Free;
  end;
end;

end.

Последний раз редактировалось uberchel; 13.07.2009 в 18:37.
uberchel вне форума Ответить с цитированием
Старый 13.07.2009, 19:57   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Код:
Regular := TStringList.Create;
//if Regit(FList.GetText)=False then //не нужно
//Temp.Add('данные не обнаружены') //не нужно
//else //не нужно
for Index:= 0 to Regular.Count - 1 do
uberchel, а Вас ничего не смущает в Ваших исправлениях?
Тогда ответьте, после Regular := TStringList.Create;
сколько записей будет в Regular? сколько раз выполнится цикл for Index .... to Regular.Count ?
Хотя, безусловно, access violation не будет

правильно сказано, нужно вызывать функцию regit()

там же закомментарен код, который вызывает эту функцию... да ещё с пометкой "//не нужно"
ТС, нужно, да ещё как нужно!!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 13.07.2009, 20:49   #5
мимо
Пользователь
 
Регистрация: 13.06.2009
Сообщений: 61
По умолчанию

так я отрыл
Код:
if not Regit(FList.GetText) then
Temp.Add('данные не обнаружены')
else
все равно, если не открывать файл, а просто нажать на Button2Click выскакивает эта ошибка
мимо вне форума Ответить с цитированием
Старый 13.07.2009, 21:28   #6
uberchel
Участник клуба
 
Аватар для uberchel
 
Регистрация: 19.01.2009
Сообщений: 1,453
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
Код:
Regular := TStringList.Create;
//if Regit(FList.GetText)=False then //не нужно
//Temp.Add('данные не обнаружены') //не нужно
//else //не нужно
for Index:= 0 to Regular.Count - 1 do
uberchel, а Вас ничего не смущает в Ваших исправлениях?
Тогда ответьте, после Regular := TStringList.Create;
сколько записей будет в Regular? сколько раз выполнится цикл for Index .... to Regular.Count ?
Хотя, безусловно, access violation не будет

правильно сказано, нужно вызывать функцию regit()

там же закомментарен код, который вызывает эту функцию... да ещё с пометкой "//не нужно"
ТС, нужно, да ещё как нужно!!
Ну поспешил, что первое бросилась в глаза и исправил.
uberchel вне форума Ответить с цитированием
Старый 13.07.2009, 22:17   #7
inkubus
 
Регистрация: 13.07.2009
Сообщений: 3
По умолчанию

что с '//', что без них, все равно - ошибка
inkubus вне форума Ответить с цитированием
Старый 13.07.2009, 22:57   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Господи, inkubus, но неужели Вы программируете методом тыка?!
Ну расскомментарили Вы строки, Вы видите, ЧТО передаётся параметром в функцию regit() ?
FList.GetText
А что такое FList ? Это объект типа TStringList...
А где он создаётся? А создаётся он при нажатии на кнопку Button1
А что будет, если обратиться к методам НЕСОЗДАННОГО объекта?! Будет ACCESS VIOLATION!! Что Вы и имеете!

Логика Вашей программы такова, что пока не нажали на кнопку Button1 Вам НЕЧЕГО обрабатывать и анализировать... Хотите, чтобы Выдавалось сообщение,
так проверяйте в начале процедуры Button2Click:
Код:
if Not Assigned(FList) then begin
  Application.MessageBox('Вы ещё не загрузили файл','Ошибка',MB_Ok or MB_IconError);
  exit;
end;
Serge_Bliznykov вне форума Ответить с цитированием
Старый 09.07.2012, 07:19   #9
Teilon
Новичок
Джуниор
 
Регистрация: 12.07.2009
Сообщений: 1
По умолчанию

здесь банальная ошибка:
try
begin
Temp.SaveToFile('result.txt');
finally
Temp.Free();
end;
для чего лишний begin в procedure TForm1.Button2Click(Sender: TObject);??
Teilon вне форума Ответить с цитированием
Старый 09.07.2012, 07:50   #10
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
здесь банальная ошибка:
это не ошибка, просто лишний текст.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
access violation at address UnChanter Общие вопросы Delphi 22 07.02.2011 11:00
Access violation at address... Ralf_ru Помощь студентам 13 05.04.2009 05:20
Access violation at address при выполнении end elsin Общие вопросы Delphi 5 30.01.2009 10:29
Access violation at address.. RegentM Общие вопросы Delphi 4 01.11.2007 03:46
Ошибка: "Access violation at address 00454F01 in module 'Project1.exe'. Read of address 00000000. Fen1x Общие вопросы Delphi 8 13.10.2007 20:13