Форум: "Основная";
Текущий архив: 2005.07.11;
Скачать: [xml.tar.bz2];
ВнизПосоветуйте как сделать конструктор форм для настройки программы Найти похожие ветки
← →
Andrey Kononov © (2005-06-15 13:25) [0]Доброго времени суток.
Мне нужно сделать конструктор форм для выбора параметров для отчета. От конструктора требуется чтобы он позволял "нарисовать" форму, разместить на ней компоненты (TEdit, TCombobox, TMemo, TLabel, TButton и еще несколько), по событиям на некоторые из них сделать операции, например при выборе записи в комбобоксе прочитать из базы данных и заполнить другой или при создании формы заполнить комбобоксы параметрами и записать значения контролов в какой-нибудь массив для передачи их дальше в программу. Весь скрипт настройки должен сохраняться, например в базе данных. Основная программа по этому скрипту должна уметь создать форму и получить из нее данные.
Подскажите, может кто-нибудь уже делал похожие вещи? Подскажите где можно почитать что-нибудь? Может есть готовые решения, пусть даже и платные. Посоветуйте, пожалуйста, как можно сделать такой
конструктор.
Из опыта:
Пробовал работу с загрузкой форм из dfm. Все загружается нормально, только я не знаю как можно привязать к контролам обработчики событий, которые должны быть в скрипте и вообще возможно ли это.
← →
ANB © (2005-06-15 14:01) [1]Возможно. Читаешь много учебников, хелп, много думаешь и делаешь. С конкретными вопросами обращаешься сюда.
← →
P.N.P. © (2005-06-15 14:04) [2]>Andrey Kononov © (15.06.05 13:25)
http://www.fast-report.com/
Должно подойти.
← →
Andrey Kononov © (2005-06-15 14:49) [3]
> P.N.P. © (15.06.05 14:04) [2]
> >Andrey Kononov © (15.06.05 13:25)
> http://www.fast-report.com/
> Должно подойти.
Для отчетов нормально. Я и использую FastReport как генератор отчетов. Мне интересено сейчас само решение задачи, так как в дальнейшем тоже самое надо будет делать не только для отчетов.
> ANB © (15.06.05 14:01) [1]
> Возможно. Читаешь много учебников, хелп, много думаешь и
> делаешь. С конкретными вопросами обращаешься сюда.
Конкретный вопрос:
Есть форма в DFM. На ней две кнопки и один TEdit.
Есть текстовый файл в котором написано:
procedure OnButtonClick1 (Sender : TObject);
begin
ShowMessage("You wrote: "+Edit1.Text);
end;
procedure OnButtonClick2 (Sender : TObject);
begin
Close;
end;
Программа должна создать форму (это я умею), присвоить обработки кнопкам и запустить форму так, чтобы обработчики заработали.
Как присвоить кнопкам эти обработчики, если можно? В каких учебниках можно посмотреть. Перерыл уже все что можно. Как создавать формы много, а как сделать их живыми - ни слова...
← →
ORMADA © (2005-06-15 15:05) [4]button1.OnClick:=OnButtonClick1
:)
← →
Andrey Kononov © (2005-06-15 15:15) [5]
>ORMADA © (15.06.05 15:05) [4]
>button1.OnClick:=OnButtonClick1
>:)
:)
А если серьезно.
← →
P.N.P. © (2005-06-15 15:20) [6]>Andrey Kononov © (15.06.05 15:15) [5]
Тебе, получается, нужен скриптовый движок.
Копай в сторону FastScript (скачай и посмотри примеры
использования для начала - вдруг не подойдет)
← →
Ega23 © (2005-06-15 15:27) [7]Задачка нетривиальная.
Я бы сначала описал всё множество возможных бизнесс-процессов, типа "Скачать данные", "Нарисовать фигу", "Показать сообщение", "Записать данные", "Распечатать" и т.п.
Это как-бы типы. Потом конкретные бизнесс-процессы. ("Скачать данные из таблица А с параметрами Б" и т.п.)
Потом скриптовый движок.
← →
Andrey Kononov © (2005-06-15 15:50) [8]Получается так:
Например есть скрипт (прошу не обращать внимания на фигурные скобки, это без умысла :) )
[construcion]
Form
{
Width = 300;
Height = 300;
Position = FormCenter;
}
Button
{
Name = "Btn1";
Caption = "OK";
Width = 100;
Height = 10;
Top = 10;
Left = 10;
Enabled = CheckOK;
}
ComboBox
{
Name = "CB1";
Width = 100;
Height = 10;
Top = 30;
Left = 10;
OnSelect = OnCB1Select;
}
ComboBox
{
Name = "CB2";
Width = 100;
Height = 10;
Top = 50;
Left = 10;
}
[events]
OnCreate
{
LoadComboBoxFromDB (CB1, "spGroupListGet", [], "ID", "Name");
}
OnClose
{
AddQueryParam ("Group", GetID(CB1));
AddQueryParam ("Name", GetID(CB2));
AddReportVariable ("Name", CB2.Text);
}
OnCB1Select
{
LoadComboBoxFromDB (CB2, "spNameListGet", [GetID(CB1)], "ID", "Name");
}
CheckOK
{
Result := GetID(CB2) <> -1;
}
Скрипт может быть другого вида, это, думаю, не важно.
Я должен сделать перед началом работы.
1. Описать все контролы, которые можно класть на форму
2. Описать все события у них, которые я хочу обслуживать в скрипте
3. Описать все процедуры и функции, которые планируется использовать в скрипте, например
function GetID(ComponentName : String) : Integer;
или
procedure LoadComboBoxFromDB (ComboBoxName : String; ProcedureName : String; Parameters : array of Variant; const Field_ID : String = "ID"; const Field_Name : String = "Name");
Я должен сделать в ходе выполнения работы.
1. Загрузить скрипт
3. Создать форму по скрипту или из dfm
2. Создать список всех контролов
3. Добавить в списки имена всех обработчиков (или тексты кодов)
4. Запустить форму
6. Когда форма создается и происходит, например, нажатие на кнопку для которой что-то описано, то обработчик в списке контролов ищет себя, смотрит есть ли у него обработки на данное событие. Если нет, то забывает об этом. Если есть, то пытается выполнить соответствующий скрипт. Например, загружает данные из базы в комбобокс с указанным именем или делает доступной кнопку "ОК".
7. Когда форма закрывается - выполняет скрипт на закрытие формы если он есть и уничтожается.
8. Список контролов для данного класса также очищается.
Такой примерный сырой алгоритм.
Правильно я понял суть предстоящей работы?
← →
Ega23 © (2005-06-15 15:58) [9]3. Добавить в списки имена всех обработчиков (или тексты кодов)
Насколько я понимаю, адреса обработчиков.
А в принципе - да, именно так.
← →
Jeer © (2005-06-15 16:05) [10]Не обязателен скрипт.
Есть реализация нечто подобного с компиляцией "на лету".
Питерская фирма создала систему моделирования Model Vision Studium на этом принципе.
В основе визуальный конструктор и компиляция через dcc32.exe.
← →
Ega23 © (2005-06-15 16:11) [11]Короче, интерпритатор нужен.
Его реализация - отдельная песня. Можно, к примеру, свой написать. Можно готовым воспользоваться. Я обычно SQL для этого использую.
← →
Andrey Kononov © (2005-06-15 16:11) [12]
>Ega23 © (15.06.05 15:58) [9]
>3. Добавить в списки имена всех обработчиков (или тексты кодов)
>Насколько я понимаю, адреса обработчиков.
Что значит адреса? Как я их могу присвоить? Например, мне надо выполнить такую конструкцию на нажатие кнопки:
AddQueryParam ("Group", GetID(CB1));
AddQueryParam ("Name", GetID(CB2));
AddReportVariable ("Name", GetText(CB2));
Какой адрес надо указать?
Я думал, что храню в обработчике текст скрипта и при необходимости начинаю его интерпретировать и выполнять.
Тогда получается такой алгоритм:
1. Устанавливаю курсор на первую строку
2. Читаю строку под курсором
3. Смотрю что за строка
4. Если оператор неизвестен, то выдаю сообщение об ошибке и останавливаю обработку.
5. Если оператор известен, то читаю параметры, которые передаются (здесь возможно даже что-то рекурсивное, пока не знаю), вычисляю при необходимости вложенные функции.
6. Затем вызываю нужную функцию с получеными параметрами.
7. Сдвигаю курсор на одну позицию ниже
8. Повторяю все для следующего оператора
Я думал так надо.
Как еще можно сделать?
← →
Andrey Kononov © (2005-06-15 16:20) [13]
>Jeer © (15.06.05 16:05) [10]
>Не обязателен скрипт.
>Есть реализация нечто подобного с компиляцией "на лету".
>Питерская фирма создала систему моделирования Model Vision >Studium на этом принципе.
>В основе визуальный конструктор и компиляция через dcc32.exe.
Это получается они пишут в программе создают к примеру pas и dfm файлы, затем компилируют их и получается готовая программа (типа модель)?
>Ega23 © (15.06.05 16:11) [11]
>Короче, интерпритатор нужен.
>Его реализация - отдельная песня. Можно, к примеру, свой >написать.
>Можно готовым воспользоваться.
А какие есть готовые, которые можно совместно с Delphi использовать?
>Я обычно SQL для этого использую.
Как, если не секрет?
← →
Jeer © (2005-06-15 16:26) [14]Andrey Kononov © (15.06.05 16:20) [13]
Совершенно верно.
Дизайнер генерит pas и dfm, далее компиляция.
В их случае - отдельное оконное приложение, но можно ведь и DLL генерить под конкретную форму.
Только оправдывает ли такая технология цель в Вашем случае ?
← →
P.N.P. © (2005-06-15 16:28) [15]>Andrey Kononov © (15.06.05 16:20) [13]
>А какие есть готовые
их огромное количество
FastScript,RemObjects...etc
← →
Ega23 © (2005-06-15 16:31) [16]Как, если не секрет?
Свой скриптовый язык (что-то навроде XML) + MS SQL Server в качестве интерпритатора. Кстати, там же в БД и описание форм и контролов хранится.
← →
Andrey Kononov © (2005-06-15 16:32) [17]
>Только оправдывает ли такая технология цель в Вашем случае ?
Наверное нет. Мне как раз и надо, чтобы было поменьше дополнительных dll и exe.
← →
Jeer © (2005-06-15 16:42) [18]Замучаешься со скриптом из-за недостаточной его функциональности.
(это о готовых движках).
И "помрешь" реализуя свой многофункциональный.
← →
Andrey Kononov © (2005-06-15 16:52) [19]
>Jeer © (15.06.05 16:42) [18]
>Замучаешься со скриптом из-за недостаточной его функциональности.
>(это о готовых движках).
>И "помрешь" реализуя свой многофункциональный.
Да. Альтернативка... :)
Неужели нет света в конце туннеля.
>И "помрешь" реализуя свой многофункциональный.
А мне многофункциональный и не нужен в общем-то.
>Ega23 © (15.06.05 16:31) [16]
>Как, если не секрет?
>Свой скриптовый язык (что-то навроде XML) + MS SQL Server в >качестве интерпритатора. Кстати, там же в БД и описание форм и >контролов хранится.
В базе храниться оболочка, скрипты и т.д. При необходимости просто строишь запрос и пытаешься выполнить его на SQL Server? Так?
>P.N.P. © (15.06.05 16:28) [15]
>>Andrey Kononov © (15.06.05 16:20) [13]
>>А какие есть готовые
>их огромное количество
>FastScript,RemObjects...etc
Посмотрю сейчас.
← →
Jeer © (2005-06-15 16:58) [20]Скорее всего идете не тем путем.
1. Создаются типовые по навигации формы. Их надо нет уж и много.
2. Наполнение нужными данными решается с помощью SQL-запросов.
3. Изменение данных с помощью SQL-исполнений.
Задачу обрисуйте в общем, а не в частностях.
Тогда точнее ответы будут.
← →
ANB © (2005-06-15 17:05) [21]Хм. Вобщем то все элементарно :
Описываешь в проге заглушки - обработчики для всех нужных видов контролов. Внутрь вставляешь типа RunScript(Sender.Строка_Скрипта). Затем так и пишешь, как
ORMADA © (15.06.05 15:05) [4]
Строку скрипта тебе придется либо как то запихивать в свойства контролов, либо юзать Tag как индекс от массива строк скриптов, либо еще как нибудь изгальнутся.
А вот саму функцию RunScript, думаю ты писать задерешься. Я неделю писал свой компилятор + интерпретатор, еще неделю доводил. Но при этом я почти всеь парсинг и вычисление выражений свалил на оракл. Да и язык получился ущербным.
← →
Andrey Kononov © (2005-06-15 17:11) [22]
>Jeer © (15.06.05 16:58) [20]
>Скорее всего идете не тем путем.
>1. Создаются типовые по навигации формы. Их надо нет уж и много.
Здесь мне не понятно. Поясните пожалуйста.
>2. Наполнение нужными данными решается с помощью SQL-запросов.
>3. Изменение данных с помощью SQL-исполнений.
Так и делаю.
>Задачу обрисуйте в общем, а не в частностях.
>Тогда точнее ответы будут.
Я ее уже обрисовывал в начале.
← →
ANB © (2005-06-15 17:15) [23]Дамс, сидит целый отдел в ICL и чешет репу, как бы нечто подобное покрасивее сделать. Уже полгода пишут. Пока только дизайнер форм сделали + их отображение.
← →
Jeer © (2005-06-15 18:14) [24]Andrey Kononov © (15.06.05 17:11) [22]
Непонятно, что ?
Что такое типовые ?
Типовые в смысле интерфейса, т.е. некоторое множество форм обеспечивающих нужную функциональность в рамках заданного множества бизнес-процессов.
Например
1. Родительская форма с нужной функциональностью по просмотру, редактированию.
2. Простейший DBGrid
3. DBGrid + Lookup
4. DBGrid + DBTree
и тд.
Редактируемые поля создаются в run-time на основе описаний design-time.
Как правило, этого хватает для значительного числа DB-приложений.
← →
Faraday (2005-06-16 07:38) [25]Все в этой жизни гораздо проще.
Создается административный модуль - дизайнер форм наподобие Делфи, только попроще. Определяемся с набором компонент, например TDBText, TLabel и т.д. (я использую больше 10 компонент, включая закладки, панели, сплиттеры и т.д.). Назначаем им минимум свойств - слева,сверху,ширина,высота,поле БД,действие (для кнопки например). Придется пару дней повозится, чтобы все это можно было таскать по форме, копировать и вставлять,изменять размеры,выравнивать и т.п., но это несложно хоть и муторно. Сохраняем форму в базе данных - в одной таблице компоненты, во второй его свойства. Далее делаем клиенсткий модуль - выбираем из БД нужные компоненты со свойствами и создаем их в RunTime. Вот так без всяких скриптов. Действия-события легко можно классифицировать на стандартные- сохранить,закрыть, открыть другую форму.
← →
ANB © (2005-06-16 09:33) [26]
> Faraday (16.06.05 07:38) [25]
- кстати, клевая идея. Если нужно усложнить логику, то можно предусмотреть вызов ХП, а ней уже делай что хочешь.
← →
Stanislav © (2005-06-16 09:37) [27]Andrey Kononov © (15.06.05 13:25)
Пытаюсь сделать что-то вроде этого. Пока сделал сохранение объектов в базу, и изменение их параметров. Для основы взял Ehlib - PropStorageEH. Изучаю RTTI. Скачал FastScript - мощная штука, разбираюсь если подойдет куплю.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2005.07.11;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.049 c