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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.07.2009, 20:47   #1
anGeee
Пользователь
 
Аватар для anGeee
 
Регистрация: 18.11.2008
Сообщений: 94
По умолчанию Ошибка с переменной

Вот, начал писать приложение от нечего делать и столкнулся с косяком в коде, который не могу исправить..
Вот код
Код:
unit records;

interface
 Type
   tRecord = Class(TObject)
   private
    Login : string;
    Password : string;
   end;

  Type tFile = {file of tRecord}text;
  Function fLoginExists(s : string):boolean;
  Procedure pSaveProfile(login, password : string);

implementation
 Function fLoginExists(s : string):boolean;
 Var vFile : tFile;
     vRecord : tRecord;
     f : boolean;
     str : string;
 Begin
  AssignFile(vFile,'data.txt');
  Reset(vFile);
  f:=false;
  while not(eof(vFile)) do
   begin
    Read(vFile,str);
    vRecord.Login:=str;
     if vRecord.Login = s then
      f:=true;
   end;
  fLoginExists:=f;
  CloseFile(vFile);
 End;

 Procedure pSaveProfile(login, password : string);
 Var vFile : tFile;
     vRecord : tRecord;
 Begin
  AssignFile(vFile,'data.txt');
  ReWrite(vFile);
  vRecord.Login:=login;
  vRecord.Password:=Password;
  Write(vFile,vRecord.Login);
  CloseFile(vFile);
 End;
end.
Собственно, при выполнении программы выскакивает исключение EAccessViolation в строке, выделенной красным цветом. При прогоне модуля в пошаговом режиме переменная vRecord.Login обозначается как InaccessiableValue.. Хотя в процедуре ниже, то же самое vRecord.Login нормально используется.. В чем тут дело ?
пс не ругайте за код = )
anGeee вне форума Ответить с цитированием
Старый 23.07.2009, 20:53   #2
Evgeniy26
Форумчанин
 
Аватар для Evgeniy26
 
Регистрация: 29.05.2009
Сообщений: 384
По умолчанию

Создай сначала:
Код:
vRecord := TRecord.Create;
Про Free не забудь.
Код:
vRecord.Free;
Evgeniy26 вне форума Ответить с цитированием
Старый 23.07.2009, 20:56   #3
anGeee
Пользователь
 
Аватар для anGeee
 
Регистрация: 18.11.2008
Сообщений: 94
По умолчанию

Эм.. Спасибо - работает, но не могли бы вы объяснить, почему в процедуре pSaveProfile не потребовалось создание переменной ? .. *dont_know*

Опять косяк.. Стал переделывать код, чтобы файл был типизированным
Код:
unit records;

interface
 Type
   tRecord = Class(TObject)
   private
    Login : string;
    Password : string;
   end;

  Type tFile = file of tRecord;
  Function fLoginExists(s : string):boolean;
  Procedure pSaveProfile(login, password : string);

implementation
 Function fLoginExists(s : string):boolean;
 Var vFile : tFile;
     vRecord : tRecord;
     f : boolean;
 Begin
  vRecord:=TRecord.Create;
  AssignFile(vFile,'data.pkb');
  Reset(vFile);
  f:=false;
  while not(eof(vFile)) do
   begin
    Read(vFile,vRecord);
    if vRecord.Login = s then
     f:=true;
   end;
  fLoginExists:=f;
  CloseFile(vFile);
  vRecord.Free;
 End;

 Procedure pSaveProfile(login, password : string);
 Var vFile : tFile;
     vRecord : tRecord;
 Begin
  vRecord:=TRecord.Create;
  AssignFile(vFile,'data.pkb');
  ReWrite(vFile);
  vRecord.Login:=login;
  vRecord.Password:=Password;
  Write(vFile,vRecord);
  CloseFile(vFile);
  vRecord.Free;
 End;
end.
Снова выскакивает исключение в той же строке. Причем vrecord.Login принмает значение InaccessiableValue после строчки
Код:
Read(vFile,vRecord);
Что я теперь не так сделал ?

Последний раз редактировалось anGeee; 23.07.2009 в 21:39.
anGeee вне форума Ответить с цитированием
Старый 23.07.2009, 21:56   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

хм...а вы в курсе что обьвление экземпляра класса то есть переменная классовая
это указатель...потому пишется указатель на сопряженную область данных а не данные сами
потому и запись работает...так как сам указатель то существует
Read(vFile,vRecord);...ужас
переписываете указатель другим значением...потому вылетает следущее обращение к этому обьекту vRecord.Login = s
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Последний раз редактировалось Пепел Феникса; 23.07.2009 в 21:59.
Пепел Феникса вне форума Ответить с цитированием
Старый 23.07.2009, 23:10   #5
anGeee
Пользователь
 
Аватар для anGeee
 
Регистрация: 18.11.2008
Сообщений: 94
По умолчанию

Был не в курсе.. Спасибо за разъяснение. В качестве решения сделал vRecord записью, а не классом. А какие еще могли бы быть решения ?
Ну и в догонку еще один вопрос по моему приложению. У меня при создании формы проверяется, существует ли файл с данными
Код:
procedure TForm1.FormCreate(Sender: TObject);
begin
 if not FileExists('Data.pkb') then
  FileCreate('Data.pkb');
end;
И во время тестов, обнаружилась ошибка: файла не существует, я запускаю прогу, вижу, что файл появился в файле, начинаю вводить новый профиль и пароль, и выскакивает ошибка на строчке
Код:
  
  Reset(vFile);
, где vFile связан с файлом, хранящий данные. При перезагрузке проги ошибка исчезает..
anGeee вне форума Ответить с цитированием
Старый 23.07.2009, 23:23   #6
Вавел из ГМТУ
Форумчанин
 
Регистрация: 19.06.2009
Сообщений: 896
По умолчанию

Желательно указывать полный путь....

ExtractFilePath(ParamStr(0)) + 'Data.pkb'

адд: там должен быть код ошибки.. Какая цифра?
Вавел из ГМТУ вне форума Ответить с цитированием
Старый 23.07.2009, 23:31   #7
anGeee
Пользователь
 
Аватар для anGeee
 
Регистрация: 18.11.2008
Сообщений: 94
По умолчанию

Везде понавтыкал полный путь.. Та же ошибка. Код - 32.
anGeee вне форума Ответить с цитированием
Старый 23.07.2009, 23:34   #8
Вавел из ГМТУ
Форумчанин
 
Регистрация: 19.06.2009
Сообщений: 896
По умолчанию

Первый раз слышу про "32"....

1. Сделал АсингФаил? (уже вижу что да)
2. Поставь брекпоинт и погляди что пытается передаться в Reset(...);

Последний раз редактировалось Вавел из ГМТУ; 23.07.2009 в 23:37.
Вавел из ГМТУ вне форума Ответить с цитированием
Старый 23.07.2009, 23:43   #9
anGeee
Пользователь
 
Аватар для anGeee
 
Регистрация: 18.11.2008
Сообщений: 94
По умолчанию

Ну I/O 32 ..
Ну не важно. Как оказалось - это ошибка означает, что файл занят другим процессом. Методом логических умозаключений я пришел к выводу, что все дело в строчке
Код:
FileCreate('Data.pkb');
Поэтому я переделал всю эту процедуру следующим образом
Код:
procedure TForm1.FormCreate(Sender: TObject);
var FileHandle : Integer;
begin
 if not FileExists(ExtractFilePath(ParamStr(0)) + 'Data.pkb') then
  FileHandle:=FileCreate(ExtractFilePath(ParamStr(0)) + 'Data.pkb');
 FileClose(FileHandle); 
end;
Я все правильно сделал ?
anGeee вне форума Ответить с цитированием
Старый 23.07.2009, 23:51   #10
Вавел из ГМТУ
Форумчанин
 
Регистрация: 19.06.2009
Сообщений: 896
По умолчанию

Чтото неочень понятно что ты пытаешься сделать....
Тебе нужно создать фаил со структурой:
Login Password
Login Password
Login Password
....

А потом считывать эти значения?

Так может тупо по строкам считывать и не заморачиваться с tRecord?

По коду:

FileHandle объявлена как Integer... Тогда FileClose(FileHandle) - ?
Параметром должен быть фаил который требуется закрыть, а не число.

или я чтото туплю
Вавел из ГМТУ вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
очистка переменной Артэс Общие вопросы C/C++ 12 07.07.2009 18:42
Имя переменной как переменная. Как получить доступ к такой переменной? Denni Microsoft Office Access 8 02.04.2009 10:06
Обнуление переменной [MI_nor] Общие вопросы C/C++ 3 05.11.2008 18:01
Изменение переменной yura-cat Помощь студентам 7 20.09.2008 17:42
Работа с файлами (создание, удаление, открытие, связываение с переменной, очищение памяти переменной) Arkuz Общие вопросы Delphi 12 25.09.2007 20:47