Страниц: [1]
  Печать  
Автор Тема: Delphi, считка из ini файла динамических компонентов  (Прочитано 14714 раз)
0 Пользователей и 1 Гость смотрят эту тему.
DM_
Давненько
**
Offline Offline

Сообщений: 68

СПАСИБО
-вы поблагодарили: 7
-вас поблагодарили: 21

237458
Просмотр профиля
: Май 24, 2013, 14:23:31 �

Есть запись параметров динамических компонентов checkbox в ini

Код:
for k:=1 to c do begin
tmp:=FindComponent('CheckBox'+IntToStr(k));
if tmp<>nil then begin
IniFile.WriteString((tmp as TCheckBox).name,(tmp as TCheckBox).name,(tmp as TCheckBox).name);
IniFile.WriteString((tmp as TCheckBox).name,(tmp as TCheckBox).name+'.caption',(tmp as TCheckBox).caption);
IniFile.WriteInteger((tmp as TCheckBox).name,(tmp as TCheckBox).name+'.top',(tmp as TCheckBox).Top);
IniFile.WriteInteger((tmp as TCheckBox).name,(tmp as TCheckBox).name+'.left',(tmp as TCheckBox).Left);
IniFile.WriteInteger((tmp as TCheckBox).name,(tmp as TCheckBox).name+'.width',(tmp as TCheckBox).width);
IniFile.WriteInteger((tmp as TCheckBox).name,(tmp as TCheckBox).name+'.height',(tmp as TCheckBox).height);
IniFile.WriteBool((tmp as TCheckBox).name,(tmp as TCheckBox).name+'.checked',(tmp as TCheckBox).checked);
end;
end;

Собственно вопрос, как их можно считать?
Записан

iPhonograph
Гений-Говорун
*
Offline Offline

Сообщений: 2100

СПАСИБО
-вы поблагодарили: 561
-вас поблагодарили: 1315

Дискоед


Просмотр профиля
Ответ #1 : Май 24, 2013, 15:48:46 �

Через TMemIniFile
Записан

"Было бы величайшей ошибкой думать" (с) В.И.Ленин, Полн. cобр. cоч., т.34, стр.375
DM_
Давненько
**
Offline Offline

Сообщений: 68

СПАСИБО
-вы поблагодарили: 7
-вас поблагодарили: 21

237458
Просмотр профиля
Ответ #2 : Май 24, 2013, 15:51:07 �

Через TMemIniFile
можешь код написать?
насчет статических компонентов я вроде разобрался, а вот над динамическими уже два дня сижу Думаю
Последнее редактирование: Май 24, 2013, 16:18:13 от DM_ Записан

iPhonograph
Гений-Говорун
*
Offline Offline

Сообщений: 2100

СПАСИБО
-вы поблагодарили: 561
-вас поблагодарили: 1315

Дискоед


Просмотр профиля
Ответ #3 : Май 24, 2013, 16:50:53 �

примеров в инете куча
Код:
{
This example demonstrates the use of Ini files in order to store
and load form configurations between sessions. This example requires
a RadioGroup and two buttons.
}
procedure TForm2.btLoadClick(Sender: TObject);
var
  SettingsFile : TCustomIniFile;
begin
  { Open an instance }
  SettingsFile := OpenIniFileInstance();

  try
    {
    Read all saved values from the last session. The section name
    is the name of the form. Also use form's properties as defaults
    }
    Top     := SettingsFile.ReadInteger(Name, 'Top', Top );
    Left    := SettingsFile.ReadInteger(Name, 'Left', Left );
    Width   := SettingsFile.ReadInteger(Name, 'Width', Width );
    Height  := SettingsFile.ReadInteger(Name, 'Height', Height );
    Caption := SettingsFile.ReadString (Name, 'Caption', Caption);

    { Load last window state }
    case SettingsFile.ReadBool(Name, 'InitMax', WindowState = wsMaximized) of
      true : WindowState := wsMaximized;
      false: WindowState := wsNormal;
    end;

  finally
    SettingsFile.Free;
  end;
end;

procedure TForm2.btStoreClick(Sender: TObject);
var
  SettingsFile: TCustomIniFile;
begin
  { Open an instance }
  SettingsFile := OpenIniFileInstance();

  {
  Store current form properties to be used in later sessions.
  }
  try
    SettingsFile.WriteInteger (Name, 'Top', Top);
    SettingsFile.WriteInteger (Name, 'Left', Left);
    SettingsFile.WriteInteger (Name, 'Width', Width);
    SettingsFile.WriteInteger (Name, 'Height', Height);
    SettingsFile.WriteString  (Name, 'Caption', Caption);
    SettingsFile.WriteBool    (Name, 'InitMax', WindowState = wsMaximized );
    SettingsFile.WriteDateTime(Name, 'LastRun', Now);
  finally
    SettingsFile.Free;
  end;

end;

function TForm2.OpenIniFileInstance: TCustomIniFile;
begin
  {
  Open/create a new INI file that has the same name as our executable
  only with the INI extension.
  }

  case RadioGroup1.ItemIndex of
    0:
      begin
        { Registry mode selected: in HKEY_CURRENT_USER\Software\... }
        Result := TRegistryIniFile.Create('Software\' + Application.Title);
      end;
    1:
      begin
        { Ini file mode selected }
        Result := TIniFile.Create(ChangeFileExt(Application.ExeName, '.INI'));
      end;
    2:
      begin
        { Memory based Ini file mode selected }
        Result := TMemIniFile.Create(ChangeFileExt(Application.ExeName, '.INI'));
      end;
  end;
end;

Эти пользователи сказали вам СПАСИБО :

DM_

За это сообщение 1 пользователь сказал спасибо!
Записан

"Было бы величайшей ошибкой думать" (с) В.И.Ленин, Полн. cобр. cоч., т.34, стр.375
iPhonograph
Гений-Говорун
*
Offline Offline

Сообщений: 2100

СПАСИБО
-вы поблагодарили: 561
-вас поблагодарили: 1315

Дискоед


Просмотр профиля
Ответ #4 : Май 24, 2013, 19:00:55 �

вот мой код из реального проекта, по которому легко разобраться как сохранять в ini-файл

Код:
procedure TfrmSetup.SaveServicesGrids;
var
   F: TMemIniFile;
   i, j: Integer;
   Grid: TStringGrid;
   Key, Value, SectionName: String;
begin
   F := TMemIniFile.Create(ServicesDir + ServicesIniFile);
   // Записать все данные из закладок в ini-файл, предварительно очистив все его секции
   F.Clear;
   for i := 0 to NumberOfGrids-1 do begin
      Grid := All_Grids[i];
      SectionName := (Grid.Parent as TTabSheet).Caption;
      for j := 1 to Grid.RowCount-1 do begin
         Key := Grid.Cells[0, j];
         Value := Grid.Cells[1, j];
         if Key <> '' then
            F.WriteString(SectionName, Key, Value);
      end;
   end;
   F.UpdateFile;
   F.Free;
end;
Записан

"Было бы величайшей ошибкой думать" (с) В.И.Ленин, Полн. cобр. cоч., т.34, стр.375
iPhonograph
Гений-Говорун
*
Offline Offline

Сообщений: 2100

СПАСИБО
-вы поблагодарили: 561
-вас поблагодарили: 1315

Дискоед


Просмотр профиля
Ответ #5 : Май 24, 2013, 19:37:56 �

А вот как считывать секции, имена которых неизвестны на момент компиляции

Код:
procedure TfrmSetup.LoadServicesGrids;
var
   F: TMemIniFile;
   SectionNames_List, DataItems_List: TStringList;
   i, j, k: Integer;
   SectionName, KeyValue: String;
begin
   F := TMemIniFile.Create(ServicesDir + ServicesIniFile);
   SectionNames_List := TStringList.Create;
   DataItems_List := TStringList.Create;
   // Считать все секции ini-файла
   F.ReadSections(SectionNames_List);
   for i := 0 to SectionNames_List.Count-1 do begin
      SectionName := SectionNames_List[i];
      F.ReadSectionValues(SectionName, DataItems_List);
      for j := 0 to DataItems_List.Count-1 do begin
         KeyValue := DataItems_List[j];
         k := Pos('=', KeyValue);
         параметр := Copy(KeyValue, 1, k-1);
         значение := Copy(KeyValue, k+1, Length(KeyValue)-k);
         //
      end;
   end;
   SectionNames_List.Free;
   DataItems_List.Free;
   F.Free;
end;
Записан

"Было бы величайшей ошибкой думать" (с) В.И.Ленин, Полн. cобр. cоч., т.34, стр.375
DM_
Давненько
**
Offline Offline

Сообщений: 68

СПАСИБО
-вы поблагодарили: 7
-вас поблагодарили: 21

237458
Просмотр профиля
Ответ #6 : Май 25, 2013, 06:15:18 �

оказалось все просто, кому интересно:
Код:
  c:=IniFile.ReadInteger('Form2','c',c);
  for i:=0 to c do
  if IniFile.ReadInteger('CheckBox'+inttostr(i),'CheckBox'+inttostr(i)+'.top',-100)<>-100 then
  begin
   tmp:=tcheckbox.Create(self);    tmp.Parent := self;
if tmp<>nil then
begin
    tmp.Top := IniFile.ReadInteger('CheckBox'+inttostr(i),'CheckBox'+inttostr(i)+'.top',0);
    tmp.left := IniFile.ReadInteger('CheckBox'+inttostr(i),'CheckBox'+inttostr(i)+'.left',0);
    tmp.checked := IniFile.ReadBool('CheckBox'+inttostr(i),'CheckBox'+inttostr(i)+'.checked',false);
    tmp.width := IniFile.ReadInteger('CheckBox'+inttostr(i),'CheckBox'+inttostr(i)+'.width',0);
    tmp.height := IniFile.ReadInteger('CheckBox'+inttostr(i),'CheckBox'+inttostr(i)+'.height',0);
    tmp.name := IniFile.ReadString('CheckBox'+inttostr(i),'CheckBox'+inttostr(i)+'.name',tmp.name);
    tmp.caption := IniFile.ReadString('CheckBox'+inttostr(i),'CheckBox'+inttostr(i)+'.caption',tmp.caption);
end;
end;
Записан

Sirion
Гений-Говорун
*****
Offline Offline

Сообщений: 1095

СПАСИБО
-вы поблагодарили: 137
-вас поблагодарили: 278



Просмотр профиля Email
Ответ #7 : Май 30, 2013, 11:36:10 �

делфи не нужен
Записан

sirion=irion+srion+rion+siion+iion+sion+ion+siron+iron+sron+ron+sion+ion+son+on+sirin+
+irin+srin+rin+siin+iin+sin+in+sirn+irn+srn+rn+sin+in+sn+n+sirio+irio+srio+rio+siio+
+iio+sio+io+siro+iro+sro+ro+sio+io+so+o+siri+iri+sri+ri+sii+ii+si+i+sir+ir+sr+r+si+i+s
iPhonograph
Гений-Говорун
*
Offline Offline

Сообщений: 2100

СПАСИБО
-вы поблагодарили: 561
-вас поблагодарили: 1315

Дискоед


Просмотр профиля
Ответ #8 : Май 30, 2013, 16:48:21 �

сирион не нужен ))

Эти пользователи сказали вам СПАСИБО :

Робинзон

За это сообщение 1 пользователь сказал спасибо!
Записан

"Было бы величайшей ошибкой думать" (с) В.И.Ленин, Полн. cобр. cоч., т.34, стр.375
Страниц: [1]
  Печать  
 
Перейти в: