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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Загрузка настроек из файла, Загрузка настроек из файла 
:(
    Опции темы
Letov
  Дата 28.12.2007, 17:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: нет
Всего: 4



Подскажите, пожалуйста, как считать настройки из файла следующего формата:

Код

имя_параметра1=параметр1
имя_параметра2=параметр2
#закомментированная строка

имя_параметра3=параметр3


И так далее.

Заранее спасибо.

Это сообщение отредактировал(а) Letov - 28.12.2007, 17:32


--------------------
Не бывает плохих языков программирования. Бывают плохие программисты...

PM MAIL   Вверх
Alexeis
Дата 28.12.2007, 17:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 34
Всего: 459



Класс TIniFile


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Rennigth
Дата 28.12.2007, 17:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Можно примерно так:
Код

var
  lSL: TStringList;
  i: Integer;
begin
  lSL := TStringList.Create;
  try
    lSL.DelimitedText := '=';
    lSL.LoadFromFile('c:\test.log');
    for i := 0 to lSL.Count - 1 do
      ShowMessage(lSL.Values[lSL.Names[i]]);
  finally
    lSL.Free;
  end;
end;

Критериев твой задачи в подробностях незнаю, т.к. 
Цитата(Letov @  28.12.2007,  17:30 Найти цитируемый пост)
как считать настройки из файла следующего формата

мало информативно... поэтому очень простеньки пример smile



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


Опытный
**


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

Репутация: нет
Всего: 4



Цитата(Alexeis @  28.12.2007,  18:56 Найти цитируемый пост)
Класс TIniFile

INI не пойдет. нет секций и т.д.
Цитата(Rennigth @  28.12.2007,  18:58 Найти цитируемый пост)
Критериев твой задачи в подробностях незнаю, т.к. Цитата(Letov @  28.12.2007,  17:30 )как считать настройки из файла следующего форматамало информативно... поэтому очень простеньки пример

Смысл следующий. В файле есть много настроек, при чем они записаны в виде пар имя=значение. Но есть одно НО: в файле могут встречаться закомментированные строки (символ #), а так же пустые строки, которые не являются настройками. Задача: написать функцию, получающую значение 1 параметра по его имени или всех параметров, например в TStrings.


--------------------
Не бывает плохих языков программирования. Бывают плохие программисты...

PM MAIL   Вверх
Rennigth
Дата 29.12.2007, 10:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(Letov @  28.12.2007,  20:05 Найти цитируемый пост)
Смысл следующий. В файле есть много настроек, при чем они записаны в виде пар имя=значение. Но есть одно НО: в файле могут встречаться закомментированные строки (символ #), а так же пустые строки, которые не являются настройками. Задача: написать функцию, получающую значение 1 параметра по его имени или всех параметров, например в TStrings. 

Мой примерчик почти удовлетворял твоим условиям. Если немного изменить то вот:
Код

unit Unit23;

interface

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

type
  TForm23 = class(TForm)
    ListBox1: TListBox;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form23: TForm23;

implementation

{$R *.dfm}

function GetSpecialParamList(const AFileName: string): TStrings;
var
  lSL: TStringList;
  lTmp: string;
  i: Integer;
begin
  Result := TStringList.Create;
  if FileExists(AFileName) then
  begin
    lSL := TStringList.Create;
    try
      lSL.DelimitedText := '=';
      lSL.LoadFromFile(AFileName);
      for i := 0 to lSL.Count - 1 do
      begin
        lTmp := Trim(lSL.Values[lSL.Names[i]]);
        if (Length(Trim(lTmp)) > 0) and (not (lTmp[1] = '#')) then
          Result.Add(lSL.Strings[i]);
      end;
    finally
      lSL.Free;
    end;
  end;
end;

procedure TForm23.FormCreate(Sender: TObject);
var
  lPL: TStrings;
begin
  lPL := GetSpecialParamList('c:\test.log');
  try
    ListBox1.Items.Assign(lPL);
  finally
    lPL.Free;
  end;
end;

end.



Это сообщение отредактировал(а) Rennigth - 29.12.2007, 10:49


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


Опытный
**


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

Репутация: нет
Всего: 4



Спсаибо. Теперь разобрался)))

Добавлено @ 11:11
Следующий вопрос по этой же теме. Как загнать эти настройки обратно в файл, но чтобы комментарии остались?
Код

lSL.SaveToFile(AFileName);//ISL -переменная с настройками
 Такой код не подойдет, т.к. не будет комментариев(

Это сообщение отредактировал(а) Letov - 29.12.2007, 11:12


--------------------
Не бывает плохих языков программирования. Бывают плохие программисты...

PM MAIL   Вверх
Rennigth
Дата 29.12.2007, 13:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Код

procedure SetSpecialParamList(const AFileName: string; AList: TStrings);
var
  lSL: TStringList;
  i: Integer;
  lIndex: Integer;
begin
  if Assigned(AList) and FileExists(AFileName) then
  begin
    lSL := TStringList.Create;
    try
      lSL.DelimitedText := '=';
      lSL.LoadFromFile(AFileName);
      for i := 0 to AList.Count - 1 do
      begin
        lIndex := lSL.IndexOfName(AList.Names[i]);
        if lIndex >= 0 then
          lSL.Values[lSL.Names[lIndex]] := AList.Values[AList.Names[i]]
        else
          lSL.Add(AList.Strings[i]);
      end;
      lSL.SaveToFile(AFileName);
    finally
      lSL.Free;
    end;
  end;
end;



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


Опытный
**


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

Репутация: нет
Всего: 4



Спасибо, попробую.


--------------------
Не бывает плохих языков программирования. Бывают плохие программисты...

PM MAIL   Вверх
Letov
Дата 5.1.2008, 20:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: нет
Всего: 4



Не понимаю в чем проблема, но этот код не работает:
Код

unit Unit23;

interface

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

type
  TForm23 = class(TForm)
    ListBox1: TListBox;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form23: TForm23;

implementation

{$R *.dfm}

function GetSpecialParamList(const AFileName: string): TStrings;
var
  lSL: TStringList;
  lTmp: string;
  i: Integer;
begin
  Result := TStringList.Create;
  if FileExists(AFileName) then
  begin
    lSL := TStringList.Create;
    try
      lSL.DelimitedText := '=';
      lSL.LoadFromFile(AFileName);
      for i := 0 to lSL.Count - 1 do
      begin
        lTmp := Trim(lSL.Values[lSL.Names[i]]);
        if (Length(Trim(lTmp)) > 0) and (not (lTmp[1] = '#')) then
          Result.Add(lSL.Strings[i]);
      end;
    finally
      lSL.Free;
    end;
  end;
end;

procedure TForm23.FormCreate(Sender: TObject);
var
  lPL: TStrings;
begin
  lPL := GetSpecialParamList('c:\test.log');
  try
    ListBox1.Items.Assign(lPL);
  finally
    lPL.Free;
  end;
end;

end.


Привожу пример работы кода:


1)

Исходный файл
Код

#Olympiad Properties
#Fri Dec 28 17:42:33 MSK 2007
CurrentCycle=2
NextWeeklyChange=1199391991328
OlympiadEnd=1201465591328
Period=0
ValdationEnd=1160732136875


Результат рыботы:
user posted image

2)
Исходный файл
Код

# ==========================================================================================================================
# Использовать альтернативную AI (интеллект)
# --------------------------------------------------------------------------------------------------------------------------
EnableAI=False
# ==========================================================================================================================


# ==========================================================================================================================
# Стандартный класс атаки AI (интеллект)
# --------------------------------------------------------------------------------------------------------------------------
DefaultAI=warrior_passive
# ==========================================================================================================================


Результат работы
user posted image


Вот исходник программы

Код
 
TForm1 = class(TForm)
    MainMenu1: TMainMenu;
    Afqk1: TMenuItem;
    N1: TMenuItem;
    OpenDialog1: TOpenDialog;
    ValPar: TValueListEditor;
    procedure N1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function GetSpecialParamList(const AFileName: string): TStrings;
var
  lSL: TStringList;
  lTmp: string;
  i: Integer;
begin
  Result := TStringList.Create;
  if FileExists(AFileName) then
  begin
    lSL := TStringList.Create;
    try
      lSL.DelimitedText := '=';
      lSL.LoadFromFile(AFileName);
      for i := 0 to lSL.Count - 1 do
      begin
        lTmp := Trim(lSL.Values[lSL.Names[i]]);
        if (Length(Trim(lTmp)) > 0) and (not (lTmp[1] = '#')) then
          Result.Add(lSL.Strings[i]);
      end;
    finally
      lSL.Free;
    end;
  end;
end;
procedure TForm1.N1Click(Sender: TObject);
begin
  if OpenDialog1.Execute then
  ValPar.Strings:=GetSpecialParamList(OpenDialog1.FileName);
end;



Подскажите, пожалуйста, в чем проблема? Как исправить?


--------------------
Не бывает плохих языков программирования. Бывают плохие программисты...

PM MAIL   Вверх
ArtemXCity
Дата 12.1.2008, 19:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 12.1.2008
Где: Хмельницкий, Укра ина

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



Меня с этим выручал компонент TValueListEditor (вкладка Additional).
Если открывать файл, в котором записано все в формате критерий=значение, то 
при команде ValueListEditor1.Strings.LoadFromFile(...); в первой колонке будут все критерии,  а во втором соответственно - их значения. Дальше просто считать с ячеек нужные данные и все.  smile 
PM MAIL WWW ICQ Skype   Вверх
Letov
Дата 3.2.2008, 23:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: нет
Всего: 4



Цитата(ArtemXCity @  12.1.2008,  20:20 Найти цитируемый пост)
ValueListEditor1.Strings.LoadFromFile(...);

А как задавать символ - признак закомментированной строки?


--------------------
Не бывает плохих языков программирования. Бывают плохие программисты...

PM MAIL   Вверх
XperT
Дата 5.2.2008, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: нет
Всего: 4



Цитата(Letov @ 3.2.2008,  23:50)
Цитата(ArtemXCity @  12.1.2008,  20:20 Найти цитируемый пост)
ValueListEditor1.Strings.LoadFromFile(...);

А как задавать символ - признак закомментированной строки?

Можно потом лишние строки просто удалять
PM MAIL   Вверх
Letov
Дата 5.2.2008, 22:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: нет
Всего: 4



Цитата(XperT @  5.2.2008,  15:38 Найти цитируемый пост)
Цитата(Letov @ 3.2.2008,  23:50)Цитата(ArtemXCity @  12.1.2008,  20:20 )ValueListEditor1.Strings.LoadFromFile(...);А как задавать символ - признак закомментированной строки?Можно потом лишние строки просто удалять

И будут пустые строки?
Может стоит в этом коде покапаться?
Код

unit Unit23;

interface

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

type
  TForm23 = class(TForm)
    ListBox1: TListBox;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form23: TForm23;

implementation

{$R *.dfm}

function GetSpecialParamList(const AFileName: string): TStrings;
var
  lSL: TStringList;
  lTmp: string;
  i: Integer;
begin
  Result := TStringList.Create;
  if FileExists(AFileName) then
  begin
    lSL := TStringList.Create;
    try
      lSL.DelimitedText := '=';
      lSL.LoadFromFile(AFileName);
      for i := 0 to lSL.Count - 1 do
      begin
        lTmp := Trim(lSL.Values[lSL.Names[i]]);
        if (Length(Trim(lTmp)) > 0) and (not (lTmp[1] = '#')) then
          Result.Add(lSL.Strings[i]);
      end;
    finally
      lSL.Free;
    end;
  end;
end;

procedure TForm23.FormCreate(Sender: TObject);
var
  lPL: TStrings;
begin
  lPL := GetSpecialParamList('c:\test.log');
  try
    ListBox1.Items.Assign(lPL);
  finally
    lPL.Free;
  end;
end;

end.



--------------------
Не бывает плохих языков программирования. Бывают плохие программисты...

PM MAIL   Вверх
Akella
Дата 5.2.2008, 23:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 8
Всего: 329



Цитата(Letov @  28.12.2007,  20:05 Найти цитируемый пост)
INI не пойдет. нет секций и т.д.

Как раз в Ini секции присутствуют
Всё, что в квадратных скобках - это названия секций, ниже содержимое секций
Цитата

[FILIAL]
FilialName=Akella
[PATH]
InFolder=D:\Programs\Kvartal2\In\
OutFolder=D:\Programs\Kvartal2\Out\
PhotoArenda=D:\Programs\Kvartal2\Photo\Arenda\
PhotoApart=D:\Programs\Kvartal2\Photo\Apart\
PhotoNovo=D:\Programs\Kvartal2\Photo\Novo\
PhotoHouses=D:\Programs\Kvartal2\Photo\Houses\
PhotoOffices=D:\Programs\Kvartal2\Photo\Offices\
StatFolder=D:\KVX_Stat\
ArcSendedFolder=D:\Programs\Kvartal2\Отправленные\
ReportMatrix=D:\Programs\Kvartal2\ReportMatrixPrn\
TempDirHatab=D:\Programs\Kvartal\SrvSocket\Temp\
ReportLaser=D:\Programs\Kvartal2\ReportLaserPrn\
PhotoToUpload=D:\Programs\Kvartal2\TempOutPhoto\

[LOGDATA]
UseLogging=1
FixLogIn=0
FixLogOut=0
[CHECK]
Server=1
[COMMON]
DividerForCheckBoxes=100
SortOnServer=1
CheckSublevelsRegion=1
ArendaActuality=1
RowLines=0
ExportByProfiles=1
OpenFileAfterExport=1
EnterAsTab=1
[OTHER]
AutoFindPhone=1
UsePhoto=0
RecivePhoto=0
SendPhoto=0
[FONT]
Name=Tahoma
Size=10
Color=clWindowText
Bold=0
[SQL]
ExecSQLOnStart=1
[AutoUpdate]
enabled=0
AutoUpdateInterval=60000
[VIEW]
FlatInterfaceEh=0
SPRUseImages=0
[PRINT]
NotPrintFirmAttribute=0


Добавлено через 2 минуты и 33 секунды
Код

  with TIniFile.Create(IncludeTrailingPathDelimiter( ExtractFilePath(ParamStr(0)) )+'kvx.ini' ) do  begin
    sInFolder := IncludeTrailingPathDelimiter(ReadString('PATH','InFolder', sAppPath+'In\'));
    sOutFolder := IncludeTrailingPathDelimiter(ReadString('PATH','OutFolder', sAppPath+'Out\'));
    sPhotoArenda := IncludeTrailingPathDelimiter(ReadString('PATH','PhotoArenda', sAppPath+'Photo\Arenda\'));
    sPhotoApart := IncludeTrailingPathDelimiter(ReadString('PATH','PhotoApart', sAppPath+'Photo\Apart\'));
    sPhotoNovo := IncludeTrailingPathDelimiter(ReadString('PATH','PhotoNovo', sAppPath+'Photo\Novo\'));
    sPhotoHouses := IncludeTrailingPathDelimiter(ReadString('PATH','PhotoHouses', sAppPath+'Photo\Houses\'));
    sPhotoOffices := IncludeTrailingPathDelimiter(ReadString('PATH','PhotoOffices', sAppPath+'Photo\Offices\'));
    sSendedPath := IncludeTrailingPathDelimiter(ReadString('PATH','ArcSendedFolder', sAppPath+'Отправленные\'));
    sReportMatrix := IncludeTrailingPathDelimiter(ReadString('PATH','ReportMatrix', sAppPath+'ReportMatrix\'));
    sReportLaser  := IncludeTrailingPathDelimiter(ReadString('PATH','ReportLaser', sAppPath+'ReportLaser\'));
.....
    Free;
  end;



Это сообщение отредактировал(а) Akella - 5.2.2008, 23:32
PM MAIL   Вверх
Letov
Дата 6.2.2008, 00:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: нет
Всего: 4



Цитата(Akella @  6.2.2008,  00:32 Найти цитируемый пост)
Цитата(Letov @  28.12.2007,  20:05 )INI не пойдет. нет секций и т.д.Как раз в Ini секции присутствуютВсё, что в квадратных скобках - это названия секций, ниже содержимое секций

Вот именно. В INI секции присутствуют, а в моем файле настроек их нет. INI не подходит не потому, что он не умеет работать с секциями (как раз с этим он нормально справляется), а потому, что он не может работать с файлом БЕЗ секций. А мой файл настроек не содержит секций.

Это сообщение отредактировал(а) Letov - 6.2.2008, 00:04


--------------------
Не бывает плохих языков программирования. Бывают плохие программисты...

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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