Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Читать INI-файл из потока. возможно...ли? 
:(
    Опции темы
lukas
Дата 2.4.2007, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 771
Регистрация: 23.2.2007

Репутация: 3
Всего: 15



Возникла такая потребность. Нужно прочитать INI файл из потока (TMemoryStream), без сохранения потока на диск. Возможно ли такое осуществить...?? Соответственно прочитать все значения, секции и т.д, 

Предварительно сохранив INI файл в поток... 

 smile 

Это сообщение отредактировал(а) lukas - 2.4.2007, 17:14


--------------------
http://code.google.com/p/orionphp/ - opensource скриптовой язык Orion (аналог PHP) для freepascal/delphi.
PM MAIL WWW   Вверх
Rennigth
Дата 2.4.2007, 17:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 21.6.2004
Где: Moscow

Репутация: 15
Всего: 76



Код

unit uVirtualIniFile;

interface

uses
  SysUtils, Classes, IniFiles;

type

  TLocateHashedStringList = class(THashedStringList)
  protected
    procedure Changed; override;
  end;

  TVirtualIniFile = class(TCustomIniFile)
  private
    FSections: TLocateHashedStringList;
    function AddSection(const ASection: string): TStrings;
    function GetCaseSensitive: Boolean;
    procedure SetCaseSensitive(Value: Boolean);

  public
    constructor Create; virtual;
    destructor Destroy; override;


    function ReadString(const ASection, AIdent, ADefault: string): string; override;

    procedure LoadValues(AStream: TStream); virtual;
    procedure SaveValues(var VStream: TStream); virtual;
    procedure Clear;

    procedure DeleteKey(const ASection, AIdent: string); override;
    procedure EraseSection(const ASection: string); override;
    procedure GetStrings(AList: TStrings);
    procedure ReadSection(const ASection: string; AStrings: TStrings); override;
    procedure ReadSections(AStrings: TStrings); override;
    procedure ReadSectionValues(const ASection: string; AStrings: TStrings); override;
    procedure SetStrings(AList: TStrings);
    procedure WriteString(const ASection, AIdent, AValue: string); override;
    procedure UpdateFile; override;
    
    property CaseSensitive: Boolean read GetCaseSensitive write SetCaseSensitive;
  end;

implementation

{ TVirtualIniFile }

function TVirtualIniFile.AddSection(const ASection: string): TStrings;
begin
  Result := TLocateHashedStringList.Create;
  try
    TLocateHashedStringList(Result).CaseSensitive := CaseSensitive;
    FSections.AddObject(ASection, Result);
  except
    FreeAndNil(Result);
  end;
end;

procedure TVirtualIniFile.Clear;
var
  i: Integer;
begin
  for i := 0 to FSections.Count - 1 do
    TObject(FSections.Objects[I]).Free;
  FSections.Clear;
end;

constructor TVirtualIniFile.Create;
begin
  FSections := TLocateHashedStringList.Create;
end;

procedure TVirtualIniFile.DeleteKey(const ASection, AIdent: string);
var
  i, j: Integer;
  lStrings: TStrings;
begin
  i := FSections.IndexOf(ASection);
  if i >= 0 then
  begin
    lStrings := TStrings(FSections.Objects[i]);
    j := lStrings.IndexOfName(AIdent);
    if j >= 0 then
      lStrings.Delete(j);
  end;
end;

destructor TVirtualIniFile.Destroy;
begin
  Clear;
  FreeAndNil(FSections);
  inherited;
end;

procedure TVirtualIniFile.EraseSection(const ASection: string);
var
  i: Integer;
begin
  i := FSections.IndexOf(ASection);
  if i >= 0 then
  begin
    TStrings(FSections.Objects[I]).Free;
    FSections.Delete(i);
  end;
end;

function TVirtualIniFile.GetCaseSensitive: Boolean;
begin
  Result := FSections.CaseSensitive;
end;

procedure TVirtualIniFile.GetStrings(AList: TStrings);
var
  i, j: Integer;
  lStrings: TStrings;
begin
  if Assigned(AList) then
  begin
    AList.BeginUpdate;
    try
      for i := 0 to FSections.Count - 1 do
      begin
        AList.Add('[' + FSections[i] + ']');
        lStrings := TStrings(FSections.Objects[i]);
        for j := 0 to lStrings.Count - 1 do
          AList.Add(lStrings[j]);
        AList.Add('');
      end;
    finally
      AList.EndUpdate;
    end;
  end;
end;

procedure TVirtualIniFile.LoadValues(AStream: TStream);
var
  lList: TStrings;
begin
  if Assigned(AStream) then
  begin
    lList := TStringList.Create;
    try
      lList.LoadFromStream(AStream);
      SetStrings(lList);
    except
      Clear;
    end;
      lList.Free;
  end else
    Clear;
end;

procedure TVirtualIniFile.ReadSection(const ASection: string;
  AStrings: TStrings);
var
  i, j: Integer;
  lStrings: TStrings;
begin
  if Assigned(AStrings) then
  begin
    AStrings.BeginUpdate;
    try
      AStrings.Clear;
      i := FSections.IndexOf(ASection);
      if i >= 0 then
      begin
        lStrings := TStrings(FSections.Objects[i]);
        for j := 0 to lStrings.Count - 1 do
          AStrings.Add(lStrings.Names[j]);
      end;
    finally
      AStrings.EndUpdate;
    end;
  end;
end;

procedure TVirtualIniFile.ReadSections(AStrings: TStrings);
begin
  if Assigned(AStrings) then
    AStrings.Assign(FSections);
end;

procedure TVirtualIniFile.ReadSectionValues(const ASection: string;
  AStrings: TStrings);
var
  i: Integer;
begin
  if Assigned(AStrings) then
  begin
    AStrings.BeginUpdate;
    try
      AStrings.Clear;
      i := FSections.IndexOf(ASection);
      if i >= 0 then
        AStrings.Assign(TStrings(FSections.Objects[i]));
    finally
      AStrings.EndUpdate;
    end;
  end;
end;

function TVirtualIniFile.ReadString(const ASection, AIdent,
  ADefault: string): string;
var
  i: Integer;
  lStrings: TStrings;
begin
  i := FSections.IndexOf(ASection);
  if i >= 0 then
  begin
    lStrings := TStrings(FSections.Objects[I]);
    i := lStrings.IndexOfName(AIdent);
    if i >= 0 then
    begin
      Result := Copy(lStrings[i], Length(AIdent) + 2, Maxint);
      Exit;
    end;
  end;
  Result := ADefault;
end;

procedure TVirtualIniFile.SaveValues(var VStream: TStream);
var
  lList: TStringList;
begin
  if not Assigned(VStream) then
    VStream := TMemoryStream.Create;
  lList := TStringList.Create;
  try
    GetStrings(lList);
    lList.SaveToStream(VStream);
  finally
    lList.Free;
  end;
end;

procedure TVirtualIniFile.SetCaseSensitive(Value: Boolean);
var
  i: Integer;
begin
  if Value <> FSections.CaseSensitive then
  begin
    FSections.CaseSensitive := Value;
    for i := 0 to FSections.Count - 1 do
    begin
      TLocateHashedStringList(FSections.Objects[i]).CaseSensitive := Value;
      FSections.Changed;
    end;
    FSections.Changed;
  end;
end;

procedure TVirtualIniFile.SetStrings(AList: TStrings);
var
  i, j: Integer;
  lStr: string;
  lStrings: TStrings;
begin
  Clear;
  lStrings := nil;
  if Assigned(AList) then
  begin
    for i := 0 to AList.Count - 1 do
    begin
      lStr := Trim(AList[i]);
      if (lStr <> '') and (lStr[1] <> ';') then
        if (lStr[1] = '[') and (lStr[Length(lStr)] = ']') then
        begin
          Delete(lStr, 1, 1);
          SetLength(lStr, Length(lStr) - 1);
          lStrings := AddSection(Trim(lStr));
        end
        else
          if Assigned(lStrings) then
          begin
            j := Pos('=', lStr);
            if j > 0 then
              lStrings.Add(Trim(Copy(lStr, 1, j - 1)) + '=' +
                Trim(Copy(lStr, j + 1, MaxInt)))
            else
              lStrings.Add(lStr);
          end;
    end;
  end;
end;

procedure TVirtualIniFile.UpdateFile;
begin
  inherited;

end;

procedure TVirtualIniFile.WriteString(const ASection, AIdent, AValue: string);
var
  i: Integer;
  lStr: string;
  lStrings: TStrings;
begin
  i := FSections.IndexOf(ASection);
  if i >= 0 then
    lStrings := TStrings(FSections.Objects[I])
  else
    lStrings := AddSection(ASection);
  lStr := AIdent + '=' + AValue;
  i := lStrings.IndexOfName(AIdent);
  if i >= 0 then
    lStrings[I] := lStr
  else
    lStrings.Add(lStr);
end;

{ TLocateHashedStringList }

procedure TLocateHashedStringList.Changed;
begin
  inherited;

end;

end.


борланды функций виртуальных не делали в TCustomIniFile, Так что пришлось немного по копипастить...


--------------------
(* Honesta mors turpi vita potior *)
PM MAIL ICQ   Вверх
lukas
Дата 2.4.2007, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 771
Регистрация: 23.2.2007

Репутация: 3
Всего: 15



Rennigth, 

спасиба... то что нужно... все получилось...  smile 


--------------------
http://code.google.com/p/orionphp/ - opensource скриптовой язык Orion (аналог PHP) для freepascal/delphi.
PM MAIL WWW   Вверх
Yanis
Дата 2.4.2007, 19:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: 6
Всего: 111



А если так:
Код

uses IniFiles;

var
  mini: TMemIniFile;
  sl: TStringList;
begin
  sl := TStringList.Create;
  sl.LoadFromStream({ ну ясен пень, что здесь нуна писать});
  mini := TMemIniFile.Create('all what you want');
  mini.SetStrings(sl);

  { Работаем с ini файлом в памяти. Не забываем освобождать... }

  FreeAndNil(mini);
  FreeAndNil(sl);
end;


Это сообщение отредактировал(а) Yanis - 2.4.2007, 19:33


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
Rennigth
Дата 3.4.2007, 09:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 21.6.2004
Где: Moscow

Репутация: 15
Всего: 76



Yanis, Гы, сделали всетаки. TVirtualIniFile писал для шестерки, там TMemIniFile небыло. smile в Turbo есть. Интересно в Семерке есть?

Добавлено через 5 минут и 50 секунд
И в семерке есть.


--------------------
(* Honesta mors turpi vita potior *)
PM MAIL ICQ   Вверх
Yanis
Дата 3.4.2007, 09:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: 6
Всего: 111



Цитата(Rennigth @  3.4.2007,  10:13 Найти цитируемый пост)
Yanis, Гы, сделали всетаки. TVirtualIniFile писал для шестерки, там TMemIniFile небыло.  в Turbo есть. Интересно в Семерке есть?

К сожалению когда я тужился на шестёрке моих знаний ещё было недостаточно, что бы мне понадобилось юзать TMemIniFile.smile
Поэтому не знаю smile
Вчера я проверял это в турбе.

Это сообщение отредактировал(а) Yanis - 3.4.2007, 09:31


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0535 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.