Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.05.12;
Скачать: [xml.tar.bz2];

Вниз

Как менять свойство сразу нескольких компонент?   Найти похожие ветки 

 
Евгений   (2003-04-27 08:46) [0]

Как например у всех компонент, имеющих свойство Visible, изменить его на true?


 
Palladin   (2003-04-27 08:54) [1]

for to do


 
Евгений   (2003-04-27 09:02) [2]

Уточнение вопроса. Как изменить общее свойство у компонент разного типа?


 
Palladin   (2003-04-27 09:08) [3]

компонент_разного_типа.visible:=true;

что за глупый вопрос?
что есть в твоем понимании общее свойство?


 
Евгений   (2003-04-27 09:18) [4]

Свойство, имеющееся у различных компонентов, например Visible.
Дай, пожалуйста, пример цикла, который менял делал бы видимыми все компоненты формы.


 
Евгений   (2003-04-27 09:19) [5]

Свойство, имеющееся у различных компонентов, например Visible.
Дай, пожалуйста, пример цикла, который делал бы видимыми все компоненты формы.


 
default   (2003-04-27 09:21) [6]

to Евгений
рекурсия тебе понадобиться
поскольку придётся просматривать Components и у элементов которыми владеет форма


 
Евгений   (2003-04-27 09:21) [7]

Свойство, имеющееся у различных компонентов, например Visible.
Дай, пожалуйста, пример цикла, который делал бы видимыми все компоненты формы.


 
default   (2003-04-27 09:41) [8]

"Дай, пожалуйста, пример цикла, который делал бы видимыми все компоненты формы"
ну нехорошо же попрошайничать ещё и на программистском форуме?
тебе дают идею - реализация за тобой


 
Palladin   (2003-04-27 10:12) [9]

(
TComponent
Components
ComponentCount
As (Is)
) + F1


 
Юрий Зотов   (2003-04-27 12:02) [10]

> Palladin, default.

Предположим, есть библиотека из 1000 РАЗНЫХ компонентов, КАЖДЫЙ из которых имеет нестандартное свойство с именем Visible и при этом унаследован НЕПОСРЕДСТВЕННО от TComponent. Такое возможно? Запросто.

На форме лежат 100 таких компонентов и требуется поменять значение свойства Visible у них у ВСЕХ. Не могли бы Вы привести код, решающий эту задачу ВАШИМ методом? Конечно, он элементарно простой, но очень хочется взглянуть на ОБЪЕМ этого кода.

Далее. Человек в вопросе написал - "например". Это означает, что он говорит не обязательно о свойстве Visible, а вообще о свойстве с любым именем. Давайте немного изменим вопрос:

"Как например у всех компонент, имеющих свойство ReadOnly, изменить его на true"?

Интересно - а как бы Вы ответили на ТАКОЙ вопрос? Ведь свойство ReadOnly есть у Edit"ов, DataSet"ов и еще у целой кучи других совершенно РАЗНЫХ компонентов (в справке Delphi 5 я насчитал 26 классов VCL с таким свойством, а ведь существуют еще и Rx, и другие библиотеки, которые тоже запросто могут использоваться в проекте).

Снова гнать цикл и писать супермногоэтажный IF с проверкой класса? А завтра на форме появится еще один такой компонент и в этот IF надо не забыть добавить еще одну строку?

Вот о чем человек спрашивает, а вовсе не об элементарном проходе по Components c проверкой класса.


> Евгений

Вот решение задачи для любого свойства перечислимого типа (а это все целочисленные типы, булевский тип, типы-перечисления, типы-диапазоны и пр. - в общем все, что можно привести к перечислимому типу).

uses
..., TypInfo;

procedure SetOrdinalProp(Obj: TObject; PropName: string; Value: integer);
var
P: PPropInfo;
begin
P := GetPropInfo(Obj, PropName);
if P <> nil then SetOrdProp(Obj, P, Value)
end;

procedure SetOrdinalPropRecursively(Component: TComponent; PropName: string; Value: integer);
var
i: integer;
begin
SetOrdinalProp(Component, PropName, Value);
with Component do
for i := 0 to ComponentCount - 1 do
SetOrdinalPropRecursively(Components[i], PropName, Value)
end;

Используя эти процедурки, любое перечислимое свойство любого компонента и всех его подкомпонентов устанавливается одной простенькой строкой. Например:

procedure TForm1.Button1Click(Sender: TObject);
begin
SetOrdinalPropRecursively(Self, "ReadOnly", Integer(True))
end;

Никаких исключений здесь не возбуждается. Если свойство с именем PropName у объекта Obj найдено - оно будет установлено в значение Value (внимание - реальный тип найденного свойства здесь не проверяется, предполагается, что программист знает, что делает). Если не найдено - ничего не происходит.

Есть одно ограничение - этот метод использует RTTI. То есть, работает ТОЛЬКО для published свойств. Другие он найти не сможет.


 
Palladin   (2003-04-27 12:19) [11]


> Юрий Зотов © (27.04.03 12:02)

вопрос к Вам

как Вы думаете, можно ли воспроизвести Ваше решение или подобное ему на основе
Palladin © (27.04.03 08:54) и
Palladin © (27.04.03 10:12)

я ему предоставил справочную информацию, я дал ему шанс подумать, комбинировать, а потом приходить и спрашивать если сам не смог, Вы же все разжевали... просто копируй и вставляй...
разве так интересно?


 
Palladin   (2003-04-27 12:27) [12]

причем пришел бы он и спросил более конкретно если не халявщик...


 
default   (2003-04-27 13:05) [13]

to Palladin
Но согласись ты же не дал вопрощающему даже намёка на RTTI ?



 
Palladin   (2003-04-27 13:16) [14]

согласен не дал :)
а надо ли ему это сейчас, на его то уровне?
тем более я оговорился

> или подобное ему


никаких if"ов я вообще не имел ввиду...

сначала решил бы частную задачу про рекурсивную установку какого либо конкретного свойства, потом бы задался задачей посложней...
пришел спросил бы как получить все существующие свойства...
сказали бы так то так то существует RTTI...
он пошел бы дальше ковырять...
процесс обучения самообучению...


 
Palladin   (2003-04-27 13:19) [15]

прошу прощения за оффтопик...
Юрий Зотов прав по своему, я прав по своему...


 
default   (2003-04-27 13:32) [16]

to Palladin
Полностью согласен - нельзя давать сразу решение
надо давать "намёки"


 
NoName   (2003-04-27 14:53) [17]

Намеки должны быть конструктивными, а не -> Что за глупый вопрос?
если у человека нет опыта, то он и обращается к более опытным людам в надежде, что ему помогут, а не будут говорить ему что он задает глупые вопросы... и давать смутные намеки которые и опытному не сразу понять...


 
default   (2003-04-27 14:55) [18]

to NoName
Тоже правда


 
Юрий Зотов   (2003-04-27 15:01) [19]

> Palladin

Поскольку на вопросы принято отвечать, то отвечаю.

> как Вы думаете, можно ли воспроизвести Ваше решение или
> подобное ему на основе
> Palladin © (27.04.03 08:54) и
> Palladin © (27.04.03 10:12)

Я думаю, что нельзя. Потому что главное в этом решении - RTTI, TypInfo и SetOrdProp. В обоих упомянутых Вами постингах нет ни одного из этих ключевых слов. А про рекурсию, цикл for, свойство Сomponents и оператор AS, я полагаю, спрашивающий знает не хуже нас с Вами - поэтому Ваши ответы ничего нового ему не дают. Даже и не дают возможности нажать F1, поскольку в хелпе надо еще и знать, что искать - а, то, о чем Вы говорили, он и так знает.

Собственно, мне совершенно непонятно, почему Вы решили, что он совсем уж такой начинающий? Я этого в его вопросах не увидел, вполне нормальные вопросы. А вот об ответах я бы так не сказал - именно потому он и просил привести конкретный код, что прекрасно понимал, что ТАК задача не решается и хотел, чтобы и Вы это поняли тоже. То есть - в данном случае вопрос о том, чей уровень выше, спрашивающего или отвечавших, остается еще очень даже открытым.

> разве так интересно?

Интересно. Потому что именно так у него появляется реальная возможность посмотреть конкретные используемые в коде вещи в VCL и в хелпе. И когда завтра ему потребуется то же самое для свойств другого типа - он сделает это самостоятельно. Это и есть самообучение.


> default © (27.04.03 13:32)
> Полностью согласен - нельзя давать сразу решение
> надо давать "намёки"

Конечно. Вот только задачи и намеки - они разные бывают. Для каких-то задач достаточно одного слова, а для каких-то - вряд ли.

Давайте проиграем такую ситуацию - Вы как бы задали вопрос, а я как бы ответил на него намеком (совершенно точным и правильным, но только намеком). После чего Вы решаете задачу на основе книг, хелпа, кода VCL и этого намека.

Итак, вот Ваш вопрос.

"Я построил иерархию форм. На них нет никаких компонентов (у них вообще нет DFM), но в их классах есть код методов, которые объявлены в published. Теперь я делаю рабочую форму, как наследника одной из этих форм, кладу на нее нужные компоненты и хочу назначить их событиям унаследованные методы в качестве обработчиков (параметры методов полностью соответствуют нужным). Проблема заключается в том, что Object Inspector этих методов не видит и поэтому назначить их в design-time обычным способом нет возможности. Как заставить Object Inspector видеть эти методы"?

А вот мой ответ-намек.
"TPropertyEditor, VMT, F1".

Уверяю Вас, этой информации для решения задачи вполне достаточно. Но попробуйте решить ее на практике. Думаю, через месяц-другой Вы согласитесь, что задачи и намеки бывают разные.

Не верите - попробуйте.


 
Palladin   (2003-04-27 16:15) [20]


> Юрий Зотов © (27.04.03 15:01)

Обратите внимание на содержание вопросов автора. Ничего подобного о свойствах разных типов он не упоминал.
Анализируем:


> Как например у всех компонент, имеющих свойство Visible,
> изменить его на true?


ответ понятен for to do


> Как изменить общее свойство у компонент разного типа?

Прошу обратить внимание. Не свойства разного типа, а компоненты.

Я отвечал на поставленый вопрос. Того что я сказал что бы решить этот вопрос вполне достаточно.
На счет моей фразы про глупые вопросы: это следствие уточнения.

Почему Вы вдруг решили что человеку нужна именно такая конструкция мне не понятно.

Я не делаю вид что я не заметил вопрос, вопрос я заметил и из принципа приступил к исследованию в этой области. О результатах Вы узнаете в форуме "Потрепатся", там же я опишу свой путь.
Прошу заметить, что я даже еще не работал в направлении взаимодействия IDE с проектом (можете верить, можете не верить), то есть начинаю с нуля. К сожалению сроки, по этой причине, указать не могу. Но если я не решу задачу в течении двух недель я так и скажу.


 
CbIH   (2003-04-27 16:28) [21]

Вообще-то я делаю так:

procedure TfmMain.EnableControls;
var
i : Integer;
begin
for i := 0 to ComponentCount - 1 do
if Components[i] is TComponent then
(Components[i] as TComponent).Visible := True;
end;



 
CbIH   (2003-04-27 16:31) [22]

То есть, конечно,

procedure TfmMain.EnableControls;
var
i : Integer;
begin
for i := 0 to ComponentCount - 1 do
if Components[i] is TControl then
(Components[i] as TControl).Visible := True;
end;



 
Palladin   (2003-04-27 16:48) [23]


> CbIH © (27.04.03 16:31)

именно до этого я предлагал додуматся автору вопроса...
большего он не просил


 
default   (2003-04-27 16:59) [24]

to Юрий Зотов
Для решения этой задачи мне тоже придётся сначала изучать класс TPropertyEditor и возможно ещё какие-то вещи которых я щас не знаю потому что они мне пока не требуются и мне не хочется тратить время щас на их изучение давайте задачу со своим намёком но для решения которой будет достаточно базового инструмента


 
Юрий Зотов   (2003-04-27 18:43) [25]

> CbIH © (27.04.03 16:31)
> Palladin © (27.04.03 16:48)

1. Код не сработает для компонентов, созданных в run-time c владельцем, отличным от формы (что в серьезных проектах встречается довольно часто).

2. Свойство Visible может быть не только у TControl. Не все компоненты - стандартные.

3. В вопросе прозвучало слово "например". Это значит, что вопрос касался не только Visible, а ставился в принципе. Как быть?


> Palladin © (27.04.03 16:15)

Уважаю. Если Вы действительно еще не имели дела с IDE и, тем не менее, решите эту задачу за пару недель, я первый сниму перед Вами шляпу. Публично.


> default © (27.04.03 16:59)

Немного затруднительно (потому что у нас может быть разное понятие о "базовом инструменте"), но давайте попробуем.

Вопрос:
Как изменить цвет кнопки класса TButton, не создавая ее потомка?

Ответ:
MakeObjectInstance + FreeObjectInstance (или SetWindowLong), а также сообщения WM_ERASEBKGND/WM_PAINT.

Если такого намека Вам действительно достаточно, то нормальный срок - пара часов. Если нет - срок неопределен.









 
Sergey Masloff   (2003-04-28 10:53) [26]

Юрий Зотов ©

>Ответ:
>MakeObjectInstance + FreeObjectInstance (или SetWindowLong), а >также сообщения WM_ERASEBKGND/WM_PAINT.
Ну вот час я уже потратил :(
Ход мыслей:
- создать новую оконную процедуру (исп. MakeObjectInstance). В ней обрабатывать и WM_ERASEBKGND и WM_PAINT
- заменить новой процедурой старую (в SetWindowLong параметр nIndex = gwl_WndProc)

пока все просто. А дальше?
получить DC и все вручную рисовать? Тем более в WM_ERASEBKGND контекст устройства содержится в WParam? Думаю это не то что нужно.
Цвет кнопки наверное определяется в структуре WNDCLASS(EX) но как его поменять после создания окна?

Вобщем, нужна еще подсказка. А то жалко времени но не успокоюсь теперь ;-))

С уважением



 
default   (2003-04-28 15:03) [27]

to Sergey Masloff
не так всё просто
если бы было всё так просто у компонента TButton было бы свойство
Color - то есть винда этого не позволяет
to Юрий Зотов
Подсказок больше не надо никому!!!
А то так не интересно будет раз дали столько значит столько...
Если Вас не затруднит пришлите мне на мыло ___ALex___@inbox.ru
exe-ик с примером кнопки что бы знать какого рез-та надо достичь!


 
supersan   (2003-04-28 15:40) [28]

Аплодирую Юрию Зотову. Сколько я смотрел ответов на вопросы, его ответы - точные и без воды. Согласен, что нужно привести примерный код (без намеков, как советуют некоторые), если автору вопроса он не "покатит", то будет гораздо больше понятен и вопрос и самообучение займет гораздо меньше времени. Сам настрадался от некоторых мастеров, которые пишут абы что, не вникнув в суть вопроса.
Юрий Зотов, так держать!


 
UserMicc   (2003-04-28 17:43) [29]

Если на форме много компонентов, то:
1. вручную описать те, у кот. менять
2. вручную исключить те, у кот. не менять
3. у тех, у кого менять поставить Tag ну пусть 5 и
for i:=0 to Form1.ComponentCount-1 do
if Form1.Components[i].Tag=5 then
Form1.Components[i].Visible:=True;

p.s. Для этого tag и нужен...


 
Sergey Masloff   (2003-04-29 22:55) [30]

default © (28.04.03 15:03)
>не так всё просто
Да ладно... Другие варианты есть?
Я сделал предлагаемым мной способом. Правда, внешне это мало напоминает старый добрый TButton но цвет имеет и нажимается ;-)
Можно конечно сделать улучшения в виде явной прорисовки границ для разных состояний - нажатое ненажатое. Но это путь тупиковый - ради такого эффекта не стоило терять столько времени. Вобщем, криво но задача решена. Хочу услышать правильный ответ ;-)



 
default   (2003-04-30 01:48) [31]

Sergey Masloff (29.04.03 22:55)
мне бы хотелось увидеть визуально какого рез-та надо достичь!
Тебе наверно тоже?
Если тебе не сильно в напряг пришли мне пример твоей кнопки
(хочу посмотреть что ты "наделал") если исходник так уж секретен то exe-ик
"Правда, внешне это мало напоминает старый добрый TButton но цвет имеет и нажимается ;-)"
кажется это вряд ли то что требовалось...
я сам эту задачу завтра или послезавтра буду "решать"
(щас время нет)
мыло своё давал выше



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2003.05.12;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.54 MB
Время: 0.006 c
11-34383
ODUVAN
2002-08-01 20:23
2003.05.12
Не могу поймать сообщения от мыши в SysTray!!!


14-34590
Evgeny
2003-04-24 08:58
2003.05.12
Справочная система Delphi


3-34347
Chery
2003-04-22 13:44
2003.05.12
Догрузка данных из архива в текущую БД


1-34469
Calm
2003-04-28 09:23
2003.05.12
Можно ли закрыть форму в ее OnShow?


14-34616
swordent
2003-04-22 16:19
2003.05.12
php > ... DELPHI!





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский