![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Одна форма для нескольких пользователей
Mitrofan © (2004-08-26 10:26:00)Имеется приложение, имеются несколько типов пользователей.
Имеется форма в приложении. Хотелось чтобы визуально данная форма отображалась по-разному для каждого типа пользователя. Причем чтобы была возможность самому определять нужный вид формы (расположение компонент и их свойства)
Как это сделать попроще ?
Юрий Зотов (2004-08-26 11:59:00) [1]> 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;
Rem (2004-08-26 11:42:00) [2]File->New->Other...->DLL Wizard
При этом создается новый проект. Готовая форма добавляется в этот проект.
Кроме этого, необходимо реализовать механизм подключения и создания форм.
Кроме этого, необходимо предусмотреть возможность идентификации DLL: что там за форма? что там за пользовательский интерфейс?.
После компиляции получаем готовую DLL.
В основном проекте - в зависимости от того, какая форма нам нужна и какой пользователь работает - подключаем нужную DLL и создаем новую форму.
Подробнее: http://www.delphikingdom.com/asp/viewitem.asp?catalogid=468
Андрей Сенченко (2004-08-26 11:35:00) [3]3. Вручную устанавливать координаты для разных контролов в зависимости от типа пользователя - практически никаких расходов, но скучно и требует рутинной отладки;
Перекомпилировать возможно и не потребуется, если не вводится новых конторов. Просто еще один раздел ИНИ-хи или ветка реестра
Mitrofan (2004-08-26 11:35:00) [4]2 Rem
4. Формы в DLL с загрузкой нужной формы - сложнее в реализации, но гибче при использовании.
У меня к примеру уже есть форма с кучей контролов.
Как поместить форму с контролами в DLL и как ее потом отобразить ?
Rem (2004-08-26 11:25:00) [5][8.3]
Вручную - в смысле, в RunTime :)
Rem (2004-08-26 11:22:00) [6]1. [1] - несложно при реализации, но чревато чрезмерными накладными расходами, так как приходится в одном проекте использовать в n раз больше форм;
2. PageControl с закладками для разных пользователей - чревато багами, так как приходится контролировать много переменных параметров (откуда брать данные и куда их размещать);
3. Вручную устанавливать координаты для разных контролов в зависимости от типа пользователя - практически никаких расходов, но скучно и требует рутинной отладки;
4. Формы в DLL с загрузкой нужной формы - сложнее в реализации, но гибче при использовании.
1, 2, 3 - при появлении новой группы пользователей приходится переписывать и перекомпилировать exe, затем устанавливать на всех компьютерах (при работе в сети), т. е. сопровождаемость никудышняя.
Лично я остановился бы, исходя из гибкости и удобства при сопровождении, на 4.
Андрей Сенченко (2004-08-26 11:20:00) [7]Андрей Сенченко © (26.08.04 11:09) [5]
Конкретная задача предполагает " и имеем 5 пользователей к примеру." Предложено решение "в лоб"
Согласен, абсолютно не универсальное решение, но в случае реально многопользовательского интерефейса нужно применять совсем другое решение -
Базовый класс - грубый TForm или его наследник с ОБЩИМИ для всех контролами. Все остальные контролы - в иниху вида
[user 1]
btn1=true,2,2'Caption'
lbl2=false
lbl3=true,5,2,'Caption'
И в RunTime их расставлять.
TUser (2004-08-26 11:14:00) [8]Я бы сделал 5 панелей.
Panel[i].Visible - в зависимости от логина
А если пользователей будет типов эдак 50, то система будет нам крайне благодарна за возможность создать много невидимых и никому не нужных панелей. Лучше отнаследовать все формы от некоторого базового класса.
Андрей Сенченко (2004-08-26 11:09:00) [9]Я бы сделал 5 панелей.
Panel[i].Visible - в зависимости от логина
Рамиль (2004-08-26 10:57:00) [10]Наследуй формы и измени.
VAleksey (2004-08-26 10:56:00) [11]Лучше сделать две формы ;-)
Mitrofan (2004-08-26 10:55:00) [12]Немного не так. Имеем одну форму (Form1), на ней имеются какие то компоненты (эдиты, кнопки, лейблы и т.д.) и имеем 5 пользователей к примеру. Для каждого пользователя нужно иметь свое расположение этих компонентов.
Юрий Зотов (2004-08-26 10:33:00) [13]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;