Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.09.12;
Скачать: CL | DM;

Вниз

Одна форма для нескольких пользователей   Найти похожие ветки 

 
Mitrofan   (2004-08-26 10:26) [0]

Имеется приложение, имеются несколько типов пользователей.
Имеется форма в приложении. Хотелось чтобы визуально данная форма отображалась по-разному для каждого типа пользователя. Причем чтобы была возможность самому определять нужный вид формы (расположение компонент и их свойства)
Как это сделать попроще ?


 
Юрий Зотов ©   (2004-08-26 10:33) [1]

procedure TForm1.Button1Click(...);
var
 FormClass: TFormClas;
begin
 case UserType of
   0: FormClass := TForm2;
   1: FormClass := TForm3
   ...
   else
     FormClass := nil
 end;
 if FormClass <> nil then
   with FormClass.Create(nil) do
   try
     if ShowModal = mrOK then
     begin
       ...
     end
   finally
     Free
   end
 else
   ShowMessage("Unknown user type")
end;


 
Mitrofan   (2004-08-26 10:55) [2]

Немного не так. Имеем одну форму (Form1), на ней имеются какие то компоненты (эдиты, кнопки, лейблы и т.д.) и имеем 5 пользователей к примеру. Для каждого пользователя нужно иметь свое расположение  этих компонентов.


 
VAleksey ©   (2004-08-26 10:56) [3]

Лучше сделать две формы ;-)


 
Рамиль ©   (2004-08-26 10:57) [4]

Наследуй формы и измени.


 
Андрей Сенченко ©   (2004-08-26 11:09) [5]

Я бы сделал 5 панелей.
Panel[i].Visible - в зависимости от логина


 
TUser ©   (2004-08-26 11:14) [6]

Я бы сделал 5 панелей.
Panel[i].Visible - в зависимости от логина

А если пользователей будет типов эдак 50, то система будет нам крайне благодарна за возможность создать много невидимых и никому не нужных панелей. Лучше отнаследовать все формы от некоторого базового класса.


 
Андрей Сенченко ©   (2004-08-26 11:20) [7]

Андрей Сенченко ©   (26.08.04 11:09) [5]

Конкретная задача предполагает "и имеем 5 пользователей к примеру." Предложено решение "в лоб"

Согласен, абсолютно не универсальное решение, но в случае реально многопользовательского интерефейса нужно применять совсем другое решение -
Базовый класс - грубый TForm или его наследник с ОБЩИМИ для всех контролами. Все остальные контролы - в иниху вида

[user 1]
btn1=true,2,2"Caption"
lbl2=false
lbl3=true,5,2,"Caption"

И в RunTime их расставлять.


 
Rem   (2004-08-26 11:22) [8]

1. [1] - несложно при реализации, но чревато чрезмерными накладными расходами, так как приходится в одном проекте использовать в n раз больше форм;
2. PageControl с закладками для разных пользователей - чревато багами, так как приходится контролировать много переменных параметров (откуда брать данные и куда их размещать);
3. Вручную устанавливать координаты для разных контролов в зависимости от типа пользователя - практически никаких расходов, но скучно и требует рутинной отладки;
4. Формы в DLL с загрузкой нужной формы - сложнее в реализации, но гибче при использовании.

1, 2, 3 - при появлении новой группы пользователей приходится переписывать и перекомпилировать exe, затем устанавливать на всех компьютерах (при работе в сети), т. е. сопровождаемость никудышняя.

Лично я остановился бы, исходя из гибкости и удобства при сопровождении, на 4.


 
Rem   (2004-08-26 11:25) [9]

[8.3]
 Вручную - в смысле, в RunTime :)


 
Андрей Сенченко ©   (2004-08-26 11:35) [10]

3. Вручную устанавливать координаты для разных контролов в зависимости от типа пользователя - практически никаких расходов, но скучно и требует рутинной отладки;

Перекомпилировать возможно и не потребуется, если не вводится новых конторов. Просто еще один раздел ИНИ-хи или ветка реестра


 
Mitrofan   (2004-08-26 11:35) [11]

2 Rem
4. Формы в DLL с загрузкой нужной формы - сложнее в реализации,   но гибче при использовании.

У меня к примеру уже есть форма с кучей контролов.
Как поместить форму с контролами в DLL и как ее потом отобразить ?


 
Rem   (2004-08-26 11:42) [12]

File->New->Other...->DLL Wizard
При этом создается новый проект. Готовая форма добавляется в этот проект.
Кроме этого, необходимо реализовать механизм подключения и создания форм.
Кроме этого, необходимо предусмотреть возможность идентификации DLL: что там за форма? что там за пользовательский интерфейс?.
После компиляции получаем готовую DLL.

В основном проекте - в зависимости от того, какая форма нам нужна и какой пользователь работает - подключаем нужную DLL и создаем новую форму.

Подробнее: http://www.delphikingdom.com/asp/viewitem.asp?catalogid=468


 
Юрий Зотов ©   (2004-08-26 11:59) [13]

> Mitrofan   (26.08.04 10:55) [2]

Вы спросили - как это сделать попроще? Я и показал, наверное, самый простой способ.

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

procedure TForm1.Button1Click(...);
var
 FileName: string;
 Form: TForm2;
begin
 case UserType of
   0: FileName := "User0.dfm";
   1: FileName := "User1.dfm";
   ...
   else
     raise Exception.Create("Unknown user type")
 end;
 Form := TForm2.CreateNew(Self);
 ReadComponentResFile(FileName, Form);
 with Form do
 try
   if ShowModal = mrOK then
   begin
     ...
   end
 finally
   Free
 end
end;



Страницы: 1 вся ветка

Текущий архив: 2004.09.12;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.026 c
1-1093373344
Rlz
2004-08-24 22:49
2004.09.12
Вопрос по функциям


14-1093351767
Knight
2004-08-24 16:49
2004.09.12
Почтовый сервер на Win2k...


3-1092393761
eLVik
2004-08-13 14:42
2004.09.12
ADOConnection.GetFieldNames


1-1093534167
hamster
2004-08-26 19:29
2004.09.12
Двоичные данные


4-1091046751
sid
2004-07-29 00:32
2004.09.12
File Access Control