Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Множественное редактирования


Автор: Vas 13.2.2013, 13:06
Как определить одинаковое значение свойства у нескольких объектов?

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

Пока мысль такая:
Просто перебором в цикле строить массив с встречающимися свойствами и ставить флаг видимости если есть оно у всех перебранных или невидимости если хоть у одного объекта его нет, в конце перебора получим массив свойств и значения флагов visible - true/false. 
А вот как сравнивать  значения? Обычным раавенством? Но как хранить текущее общее значение, ведь свойства могут содержать любые значения (ссылки, числа, строки), испоьзовать variant или выделять память и хранить указатели? Что-то как то с трудом себе представляю. 
Все-таки может есть какие-то более грамотные решения, а то какая то каша в голове. Ну или где почитать, ткните носом, поисковик отказывается меня понимать :(

Автор: DarkProg 13.2.2013, 14:52
Просто пройдитесь по всем объектам искомого типа и выставьте соответствующее свойство.

Или я не понимаю что вы хотите  smile редактор что-ли с возможностью множественного выбора?

Автор: Vas 13.2.2013, 15:00
Цитата(DarkProg @  13.2.2013,  14:52 Найти цитируемый пост)
редактор что-ли с возможностью множественного выбора? 

Именно так, причем при одинаковых значениях свойства - это значение должно быть в редакторе, а при разных значениях должна быть пустота.
Пример: на форме Label и Button
свойство Caption у обоих 'Бла-бла-бла', а свойство Visible у одного True у второго False. Так вот при одноврменном выделении обоих объектов в испекторе должны отображаться только свойства, присутствующие у обоих объектов, а значение соответсвенно быть выставлены для Caption 'Бла-бла-бла', а для Visible - пустое значение.

Автор: DarkProg 13.2.2013, 20:59
Ну так просто же можно smile

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

Вроде бы я теперь правильно понял smile

Автор: Akella 13.2.2013, 21:07
Нужно во время исполнения программы показывать инспектор объектов? Может взять готовое решение, например, от Greatis.

Автор: Vas 14.2.2013, 12:50
Цитата(Akella @  13.2.2013,  21:07 Найти цитируемый пост)
Нужно во время исполнения программы показывать инспектор объектов? Может взять готовое решение, например, от Greatis.

Почти, но больше нужно не готовое решение, а именно свое, под свои нужды, хотел посмотреть Greatis, скачал, а исходников нет :(

Цитата(DarkProg @  13.2.2013,  20:59 Найти цитируемый пост)
1-й выделенный забивает редактор своими значениями, потом выделяете второй и опять пытаетесь заполнить редактор, только где-то ставите флаг, что есть один выделенный(или массив отдельный бьёте содержащий выделенные в текущий момент элементы), проходитесь по редактору и если есть отличные значения, то вместо значения пишите пустоту и т.д. по всем свойствам, выделяете третий и следующие там смотрите есть ли разница, а если пустота вообще игнорируете свойство и всё

Понял правильно, но еще нужно показывать только одинаковые свойства. 

Видимо нет путевых решений, окромя перебора, ну ниче буду перебирать .

Автор: gesper 14.2.2013, 13:23
В инспекторе свойств отображаются только имеющиеся у обоих параметры.

Можно разбить на отдельные фунции.

1. Если все объекты относятся к Классу родительскому, то включаем функцию показа свойств этого класса
2. Если и дальше по уровням.. какие совпадения в родительских классах. Если все относятся к одному классу, то включаем функцию загрузки свойств конкретно этого класса.

Еще можно сделать в отдельном файлике описание свойств у каждого типа элементов и дальше проверкой наличия свойств в каждом объекте выводить их.

Автор: Vas 14.2.2013, 14:29
В принципе алгоритм немного набросал.

1. Берем выделенный объект и грузим его свойства и их значения в массив.
2. Далее запускаем цикл со следующего выделенного.
3. Перебираем свойства
4. Если свойство объекта входит в массив, то берем его значение.
5. Если значение свойства не пустое, то сравниваем, одинаковые - запоминаем, разные - обнуляем.

Ну собственно и все за исключением нюансов. В принципе с учетом того, что пользователь не сможет выделить сразу много объектов (тысяч 10), то думаю что на парсинг много времени уходить не будет.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)