Форум: "Основная";
Текущий архив: 2004.09.12;
Скачать: [xml.tar.bz2];
ВнизОдна форма для нескольких пользователей Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.036 c