Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.007 c
11-1209490183
=BuckLr=
2008-04-29 21:29
2009.12.13
Отрисовка ListView вручную


15-1255811409
Юрий
2009-10-18 00:30
2009.12.13
С днем рождения ! 18 октября 2009 воскресенье


2-1256393458
Lamer6666
2009-10-24 18:10
2009.12.13
Работа с COM портом.


2-1256277237
kyn66
2009-10-23 09:53
2009.12.13
Подсчет среднего значения с нулевыми числами


11-1208885318
=BuckLr=
2008-04-22 21:28
2009.12.13
LZO, чтоб его...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский