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

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

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.06.2012, 17:10   #1
_Gonzo_
 
Регистрация: 26.06.2012
Сообщений: 4
По умолчанию Проблема при записи 'Record' в файл

Здравствуйте. Есть массив записей, которые затем нужно записать в файл.

Исходник целиком
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Menus, StdCtrls, ComCtrls, CheckLst, inifiles, ShlObj;

type
      Tsection = Record //Ñîçäàþ çàïèñü äëÿ õð-èÿ íñòðîåê
      sect_name : string[20];  //íàçâàíèå ñåêöèè
      add : Boolean;  //÷åêáîêñ îòìå÷åí èëè íåò
      name : string[100]; //èìÿ â ibases
      end;
      Tibase = packed Record //çàïèñü äëÿ õðàíåíèÿ ibase.ini
      Connect : string[200];
      ID : string[20];
      OrderInList: string[10];
      Folder :string[20];
      OrderInTree : string[10];
      External : string[10];
      ClientConnectionSpeed : string[20];
      App : string[10];
      WA : string[10];
      version: string[10];
      end;
  TForm1 = class(TForm)
    chklst1: TCheckListBox;
    mm1: TMainMenu;
    File1: TMenuItem;
    Save1: TMenuItem;

    procedure FormCreate(Sender: TObject);
    procedure Save1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  Path:  String; //ïóòü äî íàñòðîåê
  Inifile:TIniFile;
  inisectionname:TStringList;
  inisectionname1:TStringList;
  sections : array of Tsection; //ìàññèâ çàïèñåé íàñòðîåê, äëÿ êàæäîé ñåêöèè
  ibases : array of Tibase;
implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
  i,j,k :Integer;
begin

Path:=Application.ExeName;
Path:=ExtractFileDir(Path);
if Path[Length(Path)]<>'\' then Path:=Path+'\';
   if FileExists(Path + 'setings.ini') then    //ïðîâåðÿåì åñòü ëè setings.ini
   begin
    IniFile := TIniFile.Create(Path + 'setings.ini');
    inisectionname:=TStringList.Create;
    Inifile.ReadSections(inisectionname); //÷òåíèå èìåí ñåêöèé èç ini
    chklst1.Items.AddStrings(inisectionname); //äîáàâëåíèå ÷åêáîêñîâ
    i :=inisectionname.Count;  //êîë-âî ñåêöèé â ôàéëå íàñòðîåê
    SetLength(sections, i);//ïðèñâîåíèå ðàçìåðà ìàññèâà, â çàâèñèìîñòè îò êîë-âî ñåêöèé

    for k := 1 to i do
    with sections[k-1] do
    begin
      sect_name :=inisectionname.Strings[k-1];//ïðèñâàèâàåì èìåíà ñåêöèé â sect_name
      add :=Inifile.ReadBool(inisectionname.Strings[k-1], 'add', False); //
      name :=Inifile.ReadString(inisectionname.Strings[k-1], 'viewname', '');
      chklst1.Checked[k-1] := add;
    end;
    Inifile.Free;
    end
    else
    ShowMessage('Setings not Found'); //ôàéë setings.ini íå íàéäåí
    if FileExists(Path + 'ibases.ini') then
    begin
    i :=inisectionname.Count;
    IniFile := TIniFile.Create(Path + 'ibases.ini');
    inisectionname1:=TStringList.Create;
    SetLength(ibases, i);
    Inifile.ReadSections(inisectionname1);
    for k := 1 to i do
    with ibases[k-1] do
    begin
    Connect :=inifile.ReadString(inisectionname1.Strings[k-1],'Connect', '');
    ID :=Inifile.ReadString(inisectionname1.Strings[k-1], 'id', '');
    OrderInList:=Inifile.ReadString(inisectionname1[k-1],'OrderInList', '');
    Folder :=Inifile.ReadString(inisectionname1[k-1],'Folder', '');
    OrderInTree :=Inifile.ReadString(inisectionname1[k-1],'OrderInTree', '');
    External :=Inifile.ReadString(inisectionname1[k-1],'External', '');
    ClientConnectionSpeed :=Inifile.ReadString(inisectionname1[k-1],'ClientConnectionSpeed', '');
    App :=Inifile.ReadString(inisectionname1[k-1],'App', '');
    WA :=Inifile.ReadString(inisectionname1[k-1],'WA', '');
    version :=Inifile.ReadString(inisectionname1[k-1],'Version', '');
    end;
    Inifile.Free;
    end
    else
    begin
    ShowMessage('ibases not Found'); //ïðîñòî òåñò
    end

 end;
procedure TForm1.Save1Click(Sender: TObject);
var
NewFile: TFileStream;
begin
NewFile := TFileStream.Create('xz.ini',fmCreate);
NewFile.Position := 0;
NewFile.WriteBuffer(ibases[1],SizeOf(ibases[1]));
NewFile.Free;
end;

end.
как должен выглядеть конечный файл:

Код:
[УПО рабочая]
Connect=Srvr="buh-serv2";Ref="upowork";
ID=
OrderInList=
Folder=/
OrderInTree=1
External=0
ClientConnectionSpeed=Normal
App=Auto
WA=1
Version=8.2
[Документооборот рабочая]
Connect=Srvr="buh-serv2";Ref="docwork";
ID=
OrderInList=
Folder=/
OrderInTree=2
External=0
ClientConnectionSpeed=Normal
App=Auto
WA=1
Version=8.2
[Зарплата рабочая]
Connect=Srvr="buh-serv2";Ref="zpwork";
ID=
OrderInList=
Folder=/
OrderInTree=3
External=0
ClientConnectionSpeed=Normal
App=Auto
WA=1
Version=8.2
[Бух. старая]
Connect=Srvr="buh-serv2";Ref="buhwork";
ID=
OrderInList=
Folder=/
OrderInTree=4
External=0
ClientConnectionSpeed=Normal
App=Auto
WA=1
Version=8.2
Текущая запись файла создают какую-то кашу, либо только первую строчку из 'Record'.

Направьте на путь истинный. Спасибо.
_Gonzo_ вне форума Ответить с цитированием
Старый 26.06.2012, 20:27   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
NewFile.WriteBuffer(ibases[1],SizeOf(ibases[1]));
Это запись???!
Друже, у тебя в руках ИНИ файл. Ты читаешь с него методами работы и ИНИ файлами - почему не записываешь в файл теми же методами?
Код:
for k := 1 to i do
    with ibases[k-1] do    begin
      inifile.WriteString(inisectionname1.Strings[k-1],'Connect', Connect );
      Inifile.WriteString(inisectionname1.Strings[k-1], 'id', ID);
     Inifile.WriteString(inisectionname1[k-1],'OrderInList', OrderInList);
    Inifile.WriteString(inisectionname1[k-1],'Folder',Folder );
    Inifile.WriteString(inisectionname1[k-1],'OrderInTree', OrderInTree );
    Inifile.WriteString(inisectionname1[k-1],'External', External );
   Inifile.WriteString(inisectionname1[k-1],'ClientConnectionSpeed', ClientConnectionSpeed );
    Inifile.WriteString(inisectionname1[k-1],'App', App );
    Inifile.WriteString(inisectionname1[k-1],'WA', WA );
    Inifile.WriteString(inisectionname1[k-1],'Version', version );
    end;
    Inifile.Free;
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 26.06.2012, 21:08   #3
_Gonzo_
 
Регистрация: 26.06.2012
Сообщений: 4
По умолчанию извинюсь))

Пока апрувили тему сделал запись ини.
ЗЫ. если кому надо могу скинуть бинарик. Софтина создает ibases.v8i для 1с версии 8.2

Сорцы:
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Menus, StdCtrls, ComCtrls, CheckLst, inifiles, ShlObj;

type
      Tsection = Record //Ñîçäàþ çàïèñü äëÿ õð-èÿ íñòðîåê
      sect_name : string[20];  //íàçâàíèå ñåêöèè
      add : Boolean;  //÷åêáîêñ îòìå÷åí èëè íåò
      name : string[100]; //èìÿ â ibases
      end;
      Tibase = packed Record //çàïèñü äëÿ õðàíåíèÿ ibase.ini
      Connect : string[200];
      ID : string[20];
      OrderInList: string[10];
      Folder :string[20];
      OrderInTree : string[10];
      External : string[10];
      ClientConnectionSpeed : string[20];
      App : string[10];
      WA : string[10];
      version: string[10];
      end;
  TForm1 = class(TForm)
    chklst1: TCheckListBox;
    mm1: TMainMenu;
    File1: TMenuItem;
    Save1: TMenuItem;

    procedure FormCreate(Sender: TObject);
    procedure Save1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  Path:  String; //ïóòü äî íàñòðîåê
  Inifile:TIniFile;
  inisectionname:TStringList;
  inisectionname1:TStringList;
  sections : array of Tsection; //ìàññèâ çàïèñåé íàñòðîåê, äëÿ êàæäîé ñåêöèè
  ibases : array of Tibase;
  v8iPath : string;
implementation

{$R *.dfm}

function GetSpecialFolderPath(CSIDL : Integer) : String;
var
  Path : PChar;
begin
  Result := '';
  GetMem(Path,MAX_PATH);
  Try
    If Not SHGetSpecialFolderPath(0,Path,CSIDL,False) Then
      Raise Exception.Create('Shell function SHGetSpecialFolderPath fails.');
    Result := Trim(StrPas(Path));
    If Result = '' Then
      Raise Exception.Create('Shell function SHGetSpecialFolderPath return an empty string.');
    Result := IncludeTrailingPathDelimiter(Result);
  Finally
    FreeMem(Path,MAX_PATH);
  End;
end;
function GetUserAppDataFolderPath : String;
begin
  Result := GetSpecialFolderPath(CSIDL_APPDATA);
end;
Чуть позже допишу проверку на присутствие файла v8i, и если его нет, то предложение запустить 1c.

Последний раз редактировалось _Gonzo_; 26.06.2012 в 21:10.
_Gonzo_ вне форума Ответить с цитированием
Старый 26.06.2012, 21:08   #4
_Gonzo_
 
Регистрация: 26.06.2012
Сообщений: 4
По умолчанию

Код:
procedure TForm1.FormCreate(Sender: TObject);
var
  i,j,k :Integer;
begin
v8iPath:= GetUserAppDataFolderPath +'1C\1CEStart\ibases.v8i';

Path:=Application.ExeName;
Path:=ExtractFileDir(Path);
if Path[Length(Path)]<>'\' then Path:=Path+'\';
   if FileExists(Path + 'setings.ini') then    //ïðîâåðÿåì åñòü ëè setings.ini
   begin
    IniFile := TIniFile.Create(Path + 'setings.ini');
    inisectionname:=TStringList.Create;
    Inifile.ReadSections(inisectionname); //÷òåíèå èìåí ñåêöèé èç ini
    chklst1.Items.AddStrings(inisectionname); //äîáàâëåíèå ÷åêáîêñîâ
    i :=inisectionname.Count;  //êîë-âî ñåêöèé â ôàéëå íàñòðîåê
    SetLength(sections, i);//ïðèñâîåíèå ðàçìåðà ìàññèâà, â çàâèñèìîñòè îò êîë-âî ñåêöèé

    for k := 1 to i do
    with sections[k-1] do
    begin
      sect_name :=inisectionname.Strings[k-1];//ïðèñâàèâàåì èìåíà ñåêöèé â sect_name
      add :=Inifile.ReadBool(inisectionname.Strings[k-1], 'add', False); //
      name :=Inifile.ReadString(inisectionname.Strings[k-1], 'viewname', '');
      chklst1.Checked[k-1] := add;
    end;
    Inifile.Free;
    end
    else
    ShowMessage('Setings not Found'); //ôàéë setings.ini íå íàéäåí
    if FileExists(Path + 'ibases.ini') then
    begin
    i :=inisectionname.Count;
    IniFile := TIniFile.Create(Path + 'ibases.ini');
    inisectionname1:=TStringList.Create;
    SetLength(ibases, i);
    Inifile.ReadSections(inisectionname1);
    for k := 1 to i do
    with ibases[k-1] do
    begin
    Connect :=inifile.ReadString(inisectionname1.Strings[k-1],'Connect', '');
    ID :=Inifile.ReadString(inisectionname1.Strings[k-1], 'id', '');
    OrderInList:=Inifile.ReadString(inisectionname1[k-1],'OrderInList', '');
    Folder :=Inifile.ReadString(inisectionname1[k-1],'Folder', '');
    OrderInTree :=Inifile.ReadString(inisectionname1[k-1],'OrderInTree', '');
    External :=Inifile.ReadString(inisectionname1[k-1],'External', '');
    ClientConnectionSpeed :=Inifile.ReadString(inisectionname1[k-1],'ClientConnectionSpeed', '');
    App :=Inifile.ReadString(inisectionname1[k-1],'App', '');
    WA :=Inifile.ReadString(inisectionname1[k-1],'WA', '');
    version :=Inifile.ReadString(inisectionname1[k-1],'Version', '');
    end;
    Inifile.Free;
    end
    else
    begin
    ShowMessage('ibases not Found'); //ïðîñòî òåñò
    end

 end;
procedure TForm1.Save1Click(Sender: TObject);
var
  SaveF : File;
  i,k : Integer;
begin
DeleteFile(v8iPath);
IniFile := TIniFile.Create(GetUserAppDataFolderPath + '1C\1CEStart\ibases.v8i');
i :=inisectionname.Count;  //êîë-âî ñåêöèé â ôàéëå íàñòðîåê
    for k := 1 to i do
     if chklst1.Checked[k-1] = True then
       with ibases[k-1] do
       begin
       Inifile.WriteString(AnsiToUtf8(inisectionname1.Strings[k-1]), AnsiToUtf8('Connect'), AnsiToUtf8(Connect));
       Inifile.WriteString(AnsiToUtf8(inisectionname1.Strings[k-1]), AnsiToUtf8('ID'), AnsiToUtf8(ID));
       Inifile.WriteString(AnsiToUtf8(inisectionname1.Strings[k-1]), AnsiToUtf8('OrderInList'), AnsiToUtf8(OrderInList));
       Inifile.WriteString(AnsiToUtf8(inisectionname1.Strings[k-1]), AnsiToUtf8('Folder'), AnsiToUtf8(Folder));
       Inifile.WriteString(AnsiToUtf8(inisectionname1.Strings[k-1]), AnsiToUtf8('OrderInTree'), AnsiToUtf8(OrderInTree));
       Inifile.WriteString(AnsiToUtf8(inisectionname1.Strings[k-1]), AnsiToUtf8('External'), AnsiToUtf8(External));
       Inifile.WriteString(AnsiToUtf8(inisectionname1.Strings[k-1]), AnsiToUtf8('ClientConnectionSpeed'), AnsiToUtf8(ClientConnectionSpeed));
       Inifile.WriteString(AnsiToUtf8(inisectionname1.Strings[k-1]), AnsiToUtf8('App'), AnsiToUtf8(App));
       Inifile.WriteString(AnsiToUtf8(inisectionname1.Strings[k-1]), AnsiToUtf8('WA'), AnsiToUtf8(WA));
       Inifile.WriteString(AnsiToUtf8(inisectionname1.Strings[k-1]), AnsiToUtf8('Version'), AnsiToUtf8(Version));
       end;
       Inifile.Free;
end;

end.

Последний раз редактировалось _Gonzo_; 26.06.2012 в 21:11.
_Gonzo_ вне форума Ответить с цитированием
Старый 26.06.2012, 21:13   #5
_Gonzo_
 
Регистрация: 26.06.2012
Сообщений: 4
По умолчанию

Формат Setings.ini:
Код:
[upo]
add=1
viewname=УПО рабочая

[doc]
add=1
viewname=Документооборот рабочая

[zp]
add=1
viewname=Зарплата рабочая

[buh]
add=0
viewname=Бух. старая
Формат ibases.ini:

Код:
[УПО рабочая]
Connect=Srvr="buh-serv2";Ref="upowork";
ID=
OrderInList=1
Folder=/
OrderInTree=
External=0
ClientConnectionSpeed=Normal
App=Auto
WA=1
Version=8.2
[Документооборот рабочая]
Connect=Srvr="buh-serv2";Ref="docwork";
ID=
OrderInList=2
Folder=/
OrderInTree=
External=0
ClientConnectionSpeed=Normal
App=Auto
WA=1
Version=8.2
[Зарплата рабочая]
Connect=Srvr="buh-serv2";Ref="zpwork";
ID=
OrderInList=3
Folder=/
OrderInTree=
External=0
ClientConnectionSpeed=Normal
App=Auto
WA=1
Version=8.2
[Бух. старая]
Connect=Srvr="buh-serv2";Ref="buhwork";
ID=
OrderInList=4
Folder=/
OrderInTree=
External=0
ClientConnectionSpeed=Normal
App=Auto
WA=1
Version=8.2
ЗЫ Извинияюсь за плохо-форматированный код, я только начал учить Делфи и это мой первый проект....

Бинарик и две инишки
http://rghost.ru/38887829

Последний раз редактировалось _Gonzo_; 26.06.2012 в 21:27.
_Gonzo_ вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Удаление кракозябр при записи в файл tema654 Visual C++ 5 25.03.2012 17:27
Проблема записи в файл Lampard7 Общие вопросы по Java, Java SE, Kotlin 0 31.10.2011 14:38
Непонятное при записи в файл Exeil Общие вопросы C/C++ 0 27.11.2010 20:24
Проблема записи в файл m9yt Общие вопросы C/C++ 1 01.06.2010 13:55