Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.12.13;
Скачать: CL | DM;

Вниз

Глюкии ввода-вывода ReWrite   Найти похожие ветки 

 
mw_Kronos ©   (2009-10-26 10:51) [0]

Есть у меня тип:
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 должна создавать и открывать файл для записи при его отсутствии, но реально выдает ошибку. Почему?


 
Сергей М. ©   (2009-10-26 11:21) [1]

F1 + "FileMode"


 
mw_Kronos ©   (2009-10-26 11:29) [2]

FileMode = 2


 
Сергей М. ©   (2009-10-26 11:37) [3]

У меня этот чуть упрощенный код успешно работает:

function SaveData(dirPath:string):boolean;
var
   i: Integer;
  f:file of Integer;
begin
{$I-}
AssignFile(f, dirpath);
ReWrite(f);
if IOResult = 0 then
Write(f,i)
else
ShowMessage(IntToStr(IOResult));
CloseFile(f);
{$I+}
end;

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


 
mw_Kronos ©   (2009-10-26 11:45) [4]

а если не упрощать?


 
mw_Kronos ©   (2009-10-26 11:49) [5]

странно, в упрощенном виде у меня тоже работает


 
Плохиш ©   (2009-10-26 12:03) [6]

Приведённый код в BDS2006 работает без проблем, ищите ошибку в неприведённом коде.


 
Сергей М. ©   (2009-10-26 12:06) [7]

И в "усложненном" тоже работает)


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
data: TData;

function SaveData(dirPath:string):boolean;
var
   i: Integer;
   s:string;
  f:file of TData;
begin
{$I-}
AssignFile(f, dirpath);
ReWrite(f);
if IOResult = 0 then
Write(f,data)
else
ShowMessage(IntToStr(IOResult));
CloseFile(f);
{$I+}
end;

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



 
mw_Kronos ©   (2009-10-26 12:14) [8]

у меня RadStudio 2007


 
Anatoly Podgoretsky ©   (2009-10-26 12:20) [9]

> mw_Kronos  (26.10.2009 12:14:08)  [8]

А чего искать, наверно недостаточно прав на папку.


 
Anatoly Podgoretsky ©   (2009-10-26 12:22) [10]

И непонятно, зачем там передается dirPath, наверно не зря.


 
mw_Kronos ©   (2009-10-26 12:31) [11]

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

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

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


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


> у меня RadStudio 2007


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


 
mw_Kronos ©   (2009-10-26 12:34) [13]

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


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

А так


type
 TData = packed 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
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.


?


 
Anatoly Podgoretsky ©   (2009-10-26 12:47) [15]


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

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


 
mw_Kronos ©   (2009-10-26 12:56) [16]

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


 
Anatoly Podgoretsky ©   (2009-10-26 13:05) [17]

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

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


 
mw_Kronos ©   (2009-10-26 13:13) [18]

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

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;


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

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

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

> SetCurrentDir(dirPath + "\Base");

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

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


 
mw_Kronos ©   (2009-10-26 13:25) [20]

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


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

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

какая?


 
mw_Kronos ©   (2009-10-26 13:53) [22]

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


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


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


Алё, гараж !

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


 
mw_Kronos ©   (2009-10-26 13:57) [24]

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


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

У всех все варианты работают, а у тебя нет.
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 14:04) [26]

[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;

Не работает.


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


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


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


 
mw_Kronos ©   (2009-10-26 14:13) [28]

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


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


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


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


 
mw_Kronos ©   (2009-10-26 15:23) [30]

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



Страницы: 1 вся ветка

Текущий архив: 2009.12.13;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.017 c
2-1256057370
Инна
2009-10-20 20:49
2009.12.13
GDI как "затенить" заданый прямоугольник ?


15-1255120208
Юрий
2009-10-10 00:30
2009.12.13
С днем рождения ! 10 октября 2009 суббота


2-1256210880
Nucer
2009-10-22 15:28
2009.12.13
Вопрос по исключениям


2-1256814151
Aleks
2009-10-29 14:02
2009.12.13
Запуск программ в Дельфи


15-1255252664
Kerk
2009-10-11 13:17
2009.12.13
Украсть ящик водки, продать его, а полученные деньги пропить.