Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.07.11;
Скачать: CL | DM;

Вниз

Посоветуйте как сделать конструктор форм для настройки программы   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.05 c
14-1118673261
ms1
2005-06-13 18:34
2005.07.11
Moи oтnyck нa Kyбe.


1-1118219173
kot andrei
2005-06-08 12:26
2005.07.11
замена MessageDlg


11-1102246493
Silver Dragon
2004-12-05 14:34
2005.07.11
onMouseLeave


14-1118228197
ISP
2005-06-08 14:56
2005.07.11
Apple Computers заключила контракт с Intel.


3-1117091783
mebel
2005-05-26 11:16
2005.07.11
Последний раз! покажите в тексте что я делаю не так?