Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Получение всех компонентов всех форм проекта 
:(
    Опции темы
MacTep
Дата 17.4.2012, 13:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1292
Регистрация: 4.8.2003
Где: г. Самара

Репутация: 4
Всего: 4



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

try
  frmMain := TfrmMain.Create(Self);
  frmMain.ShowModal;
finally
  frmMain.Free;
end;
Как при таком вызове форм реализовать задачу получения перечня всех форм и всех компонентов на них? Или это невозможно?

Это сообщение отредактировал(а) MacTep - 17.4.2012, 13:12


--------------------
(A)bort, (R)etry, (I)gnore = Haфиг, Heфиг, Пoфиг ... :)
PM MAIL   Вверх
Vaskevych
  Дата 17.4.2012, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi Developer



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 30.12.2009
Где: UA. Rovno

Репутация: нет
Всего: нет



Можна написать проц. типа:

Код

procedure UShowModal(Form: TForm);
begin

for i:= 0 to Form.ComponentCount - 1 do 
begin

end;
Form.ShowModal;
end;

и заменить все модал на 
Код

try
  frmMain := TfrmMain.Create(Self);
  UShowModal(frmMain);
finally
  frmMain.Free;
end

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

Это сообщение отредактировал(а) Vaskevych - 17.4.2012, 14:59
PM   Вверх
MacTep
Дата 18.4.2012, 14:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1292
Регистрация: 4.8.2003
Где: г. Самара

Репутация: 4
Всего: 4



То есть при самом первом запуске программы загрузить таким образом все данные о формах, которые есть в проекте (естественно при этом вручную в коде указать, какие формы обходить), правильно понимаю?


--------------------
(A)bort, (R)etry, (I)gnore = Haфиг, Heфиг, Пoфиг ... :)
PM MAIL   Вверх
Snowy
Дата 18.4.2012, 15:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Можно обойти все формы при помощи Screen.FormCount и Screen.Forms
PM MAIL   Вверх
MacTep
Дата 18.4.2012, 17:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1292
Регистрация: 4.8.2003
Где: г. Самара

Репутация: 4
Всего: 4



Цитата(Snowy @  18.4.2012,  15:42 Найти цитируемый пост)
Можно обойти все формы при помощи Screen.FormCount и Screen.Forms
Даже тогда, когда эти формы не созданы в памяти?
Все очень просто:
Код

      for i := 0 to Screen.ComponentCount - 1 do
        if Screen.Components[i] is TForm then
          frmAddEditRoleRight.cbForms.Items.Add((Screen.Components[i] as TForm).Name + ' - [' +
                                                (Screen.Components[i] as TForm).Caption + ']');
не работает smile)))) Не выдает ни единой формы в списке.
А так:
Код

      for i := 0 to Screen.FormCount - 1 do
        frmAddEditRoleRight.cbForms.Items.Add(Screen.Forms[i].Name + ' - [' +
                                              Screen.Forms[i].Caption + ']');
выдает только те формы, что уже в памяти, а те, что не проинициализированы, не выдает. Т.е. ВСЕ формы из проекта читать не получается.

Это сообщение отредактировал(а) MacTep - 18.4.2012, 18:02


--------------------
(A)bort, (R)etry, (I)gnore = Haфиг, Heфиг, Пoфиг ... :)
PM MAIL   Вверх
MacTep
Дата 19.4.2012, 18:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1292
Регистрация: 4.8.2003
Где: г. Самара

Репутация: 4
Всего: 4



Видимо все же никак...


--------------------
(A)bort, (R)etry, (I)gnore = Haфиг, Heфиг, Пoфиг ... :)
PM MAIL   Вверх
northener
Дата 20.4.2012, 00:55 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1361
Регистрация: 2.9.2010

Репутация: 8
Всего: 20



Цитата(MacTep @  19.4.2012,  18:56 Найти цитируемый пост)
Видимо все же никак...

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


--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
Akella
Дата 20.4.2012, 10:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



а зачем сразу в одой процедуре получать все формы, какаой в этом смысл?
PM MAIL   Вверх
MacTep
Дата 22.4.2012, 09:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1292
Регистрация: 4.8.2003
Где: г. Самара

Репутация: 4
Всего: 4



Цитата(northener @  20.4.2012,  00:55 Найти цитируемый пост)
Видимо придётся как-то переосмыслить решение "создать разграничение прав доступа пользователей".
Но если сей "большой проект" не ваш, то вы сразу пошли (или вас направили) по неверному пути. 
т.е. нужно было сразу от этой задачи отказаться. 

Было бы круто получить ответ на вопрос почему вы так думаете?


Цитата(Akella @  20.4.2012,  10:33 Найти цитируемый пост)
а зачем сразу в одой процедуре получать все формы, какаой в этом смысл? 

Чтобы можно было на каждый компонент определенной формы проставить разрешающие или запрещающие права (скажем, свойства компонентов Enabled или Visible поставить в True/False).


--------------------
(A)bort, (R)etry, (I)gnore = Haфиг, Heфиг, Пoфиг ... :)
PM MAIL   Вверх
kami
Дата 22.4.2012, 17:02 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 23
Всего: 72



Цитата(MacTep @  18.4.2012,  17:30 Найти цитируемый пост)
Даже тогда, когда эти формы не созданы в памяти?

Цитата(MacTep @  22.4.2012,  09:02 Найти цитируемый пост)
Чтобы можно было на каждый компонент определенной формы проставить разрешающие или запрещающие права

Как можно что-то сделать с тем, чего нет?

Имхо, основанное на своем опыте - пусть каждая форма/объект при создании сам разбирается, что с ним можно делать, а что нельзя: берет откуда-нибудь права доступа, Enabl-ит/Disabl-ит компоненты. Только всё равно в каждом методе придется проверять права, иначе какой-нибудь умник сторонней программой "заенаблит" кнопочки и пиши пропало.
PM MAIL WWW   Вверх
superVad
Дата 22.4.2012, 19:44 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 735
Регистрация: 6.4.2006
Где: Черкассы, Украина

Репутация: 4
Всего: 15



MacTep, Как вариант - сделай общего предка для всех окон, который при создании (или показе) будет заниматься правами.
PM MAIL   Вверх
MacTep
Дата 24.4.2012, 06:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1292
Регистрация: 4.8.2003
Где: г. Самара

Репутация: 4
Всего: 4



Цитата(kami @  22.4.2012,  17:02 Найти цитируемый пост)
Имхо, основанное на своем опыте - пусть каждая форма/объект при создании сам разбирается, что с ним можно делать, а что нельзя: берет откуда-нибудь права доступа, Enabl-ит/Disabl-ит компоненты.
Все правильно говорите, именно так и происходит. Но мой вопрос в этой теме скорее относится не к проверке прав при создании формы и выставлению определенных контролов в определенное состояние, а к созданию интерфейса, позволяющего сами значения доступов проставить, чтобы потом уже эту информацию использовать при создании каждой формы.

Цитата(kami @  22.4.2012,  17:02 Найти цитируемый пост)
Только всё равно в каждом методе придется проверять права, иначе какой-нибудь умник сторонней программой "заенаблит" кнопочки и пиши пропало. 
Так остро вопрос не стоит. Не та программа, чтобы еще какие-то доступы себе выбивать при помощи стороннего ПО.


Цитата(superVad @  22.4.2012,  19:44 Найти цитируемый пост)
MacTep, Как вариант - сделай общего предка для всех окон, который при создании (или показе) будет заниматься правами. 
Можно подробнее?



--------------------
(A)bort, (R)etry, (I)gnore = Haфиг, Heфиг, Пoфиг ... :)
PM MAIL   Вверх
MetalFan
Дата 24.4.2012, 07:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 62
Всего: 128



Ну на худой конец можно "прошерстить" dfm-ки проекта...


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
MacTep
Дата 24.4.2012, 17:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1292
Регистрация: 4.8.2003
Где: г. Самара

Репутация: 4
Всего: 4



Цитата(MetalFan @  24.4.2012,  07:15 Найти цитируемый пост)
Ну на худой конец можно "прошерстить" dfm-ки проекта... 

Хыыы, да это уж очень худой конец smile))) Лучше уж так, как предлагал Vaskevych во второй ноте smile


--------------------
(A)bort, (R)etry, (I)gnore = Haфиг, Heфиг, Пoфиг ... :)
PM MAIL   Вверх
superVad
Дата 24.4.2012, 20:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 735
Регистрация: 6.4.2006
Где: Черкассы, Украина

Репутация: 4
Всего: 15



Цитата(MacTep @  24.4.2012,  05:31 Найти цитируемый пост)
Можно подробнее?

Создаешь пустую форму. И реализуешь в ее создании или показе, что тебе надо с правами там делать.
Такое вот в пас файле что то:
Код

type
  TfrmModal = class(TForm)
    ...
  end;


И наследуешь остальные формы от нее уже. Т.е. меняешь TForm на TfrmModal:
Код

type
  TMyForm = class(TfrmModal)
    ...
  end;

В FormCreate, FormShow и т.п. (там где будет код в предке) потомков надо добавить inherited что бы выполнился код предка.

Как то так - может что то упустил.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1817 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.