Форум 3DNews
Вернуться   Форум 3DNews > Программирование > Программирование

Ответ Создать новую тему
Опции темы Опции просмотра
Непрочитано 04.12.2004, 17:00   [включить плавающее окно]   #1
Sergey_Sun
Мужской Интересующийся
Автор темы
 
Регистрация: 04.12.2004
Exclamation Перечисление компонентов в Delphi

Привет всем!

У меня вопрос: Как перечислить компоненты в Delphi, например Panel'и. У меня их 60. И нужно изменить у всех одно и тоже св-во Visible.
Очень срочно.

Заранее спасибо.
__________________
Go to zeitgeistmovement.ru
Sergey_Sun вне форума  
Ответить с цитированием
Непрочитано 04.12.2004, 17:40   [включить плавающее окно]   #2
Johnnie Walker
Опытный
 
Регистрация: 28.04.2004
Код:
for i := 0 to ControlCount - 1 do
    if Controls[i].Tag = 1 then
        Controls[i].Visible := false;
Johnnie Walker вне форума  
Ответить с цитированием
Непрочитано 04.12.2004, 22:07   [включить плавающее окно]   #3
Sergey_Sun
Мужской Интересующийся
Автор темы
 
Регистрация: 04.12.2004
Спасибо огромное!!!

Еще вопрос: этот метод не работает в собственной процедуре. Вы не объясните почему так происходит и как заставить его заработать?
__________________
Go to zeitgeistmovement.ru
Sergey_Sun вне форума  
Ответить с цитированием
Непрочитано 04.12.2004, 22:29   [включить плавающее окно]   #4
ender
Мужской Интересующийся
 
Аватар для ender
 
Регистрация: 01.07.2004
procedure FindComponents(const C:TComponent; const P:TPanel);
begin
for i := 0 to CControlCount - 1 do
if Controls[i].Parent = P then
Controls[i].Visible := false;
end;
ender вне форума  
Конфигурация ПК
Ответить с цитированием
Непрочитано 04.12.2004, 22:33   [включить плавающее окно]   #5
Johnnie Walker
Опытный
 
Регистрация: 28.04.2004
Цитата (Sergey_Sun) »
в собственной процедуре
Что это такое?
Johnnie Walker вне форума  
Ответить с цитированием
Непрочитано 05.12.2004, 15:14   [включить плавающее окно]   #6
Sergey_Sun
Мужской Интересующийся
Автор темы
 
Регистрация: 04.12.2004
Собственная - значит созданная мной. Ну т.е. не Onclick и тому подобные, а чисто моя, с чисто придуманным названием.

Ну не знаю как это по-другому объяснить.
__________________
Go to zeitgeistmovement.ru
Sergey_Sun вне форума  
Ответить с цитированием
Непрочитано 05.12.2004, 15:18   [включить плавающее окно]   #7
ender
Мужской Интересующийся
 
Аватар для ender
 
Регистрация: 01.07.2004
Цитата (Sergey_Sun) »
Собственная - значит созданная мной. Ну т.е. не Onclick и тому подобные, а чисто моя, с чисто придуманным названием. Ну не знаю как это по-другому объяснить.
Вот тебе выше пример и висит, "собственной" процедуры.
ender вне форума  
Конфигурация ПК
Ответить с цитированием
Непрочитано 05.12.2004, 15:43   [включить плавающее окно]   #8
Sergey_Sun
Мужской Интересующийся
Автор темы
 
Регистрация: 04.12.2004
Question

Цитата (ender) »
procedure FindComponents(const C:TComponent; const P:TPanel);
begin
for i := 0 to CControlCount - 1 do
if Controls[i].Parent = P then
Controls[i].Visible := false;
end;
Точно такая же ошибка:

[Error] Unit1.pas(31): Undeclared identifier: 'СControlCount'

Sergey_Sun добавил :

Цитата (ender) »
Цитата (Sergey_Sun) »
Собственная - значит созданная мной. Ну т.е. не Onclick и тому подобные, а чисто моя, с чисто придуманным названием. Ну не знаю как это по-другому объяснить.
Вот тебе выше пример и висит, "собственной" процедуры.
Я понял. Но и этот пример почему-то не работает. Вроде как неописанная переменная ControlCount.
__________________
Go to zeitgeistmovement.ru
Sergey_Sun вне форума  
Ответить с цитированием
Непрочитано 05.12.2004, 16:21   [включить плавающее окно]   #9
ender
Мужской Интересующийся
 
Аватар для ender
 
Регистрация: 01.07.2004
Разумеется. В примере опечатка, не "CControlCount", а "C.ControlCount". Меня терзают смутные сомнения что ты слабо понимаешь что эта функция вообще делает. Если бы понимал, то заметил-бы что я написал полную чушь, невнимательно прочитав начальный вопрос.

Давай начнем разбор:
Цитата
Как перечислить компоненты в Delphi
Наверное ты хотел спросить "Как найти в приложении или на форме компоненты определенного типа и сделать с ними что-нибудь?"
Цитата
например Panel'и. У меня их 60. И нужно изменить у всех одно и тоже св-во Visible.
Подозрительно большое количество панелей и подозрительно что тебе требуется им всем сделать Visible.
Цитата
Очень срочно.
Глубина твоих страданий и срочность дела вообще никого не трогает...

Вот пример юнита. В нем на форме лежат три панельки и две конпки. Нажатие на кнопки скрывает все панели или открывает все панели. Ключевое место - процедура SetPanelsVisible. В нее передается два параметра, ParentControl - тот TWinControl (форма - наследник TWinControl), на котором должны лежать искомые панели. VisibleState - желаемое состояние свойства Visible для найденных панелей. В функции пробегаемся по списку контролов, содержащихся в ParentControl и проверям их тип. Если тип - TPanel, то меняем свойство Visible на желаемое.

Код:
unit Unit1;

interface

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

type
	TForm1 = class(TForm)
	Panel1: TPanel;
	Panel2: TPanel;
	Panel3: TPanel;
	ShowPanels: TButton;
	HidePanels: TButton;
	procedure ShowPanelsClick(Sender: TObject);
	procedure HidePanelsClick(Sender: TObject);
end;

var
	Form1: TForm1;

implementation
{$R *.dfm}

procedure SetPanelsVisible(const ParentControl:TWinControl; const VisibleState:Boolean=TRUE);
var
	I:Integer;
	C:TControl;
begin
	for I:=0 to ParentControl.ControlCount-1 do
		begin
			C:=ParentControl.Controls[I];
			if C is TPanel then C.Visible:=VisibleState;
		end;
end;

procedure TForm1.ShowPanelsClick(Sender: TObject);
begin
	SetPanelsVisible(Self);
end;

procedure TForm1.HidePanelsClick(Sender: TObject);
begin
	SetPanelsVisible(Self, FALSE);
end;

end.

ender добавил :

Цитата (Johnnie Walker) »
if Controls[i].Tag = 1 then
Ориентироваться на значение свойства Tag - дело рискованное.
ender вне форума  
Конфигурация ПК
Ответить с цитированием
Непрочитано 05.12.2004, 21:17   [включить плавающее окно]   #10
Johnnie Walker
Опытный
 
Регистрация: 28.04.2004
Цитата (ender) »
Ориентироваться на значение свойства Tag - дело рискованное
Это дело определения смысла этого свойства. Для этого оно и было создано.
Johnnie Walker вне форума  
Ответить с цитированием
Непрочитано 06.12.2004, 01:11   [включить плавающее окно]   #11
ender
Мужской Интересующийся
 
Аватар для ender
 
Регистрация: 01.07.2004
Один девелопер использует его для одного, другой для другого. Когда они встречаются, в лучшем случае один переписывает свой код, но поскольку, как правило, никому не приходит в голову сказать: "Эй! Я тут Tag использую, а ты случаем его тоже не юзаешь?", то эта ситуация не разруливается никак. А потом все падает по E_Чего_то_там.
ender вне форума  
Конфигурация ПК
Ответить с цитированием
Непрочитано 06.12.2004, 10:58   [включить плавающее окно]   #12
Johnnie Walker
Опытный
 
Регистрация: 28.04.2004
ender, ужасы какие-то рассказываете. Все надо делать в меру.
Johnnie Walker вне форума  
Ответить с цитированием
Непрочитано 06.12.2004, 11:32   [включить плавающее окно]   #13
ender
Мужской Интересующийся
 
Аватар для ender
 
Регистрация: 01.07.2004
Цитата (Johnnie Walker) »
ender, ужасы какие-то рассказываете. Все надо делать в меру.
Пока гром не грянет, мужик, как известно, не перекрестится. Тут понятие меры неприменимо. Тут или ты пишешь, избегая потенциально опасных методов и конструкций, или пишешь не избегая. Соответственно и результаты. Не враз, конечно, ударит, но рано или поздно последствия небрежности тебя настигнут.
ender вне форума  
Конфигурация ПК
Ответить с цитированием
Непрочитано 07.12.2004, 12:13   [включить плавающее окно]   #14
Sergey_Sun
Мужской Интересующийся
Автор темы
 
Регистрация: 04.12.2004
Спасибо.

Еще вопрос: вот нахожу я на форме Radiobutton'ы, а изменить св-во Checked не могу. Как это можно сделать?
__________________
Go to zeitgeistmovement.ru
Sergey_Sun вне форума  
Ответить с цитированием
Непрочитано 08.12.2004, 12:16   [включить плавающее окно]   #15
Sergey_Sun
Мужской Интересующийся
Автор темы
 
Регистрация: 04.12.2004
Почему нельзя изменить св-во Checked, используя вышеописанную процедуру?
__________________
Go to zeitgeistmovement.ru
Sergey_Sun вне форума  
Ответить с цитированием
Непрочитано 08.12.2004, 20:26   [включить плавающее окно]   #16
ender
Мужской Интересующийся
 
Аватар для ender
 
Регистрация: 01.07.2004
Изменить можно. Только оно работает несколько по другому. В группе RadioButton-ов только один радиобатон может быть Checked=TRUE, или для всех Checked=FALSE.
ender вне форума  
Конфигурация ПК
Ответить с цитированием
Непрочитано 09.12.2004, 19:09   [включить плавающее окно]   #17
Sergey_Sun
Мужской Интересующийся
Автор темы
 
Регистрация: 04.12.2004
Мне как раз и надо для всех Checked=false! Но той процедурой у меня не получается - Делфи его как будто не видит, вроде как его вообще не существует. Пишет: неописанная переменная Checked Что тут можно сделать?
__________________
Go to zeitgeistmovement.ru
Sergey_Sun вне форума  
Ответить с цитированием
Непрочитано 13.12.2004, 09:50   [включить плавающее окно]   #18
ender
Мужской Интересующийся
 
Аватар для ender
 
Регистрация: 01.07.2004
Потому что свойство Checked присутствует у TRadioButton и не присутствует у TControl. Соответственно преобразовывать надо к TRadioButton.
Код:
var
  I:Integer; C:TControl; R:TRadioButton;
begin	
  for I:=0 to ParentControl.ControlCount-1 do
    begin
      C:=ParentControl.Controls[I];
      if C is TRadioButton then 
        begin
          R:=C as TRadioButton;
          R.Checked:=...;
        end;
   end;
end;
ender вне форума  
Конфигурация ПК
Ответить с цитированием
Непрочитано 14.12.2004, 11:18   [включить плавающее окно]   #19
Sergey_Sun
Мужской Интересующийся
Автор темы
 
Регистрация: 04.12.2004
Процедура работает только в том случае, если Radiobutton'ы находятся непосредственно на форме. А у меня они все на Panel'ях.
Подскажите пж-та узко мыслящему студенту
__________________
Go to zeitgeistmovement.ru
Sergey_Sun вне форума  
Ответить с цитированием
Непрочитано 14.12.2004, 23:48   [включить плавающее окно]   #20
ender
Мужской Интересующийся
 
Аватар для ender
 
Регистрация: 01.07.2004
А самому немного подумать? Если находятся на панелях, стало быть и искать их надо на панелях, а не на форме.
ender вне форума  
Конфигурация ПК
Ответить с цитированием
Ответ Создать новую тему

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


Текущее время: 13:39. Часовой пояс GMT +3.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 2000-2017 3DNews. All Rights Reserved.
Администрация 3DNews требует соблюдения на форуме правил и законов РФ
Серверы размещены в Hostkey