![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Циклом читать и писать настройки из/в файл
КВАНТ © (2006-11-16 05:25:00)Здрасьте!
Изложу вопрос кратко:
Имеется форма, имеются энное количество всяких лейблов, едитов, чек-боксов, радио-боксов и т.д.
Вопрос: как мне ЦИКЛОМ (желательно, потому что объектов много) записать/прочитать значения (например, у лейблов - caption, у чеков и радио - checked и т.д.) в/из файла? Как то химичил, пробовал, но, видимо, не допёр мозгом своим... Практики и знаний маловато =)
Спасибо!
ЗЫ Очень нужно! И, если не трудно, снабдите код комментами!
Спасибо в квадрате.
MTsv DN (2006-11-17 15:57:00) [1]> Нужно не всех компонент на форме, а всех компонент на панели
> (Panel) НО естественно не считая всяких там компонент, сделанных
> для красоты (Label всякий, GroupBox...)
Ну, так в чем же проблема-то???
Только на Panel, так вызывайте не_SearchControls( Form1.Form, YOUR_PROCESS);, в_SearchControls( Panel, YOUR_PROCESS);
И фильтр настроить:
SubClassName:
у Label, LabelEffect, Panel, Splitter -> obj_STATIC
у Button, BitBtn, GroupBox, Check, Radio -> obj_BUTTON
КВАНТ (2006-11-17 06:43:00) [2]2 MTsv DN ©
Нужно не всех компонент на форме, а всех компонент на панели (Panel) НО естественно не считаявсяких там компонент, сделанных для красоты (Label всякий, GroupBox...)
Barloggg (2006-11-16 16:51:00) [3]ну, можно перекрыть функции создания компонетов, как я это сделал подключив Grush к своему большому и готовому проекту без инсталляции.
Сделать так перед NewForm вписать это
function NewLabel(сюда скопировать весь синтаксис):
begin
а тут этот лабел запомнить в массиве или запомнить прямую ссылку на него
result:=Kol.NewLabel(передать все параметры дальше);
end;
таким образом во время запуска можно все компоненты подобными вставками пометить. на каждый тип компонента - одна вставка.
надеюсь понятно объяснил :(
Galkov (2006-11-16 11:50:00) [4]А настройки невизуальных объектов сохранять/восстанавливать, видимо - не судьба :(
MTsv DN (2006-11-16 09:49:00) [5]> Кстати, я уже здесь задавал этот ВОПРОС, только так и не смог его
> найти на форуме...
Слово пропустил ;)
MTsv DN (2006-11-16 09:48:00) [6]2 avs ©
<OFFTOP>Не обижайся, красиво конечно...но это изврат ;)
Все делается рекурсией, быстрее и проще... Кстати, я уже здесь задавал этот, только так и не смог его найти на форуме... Интересно, сколько здесь темы хранят, прежде чем скинуть в архив?</OFFTOP>
Если я правильно понял, надо отсканировать ВСЕ компоненты на форме, независимо от их Parent'а...
Вот код...переделанный поиск по диску (прям из учебника "содрал"):
Файл SearchControls.pas
unit SearchControls;
interface
uses KOL, windows;
type
PSearchAction = procedure (Sender : PControl);
procedure _SearchControls(Sender : PControl; SearchAction : PSearchAction);
implementation
procedure _SearchControls(Sender : PControl; SearchAction : PSearchAction);
var
i : integer;
begin
for i := 0 to Sender.ChildCount-1 do
begin
if Sender.Children[i] <> nil then
begin
if (Sender.Children[i].SubClassName = YOUR_SEARCH_FILTER) // Фильтр не обязательно должен быть SubClassName
then
begin
SearchAction(Sender.Children[i]);
if Sender.Children[i].ChildCount <> 0 then
_SearchControls(Sender.Children[i], SearchAction);
end;
end;
end;
end;
end.
Использование:
uses SearchControls;
procedure YOUR_PROCESS(Sender : PControl);
begin
Sender.Color := clGray;
end;
procedure TForm1.KOLForm1FormCreate(Sender: PObj);
begin
_SearchControls(Form1.Form, YOUR_PROCESS);
end;
В строке:if (Sender.Children[i].SubClassName = YOUR_SEARCH_FILTER) then, YOUR_SEARCH_FILTER- это obj_BUTTON и т.д. Если вместо этой строки написать:if pos('obj_', Sender.Children[i].SubClassName) = 1 then, то отсканируются все компоненты...
В функции YOUR_PROCESS, Ваш обработчик...
avs (2006-11-16 09:11:00) [7]Если Вы не пользуете Тэги для других целей - можно соорудить таблицу из
2-х столбцов: 1- ТЭг 2- разновидность контрола (лейбл,чек и т.д.).
Далее что-то типа
var
p:pcontrol;
i,j,k:integer;
.....
j:=Form.ChildCount-1;
For i:=0 to j do
begin
p:=Form.Children[i];
if p.hasChildren then
begin
Здесь задача сводится к предыдущей
...
end else
begin
k:=p.tag
Далее анализ с помощью таблицы,
запись или чтение из файла.
end;
...
end;
Остальное см. в Книгеработа с ini - файлами или можно еще использовать Pstrlist в режиме именованного списка
.
s:=ls.values[имя]
s-строка, ls - Pstrlist
Я пользовал это в vcl с именами - получается монстр, который еще и хорошо тормозит. Подумайте хорошенько, а так ли уж это Вам необходимо.
С уважением, А.Шаталов