Форум: "Начинающим";
Текущий архив: 2009.12.13;
Скачать: [xml.tar.bz2];
ВнизГлюкии ввода-вывода 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;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.011 c