Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.091 c
8-1110699990
Tirex
2005-03-13 10:46
2005.07.11
Сглаживание изображения (tbitmap)


3-1117423325
akhmadey
2005-05-30 07:22
2005.07.11
Сортировка по lookup-полю


1-1118647710
silvestr
2005-06-13 11:28
2005.07.11
Замена вункции Uppercase


1-1118836041
kot
2005-06-15 15:47
2005.07.11
Code snippets D9


9-1112675007
Xeno
2005-04-05 08:23
2005.07.11
Полноэкранный режим





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский