![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Глюкии ввода-вывода ReWrite [D7, WinXP]
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);
Но ошибка как была так и осталась.