На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! ПРАВИЛА РАЗДЕЛА · FAQ раздела Delphi · Книги по Delphi
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как "свернуть" программу в трей.
3. Как "скрыться" от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как прочитать список файлов, поддиректорий в директории?
5. Как запустить программу/файл?
... (продолжение следует) ...

Вопросы, подробно описанные во встроенной справочной системе Delphi, не несут полезной тематической нагрузки, поэтому будут удаляться.
Запрещается создавать темы с просьбой выполнить какую-то работу за автора темы. Форум является средством общения и общего поиска решения. Вашу работу за Вас никто выполнять не будет.


Внимание
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки бан.
Мат в разделе - бан на три месяца...
Модераторы: jack128, D[u]fa, Shaggy, Rouse_
Страницы: (2) [1] 2  все  ( Перейти к последнему сообщению )  
> File access denied
    Процедура для показа списка пользователей/создания нового пользователя/чтения данных конкретного пользователея.

    ExpandedWrap disabled
      Type
        TUser = Record
                  Name:String[100];
                  Password:String[100];
                End;
       
      var
        F:File of TUser;
        User:TUser;
        I,I1:Word;
       
      Procedure UserProc(D:Byte;D2:Byte);{D - 1-show 2-add 3-read, D2 - Номер пользователя}
      Var
       Size:Word;
       S:String;
      Begin
        AssignFile(F,Form1.CurDir+'User.ini');
        {$I-}
        Reset(F);
          If  IOResult<>0 then Rewrite(F);
        {$I+}
          Size:=FileSize(F);
       
        Case D of
         1:Begin
             While Not Eof(F) do
               Begin
                 Read(F,User);
                 Form2.ListBox1.Items.Add(User.Name);
                 Form4.ListBox1.Items.Add(User.Name);
               End;
           End;
         2:Begin
             S:=InputBox('Введите имя нового пользователя:','','');
               If S<>'' Then
               If not DirectoryExists(Form1.CurDir+S) Then
                 Begin
                   User.Name:=S;
                   S:=InputBox('Введите пароль:','','');
                     If S<>'' Then
                       Begin
                         User.Password:=S;
                         Seek(F,Size);
                         Write(F,User);//File Access Denied!!!
                         MkDir(Form1.CurDir+User.Name);
                         Form1.UserDir:=User.Name;
                       End;
                 End Else ShowMessage('Пользователь уже существует');
           End;
         3:Begin
             Seek(F,D2);
             Read(F,User);
           End;
        End;{case}
       
        CloseFile(F);
      End;


    Если мы вызываем данную процедуру для создания пользователя неограниченное кол-во раз, все работает( UserProc(2,0) )

    Стоит только прозвести чтение(UserProcD(3,1) ) и затем снова создание UserProc(2,0), как вываливается Write(F,User);//File Access Denied!!!
    Не пойму в чем дело.

    Файл User.ini не блокирован, я проверял перемещением, в чем ещё может быть дело?

    Там ещё есть код конечно, но в нем нет операций по работе с файлами
    Сообщение отредактировано: ^D^ima -
      Подскажите методу как отловить глюк
        Я не уверен, но может попробовать при Reset и ReWrite указывать размер блока данных.
          Seek(F,Size);
          Seek(F,D2);

          как-то странно, в одном случае передаёшь размер файла(в байтах), а в другом, номер раписи...
            Цитата Polinom2686 @
            попробовать при Reset и ReWrite указывать размер блока данных

            Для типизированного файла такого понятия нет.
              Цитата Shaggy @
              как-то странно, в одном случае передаёшь размер файла(в байтах), а в другом, номер раписи...

              Для типизированного файла FileSize выдает размер в кол-ве записей, а не в байтах
                Подскажите алгоритм багфикса. IDE Delphi7
                  Для начала попробуй переписать "по человечески" ;)
                  ExpandedWrap disabled
                    S:=Form1.CurDir+'User.ini';
                    AssignFile(F,S);
                    if FileExists(S) then
                      Reset(F)
                    else
                      Rewrite(F);
                    try
                      ...
                    finally
                      CloseFile(F);
                    end;
                    Скопировал пример, но по указанным действиям, так и не удалось повторить ошибку, все прекрасно читается и пишется в любом порядке. BDS 2006.
                      Выяснои в чем дело. ТОлько не знаю как решить. Помогите советом...

                      Сократил 1-й код до минимума.
                      ExpandedWrap disabled
                        unit Unit2;
                         
                        interface
                         
                        uses
                          Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
                          Dialogs, AdvGlowButton, StdCtrls, AdvSmoothExpanderGroup;
                         
                        type
                          TForm2 = class(TForm)
                            AdvSmoothExpanderGroup1: TAdvSmoothExpanderGroup;
                            AdvGlowButton1: TAdvGlowButton;
                            procedure AdvGlowButton1Click(Sender: TObject);
                          private
                            { Private declarations }
                          public
                            { Public declarations }
                          end;
                         
                         
                        Type
                          TUser = Record
                                    Name:String[100];
                                    Password:String[100];
                                  End;
                         
                        var
                          Form2: TForm2;
                          F:File of TUser;
                          User:TUser;
                         
                        implementation
                         
                        uses NxCustomGridControl, Unit1;
                         
                        {$R *.dfm}
                         
                         
                        procedure TForm2.AdvGlowButton1Click(Sender: TObject);
                        begin
                          form1.NextGrid1.LoadFromTextFile(form1.CurDir+'1\table1.tbl');
                         
                          AssignFile(F,Form1.CurDir+'User.ini');
                         
                          Reset(F);
                          User.Name:='777';
                          User.Password:='777';
                          Write(F,User);
                          CloseFile(F);
                        end;
                         
                         
                        end.


                      Если убрать form1.NextGrid1.LoadFromTextFile(form1.CurDir+'1\table1.tbl'); то все работает.

                      NextGrid1 это известный компонент(тут)
                      Ошибка в атаче. Что с этим можно сделать? Delphi7
                      Прикреплённый файлПрикреплённый файл__________.png (19,66 Кбайт, скачиваний: 728)
                      Сообщение отредактировано: ^D^ima -
                        Цитата ^D^ima @
                          Reset(F);
                        ...
                          Write(F,User);
                        reset, а потом write ... Вам не кажется, что тут что-то не так? :rolleyes:
                          Если Вам кажется, напишите об этом :yes:
                            Проверь значение переменной FileMode, должно быть = 2 = fmOpenReadWrite
                            (Давно эта мыслЯ крутилась, но ты ж уверял, что больше нет операций с файлами)
                              В точку. :wall:

                              Спасибо большое.

                              Операций со своими файлами не было. Я не думал что из-за сторонней процедуры может быть.
                                Цитата ^D^ima @
                                Если Вам кажется, напишите об этом

                                чтобы "прочитать" файл делаем assignfile,reset,read(ln)...,closefile
                                чтобы записать файл делаем assignfile,rewrite,write(ln)...,closefile
                                так?
                                1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 1,0353 ]   [ 16 queries used ]   [ Generated: 1.09.24, 00:55 GMT ]