Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Циклом читать и писать настройки из/в файл


КВАНТ ©   (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 с именами - получается монстр, который еще и хорошо тормозит. Подумайте хорошенько, а так ли уж это Вам необходимо.
С уважением, А.Шаталов


Наверх

Титульная страница Поиск, карта сайта Написать письмо