Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
1 / 1 / 0
Регистрация: 25.05.2015
Сообщений: 16
1
Delphi 6-7

Чтение данных для контролов на форме из ini файла

29.03.2019, 00:42. Показов 899. Ответов 8

Подскажите как можно реализовать чтение данных для контролов (в моём случае для кнопок) из ini файла без написания километров кода? Опишу что пытаюсь реализовать (хотя пока не получается):

Есть 2 панели, на каждой по 12 кнопок, у кнопок свои имена (вместо стандартных Button1), для кнопок на Panel1 имена BtnA0-BtnA11, для Panel2 - BtnB0-BtnB11. Как мне реализовать достаточно простое (скорее короткое по кол-ву кода) решение для чтения данных из ini файла при запуске программы (Form1.OnCreate)?
Я знаю что подобное вполне возможно.
Как считать данные для ShowMessage я уже понял, хотя и придется прописывать соответствующий код для каждой кнопки.
А вот как считать данные для заголовков кнопок не большим кол-вом кода я пока не понял.

В ini файле строки и секции выглядят так:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
[Panel1] //Данные для Panel1
BtnA0_Cap = Test Button A 1 //Заголовок кнопки - BtnA0.Caption
BtnA0_Msg = You Press Test Button A 1 //Текст сообщения (ShowMessage) выдаваемого при нажатии на соответствующую кнопку 
...
BtnA11_Cap = Test Button A 1
BtnA11_Msg = You Press Test Button A 1
 
[Panel2]//Данные для Panel2
BtnB0_Cap = Test Button B 1
BtnB0_Msg = You Press Test Button B 1
...
BtnB0_Cap = Test Button B 1
BtnB0_Msg = You Press Test Button B 1
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.03.2019, 00:42
Ответы с готовыми решениями:

Чтение с ini файла для edit
Привет всем, у меня такая проблема, не читается с ini файла текст для edit. Вот примерный код: ...

Сохранение в ini и чтение из ini собственных типов данных и сохранение комментариев
Доброго времени суток. 1. Допустим есть собственный тип, определяемый посредством Enum. ...

чтение из ini файла
здравствуйте товарищи программисты.делаю тест и надо чтобы вопросы выборочно подгружались из ini...

Чтение из *.ini файла
Всем привет прошу помочь с микро програмулькой Uses Inifiles; Var ini: TInifile; procedure...

8
60 / 46 / 20
Регистрация: 01.09.2017
Сообщений: 362
29.03.2019, 01:26 2
nnm4evr, По скольку я работал с ини файлами не мало, но такие возможности, которые вам нужны, я в их описаниях не видел вообще. Есть секции, ключи и значения ключей. Можно каждый из них считывать как сам по себе. Но что-бы сократить количества кода в ини, этого я не встречал.
0
320 / 158 / 65
Регистрация: 25.02.2018
Сообщений: 594
29.03.2019, 02:03 3
Цитата Сообщение от nnm4evr Посмотреть сообщение
А вот как считать данные для заголовков кнопок не большим кол-вом кода я пока не понял.
Я смотрел недавно одну тему, в которой были правда динамически создаваемые компоненты, но суть остается та же. Динамически они только создавались, а все параметры писались в ini-файл, и при открытии приложения снова считывались с того же файла. Две процедуры записать/считать там занимают всего 50 строк, а кнопок может Ваших быть сколько угодно. Посмотрите, может поможет чем-то.
1
Модератор
7182 / 4683 / 1973
Регистрация: 21.01.2014
Сообщений: 19,867
Записей в блоге: 3
29.03.2019, 06:45 4
nnm4evr, я вот не совсем понял идею этого ини-файла... Зачем он вообще? У Вас статически созданные кнопки, которые будут появляться в одном и том же количестве с одними и теми же заголовками (которые Вы задаете для каждой кнопки в Инспекторе объектов) каждый раз при старте программы. Непонятно...
Или в процессе работы с этими кнопками что-то происходит? Меняются заголовки? выдаваемые при нажатии сообщения? что-то еще?
Или кнопки, таки, динамически создаваемые?
Цитата Сообщение от nnm4evr Посмотреть сообщение
В ini файле строки и секции выглядят так
Неправильно выглядят!!! На кой черт в качестве имени секции выступает панель? Какую информативную нагрузку несет такая секция? Да никакой! А вот если бы все параметры каждой отдельной кнопки находились в отдельный секциях, имя которой является именем кнопки - все стало бы намного проще. Не появился бы и такой крик души:
Цитата Сообщение от nnm4evr Посмотреть сообщение
хотя и придется прописывать соответствующий код для каждой кнопки
Вот как выглядит INI-файл при моем подходе:
[btnA0]
Parent=Panel1 //<<== Не знаю, зачем это вообще надо при статически создаваемых кнопках... Но пусть будет, мало ли...
Capt=Test Button A 1
Msg=You Press Test Button A 1
...
[btnA11]
Parent=Panel1
Capt=Test Button A 12
Msg=You Press Test Button A 12
[btnB0]
Parent=Panel2
Capt=Test Button B 1
Msg=You Press Test Button B 1
...
Вот как производится чтение при старте приложения:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
procedure Reader(P: TPanel);
var INI: TINIFile;
    i: integer;
begin
  INI := TINIFile.Create('c:\tmp\111.ini');
  with P do
   for i := 0 to ControlCount - 1 do
    if Controls[i] is TButton then
      TButton(Controls[i]).Caption := INI.ReadString(TButton(Controls[i]).Name, 'Capt', '');
  INI.Free;
end;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  Reader(Panel1);
  Reader(Panel2);
end;
Если я правильно понял, весь полезный функционал кнопок сводится к выводу сообщения, для каждой кнопки - свое.
Тогда достаточно создать один обработчик события нажатия на кнопку (например, для кнопки btnA0) и назначить его для всех остальных кнопок на обеих панелях, написав туда такой код:
Delphi
1
2
3
4
5
6
7
procedure TForm1.btnA0Click(Sender: TObject);
var INI: TINIFile;
begin
  INI := TINIFile.Create('c:\tmp\111.ini');
  ShowMessage(INI.ReadString(TButton(Sender).Name, 'Msg', ''));
  INI.Free;
end;
так же элементарно осуществляется запись в INI, например, при закрытии формы...

Не по теме:

Я прямо стесняюсь спросить: а как у Вас сейчас происходит запись в INI?

Мой подход...
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
procedure Writer(P: TPanel; Suffix: String);
var i, k: integer;
    INI: TINIFile;
begin
  INI := TINIFile.Create('c:\tmp\111.ini');
  k := 1;
  with P do
   for i := 0 to ControlCount - 1 do
    if Controls[i] is TButton then
     begin
      INI.WriteString(TButton(Controls[i]).Name, 'Parent', TButton(Controls[i]).Parent.Name);
      INI.WriteString(TButton(Controls[i]).Name, 'Capt', Format('Test Button %s %d', [Suffix, k]));
      INI.WriteString(TButton(Controls[i]).Name, 'Msg', Format('You Press Test Button %s %d', [Suffix, k]));
      inc(k)
     end;
  INI.Free;
end;
 
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Writer(Panel1, 'A');
  Writer(Panel2, 'B');
end;

1
1 / 1 / 0
Регистрация: 25.05.2015
Сообщений: 16
29.03.2019, 14:53  [ТС] 5
920403, Я имел ввиду сократить кол-во кода самой программы, а не ини файла, там-то кода будет скорее всего много))

Ашотик2018, D1973, Вариант с динамическими кнопками хорош, изучу его подробнее, потому как этих самых кнопок будет уйма. Данная тема и код в ини, да и сам код для Delphi - это тестовая (для изучения/понимания самого процесса так сказать) программа, в конечном варианте будет и больше параметров в самом ини файле и программа будет работать иначе. А точнее кнопки нужны для запуска сторонних приложений в разных папка, и в ини будут записаны как имена кнопок, так и пути к этим программам и пути к файлу значка программы (я буду использовать SpeedButton), так и параметр видимости кнопки. Хотя по ходу разработки параметры могут как добавляться, так и убираться, это всегда так бывает. Просто использовать ини (или даже можно назвать это файлом параметров) проще для возможности конечному пользователю менять параметры для кнопок, а не то что вбить все параметры в коде программы без возможности для конечного пользователя менять эти параметры. Думаю даже придется использовать дополнительный компонент BigIni, потому как ини файл может быть более 64 Кб.
0
320 / 158 / 65
Регистрация: 25.02.2018
Сообщений: 594
29.03.2019, 15:23 6
Цитата Сообщение от nnm4evr Посмотреть сообщение
проще для возможности конечному пользователю менять параметры для кнопок, а не то что вбить все параметры в коде программы без возможности для конечного пользователя менять эти параметры.
Для реализации данной возможности, в любой более-менее вменяемой программе существует такое понятие как "Настройки", и уж точно конечному пользователю в Help-е где-то не пишут, "Откройте INI-файл с настройками и ковыряйте там все что Вам сдумается". По человеческой логике пользователь должен открыть вкладку "Настройка" (будь это вкладка в самой программе реализованная на TabControl или отдельная форма), внести необходимые изменения, а уж программа сама запишет в INI-файл то, что там изменил пользователь.

Не по теме:

ИМХО - на велосипеде с квадратными колесами кататься очень тяжело :D

0
Модератор
7182 / 4683 / 1973
Регистрация: 21.01.2014
Сообщений: 19,867
Записей в блоге: 3
29.03.2019, 17:03 7
Цитата Сообщение от nnm4evr Посмотреть сообщение
Думаю даже придется использовать дополнительный компонент BigIni

Не по теме:

Когда-то, в давние-стародавние времена, древние люди, пытаясь сохранить какую-то информацию, придумали базы данных... Начала они рисовали пиктограммы на стенах пещер, потом вырубали клинопись на базальтовых плитах, ну и т.д., до тех пор, пока не появилась ЭВМ и возможность создавать и хранить любую информацию в реляционных\иерархических\функциональных и т.д. и т.п. Базах Данных.

nnm4evr, Ваша попытка хранить 100500 тышш параметров в ини-файле - это (уж простите мне мой хранцусский) или неправильное проектирование приложения или неправильный подход к хранению конфигурации ПО...

0
1 / 1 / 0
Регистрация: 25.05.2015
Сообщений: 16
29.03.2019, 19:35  [ТС] 8
Пожалуй буду делать авто-генерацию кнопок, как посоветовал Ашотик2018.

Программа - это Autorun для загрузочного/установочного/реанимационного/и т.д. внешнего HDD (т.к. объем 110+ Гб), но я собирался делать именно ini'шку из-за простоты редактирования, хотя бы обычным блокнотом, чтобы пользователи, которые скачают мою сборку, могли сами править параметры (удалять/добовлять/изменять) того ПО что есть на этом диске. Использование БД для хранения данных означает так же и написание программы для правки файла БД, что уже несколько геморойно т.к. раньше я с БД не работал (по крайней мере в Delphi, только с MySQL на Web-серверах, но там для этого есть PHPMyAdmin или Navicat for MySQL).

Как что-то удастся, отпишусь.
0
1 / 1 / 0
Регистрация: 25.05.2015
Сообщений: 16
29.03.2019, 22:52  [ТС] 9
Вроде что-то получилось, кнопки создаются из ini'шки, им назначается имя, заголовок и по нажатию на кнопку выдается сообщение именно от Нажатой кнопки на нужной панели.

Если Вам интересно прикрепляю исходники с тестовой прогой, на лишние контролы (Label'ы и кнопку ХХХХ) не обращайте внимания, положил их на случай необходимости поиска ошибок в коде и не работоспособности частей кода. Запустите прогу и нажмите на кнопку Load INI, далее я думаю и так всё понятно. Писалось и компилировалось на Delphi 7.
0
Вложения
Тип файла: zip GenBtnsByIni.zip (228.1 Кб, 3 просмотров)
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.03.2019, 22:52

Чтение ini файла
ini := Tinifile.Create('F:\рограммирование\лаба3зад2\name.ini'); label3.caption :=...

Чтение ini файла
При запуске программы нужно проверить, не равен ли 1 в секции PassSetted параметр AreSetted и если...

Чтение из ini файла
Значит записал я в ini файл название вопроса который ввёл в Edit1 , ка мне его вывести в Edit4 ?...

Чтение с ini файла...
Нужно открыть настройки ListBox с ini файла.... Когда делаю выдает ошибки... Подскажите как...

Чтение .ini файла
Здравствуйте. Подскажите новичку пожалуйста такую &quot;весч&quot;: procedure TForm1.Button3Click(Sender:...

Чтение .ini файла
Имеется структура SetUp struct SetUp { int Xresolution; int Yresolution; bool...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.