Конференция "Основная" » Как выдать список форм проекта, даже те которые еще не созданы ? [D7, WinXP]
 
  • jiny (03.04.08 21:41) [0]
    Доброе время суток ув.эскперты и гуру, лень двигатель прогресса , и собственно она поставила передо мной этот вопрос :
    делаю проект, состоит из 40 форм, компонентов, соответственно тоже много в конце проекта сделал распредение прав пользователей, все работает, только для себя хотелось бы написать процедуру выдачи всех форм проекта в определенном виде : форма+название->компонент+название
    все бы ничего но из авто-создаваемых 3 формы из 40, причем одна из этих 3-х уничтожается при запуске,  поэтому в цикле

    procedure GetMyFormList;
    var iForms,iControls: integer;
    begin
     For iForms:=0 to Application.ComponentCount-1 do
     begin
       ListBox1.Items.Add(Application.Components[iforms].Name+' : '+Application.Components[iforms].ClassName)
     end;



    выдаются те формы, которые созданы в RunTime
    как мона выдать остальные 37 ?
  • DVM © (03.04.08 22:45) [1]

    > как мона выдать остальные 37 ?

    считай что никак
  • Loginov Dmitry © (03.04.08 22:59) [2]
    > все работает, только для себя хотелось бы написать процедуру
    > выдачи всех форм проекта


    Список форм проекта в Delphi выводится по Shift+F12.
  • Игорь Шевченко © (03.04.08 23:25) [3]

    > только для себя хотелось бы написать процедуру выдачи всех
    > форм проекта в определенном виде : форма+название->компонент+название
    > все бы ничего но из авто-создаваемых 3 формы из 40, причем
    > одна из этих 3-х уничтожается при запуске,  поэтому в цикле


    У Юрия Зотова есть компонент - разборщик DFM, с его помощью можно решить подобную задачу, разбирая исходные формы
  • Германн © (04.04.08 01:19) [4]

    > Игорь Шевченко ©   (03.04.08 23:25) [3]

    Но где Юрий? И как достать его компонент?
  • Джо © (04.04.08 03:44) [5]
    А что если написать дизайн-тайм эксперт, который при компиляции будет «зашивать» эту информацию в исполнимый модуль?
  • Германн © (04.04.08 03:54) [6]

    > Джо ©   (04.04.08 03:44) [5]

    А С.Орлик разве не такой написал эсперт?
  • Джо © (04.04.08 04:26) [7]
    > [6] Германн ©   (04.04.08 03:54)
    >
    > > Джо ©   (04.04.08 03:44) [5]
    >
    > А С.Орлик разве не такой написал эсперт?

    Честно, не знаю, не видел и не слышал.
  • Семеныч (04.04.08 06:06) [8]
    > jiny   (03.04.08 21:41)

    > как мона выдать остальные 37?

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

    2. Имея класс формы, можно получить список ее published-полей - это и будут лежащие на форме компоненты.
  • jiny (04.04.08 08:42) [9]
    спасибо за советы, просто хотелось чтобы программа сама находила новые формы и компоненты и записывала в таблицу со всеми объектами программы, дабы админ проги мог просто включить новые опции себе и другим пользователям, видимо придется вручную готовить обновление для таблицы контролов и форм... :(
  • KSergey © (04.04.08 10:18) [10]
    > jiny   (04.04.08 08:42) [9]
    > спасибо за советы, просто хотелось чтобы программа сама
    > находила новые формы ... и записывала в таблицу

    Тогад можно пронаследовать все формы от отного предка (не обязательно визуально в данном случае) и в перекрытом конструкторе предка (или где-то еще) сделать это. Правда, получится лишняя нагрузка при каждом создании формы у каждого пользователя.... но можно этот процесс отключать, выполняя данный код по определенному ключику в строке запуска екзешника, т.к. процедура, понятно, нужна только один раз для каждой новой версии.
    Не забыть так же решить задачу "исчезновения" некоторых элементов формы в новых версиях.
  • icWasya © (04.04.08 15:41) [11]
    Тут нужен не конструктор, а регистрация.
    например


    type TFormClass = class of TForm;
    procedure RegisterForm(F:TFormClass;Comment:String);
    begin
     // занесение в таблицу
     //  F.ClassName
     // Comment
     
    end;



    а в коде каждого модуля с формой добавить примерно такой код

    initialization
     RegisterForm(TForm1,"Это первая форма");
    end.

  • jiny (05.04.08 08:39) [12]
    уже решил, задачу, написал процедуру сверки компонент на форме с таблицей объектов программы, даже если хинт компоненты меняется, делаю апдейт названия компоненты. Осталось сделать обратную проверку, есть ли удаленные компоненты ...
    Получается, когда форма запускается первый раз у пользователя, onCreate срабатывает процедура сверки объектов и проверке прав на объекты формы.
    Я думаю так будет изящней, чем добавлять вручную объекты каждый раз когда будут происходить изменения.
 
Конференция "Основная" » Как выдать список форм проекта, даже те которые еще не созданы ? [D7, WinXP]
Есть новые Нет новых   [134434   +27][b:0][p:0.001]