Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Глюкии ввода-вывода ReWrite [D7, WinXP]


Страницы:   1 2

mw_Kronos ©   (2009-10-26 10:51:00) 

Есть у меня тип:
type TData = record
     period          :array [0..1, 0..23] of TDateTime;
     text            :array [0..23] of string[255];
     date            :TDateTime;
     count           :integer;
     password        :array [0..23] of string[255];
end;

Есть процедура которая должна писать в файл этот тип:

function THallData.SaveData(dirPath:string):boolean;
var s:string;
   f:file of TData;
begin
s := FormatDateTime('ddmmyyyy',data.date) + '.dat';
{$I-}
SaveData := true;
AssignFile(f, s);
ReWrite(f);
if IOResult = 0 then
 Write(f,data)
else
 SaveData := false;
CloseFile(f);
{$I+}
end;

Проблема в следующем: если файл не существует, то он создается, но запись в него невозможна, IOResult возвращает 103. А если файл уже существует, то запись проходит успешно. В хелпе написано что ReWrite должна создавать и открывать файл для записи при его отсутствии, но реально выдает ошибку. Почему?


mw_Kronos   (2009-10-26 15:23:00) [1]

Ну вобщем наверно да. Хотя глюк остался непонятым. Причем есть другая прога которая пишет похожую структуру в файл и там всё работает.


Сергей М.   (2009-10-26 14:14:00) [2]


> mw_Kronos ©   (26.10.09 14:13) [28]


Т.е. вопрос исчерпан.


mw_Kronos   (2009-10-26 14:13:00) [3]

Ошибочка , [14] работает.


Сергей М.   (2009-10-26 14:05:00) [4]


> mw_Kronos ©   (26.10.09 14:04) [26]


Прямо тк и говорит "Не работаю" ?)


mw_Kronos   (2009-10-26 14:04:00) [5]

[14]
function THallData.SaveData(dirPath:string):boolean;
var
fs : TFileStream;
s  : string;
begin
s := FormatDateTime('ddmmyyyy',data.date) + '.dat';
fs := TFileStream.Create(s, fmCreate);
try
 fs.WriteBuffer(data, SizeOf(data));
finally
 fs.Free;
end;
end;

Не работает.


{RASkov}   (2009-10-26 14:00:00) [6]

У всех все варианты работают, а у тебя нет.
unit Unit1;

interface

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

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

var
 Form1: TForm1;

type TData = record
    period          :array [0..1, 0..23] of TDateTime;
    text            :array [0..23] of string[255];
    date            :TDateTime;
    count           :integer;
    password        :array [0..23] of string[255];
end;
var Dt: TData;

implementation

{$R *.dfm}

function SaveData(dirPath: string):boolean;
var s:string; f:file of TData;
begin
 try
  SaveData := True;
  s := FormatDateTime('ddmmyyyy', Dt.date) + '.dat';
  AssignFile(f, IncludeTrailingPathDelimiter(dirPath)+s);
  ReWrite(f);
  try
   Write(f, Dt);
  finally
   CloseFile(f);
  end;
 except
  SaveData := False;
 end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Dt.date:=Date;
if SaveData(ExtractFilePath(ParamStr(0))) then ShowMessage('Save')
 else ShowMessage('NOT Save');
end;

end.


mw_Kronos   (2009-10-26 13:57:00) [7]

Еще класс EInOutError выдает сообщение Read beyond end of file


Сергей М.   (2009-10-26 13:55:00) [8]


> mw_Kronos ©   (26.10.09 13:53) [22]


Алё, гараж !

[14] работает или нет ?)


mw_Kronos   (2009-10-26 13:53:00) [9]

IOResult = 103
Если не пользоваться директивой {$I-} то в период выполнения вылетает Error:
I/O Error 103


{RASkov}   (2009-10-26 13:36:00) [10]

> [20] mw_Kronos ©   (26.10.09 13:25)
> Абсолютно одинаковая ошибка.

какая?


mw_Kronos   (2009-10-26 13:25:00) [11]

Да я же говорю что не работает ни так ни эдак. Абсолютно одинаковая ошибка.


{RASkov}   (2009-10-26 13:19:00) [12]

> [18] mw_Kronos ©   (26.10.09 13:13)

В одном месте программы делаешь

> SetCurrentDir(dirPath + '\Base');

в другом, надеясь на прошлое, пытаешься это использовать.

Лучше так не делать. Вроде работает, но....
Лучше так:
> AssignFile(f, dirPath + '\' + s); - это { не} принципиально.


mw_Kronos   (2009-10-26 13:13:00) [13]

Куда пишется как раз-таки известно:

procedure TMainForm.FormShow(Sender: TObject);
begin
dirPath                   := ExtractFileDir(ParamStr(0));
if not DirectoryExists(dirPath) then
 begin
   ShowMessage('Нет доступа к базе данных: ' + dirPath);
   Halt(0);
 end
else
 SetCurrentDir(dirPath + '\Base');
end;


Anatoly Podgoretsky   (2009-10-26 13:05:00) [14]

> mw_Kronos  (26.10.2009 12:56:16)  [16]

Принципиально, без этого неизвестно куда пишется.


mw_Kronos   (2009-10-26 12:56:00) [15]

AssignFile(f, dirPath + '\' + s); - это не принципиально.
И этот и другой способ одинаково верны и одинаково не работают.


Anatoly Podgoretsky   (2009-10-26 12:47:00) [16]


> AssignFile(f, dirPath + '\' + s);

Вот так было правильно


Сергей М.   (2009-10-26 12:45:00) [17]

А так


type
 TData = packedrecord
    period          :array [0..1, 0..23] of TDateTime;
    text            :array [0..23] of string[255];
    date            :TDateTime;
    count           :integer;
    password        :array [0..23] of string[255];
 end;

var
data: TData;

function SaveData(dirPath:string): Boolean;
var
 fs: TFileStream;
begin
 fs := TFileStream.Create(dirPath, fmCreate);
 try
   fs.WriteBuffer(data, SizeOf(data));
 finally
   fs.Free;
 end;

end;

procedure TForm1.Button6Click(Sender: TObject);
begin
 SaveData('c:\1.dat')
end;

end.


?


mw_Kronos   (2009-10-26 12:34:00) [18]

Какой-то глюк возникает если я открываю файл как file of TData. Если же открыть как file of integer и записать туда любое число то всё работает нормально.


Сергей М.   (2009-10-26 12:33:00) [19]


> у меня RadStudio 2007


И что ?
[7] не работает ?)


mw_Kronos   (2009-10-26 12:31:00) [20]

dirPath это лишняя переменная, я немного переписал процедуру. Изначально было вот так

AssignFile(f, dirPath + '\' + s);

Но ошибка как была так и осталась.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо