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


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

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

Автор: Vaskevych 17.4.2012, 14:58
Можна написать проц. типа:

Код

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

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

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

Автор: Snowy 18.4.2012, 15:42
Можно обойти все формы при помощи Screen.FormCount и Screen.Forms

Автор: MacTep 18.4.2012, 17:30
Цитата(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 19.4.2012, 18:56
Видимо все же никак...

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

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

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

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

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


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

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

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

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

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

Имхо, основанное на своем опыте - пусть каждая форма/объект при создании сам разбирается, что с ним можно делать, а что нельзя: берет откуда-нибудь права доступа, Enabl-ит/Disabl-ит компоненты. Только всё равно в каждом методе придется проверять права, иначе какой-нибудь умник сторонней программой "заенаблит" кнопочки и пиши пропало.

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

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

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


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

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

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

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

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

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

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


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

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

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

Как то так - может что то упустил.

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

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

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

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

Понятно, наверное друг друга не совсем поняли. Это немного не то, что мне надо.

Автор: northener 24.4.2012, 23:53
Цитата(MacTep @  24.4.2012,  20:54 Найти цитируемый пост)
Понятно, наверное друг друга не совсем поняли. Это немного не то, что мне надо.

Я вот тоже не понимаю, что же вам на самом деле надо?

Автор: MacTep 25.4.2012, 13:23
Мой вопрос относится не к проверке прав при создании формы и выставлению определенных контролов в определенное состояние, а к созданию интерфейса, позволяющего сами значения доступов задать в определенной структуре (бд, файл или не важно что - не суть), чтобы потом уже эту информацию использовать при создании каждой формы.

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