powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Разработка информационных систем [игнор отключен] [закрыт для гостей] / Генерация пользовательского интерфейса
25 сообщений из 68, страница 2 из 3
Генерация пользовательского интерфейса
    #37964003
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все это уже было.
Но стоит только шагнуть в сторону и вся эта стройная система, созданная для нескольких типовых документов, идет в лес.
...
Рейтинг: 0 / 0
Генерация пользовательского интерфейса
    #37964067
d8m1k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_rb, да, очень похоже на мою задумку. Только формируются формы по интерфейсу объекта. Свойства компонентов я разделил на:
- относящиеся к логике взаимодействию с интерфейсом модели
- к внешнему виду.

Например доступность для редактирования определяются интерфейсом модели.
Для понимания
Код: c#
1.
public int Value { get; set;} 

привязанный компонент будет доступен для редактирования
Код: c#
1.
public int Value { get; private set;} 

только для чтения.

У меня это реализовано по-другому, вместо int использовал свои специально обученные на взаимодействия с представлением классы. Но суть такая.
В С# нельзя менять атрибуты private на public во время выполнения программы, много чего нельзя. Нужен либо динамически типизированный либо эмулировать это.
...
Рейтинг: 0 / 0
Генерация пользовательского интерфейса
    #37964151
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
d8m1kВ С# нельзя менять атрибуты private на public во время выполнения программы, много чего нельзя. Нужен либо динамически типизированный либо эмулировать это.
можно сгенерировать нужные классы из метаданных
а ваще нафиг не нужны эти классы, все генерируем из метаданных,а если уж кому то невмоготу без классов, то суем ему дайнамик
...
Рейтинг: 0 / 0
Генерация пользовательского интерфейса
    #37964197
Фотография iscrafm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
d8m1k Программный интерфейс классов однозначно отображается на визуальный интерфейс.
это одна из главных ошибок. Класс может быть один, а интерфейсов более одного.
...
Рейтинг: 0 / 0
Генерация пользовательского интерфейса
    #37964239
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
d8m1kSergey_rb, да, очень похоже на мою задумку. Только формируются формы по интерфейсу объекта. Свойства компонентов я разделил на:
- относящиеся к логике взаимодействию с интерфейсом модели
- к внешнему виду.

Например доступность для редактирования определяются интерфейсом модели.
Для понимания
Код: c#
1.
public int Value { get; set;} 

привязанный компонент будет доступен для редактирования
Код: c#
1.
public int Value { get; private set;} 

только для чтения.

У меня это реализовано по-другому, вместо int использовал свои специально обученные на взаимодействия с представлением классы. Но суть такая.
В С# нельзя менять атрибуты private на public во время выполнения программы, много чего нельзя. Нужен либо динамически типизированный либо эмулировать это.

ничего не понял.
...
Рейтинг: 0 / 0
Генерация пользовательского интерфейса
    #37964390
d8m1k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iscrafmd8m1k Программный интерфейс классов однозначно отображается на визуальный интерфейс.
это одна из главных ошибок. Класс может быть один, а интерфейсов более одного.

Не верно выразился. Вернее будет:
Вид дерева объектов однозначно отображается на визуальный интерфейс.

Но это упрощённо. На самом деле даже один и тот же объект в разных местах дерева может отображаться по-разному.
Например список как таковой и список в качестве словаря для выбора.
...
Рейтинг: 0 / 0
Генерация пользовательского интерфейса
    #37964436
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А что, в список для выбора пользователь не может добавлять записи?
...
Рейтинг: 0 / 0
Генерация пользовательского интерфейса
    #37964445
d8m1k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_rb, попробую пояснить.

Гипотетический генератор UI сканирует контейнер в модели - ищет все открытые свойства и методы.

Если он найдёт
Код: c#
1.
public int Value { get; set;}

то создаст TextBox и свяжет его с Value двусторонне. Т.е. при изменении значения в TextBox будет присваивать это значение Value.
А если встретит
Код: c#
1.
public int Value { get; private set;} 

то поймёт, что присваивать значение Value нельзя, поэтому логично сделать TextBox недоступным для редактирования.

Реакцию на TextBox на изменение Value можно было бы устроить если бы существовало некие события возникающие автоматически перед и после присвоения значения свойству Value. private или public, определяющие видимость свойств можно тоже задать только один раз при написании программы.

Поэтому на самом деле я использую некий класс MyInt у которого есть события ValueChanging, ValuetChanged, свойство public int Value. Так же свойство Visible, заменяющее модификатор доступа public/не public.

Использую эти классы следующим образом
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
public class Something{
  public Something(){
    Value = new MaInt(this);
  }
  public MyInt Value;

  public DoSomething(){
    Value.Value = 1; //в результате в представление поменяется значение
    Value.Visible.Value = false; //в результате в представление элемент скроется
  }
}

В объекте Value перед и после присваивания возникают события ValueChanging, ValueChanged. На изменение Visible тоже события, которые понимает генератор представления и адекватно реагирует. Так как Visible относиться к подобному типу MyBoolean устроенному по аналогии.

В представлении TextBox можно настроить: внешний вид, расположение, прилепить Caption, Hint. Всё это
запомнить относительно положения Value в модели. А следующий раз оно воспроизведётся.
...
Рейтинг: 0 / 0
Генерация пользовательского интерфейса
    #37964455
d8m1k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_rbА что, в список для выбора пользователь не может добавлять записи?
Извините, не понял...
...
Рейтинг: 0 / 0
Генерация пользовательского интерфейса
    #37964472
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
d8m1kSergey_rbА что, в список для выбора пользователь не может добавлять записи?
Извините, не понял...

Есть список выбора, но пользователю иногда надо прямо в этой форме добавить запись в этот список.
...
Рейтинг: 0 / 0
Генерация пользовательского интерфейса
    #37964475
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
d8m1kSergey_rb, попробую пояснить.

Гипотетический генератор UI сканирует контейнер в модели - ищет все открытые свойства и методы.

Если он найдёт
Код: c#
1.
public int Value { get; set;}

то создаст TextBox и свяжет его с Value двусторонне. Т.е. при изменении значения в TextBox будет присваивать это значение Value.
А если встретит
Код: c#
1.
public int Value { get; private set;} 

то поймёт, что присваивать значение Value нельзя, поэтому логично сделать TextBox недоступным для редактирования.

Реакцию на TextBox на изменение Value можно было бы устроить если бы существовало некие события возникающие автоматически перед и после присвоения значения свойству Value. private или public, определяющие видимость свойств можно тоже задать только один раз при написании программы.

Поэтому на самом деле я использую некий класс MyInt у которого есть события ValueChanging, ValuetChanged, свойство public int Value. Так же свойство Visible, заменяющее модификатор доступа public/не public.

Использую эти классы следующим образом
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
public class Something{
  public Something(){
    Value = new MaInt(this);
  }
  public MyInt Value;

  public DoSomething(){
    Value.Value = 1; //в результате в представление поменяется значение
    Value.Visible.Value = false; //в результате в представление элемент скроется
  }
}

В объекте Value перед и после присваивания возникают события ValueChanging, ValueChanged. На изменение Visible тоже события, которые понимает генератор представления и адекватно реагирует. Так как Visible относиться к подобному типу MyBoolean устроенному по аналогии.

В представлении TextBox можно настроить: внешний вид, расположение, прилепить Caption, Hint. Всё это
запомнить относительно положения Value в модели. А следующий раз оно воспроизведётся.

А если это поле не должен редактировать один пользователь, но должен редактировать другой?
Или документ находится в статусе редактирования, потом переходит в другой статус и закрывается для редактирования?
...
Рейтинг: 0 / 0
Генерация пользовательского интерфейса
    #37964531
d8m1k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_rbЕсть список выбора, но пользователю иногда надо прямо в этой форме добавить запись в этот список.

Непосредственно в список по задумкие почему нет. Список - массив элементов. Тоже может быть связан с моделью. Модель может разрешить добавлять элементы пользователю.

Можно чуточку поконкретней, если не сложно? Список не сам по-себе он где-то используется?
...
Рейтинг: 0 / 0
Генерация пользовательского интерфейса
    #37964537
d8m1k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А если это поле не должен редактировать один пользователь, но должен редактировать другой?
Значит экземпляр приложения одного пользователя должен создавать поле доступным, а у дрогого недоступным.
К сожалению не получается для одного пользователя создать
Код: c#
1.
public int Value { get; set;}

а для другого
Код: c#
1.
public int Value { get; private set;}

Зато можно всё это реализовать в MyInt, например ввести понимаемое генератором UI свойство ReadOnly или Enabled.
Или документ находится в статусе редактирования, потом переходит в другой статус и закрывается для редактированияаналогично
...
Рейтинг: 0 / 0
Генерация пользовательского интерфейса
    #37964540
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пользователь заполняет приходную накладную.
В накладной есть товар, которого нет в базе.
Пользователю надо добавить товар в базу не закрывая формы приходной накладной.
...
Рейтинг: 0 / 0
Генерация пользовательского интерфейса
    #37964572
d8m1k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_rb, пример ясен.

Да.
На уровне модели есть этот список.
На уровне представления грид, связанный с этим списком. Модель разрешает представлению редактировать список, предоставляет ему интерфейс для редактирования например IList<object> если на C#, вместо IEnumirable<object>
Генератор UI понимает это и создаёт грид редактируемым. При добавлении строки сообщает модели, что добавилась строка. В модели на событие изменения таблицы тоже могут быть навешаны свои обработчики, благодаря чему модель можно запрограммировать, например, сохранять изменения сразу, а так же обновлять логически связанные элементы.
...
Рейтинг: 0 / 0
Генерация пользовательского интерфейса
    #37964584
d8m1k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_rbВсе это уже было.
Но стоит только шагнуть в сторону и вся эта стройная система, созданная для нескольких типовых документов, идет в лес.Мне самому интересно насколько описываемая система жизнеспособна. Насколько много всевозможных необходимых вариантов визуализации или можно для большинства применений ограничиться каким то конечным набором. По аналогии как например достаточно базовых типов данных в языке программирования: строка, массив, запись.

Вижу такая система плохо подходит для написания игрушек, интернет-магазинов, отчётной системы...
Но для ведения учётов, картотек, где оперируют небольшим наборов типов данных однообразным образом. Хочется понять насколько там возможны различные непредсказуемые вариации.

Буду рад каким либо примерам
...
Рейтинг: 0 / 0
Генерация пользовательского интерфейса
    #37965107
_мод
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Sergey_rbПользователю надо добавить товар в базу не закрывая формы приходной накладной.
Ессно. Но для этого придумали MDI
...
Рейтинг: 0 / 0
Генерация пользовательского интерфейса
    #37965244
Cane Cat Fisher
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
d8m1kSergey_rbВсе это уже было.
Но стоит только шагнуть в сторону и вся эта стройная система, созданная для нескольких типовых документов, идет в лес.Мне самому интересно насколько описываемая система жизнеспособна. Насколько много всевозможных необходимых вариантов визуализации или можно для большинства применений ограничиться каким то конечным набором. По аналогии как например достаточно базовых типов данных в языке программирования: строка, массив, запись.

Вижу такая система плохо подходит для написания игрушек, интернет-магазинов, отчётной системы...
Но для ведения учётов, картотек, где оперируют небольшим наборов типов данных однообразным образом. Хочется понять насколько там возможны различные непредсказуемые вариации.

Буду рад каким либо примерам

Есть некий справочник. Из одной формы он должен предлагать все записи. Из другой - только актуальные на сегодня. Из третьей - с учетом значения, введеного в соседнем контроле.

Куда предполагается долепить дополнительные условия выборки, к какому объекту привязать?
...
Рейтинг: 0 / 0
Генерация пользовательского интерфейса
    #37965386
LSV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cane Cat FisherЕсть некий справочник. Из одной формы он должен предлагать все записи. Из другой - только актуальные на сегодня. Из третьей - с учетом значения, введеного в соседнем контроле.
Куда предполагается долепить дополнительные условия выборки, к какому объекту привязать?Иметь возможность открывать выборку с фильтром. Набор возможных фильтров привязать к самой выборке настроенной в метаданных.
...
Рейтинг: 0 / 0
Генерация пользовательского интерфейса
    #37965488
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
d8m1kSergey_rb, пример ясен.

Да.
На уровне модели есть этот список.
На уровне представления грид, связанный с этим списком. Модель разрешает представлению редактировать список, предоставляет ему интерфейс для редактирования например IList<object> если на C#, вместо IEnumirable<object>
Генератор UI понимает это и создаёт грид редактируемым. При добавлении строки сообщает модели, что добавилась строка. В модели на событие изменения таблицы тоже могут быть навешаны свои обработчики, благодаря чему модель можно запрограммировать, например, сохранять изменения сразу, а так же обновлять логически связанные элементы.

Добавлять надо не в гриде, а в форме ввода товарной позиции со всеми проверками.

Иначе получается что-то вроде 1С.
...
Рейтинг: 0 / 0
Генерация пользовательского интерфейса
    #37965517
Фотография iscrafm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_rbДобавлять надо не в гриде, а в форме ввода товарной позиции со всеми проверками.
а в гриде разве проверок нет? если в системе существует какая-то зависимость от того, в какой форме в нее можно добавить запись, то явно где-то прокол в ее архитектуре.
...
Рейтинг: 0 / 0
Генерация пользовательского интерфейса
    #37965679
d8m1k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cane Cat FisherЕсть некий справочник. Из одной формы он должен предлагать все записи. Из другой - только актуальные на сегодня. Из третьей - с учетом значения, введеного в соседнем контроле.

Куда предполагается долепить дополнительные условия выборки, к какому объекту привязать?
Предлагаю делегировать дополнительные условия в отдельный класс, скажем AdditionalFilterBase

Схематично так:
Сам справочник
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
public class Handbook : DataTable {
	public Handbook(AdditionalFilterBase additionalFilter) {
		this.additionalFilter = additionalFilter;
	}

	internal void Load(){
		new OracleDataAdapter(
			"select * from HANDBOOK where "+additionalFilter.Value, 
			Config.ConnectionString
		).Fill(this);
	}

	private readonly AdditionalFilterBase additionalFilter;
}

Вынесенный шаблон фильтра
Код: c#
1.
2.
3.
internal abstract class AdditionalFilterBase {
	internal abstract string Value { get; }
}

Конкретные варианты этого вынесенного фильтра
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
internal class AdditionalFilterAll : AdditionalFilterBase {
	internal override string Value { get { return "1=1"; } }
}
internal class AdditionalFilterToday : AdditionalFilterBase {
	internal override string Value { get { return "DATECREATE >= trunc(SYSDATE)"; } }
}
internal class AdditionalFilterAdjacentControlDependent : AdditionalFilterBase {
	///<param name="meanOfAdjacentControl">MyString - понимаемый генератором UI класс</param>
	internal AdditionalFilterToday(MyString meanOfAdjacentControl) {
		this.meanOfAdjacentControl = meanOfAdjacentControl;
	}

	internal override string Value { get { return "TEXT like '%"+meanOfAdjacentControl.Value+"%"; } }

	private readonly MyString meanOfAdjacentControl;
}

Экземпляры справочника. В одном месте модели так
Код: c#
1.
var hb = new Handbook(new AdditionalFilterAll()); hb.Load();

В другом так:
Код: c#
1.
var hb = new Handbook(new AdditionalFilterToday()); hb.Load();

В третьем так:
Код: c#
1.
var hb = new Handbook(new AdditionalFilterAdjacentControlDependent(некое поле)); hb.Load();


Разные hb создаются в разных местах модели.
Получается класс 1 а объекты по разному устроены.
...
Рейтинг: 0 / 0
Генерация пользовательского интерфейса
    #37965696
d8m1k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_rbДобавлять надо не в гриде, а в форме ввода товарной позиции со всеми проверками.
В принципе возможно валидация в строке грида так же как на форме. Строка грида - это тот же набор полей.

Валидация относиться к функциональности и логично вынести код валидации в модель.
...
Рейтинг: 0 / 0
Генерация пользовательского интерфейса
    #37966872
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
d8m1kSergey_rbДобавлять надо не в гриде, а в форме ввода товарной позиции со всеми проверками.
В принципе возможно валидация в строке грида так же как на форме. Строка грида - это тот же набор полей.

Валидация относиться к функциональности и логично вынести код валидации в модель.

Как будет осуществлен контроль ввода на уровне прав пользователей?
Допустим кладовщик не имеет право редактировать поле "Заказано", его может править только менеджер и только когда документ в статусе заказа.
И наоборот, менеджер не имеет права править поле "Отпущено", а кладовщик имеет.
Когда документ переходит в статус "отгружено", то уже никто не имеет права редактировать эти поля.

А поле "цена" может видеть только менеджер и не имеет права ВИДЕТЬ кладовщик.
Как это собираетесь реализовать в гриде?
...
Рейтинг: 0 / 0
Генерация пользовательского интерфейса
    #37966884
LSV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_rbКак будет осуществлен контроль ввода на уровне прав пользователей?
Допустим кладовщик не имеет право редактировать поле "Заказано", его может править только менеджер и только когда документ в статусе заказа.
И наоборот, менеджер не имеет права править поле "Отпущено", а кладовщик имеет.
Когда документ переходит в статус "отгружено", то уже никто не имеет права редактировать эти поля.

А поле "цена" может видеть только менеджер и не имеет права ВИДЕТЬ кладовщик.
Как это собираетесь реализовать в гриде?Ввести такое понятие, как флаг запрета в гриде. По состоянию этого флага нужные поля разрешаются/запрещаются.
Разумеется выборка должна знать, кто именно ее "вычитал".
...
Рейтинг: 0 / 0
25 сообщений из 68, страница 2 из 3
Форумы / Разработка информационных систем [игнор отключен] [закрыт для гостей] / Генерация пользовательского интерфейса
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]