Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 24.10.2010, 18:59
ila ila вне форума
Прохожий
 
Регистрация: 23.10.2010
Сообщения: 14
Репутация: 10
По умолчанию INI не получается

скажите почему когда делаю так:

Цитата:
procedure TFMyServ.FormCreate(Sender: TObject);
var
ini: TIniFile;
s: TMemoryStream;
begin
S:=TMemoryStream.Create;
Ini:=TiniFile.Create(ExtractFilePath(ParamStr(0))+ 'user.ini');
ini.ReadBinaryStream('Text', 'Record', S);
//RichEdit1.Lines.LoadFromStream(s);
MUsers.Lines.LoadFromStream(S);
ini.Destroy;
s.Destroy;
end;

procedure TFMyServ.tmr1Timer(Sender: TObject);
var
ini: TIniFile;
s: TMemoryStream;
begin
S:=TMemoryStream.Create;
Ini:=TiniFile.Create(ExtractFilePath(ParamStr(0))+ 'user.ini');
//RichEdit1.Lines.SaveToStream(s);
MUsers.Lines.SaveToStream(S);
s.Seek(0, soFromBeginning);
ini.WriteBinaryStream('Text', 'Record', S);
ini.Free;
s.Free;
end;


получается, что не сохраняется, загружается текст если его много.
тоесть как бы обрезается часть сама если много строк
Ответить с цитированием
  #2  
Старый 24.10.2010, 19:28
Аватар для PhoeniX
PhoeniX PhoeniX вне форума
Always hardcore!
 
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,239
Версия Delphi: GCC/FPC/FASM
Репутация: 62149
По умолчанию

Обязательно использовать INI? На вид ошибок не вижу, а трейсить по такому фрагменту (не видя всей программы) - это ппц...
__________________
Оставайтесь хорошими людьми...
VK id2634397, ds [at] phoenix [dot] dj
Ответить с цитированием
  #3  
Старый 24.10.2010, 19:38
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,100
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Потому что ini не понимает переноса строк. Сам на это наступал в молодости . Для храниения текста (больших объемов) ini лучще не использовать.
Ответить с цитированием
  #4  
Старый 24.10.2010, 19:43
ila ila вне форума
Прохожий
 
Регистрация: 23.10.2010
Сообщения: 14
Репутация: 10
По умолчанию

а куда писать если не в ini
Ответить с цитированием
  #5  
Старый 24.10.2010, 19:47
Аватар для PhoeniX
PhoeniX PhoeniX вне форума
Always hardcore!
 
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,239
Версия Delphi: GCC/FPC/FASM
Репутация: 62149
По умолчанию

ну... может, txt?
Или опять же текстовый файл с любым другим расширением?
__________________
Оставайтесь хорошими людьми...
VK id2634397, ds [at] phoenix [dot] dj
Ответить с цитированием
  #6  
Старый 24.10.2010, 19:52
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,100
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

В файл своего формата, созданный через TFileStream.
Вот пример:

Базовый класс:
Код:
unit ModelBase;

interface

uses
  Classes, SysUtils; 

type

  { TModelItemBase }

  TModelItemBase = class
  public
    // Load methods
    function ReadInt(AStream : TStream) : Integer;
    function ReadBool(AStream : TStream) : Boolean;
    function ReadString(AStream : TStream) : String;
    function ReadDateTime(AStream : TStream) : TDateTime;

    // Save methods
    procedure WriteInt(AStream : TStream; AValue : Integer);
    procedure WriteBool(AStream : TStream; AValue : Boolean);
    procedure WriteString(AStream : TStream; AValue : String);
    procedure WriteDateTime(AStream : TStream; AValue : TDateTime);

    // General Load/Save methods
    procedure SaveToStream(AStream : TStream); virtual; abstract;
    procedure LoadFromStream(AStream : TStream); virtual; abstract;
  end;

  { TModelBase }

  TModelBase = class
  protected
    procedure SaveToStream(AStream : TStream); virtual; abstract;
    procedure LoadFromStream(AStream : TStream); virtual; abstract;
  public
    procedure SaveToFile(AFileName : String);
    procedure LoadFromFile(AFileName : String);
  end;

implementation

{ TModelItemBase }

function TModelItemBase.ReadInt(AStream: TStream): Integer;
begin
  AStream.ReadBuffer(Result,SizeOf(Integer));
end;

function TModelItemBase.ReadBool(AStream: TStream): Boolean;
begin
  AStream.ReadBuffer(Result,SizeOf(Boolean));
end;

function TModelItemBase.ReadString(AStream: TStream): String;
var
  ALen : Integer;
begin
  ALen := ReadInt(AStream);
  SetLength(Result,ALen);
  If ALen > 0 Then AStream.Readbuffer(Result[1],ALen);
end;

function TModelItemBase.ReadDateTime(AStream: TStream): TDateTime;
begin
  AStream.ReadBuffer(Result,SizeOf(TDateTime));
end;

procedure TModelItemBase.WriteInt(AStream: TStream; AValue: Integer);
begin
  AStream.WriteBuffer(AValue,SizeOf(Integer));
end;

procedure TModelItemBase.WriteBool(AStream: TStream; AValue: Boolean);
begin
  AStream.WriteBuffer(AValue,SizeOf(Boolean));
end;

procedure TModelItemBase.WriteString(AStream: TStream; AValue: String);
var
  ALen : Integer;
begin
  ALen := Length(AValue);
  WriteInt(AStream,ALen);
  If ALen > 0 Then AStream.WriteBuffer(AValue[1],ALen);
end;

procedure TModelItemBase.WriteDateTime(AStream: TStream; AValue: TDateTime);
begin
  AStream.WriteBuffer(AValue,SizeOf(TDateTime));
end;

{ TModelBase }

procedure TModelBase.SaveToFile(AFileName: String);
var
  AStream : TFileStream;
begin
  AStream := TFileStream.Create(AFileName,fmCreate Or fmShareExclusive);
  Try
    SaveToStream(AStream);
  Finally
    AStream.Free;
  End;
end;

procedure TModelBase.LoadFromFile(AFileName: String);
var
  AStream : TFileStream;
begin
  AStream := TFileStream.Create(AFileName,fmOpenRead Or fmShareExclusive);
  Try
    LoadFromStream(AStream);
  Finally
    AStream.Free;
  End;
end;

end.

Собственно класс с данными (только сохр./чтение):
Код:
  TReminderItem = class(TModelItemBase)
  private
    FName : String;
    FComments : String;

    FLastEvent : TDateTime;
    FNextEvent : TDateTime;
    FScheduleType : TScheduleType;
    FScheduleValue : Integer;
    FDeleteOnDone : Boolean;
    FIsDone : Boolean;

    FOverrideUrgDays : Boolean;
    FDaysMedUrg : Integer;
    FDaysHighUrg : Integer;

  protected
  public
    constructor Create;
    destructor Destroy; override;

    procedure Assign(ASource : TReminderItem);

    procedure SaveToStream(AStream: TStream); override;
    procedure LoadFromStream(AStream: TStream); override;

    property Name : String read FName write FName;
    property Comments : String read FComments write FComments;

    property LastEvent : TDateTime read FLastEvent write SetLastEvent;
    property NextEvent : TDateTime read FNextEvent write SetNextEvent;
    property ScheduleType : TScheduleType read FScheduleType write SetScheduleType;
    property ScheduleValue : Integer read FScheduleValue write SetScheduleValue;
    property DeleteOnDone : Boolean read FDeleteOnDone write SetDeleteOnDone;
    property IsDone : Boolean read FIsDone;

    property OverrideUrgDays : Boolean read FOverrideUrgDays write FOverrideUrgDays;
    property DaysMedUrg : Integer read FDaysMedUrg write SetDaysMedUrg;
    property DaysHighUrg : Integer read FDaysHighUrg write SetDaysHighUrg;
  end;

procedure TReminderItem.SaveToStream(AStream: TStream);
begin
  // Class version
  WriteInt(AStream,vrItemVersion);

  // Class data
  WriteString(AStream,FName);
  WriteString(AStream,FComments);

  WriteDateTime(AStream,FLastEvent);
  WriteDateTime(AStream,FNextEvent);
  AStream.WriteBuffer(FScheduleType,SizeOf(TScheduleType));
  WriteInt(AStream,FScheduleValue);
  WriteBool(AStream,FDeleteOnDone);
  WriteBool(AStream,FIsDone);

  WriteBool(AStream,FOverrideUrgDays);
  WriteInt(AStream,FDaysMedUrg);
  WriteInt(AStream,FDaysHighUrg);
end;

procedure TReminderItem.LoadFromStream(AStream: TStream);
var
  AClsVer : Integer;
begin
  // Class version
  AClsVer := ReadInt(AStream);
  If AClsVer > vrItemVersion Then
    Raise Exception.CreateFmt('Wrong reminder class version. Expected %d but found %d.',[vrItemVersion,AClsVer]);

  // Class data
  FName := ReadString(AStream);
  FComments := ReadString(AStream);

  FLastEvent := ReadDatetime(AStream);
  FNextEvent := ReadDatetime(AStream);
  AStream.ReadBuffer(FScheduleType,SizeOf(TScheduleType));
  FScheduleValue := ReadInt(AStream);
  FDeleteOnDone := ReadBool(AStream);
  FIsDone := ReadBool(AStream);

  FOverrideUrgDays := ReadBool(AStream);
  FDaysMedUrg := ReadInt(AStream);
  FDaysHighUrg := ReadInt(AStream);
end;
Ответить с цитированием
  #7  
Старый 24.10.2010, 20:15
ila ila вне форума
Прохожий
 
Регистрация: 23.10.2010
Сообщения: 14
Репутация: 10
По умолчанию

в ини я сохранял бинарный поток, и если его просто открыть, то не виден настоящий текст, тоесть нужно сделать так, что вне программы открыв файл небыло ясно, что там написано
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 02:21.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025