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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.01.2011, 20:27   #1
123cmp
 
Аватар для 123cmp
 
Регистрация: 22.01.2011
Сообщений: 3
Восклицание Ошибка при выполнении

Здравствуйте. Пишу программу на Delphi 7, цель которой - обработать текстовый файл след. образом: в каждой строке, если 2-й символ "3" - то поменять его на "4", и убрать символы после 18-го.
Вот что получилось:

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls, ImgList, ToolWin;

type
  TForm1 = class(TForm)
    OpenDialog1: TOpenDialog;
    SaveDialog1: TSaveDialog;
    ToolBar1: TToolBar;
    ImageList1: TImageList;
    ToolButton1: TToolButton;
    ToolButton2: TToolButton;
    ToolButton3: TToolButton;
    ToolButton4: TToolButton;
    ToolButton5: TToolButton;
    ToolButton6: TToolButton;
    ToolButton7: TToolButton;
    RichEdit1: TRichEdit;
    procedure ToolButton4Click(Sender: TObject);
    procedure ToolButton2Click(Sender: TObject);
    procedure ToolButton3Click(Sender: TObject);
    procedure ToolButton1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  a: string;
  j,i:byte;
  Form1: TForm1;
  fname, st1, st: string;

implementation

{$R *.dfm}

procedure TForm1.ToolButton4Click(Sender: TObject);
begin
if opendialog1.Execute then
begin
fname := opendialog1.FileName;
richedit1.Lines.LoadFromFile(fname);
end;
end;

procedure TForm1.ToolButton2Click(Sender: TObject);
begin
if savedialog1.Execute then
begin
 fname := savedialog1.FileName;
richedit1.Lines.savetoFile(fname);
end;
end;

procedure TForm1.ToolButton3Click(Sender: TObject);
begin
close;
end;

procedure TForm1.ToolButton1Click(Sender: TObject);
begin
for i:=0 to richedit1.Lines.Count do
begin
st := richedit1.Lines[i];
for j:=1 to 18 do
st1[j] := st[j];
if st1[2] = '3' then
st1[2] := '4';
end;
begin
richedit1.Lines[i]:= st1;
end;
end;
end.
Программа компилируется и вополняеться, но при попытке выполнить изменение строк выводит след. сообщение:

Цитата:
Project Project1.exe raised exception class EAccessViolation with message ' Access violation at address 0045BD14 in module 'Project1.exe'. Read of address 00000000'. Process stopped. Use Step or Run to continue.
при этом указывая на строку:
Код:
st1[j] := st[j];
Подскажите пожалуйста в чем моя ошибка и как ее исправить.
123cmp вне форума Ответить с цитированием
Старый 22.01.2011, 21:08   #2
GetMax
Форумчанин
 
Регистрация: 21.10.2010
Сообщений: 588
По умолчанию

Попробуйте переделать вот так
Код:
rocedure TForm1.Button1Click(Sender: TObject);
var
  i,dl:Integer;
  st:String;
begin
  for i:=0 to richedit1.Lines.Count do
  begin
  st := richedit1.Lines[i];
  Dl:=Length(St);
  Delete(St,19,dl-18);
  if st[2] = '3' then st[2] := '4';
  richedit1.Lines[i]:= st;
  end;
end;

end.
Пользователь не знает, чего он хочет, пока не увидит то, что он получил.
Для благодарностей WMR R145235935681
GetMax вне форума Ответить с цитированием
Старый 22.01.2011, 22:48   #3
123cmp
 
Аватар для 123cmp
 
Регистрация: 22.01.2011
Сообщений: 3
По умолчанию Не помагает

Все равно выбивает ошибку, на этот раз в строке:
Код:
  if st[2] = '3' then st[2] := '4';
Я переделывал несколько раз, ошибку всегда выводит при первом обращении к символу строки st[№].
123cmp вне форума Ответить с цитированием
Старый 22.01.2011, 23:04   #4
kangreon
Форумчанин
 
Аватар для kangreon
 
Регистрация: 03.04.2009
Сообщений: 305
По умолчанию

Стоит поправить
Код:
for i:=0 to richedit1.Lines.Count-1 do
тк RichEdit1.Lines.Strings[] Начинается с 0 а richedit1.Lines.Count начинает отсчет с 1.
и
Код:
i := richedit1.Lines.Count;
s := RichEdit1.Lines.Strings[i];
не существует. Возможно в этом и ошибка.
kangreon вне форума Ответить с цитированием
Старый 22.01.2011, 23:45   #5
123cmp
 
Аватар для 123cmp
 
Регистрация: 22.01.2011
Сообщений: 3
По умолчанию

Спасибо. Вы были правы. Программа заработала нормально в таком виде:
Код:
procedure TForm1.ToolButton1Click(Sender: TObject);
begin
i:=(-1);
repeat
i:=i+1;
st := memo1.Lines[i];
if st[2]='3' then st[2] := '4';
Delete(St,19,Length(St)-18);
memo1.Lines[i]:= st;
until i = memo1.Lines.Count-1;
end;
123cmp вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка при выполнении программы Гурам Общие вопросы Delphi 1 18.11.2010 18:53
Ошибка при выполнении макроса rlev Microsoft Office Excel 8 22.02.2010 12:41
Ошибка при Выполнении Insert nimf БД в Delphi 2 27.11.2007 18:16
Ошибка при выполнении запроса Шани БД в Delphi 4 27.07.2007 13:04
Странная ошибка при выполнении okolobaxa Общие вопросы Delphi 2 03.07.2007 00:47