Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 31.05.2008, 10:25   #1
AngelOfDeath
Delphi/C++/Asm
Форумчанин Подтвердите свой е-майл
 
Аватар для AngelOfDeath
 
Регистрация: 28.03.2008
Сообщений: 358
Восклицание Проблема с record,string,TFileStream

В чём ошибка данного кода?
Пытаюсь записать Caption формы в dat файл
И при считывании из файла caption становиться пустым

Код:
unit Unit2;

interface

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

type
FormOptionInt=record
  left,Top:Integer;
end;


type
formOptionStr = record
  FormCaption, edittext:string;
end;

type
  TForm2 = class(TForm)
    Edit1: TEdit;
    Button1: TButton;
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

procedure TForm2.Button1Click(Sender: TObject);
begin
Form2.Caption:=Edit1.Text;
end;

procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
var
FOS:formOptionStr;
FOI:FormOptionInt;
F:TFileStream;
begin
FOI.left:=Form2.Left;
foi.Top:=Form2.Top;
FOS.FormCaption:=Form2.Caption;
fos.edittext:=Edit1.Text;
F:=TFileStream.Create('FOI.dat',fmCreate);
f.Write(Foi,SizeOf(FOI));
f.Free;
F:=TFileStream.Create('FOS.dat',fmCreate);
f.Write(Fos,SizeOf(FOS));
f.Free;
end;

procedure TForm2.FormCreate(Sender: TObject);
var
FOI:FormOptionInt;
FOS:formOptionStr;
F:TFileStream;
begin
if FileExists('FOI.dat') then
begin

 F:=TFileStream.Create('FOI.dat',fmOpenRead);
 f.Read(FOI,Sizeof(foi));
 f.Free;
 Form2.Left:=Foi.left;
 Form2.Top:=FOI.Top;
end;
if FileExists('FOS.dat') then
begin
  F:=TFileStream.Create('FOS.dat',fmOpenRead);
  f.Read(FOS,SizeOf(Fos));
  f.Free;
  Form2.Caption:=FOS.FormCaption;
  Form2.Edit1.Text:=FOS.edittext;
end;
end;

end.
AngelOfDeath вне форума Ответить с цитированием
Старый 31.05.2008, 10:45   #2
N!ckeL
Форумчанин
 
Регистрация: 29.03.2008
Сообщений: 300
По умолчанию

Код:
 F:=TFileStream.Create('FOI.dat',fmOpenRead);   
 f.Read(FOI,Sizeof(foi));
FOI-в этот момент пустая (то есть = 0, поэтому читаются 0 байт..) так же как и FOS, нужно записать их размер при уничтожении формы в отдельный файл, а потом загружать. Можно сделать так:
Код:
unit Unit2;   
  
interface   
  
uses   
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,   
  Dialogs, StdCtrls;   
  
type   
FormOptionInt=record   
  left,Top:Integer;   
end;   
  
  
type   
formOptionStr = record   
  FormCaption, edittext:string;   
end;   
  
type   
  TForm2 = class(TForm)   
    Edit1: TEdit;   
    Button1: TButton;   
    procedure FormClose(Sender: TObject; var Action: TCloseAction);   
    procedure FormCreate(Sender: TObject);   
    procedure Button1Click(Sender: TObject);   
  private  
   sizeFOI, sizeFOS:integer; //размеры FOI и FOS
    { Private declarations }   
  public   
    { Public declarations }   
  end;   
  
var   
  Form2: TForm2;   
  
implementation   
  
{$R *.dfm}   
  
procedure TForm2.Button1Click(Sender: TObject);   
begin   
Form2.Caption:=Edit1.Text;   
end;   
  
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);   
var   
FOS:formOptionStr;   
FOI:FormOptionInt;   
F:TFileStream;   
begin   
FOI.left:=Form2.Left;   
foi.Top:=Form2.Top;   
FOS.FormCaption:=Form2.Caption;   
fos.edittext:=Edit1.Text;   
F:=TFileStream.Create('FOI.dat',fmCreate);   
f.Write(Foi,SizeOf(FOI));   
f.Free;   
F:=TFileStream.Create('FOS.dat',fmCreate);   
f.Write(Fos,SizeOf(FOS));   
f.Free; 

sizeFOS:=sizeof(FOS); //записываем
sizeFOI:=sizeof(FOI);
  f:=tstringlist.Create;
  f.Add(inttostr(sizeFOS));
  f.Add(inttostr(sizeFOI));
  f.SaveToFile('data.dat');
  f.Free;
  
end;   
  
procedure TForm2.FormCreate(Sender: TObject);   
var   
FOI:FormOptionInt;   
FOS:formOptionStr;   
F:TFileStream;
S:tStringList;   
begin   

f:=tstringlist.Create; //читаем
  f.LoadFromFile('data.dat');
  sizeFOS:=strtoint(f[0]);
  sizeFOI:=strtoint(f[1]);
  f.Free;

if FileExists('FOI.dat') then   
begin   
  
 F:=TFileStream.Create('FOI.dat',fmOpenRead);   
 f.Read(FOI,Sizeof(foi));   
 f.Free;   
 Form2.Left:=Foi.left;   
 Form2.Top:=FOI.Top;   
end;   
if FileExists('FOS.dat') then   
begin   
  F:=TFileStream.Create('FOS.dat',fmOpenRead);   
  f.Read(FOS,SizeOf(Fos));   
  f.Free;   
  Form2.Caption:=FOS.FormCaption;   
  Form2.Edit1.Text:=FOS.edittext;   
end;   
end;   
  
end.
Вообще чем ini файлы не нравятся?
Карп преодолевший водопад становится драконом.

Последний раз редактировалось N!ckeL; 31.05.2008 в 10:48.
N!ckeL вне форума Ответить с цитированием
Старый 31.05.2008, 10:47   #3
AngelOfDeath
Delphi/C++/Asm
Форумчанин Подтвердите свой е-майл
 
Аватар для AngelOfDeath
 
Регистрация: 28.03.2008
Сообщений: 358
По умолчанию

FOI считываеться нормально
Вот с FOS проблемы
Щас попробую твой способ
AngelOfDeath вне форума Ответить с цитированием
Старый 31.05.2008, 10:48   #4
N!ckeL
Форумчанин
 
Регистрация: 29.03.2008
Сообщений: 300
По умолчанию

ОШИБСЯ:
f:=tstringlist.Create; //читаем
f.LoadFromFile('data.dat');
sizeFOS:=strtoint(f[0]);
sizeFOI:=strtoint(f[1]);
f.Free;
Карп преодолевший водопад становится драконом.
N!ckeL вне форума Ответить с цитированием
Старый 31.05.2008, 10:54   #5
AngelOfDeath
Delphi/C++/Asm
Форумчанин Подтвердите свой е-майл
 
Аватар для AngelOfDeath
 
Регистрация: 28.03.2008
Сообщений: 358
По умолчанию

Да ещё и переменная не f, а s
Код:
s:=tstringlist.Create; //читаем
s.LoadFromFile('data.dat');
sizeFOS:=strtoint(s[0]);
sizeFOI:=strtoint(s[1]);
s.Free;
-------------------------------------------------------------------

Твой код неработает

Последний раз редактировалось AngelOfDeath; 31.05.2008 в 11:01.
AngelOfDeath вне форума Ответить с цитированием
Старый 31.05.2008, 11:12   #6
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

# FormOptionStr = record
# FormCaption, edittext:string;
# end;
#

Здесь в record хранятся ССЫЛКИ а не строки и
и соответственно идет запись ссылок (адресов) строк
Sizeof(fos) =8

record s1: string[20]; s3: string[100] end;
здесь уже сами строки и sizeof(fos)=20+100
программа — запись алгоритма на языке понятном транслятору
evg_m на форуме Ответить с цитированием
Старый 31.05.2008, 11:24   #7
AngelOfDeath
Delphi/C++/Asm
Форумчанин Подтвердите свой е-майл
 
Аватар для AngelOfDeath
 
Регистрация: 28.03.2008
Сообщений: 358
По умолчанию

2evg_m спасибо
Я так и думал))
Вот это работает:
Код:
type
formOptionStr = record
  FormCaption, edittext:string[200];
end;
Тему можно закрыть
AngelOfDeath вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема со String ilya_cska Общие вопросы C/C++ 2 09.03.2008 13:39
проблемы с TFileStream andrey4623 Общие вопросы Delphi 9 01.11.2007 20:44
сохранение изображения с TFileStream andrey4623 Общие вопросы Delphi 10 20.10.2007 20:28
TFilestream UnD)eaD)Snake Win Api 1 27.09.2007 21:22
проблема перевода (PChar и string) Fireleo Общие вопросы Delphi 4 29.07.2007 08:14