Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
14-1093277312
stef
2004-08-23 20:08
2004.09.12
Помощь глазам


1-1092739951
Inco
2004-08-17 14:52
2004.09.12
Обновление приложения в рантайм.


1-1093580888
samumka
2004-08-27 08:28
2004.09.12
Работа с датой в Delphi?


3-1092898569
jappak
2004-08-19 10:56
2004.09.12
Как игнорировать помечанные записи.


14-1093290098
Mihey_temporary
2004-08-23 23:41
2004.09.12
Код клавиши





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский