Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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


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;


Наверх

Титульная страница Поиск, карта сайта Написать письмо