Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Delphi: Общие вопросы > Множественное редактирования |
Автор: Vas 13.2.2013, 13:06 |
Как определить одинаковое значение свойства у нескольких объектов? Все знают, что в дельфи если выделить несколько объектов, то их общие свойства будут показаны в инспекторе объектов, а также их значения будут соответсвующим образом установлены, если все одинаковые, то ставится значение, иначе пустота. Пока мысль такая: Просто перебором в цикле строить массив с встречающимися свойствами и ставить флаг видимости если есть оно у всех перебранных или невидимости если хоть у одного объекта его нет, в конце перебора получим массив свойств и значения флагов visible - true/false. А вот как сравнивать значения? Обычным раавенством? Но как хранить текущее общее значение, ведь свойства могут содержать любые значения (ссылки, числа, строки), испоьзовать variant или выделять память и хранить указатели? Что-то как то с трудом себе представляю. Все-таки может есть какие-то более грамотные решения, а то какая то каша в голове. Ну или где почитать, ткните носом, поисковик отказывается меня понимать :( |
Автор: DarkProg 13.2.2013, 14:52 |
Просто пройдитесь по всем объектам искомого типа и выставьте соответствующее свойство. Или я не понимаю что вы хотите ![]() |
Автор: Vas 13.2.2013, 15:00 |
Именно так, причем при одинаковых значениях свойства - это значение должно быть в редакторе, а при разных значениях должна быть пустота. Пример: на форме Label и Button свойство Caption у обоих 'Бла-бла-бла', а свойство Visible у одного True у второго False. Так вот при одноврменном выделении обоих объектов в испекторе должны отображаться только свойства, присутствующие у обоих объектов, а значение соответсвенно быть выставлены для Caption 'Бла-бла-бла', а для Visible - пустое значение. |
Автор: DarkProg 13.2.2013, 20:59 |
Ну так просто же можно ![]() 1-й выделенный забивает редактор своими значениями, потом выделяете второй и опять пытаетесь заполнить редактор, только где-то ставите флаг, что есть один выделенный(или массив отдельный бьёте содержащий выделенные в текущий момент элементы), проходитесь по редактору и если есть отличные значения, то вместо значения пишите пустоту и т.д. по всем свойствам, выделяете третий и следующие там смотрите есть ли разница, а если пустота вообще игнорируете свойство и всё ![]() Вроде бы я теперь правильно понял ![]() |
Автор: Akella 13.2.2013, 21:07 |
Нужно во время исполнения программы показывать инспектор объектов? Может взять готовое решение, например, от Greatis. |
Автор: gesper 14.2.2013, 13:23 |
В инспекторе свойств отображаются только имеющиеся у обоих параметры. Можно разбить на отдельные фунции. 1. Если все объекты относятся к Классу родительскому, то включаем функцию показа свойств этого класса 2. Если и дальше по уровням.. какие совпадения в родительских классах. Если все относятся к одному классу, то включаем функцию загрузки свойств конкретно этого класса. Еще можно сделать в отдельном файлике описание свойств у каждого типа элементов и дальше проверкой наличия свойств в каждом объекте выводить их. |
Автор: Vas 14.2.2013, 14:29 |
В принципе алгоритм немного набросал. 1. Берем выделенный объект и грузим его свойства и их значения в массив. 2. Далее запускаем цикл со следующего выделенного. 3. Перебираем свойства 4. Если свойство объекта входит в массив, то берем его значение. 5. Если значение свойства не пустое, то сравниваем, одинаковые - запоминаем, разные - обнуляем. Ну собственно и все за исключением нюансов. В принципе с учетом того, что пользователь не сможет выделить сразу много объектов (тысяч 10), то думаю что на парсинг много времени уходить не будет. |