Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Присоединяйтесь к совместному написанию программы!
Форум программистов > Системное программирование > Visual Basic
Страницы: 1, 2
gerich
Вобщем я предлагаю написать программу для расширения возможностей любого приложения.
Отдалённо это будет напоминать язык программирования, или точнее макросы в Word и Excel.
Смысл такой.
Представим себе некоторый текстовый редактор. Разработчик программы хочет, чтобы она не оставалась монолитной, и пользователь мог бы, к примеру, добавить в неё новую функцию. Тогда он создаёт в нашей проге специальный файл, после чего он может назначить этот файл в качестве реакции на нажатие какой-либо кнопки.

Таким образом придётся создать сразу две части этого приложения: программа для создания таких файлов и ActiveX DLL-ку, которая эти файлы будет выполнять.

Поскольку маловероятно, что мы можем предугадать всё, что потребуется конечному пользователю, то неплохо было бы сделать возможность расширения программы.
Моё решение этой проблемы такое.
Вся программа состоит из нескольких DLL библиотек.
В главной библиотеке определяются все общие классы, которые могут быть использованы другими частями программы.
Вот они:
Класс Document. В нём содержатся все объекты. Он как раз и представляет собой эту новую функция, которая добавляется к текстовому редактору. У этого класса есть свойства Objects(список всех объектов, которые содержатся в Document) и Value(значение, которое возвращается Document) и методы Run(вызывает стартовый оператор) и Save(сохранение)
Класс Object. От этого класса наследуются Document, Value и Operator. Он может быть сохранён и загружен из файла методами Load, Save.
Класс Value. Имеет свойство Value, которое возвращает определённое значение. От этого класса унаследованы классы, которые реализуют функции, например функция sin может быть представлена классом, у которого есть свойство Angle(угол) и переопределённое свойство Value, которое возвращает синус этого угла.
Класс Operator. В нём определённое действие. Это аналог процедуры в языках программирования. Метод Run запускает оператор на выполнение.

Я искренне надеюсь, что найдутся программисты-энтузиасты, которые захотят ко мне присоединиться.
smile.gif
Gamlet
А зачем тебе это? Вообще я могу поучавствовать. У меня есть проэктик, там это можно использовать. smile.gif
Normann
Блин, неужели ты и в правду собрался это на бейсике писать?
Gamlet
Ну мне вообще такой размах не нужен. Я бы написал свой текстовый редактор и встроил туда такую функцию. А такое писать я сам не понимаю зачем. smile.gif
Kmet
Eclipse PDE имхо эталонная реализация расширяемости. смотрим, учимся, а потом еще раз думаем, чтоит ли браться за столь объемный проект.
Seva
Идея, в общем, понятна... но, как уже не раз говорилось- это кому-то будет нужно? в любом случае помочь чем смогу не против!
Azrael
Цитата
Вобщем я предлагаю написать программу для расширения возможностей любого приложения.

Отдельный программный модуль для программистов с целью прикрутки к существующим приложениям?
Тогда уж лучше, наверное, на Java, либо .NET ?
gerich
Я хочу сделать удобную для программистов библиотеку. Я описал довольно-таки узкую сферу применения проги. Это не обязательно какая-то новая функция к программе. Это ещё и короткий код и(или) более понятный код.
Я уже пробовал делать нечто подобное.

Пусть у нас есть форма, на которой кнопка(cmdCicl).
И есть действие при нажатии
Private Sub cmdCicl_Click()
Dim i As Long
Dim j As Long
For i=1 To 10
  For j=1 To 10
   MsgBox i*j
  Next j
Next i
End Sub


Тогда при использовании нашей DLL Это превратится примерно в следующее
Private Doc As Document

Private Sub Form_Load()
Dim Low As LongNumber
Dim Up As LongNumber
Dim I As LongNumber
Dim J As LongNumber
Dim Step As LongNumber
Set Doc = CreateEmptyDoc               'Создать док и добавить его в свой же список объектов
Doc.Active=True                               'Чтобы все новые объекты записывались в этот док
Set I = CreateEmptyLongNumber       'Создать пустое число и добавить его в текущий док
Set J = CreateEmptyLongNumber
Set Low = CreateLongNumber(1)        'Создать заданное число и добавить его в текущий док
Set Up = CreateLongNumber(100)
Set Step = CreateLongNumber(1)
'Стартовый оператор
Doc.StartOperator=Cicle(I, Low, Up, Step, Cicle(J, Low, Up, Step, CreateMsgBox(CreateMult(I,J))))
End Sub

Private Sub cmdCicl_Click()
Doc.Run 'запуск дока
End Sub


Поскольку это только пример, то не обращайте на его громоздкость.

Если подумать, то разработка библиотеки будет заключаться в написании небольшой основной части,
а затем в дописывании к ней огромного числа готовых действий и функций.

Сегодня часа в три дня или вечером я ещё чё-нибудь напишу-а вы задавайте вопросы и давайте комментарии и пожелания
gerich
Вот, как и обещал, выкладываю свою работу ]]>DocScript.rar]]>. Это ядро проги.
Проект не полный. Запускать не пытайтесь. Просто повнимательнее почитайте код. Там много коментов

Для создания полноценной программы надо добавить к этому ядру множество новых библиотек
В каждой из них будут находиться классы, которые будут потомками основных классов TObject, TValue или TOperator.
Пример отношений между классами смотри в прикреплённом файле structura.GIF

Для передачи параметров функциям достаточно назначить значениям полей функции соответсвующие объекты
Pasha
Для: gerich
Никак не могу понять, в чем же смысл мегаразработки. С какой стати программисту для добавления новой функции в, скажем, текстовый редактор, не вписать ее в редактор напрямую. Может быть не в сам редактор, а в какой-то плагин для него. Практически для всех платформ существуют стандартные подходы к написанию плагинов, например ]]>System.AddIn]]> и ]]>Visual Studio Tools for Application]]> для .net (и VB.NET). Зачем изобретать велосипед, да еще и реализовавать его на вымирающем 6-м VB?
gerich
На VB6 - потому что я на нём лучше всего. А зачем - мне хочется что-то делать а не просто сидеть в форуме и читать чужие сообщения

И ещё я бы хотел, чтобы продвинутые пользователи программ могли бы делать свои функции.
А как?
По-моему, в форме языка программирования это никому не надо.
Поэтому лучше было бы всё представить в форме графа, где каждая вершина-оператор или значение, а линии, соединяющие их - назначали бы параметры объектов
Если непонятно - сейчас картинку нарисую
gerich
Вот это пример той программки с циклами на этапе разработки пользователем
Нарисовано не супер-ну и ладно. Кружки это значения, прямоугольники-операторы
Pasha
Для: gerich
Очень хочется рисовать код в виде диаграмм и вызывать прямо из этих диаграмм методы в подключаемых dll? Тогда может быть стоит посмотреть в сторону ]]>Windows Workflow Foundation]]> (]]>статья на русском]]>, ]]>еще статья на русском]]>)?
gerich
А мне всё равно хочется это делать и мне всё на этом не отговаривайте!!! mad.gif
Pasha
Для: gerich
Да никто не отговаривает, просто предлагаю изучить другие решения той же проблемы.
Gamlet
Никто не отговаривает. Я лично пытаюсь понять-зачем это надо? Может проще втавить в текстовик фунций побольше и сделать невизуальной средой разработки. Новый язык на такой основе-очень даже интересгая мысль. Я так думаю. smile.gif ВБ6 изживается. Немногоие хорошие праграмисты пишут именно на нем. Ели создать такой упрошенный язык-он может стать популярным. smile.gif
Pasha
Для: Gamlet
VSTA позволяет прикрутить к своему приложению поддержку макросов. Примерно так, как это сделано в Word/Excel, с кнопочками Record/Run/Edit. Куда уж упрощенее.
Он конечно платный, но это не мешает разобратся в нем и украсть идею.
gerich
Gamlet, я конечно чуток тупенький(я начинающий программюга), потому что не понял, что ты имел ввиду по "сделать невизуальной средой разработки". Объясни по новой.

Pasha, а чё такое VSTA?

Да и кстати мой ]]>код]]> кто-нибудь смотрел? А то я мучался, полдня его переписывал занова и комментировал - обидно, если всё зря делал unsure.gif
Pasha
Для: gerich
Visual Studio Tools for Applications, чуть выше была ссылка.
Gamlet
Для: gerich
Есть 2 варианта.
1.Делать ехе"ШНИК. Где-то видел такой исходник. Только не помню. Но это не лучший вариант.
2.Знаешь язык ]]>Делферон]]> Там вообще нет ехе. Там делферон мащина. И файла со воеобразнами командами для нее. Но мне нравится больше идея следующая:
Есть папка с прогой. Там есть файл ехе (допустим его имя будет Прога.ехе, или любое другое он не меняется.Своеобразная машина впапке с прогой) и файл (мне нравится им config) в котором хранятся инструкции-команды. + естественно ресурсы(рисунки и т.д.) smile.gif
gerich
Да впринципе хорошая идея, только почему бы нам не сделать нам это не просто EXE, а ActiveX Exe. Тогда её можно быдет использовать и просто так, и из других программ, как плагин.
Gamlet
Для: gerich
Тебя заклинило??? blink.gif blink.gif
Нет!Нельзя сделать активиксы. 2 причины:
1. Ты себе как представляешь VB на активиксе? А ссемблер? НИФИГА? Принцип не в создании набора команд а в создании полноценного языка на уровне ДБ или Делферона!
2. Я ненавижу активиксы и неумею их делать.
Скажи, зачем тебе это:
Любо ты научился создавать компакненты, и хочешь это опробовать, либо ты обещал что-ли, или задали тебе где. smile.gif
gerich
Для: Gamlet
Я просто лучше представляю себе, как это сделать с ActiveX. А может я не совсем понимаю твою идею.
Расскажи мне поконкретнее
1) на чём будем писать
2) как будет всё это выглядеть

Пока я понимаю что ты хочешь в каждом новом EXE прописывать поддержку этого файла config с инструкциями для выполнения. Не проще ли тогда и в самом деле с нуля написать типа виртуальную машину(как в Делфероне) и делать для них программки на этом языке(те же файлы config). Это сильно смахивает на Java, во всяком случае по моему мнению. Честно говоря на VB это писать и в самом деле замучишься-так что мне надо учить новые языки!

А ещё тебе вопрос: в среде разработки мы будем текст проги писать, или рисовать картинки-графы(смотри моё сообщение от 27:08:2007, 18:41 )

Да, кстати до 1-ого сентября у меня жутко инет будет тормозить sad.gif , так что если написали, ждите минут 10, может и отвечу.

Поправка тормозов уже не будет.
Gamlet
Писать естественно на ВБ, местами можем делать отдельные ехе"шники на ДБ.
Сам ехе"шник не меняется в разных прогах. Меняется только config.
Естественно будем писать, в редакторе.
Вот пример текста: Прочли строку текста, присвоили её значение переменной tex
Цитата
if tex="meseg"(допустим функция вывада сообщения лова "пуск") then Msgbox "пуск"

Вот такими функциями и структурированием работает язык.
Это и есть принцип делферона (если не ошибаюсь). Только я не хочу, чтобы пользователям приходилось ставить какуюнибудь машину. Легче класть такой файл в папку с прогой. smile.gif
А почему замучаешься на ВБ?
И как это сделать с активекс? smile.gif
gerich
Вобщем я всё понял. У нас будет максимально упрощённый язык, на котором мы будем писать файлы config, представляющие почти полноценные программы, а не надстройки, как я предлагал. Но я вижу проблему. Если мы сделаем один единственный EXE, это будет подразумевать, что у него будет определённый набор функций. Если мы захотим добавить новую функцию, надо будет переписывать весь EXE и добавлять то свое, что мы хотим. Поэтому я и стремлюсь к ActiveX. По-моему, это оптимальное решение для расширения приложения из тех, которые я знаю. Хотя если мы каждый раз новый EXE будем использовать, то эта проблема, в принципе отпадает. Но в таком случае у нашего языка нельзя будет выделить чёткий синтаксис-он в каждой новой версии будет новый.
Да, а почему тебя не устраивает установка VM на комп юзера?
Gamlet
smile.gif Не очень мне нравится, что то ставить. Вообще можно.
gerich
Ну так чё - надо, что-ли подумать о синтаксисе и т.п.
gerich
Вобще я подумал про синтаксис и вот что приумал
Вот пример программки на этом языке
 {
  defsub
  { symbol 2 = ^ }                 условие оператора
  do                                      действие если условие выполнено
  { integer number = 1
    repeat symbol 3 { number = number * symbol 1 }
   }
   msg "3^100=" str+ 3 ^ 100
  }


А теперь объясню.
Всё что мы напишем - для прогрммы это набор символов. Символ - любая последовательность знаков, не разорванная пробелом. В рабочей памяти программы есть таблица определённых операторов. Каждая строка состоит из 2 частей - условие оператора и действие оператора. Многие операторы предопределены, а некоторые можно написать самому. Также у программы будет таблица переменных, каждая строчка которое состоит из имени, типа и значения. И будет типа стек, в который будет класться текущий набор команд, а затем все элементы будут выпоняться, и заменяться на результат, пока не останется ничего, после этого программа удаляет верхний элемент стека и выполняет более нижний, пока в стеке не останется ничего.
Кстати, объявление переменной - это тоже оператор. Он заносит в список переменных новую запись.
Kmet
Для: gerich
Для: Gamlet

не обижайтесь, но вы велосипедисты. скриптовых движков создано вагон и маленькая тележка, уверен что найдутся такие, которые можно будет прикруить к вб. никому новый синтаксис не нужен, все уже давно придумали до вас.
gerich
Kmet, спасибо за комментарий! И если
Цитата
все уже давно придумали
, то это не значит, что быть велосипедистом неинтересно.
Zato
Я думаю, что если писать язык, то надо писать среду или язык для создания игр.(с програмированием или без него)Эти языки популярнее и их не очень много.это не велосипед-это хотябы мотобайк. Просто язык никому не нужен, уже есть VB, pascal,C++, и д.р. ph34r.gif
gerich
Zato, ну тогда давай свои идеи, как это сделать, что язык делать будет, каким образом, если можно, то примерный синтаксис языка и т.д.
Zato
Лучше всего если работать на ВБ, то подключать дерекс.
действовать надо так:
одно окно отображающее локацию,
одно окно отображающее быбранный предмет,
одно отбражает свойства предмета,
одно окно-перечень предметов.

Нада чётко размечать участки кода.

А для системы можно взять автаномную работу, или метод предложенный Абироном.
В общем это должно работать так

Обьявление обьектов и команд

Изменение параметров обьекта

основной цикл (тут и нужно использовать команды языка)

Если интересно, то могу продолжить! ph34r.gif
gerich
Интересно, только ты учитывай, что я - начинающий программист и не все термины понимаю
А идея интересная, только надо делать всё более универсальным, чтобы можно было любую игру сделать
Zato
Так вроде и есть. Я мог не правильно всё обьяснить! ph34r.gif
gerich
Нут так давай объясняй, не бойся, а то как мы тебя поймём!
Zato
Я всё обьяснил.
4 окна.
грамотное распределение кода.
компиляция либо автономная, либо как предложил Абирон.
Есть ещё вопросы? ph34r.gif
gerich
короче у меня новая идея.
есть язык - PostScript называется. Его в Adobe придумали как язык описания страниц. Он стековый. Его идея мне прям очень нравится. Ну так вот - можно сделать похожий язык. По-моему сделать его проще и он не будет таким уж велосипедом

Вот ]]>ссылка]]>, где кое-что написано про PS
iTAS
2ALL
А мне понравилась идея gerich - по-моему, человек дело говорит!
Gamlet
А можете ленивому описать основные идеии PostScript? smile.gif
gerich
постскрипт- язык для описания графики в адобевских продуктах
Gamlet
Слышал. На нем скрипты во флеш пишутся. Знаю.Знаю. Неплохо, но к нему должен прилагатся видео редактор. smile.gif
Давай тогда лучше вроде пхп напишим.
gerich
он стековый, то есть вся работа с памятью устроена по принципу стека
для наглядности приведу небольшую прогу на пс
2 3.14 sin add

она эквивалентна следующему:
2+sin(3.14)

интерпретатор перебирает все выражения слева направо.
если там стоит число, то он его кладёт на вершину стека
то есть сначала стек пуст, потом в нём 2, потом 2 и 3 (3 на вершине).
после этого он встречает команду sin, которая берёт из стека число,
удаляет его оттуда и кладёт туда синус трёх то есть 0.
потом команда add берёт из стека 2 числа и кладёт туда их сумму

надеюсь вы знаете что есть стек?


нет Gamlet, ты не совсем понял, я предлагаю сделать язык, похожий по синтаксису на постскрипт, а именно использующий стек и обратную польскую нотацию при записи кода

и написать EXE на постскрипте нельзя, он работает только с графикой, и интерпретируется принтером при печати, или спец средой
Gamlet
Посмотрите прогу, которую я написал. Посмотрите на сайте webostrovok.by.ru smile.gif
Gamlet
Цитата
и написать EXE на постскрипте нельзя, он работает только с графикой, и интерпретируется принтером при печати, или спец средой
Конечно нельзя. Знаешь флеш игры? Вот они на нем пишутся. smile.gif
gerich
По моему они пишутся в Macromedia Flash (или чё-то такое). Я смотрел код флешек, но там (как мне кажется) ни чего общего с постскриптами
Pasha
Для: gerich
Во флеше ActionScipt вообще-то.
gerich
А я чё и говорил!
gerich
Вот я решил написать пару слов о моих идеях.
Типы данных.
В нашем языке будет множество различных типов данных, которые условно можно разделить на записываемые непосредственно ввиде текста и создаваемые только командами языка
В первую группу входят числа, строки, ключи, массивы, исполняемые массивы.

Число - это самое обычное число, может быть записано в разных системах счисления.

Строка - последовательность символов начинающаяся и заканчивающаяся символом "
Для того, чтобы вставить в строку символ " надо написать ""
В строку могут входить символы пробела и переноса строки

Ключ - последовательность символов начинающаяся и заканчивающаяся символом \
Для того, чтобы вставить в ключ символ \ надо написать \\
В ключ не могут входить символы пробела и переноса строки
Пустой ключ существовать не будет.
Ключи предназначены для работы со словарями
Запись \+\ отличается от + тем, что если встречается \+\, то интерперетатор сразу кладёт в стек +, а не ищет команду в словаре и не выполняет её.

Массив - последовательность выражений начинающаяся с символа [ и заканчивающаяся символом ]
Между ними могут находиться любые выражения. Всё, что находится между квадратными скобками сначала выполняется, а потом уже создаётся массив.
В массиве могут содержаться элементы любого типа, в том числе и типа массив
Примеры:
[ 1 5 3 465 ]
[ "hello world" ":)" ]
[ [ 1 2 3 ] [ 4 5 6 ] [ 7 8 9 ] ]
Для доступа к элементам массива используются специальные команды.

Исполняемый массив - последовательность выражений начинающаяся с символа { и заканчивающаяся символом }
Между ними могут находиться любые выражения. Всё, что находится между фигурными скобками не выполняется на этапе создания массива.
Для выполнения массива используются специальные команды.
На самом деле исполняемый массив - это конструкция подобная begin .. end в паскале.

Во вторую группу входят словари, стеки, файлы и т.д.
Я рассмотрю словари и стеки.

Словарь-это набор пар ключ-объект.
Когда программа встречает какое-либо выражение, то она сначала просматривает весь словарь и ищет его определение.
Если определение найдено, то если под данным ключом хранится испоняемый массив, то он выполняется, иначе в стек кладётся
соответсвующее выражение.

Стек-массив, у которого можно работать с верхними элементами (удалять и добавлять)
В языке будет несколько стеков:
стек данных-стек, где хранятся все объекты
запись
3 4 +
кладёт свои данные на вершину стека данных.
стек словарей-стек, где хранятся все словари.
То есть определений функции + может быть несколько: в стандартном словаре и в новом словаре, но программа выберет определение из самого верхнего
словаря в стеке, таким образом можно переопределить функцию +.

Алгоритмические структуры.
В каждом языке программирования есть структуры типа if .. then .. else .. , for .. ,while .. и тому подобное.
Наш язык не будет исключением.
вот пример условия
a 2 > { "a > b" message } if
это эквивалентно
if a>b then message("a > b")

Это пока всё, что я хотел рассказать!
Gamlet
Для: gerich
Ндам. Мне идея DB как то ближе. Помниш я тебе учебник присылал. ДБ это язык для самых обычных прльзователей. Он прост. А ты хочешь сделать мощный но сложный язак. Может интерфейс от ДБ , но стековая система?

А то
Цитата
a 2 > { "a > b" message } if

как то убито. Встречались с этом в С++. Не очень весело. smile.gif

А еще лучше создать полувизуальный язык. Я видел как то визуальный компилятор ассемблера. Нечто вроде этого неплохая мысль. Язык невизуальный, но визуально настраиваемый (видны функции, но не обьекты типа кнопок.)
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2008 IPS, Inc.