-
Постов
95 -
Зарегистрирован
-
Посещение
Весь контент joe2009
-
Язык запросов, пример №3 С выборкой данных разобрались. Учимся добавлять данные. insert into quotations(symbol, c_volume, c_high, c_low, c_open, c_close, date_time, timeframe) values ('EURUSD', 10195, 1.37748, 1.36442, 1.36690, 1.37541, '2010.02.16 16:00', 'H4') F9 я думаю, комментарии излишни - в таблицу истории котировок добавлены данные по свече на H4 на 16 февраля 2010 16:00. Снизу в окне мелкими буквами по-английски видим: 1 record(s) was(were) inserted into QUOTATIONS ... и чего-то там еще ниже. Нам дальше-то и не нужно - главное, что запись добавилась! Перед тем как проверить, что запись действительно уже есть в таблице нажимаем подтверждение транзакции (вот же название ) - зеленую "галочку", а то иначе ничего не выйдет. Далее соглашаемся над тем, что мы действительно отдаем себе отчет в том что делаем, жмем Да в маленьком окошке. Находим в дереве слева нашу таблицу Quotations, двойной клик, закладка Данные - запись в наличии. Если записи не видно - и такое бывает. Закрываем все окна, открываем снова - должно появиться. Возвращаемся в окно редактора запросов, нажимаем снова на F9. А вот теперь ошибку выдает нам IBExpert. К чему бы это ? А это - результат работы нашего первичного ключа PK_QUOTATIONS который мы для таблицы создавали - не дает нам база данных создать такую же запись для валютной пары за тот же период. И это хорошо - и даже теперь если мы ошибемся, то база данных вовремя об этом скажет.
-
Язык запросов, пример №3 Усложняю SELECT и на этом пока остановлюсь. select * from quotations where date_time > '2010.01.01' order by symbol, date_time F9 Ничего нового мы для себя на закладке Результат не увидим, но это только пока. Нам важно другое: в запросе появилась новая директива order. Директива выполняет функцию упорядочивания записей в выборке, так как возвращать база данных будет записи как бог на душу положит, и не факт - что в нужном нам порядке. После применения директивы order в таблице будет упорядочивание запесей по содержимому полей symbol, date_time (т.е. валютной паре и дате в истории котировок). На то что в запросе указана фильтрация данных - уже не заостряю ваше внимание, тут и так все понятно. Если нет - задавайте вопросы.
-
Язык запросов, пример №2 Создаем запрос с условием: select * from timeframes where name = 'M1' F9 Во как! в запросе появилась новая директива WHERE (если на русский перевести - "когда"). То есть выборка из таблицы таймреймов произошла по условию, где в возвращаемую таблицу должны попасть только те записи, у которых поле NAME должно быть равно 'M1'. Обращаю ваше внимание: что вы у базы попросите, то она вам и вернет. Слудующие моменты в синтаксисе запросов: - на примере 'M1' - строковый параметр, должен быть заключен в апострофы, то же самое касается и параметров типа DATE (т.е. дата) - при вводе строковых параметров не забывайте о регистре в котором вы вводите значение фильтра, т.е. например при изменении строки условия на: where name = 'm1' база данных вам вернет пустую выборку (можете убедиться самостоятельно). То же самое касается еще и кодировки (RU/EN), на которой вы вводите строковые параметры. - числовые параметры вводятся без дополнительных символов, в следующем примере это будет продемонстрировано: select * from timeframes where interval > 1 and interval <= 10800 F9 вот результат работы запроса: почти все то же самое, только условие усложнилось и добавилась новая директива and (по-русски - логическое И). Эта директива сообщает базе, что выборку по таблице таймфреймов записи которой удовлетворяют условию: больше 1 и меньше либо равно 10800.
-
Язык запросов, пример №1 Переходим в окно редактора, набираем следующий текст: select NAME from SYMBOLS Жмем F9, в результате нас IBExpert отправит на закладку "Результаты": О чем мы попоросили базу данных? Выбери (SELECT) поле названий валютных пар (Name) из таблицы (FROM) SYMBOLS. В случае, если нам необходимо обратиться к таблице и получить значения не одного а некскольких полей таблицы - то эти поля указываются через запятую, например: select SYMBOL, VOLUME from QUOTATIONS Таким образом можно получать необходимые данные из базы - проще некуда: после SELECT указываем названия полей через запятую, после FROM - название таблицы, где хранятся данные. При этом необязательно указывать все поля, которые требуется через запятую. Возвращаемся на закладку "Редактор", стираем старый запрос. Пишем новый: select * from quotations F9 в результате на закладке Результат наблюдаем в выборке все поля, которые мы создавали в таблице истории котировок: в правом верхнем углу наблюдаем также, что количество записей, попавших в выборку равно 0, т.е. данных в нашей таблице пока нет, но они скоро там появятся.
-
Немного о языке запросов Я не буду Вам рассказывать обо всех тонкостях работы с языком запросов, да Вам это и не нужно. Передо мной стоит немного другая задача - научить вас как быстро и правильно пользоваться механизмами языка не залезая при этом в очень глубокие дебри. Итак, первое: - любая база данных, поддерживающая язык запросов всегда работает в режиме обмена информацией с клиентом, т.е. нашим клиенским приложением. Перевожу с русского на понятный: мы ее о чем-то спрашиваем, она нам чего-то отвечает. Как и любая другая база данных наша (т.е. которую мы с вами проектируем) "общаться" будет с нами только на том языке, который она понимает. Таким образом, для того чтобы от базы получить интересующую нас информацию, мы должны знать тот минимум языка запросов, чтобы база нас понимала, ну а мы - ее. Итак: 1. Запрос (т.е. обращение к базе данных) имеет текст. Текст представляет собой набор параметров и директив на английском языке. Не пугайтесь названий: директива - это специальная команда, которая понятна базе, параметр (он и в Африке параметр ) - значения, которые будут использованы в запросе. В начале запроса будет стоять главная директива, т.е. команда, которую будет выполнять база данных. Мы будем использовать четыре: SELECT - обращение к базе данных с целью получения выборки, т.е. данных из базы INSERT - добавление записей в таблицу UPDATE - обновление существующих записей таблицы DELETE - удаление записей из таблиц 2. В случае выполнения запроса база данных всегда нам должна что-то вернуть. В случае ошибки выполнения запроса база данных нам вернет код ошибки, в случае если запрос корректен база данных вернет количество записей в выборке и/или таблицу с данными (recordset - в случае использования директивы SELECT) или количество записей, над которыми база данных совершила действие (в случае выполнения остальных трех директив). 3. После директивы в запросе указывается для какой таблицы и каких полей выполняется обращение к базе данных, можно задать дополнительные фильтры). Ниже мы подробно рассмотрим несколько примеров. Советую воспользоваться открытым IBExpert, для того чтобы увидеть как это работает. Для этого в главном меню выбираем Инструменты - SQL Редактор. В результате открывается окно редактора, после ввода текста запроса не забываем нажимать кнопочку на панели инструментов формы редактора - она обозначена зеленым треугольником (или кнопку F9, что означает одно и тоже - Выполнить запрос).
-
Добавление данных Данные вручную с базу заполнять долго и не интересно - ведь мы хотим наоборот автоматизировать этот процесс. Так что заполняет котировки за нас это программа, которую мы пишем в другой ветке. Эта программа будет находиться в теле библиотеки, которую мы будем подключать к MT4 и к нашей базе данных. Но на практике нужно обязательно знать, как при помощи IBExpert можно править данные в базе. Заполним два наших справочникаа-классификатора, которые очень редко будут менять данные, а точнее это будут справочник валютных пар (SYMBOLS) и таймфреймов (TIMEFRAMES). В дереве разворачиваем ветку Таблицы, находим таблицу SYMBOLS. Делаем двойной клик мышью. Ищем закладку Данные. Для управления записями в таблице можно воспользоваться контекстным меню (по правой кнопке) мыши, кнопками, которые расположены на верхней панели формы или горячими клавишами (INS, DEL, ENTER - больше нам не понадобится). Нажимаем кнопку INS (добавление записи), в поле NAME вводим большими английскими буквами EURUSD. Нажимаем Enter. Все - данные записаны . Просто? Можете добавить еще те валютные пары, с которыми собираетесь работать. Пусть это будут фунт, йена и франк. В конечном итоге таблица должна принять вот такой вид: Таким же образом заполняем таблицу таймфреймов, только здесь в поле NAME будем заносить информацию о названии таймфрейма, в поле INTERVAL - числовое значение в минутах. В конечном итоге таблица примет следующий вид: готовую базу данных можно скачать в начале данной ветки. MT4_20100512.RAR
-
Создание индексов Индексы для таблиц не являются критичными с точки зрения хранения информации, но в случае хранения в таблице больших объемов данных при обращении к базе сильно снижается быстродействие. Для ускорения поиска и выборки данных из таблиц используются индексные выражения. Например, самой большой по объему таблице будет наша таблица котировок. В таблице будут храниться информативные поля такие как объемы, хай, лоу свечей, цены открытия и закрытия. При этом поля, по которым будет осуществляться поиск - валютная пара, таймфрейм и период. Кроме того, для таблицы котировок требуется задать уникальность повторяющихся записей, для того чтобы в базе не могло находиться информации об одной и той же свече на одном таймфрейме по валютной паре не более одного раза. Создаем новый ключ в базе. Слева в дереве ищем нашу созданную таблицу QUOTATIONS. Двойной клик, закладка Ограничения, на закладке Первичный ключ ПКМ - Новый первичный ключ. Выбираем поле На поле, указываем значения так, как показано на рисунке. Нажимаем зеленую "галочку" на панели формы. При закрытии окна с таблицей IBExpert попросит нас подтвердить транзакцию но уже на англиском, соглашаемся, закрываем окно, выходим.
-
Создание таблиц Теперь наша задача - подготовить таблицы для хранения данных. Слева в дереве ищем Таблицы - правая кнопка мыши Новая таблица. В новом откврывшемся окне в поле сверху (отмечено стрелкой) указываем название таблицы - SYMBOLS. В этой таблице будут храниться названия валютных пар. В табличном поле (выделено прямоугольником) добавляем новое поле: название - NAME домен - SYMBOL (помните, создавали ранее). Выполняем запись в базу данных. остальные записи в табличном поле удаляем (например, запись с названием NEW_FIELD). Аналогично создаем следующие таблицы: TIMEFRAMES (таймфреймы), в таблицу добавляем два поля: - Название - NAME, домен - TIMEFRAMES (создавали ранее) - Название - INTERVAL, тип INTEGER, Не пустое - Истина (крестик в поле) QUOTATIONS (котировки), в таблицу добавляем поля: - Название - SYMBOL, домен - SYMBOLS (создавали ранее) - Название - TIMEFRAME, домен - TIMEFRAMES (создавали ранее) - Название - DATE_TIME, тип - TIMESTAMP, не пустое - Истина - Название - C_VOLUME, тип - INTEGER - Название - C_HIGH, домен - DATA_CANDLE - Название - C_LOW, домен - DATA_CANDLE - Название - C_OPEN, домен - DATA_CANDLE - Название - C_CLOSE, домен - DATA_CANDLE
-
Создание доменов При разработке базы данных у вас может возникнуть потребность создания доменов. Домен по своей сути - шаблон, в котором будут определены параметры создаваемого поля в таблице базы данных. Если у вас в разных таблицах будут создаваться однотипные поля, то достаточно один раз содать домен с параметрами колонки таблицы и вместо того, чтобы каждый раз задавать вручную параметры колонки - вы просто указываете ранее созданный домен. 1. Выбираем в дереве базы данных Домен, правая кнопка мыши - Новый домен Далее в правом открывшемся окне указываем: Имя домена - DATA_CANDLE Тип - NUMERIC Длина - 10 Точность - 5 все остальные поля - по-умолчанию. Параметры введены, делаем запись в базу данных. Любая запись в базе данных - кнопка с желтой молнией на панели инструметов формы: В появившемся окне жмем на кнопку в правом нижнем углу (Commit). Домен создан. Таким же образом создаем еще два домена: Имя домена - SYMBOL Тип - CHAR Длина - 6 Не пусто - Истина (т.е. крестик в этом поле) Кодировка - Win 1251 Колпате (кто-то поленился поискать аналог слова на русском ) - Win 1251 Имя домена - TIMEFRAMES Тип - CHAR Длина - 3 Кодировка - Win 1251 Колпате - Win 1251 не забываем делать запись в базу.
-
На форуме в ветках некоторые темы будут расписаны очень подробно и немного "топорным" языком. Это сделано именно для тех пользователей, которые не сильно разбираются в вопросах программирования и работе ядра. Поскольку мы планировали форум для широкого круга пользователей, то попытаемся объяснить сложные вещи просто и доходчиво. Поэтому просим специалистов "не сильно бить" модераторов форума за возможные технические "ляпы" и не обвинять нас в непрофессионализме .
-
Создание базы данных Для работы с базой данных необходимо ее сначала создать. Запустите IBExpert. Для простоты работы переключитесь на русский язык (Options\Environment Options - Interface language) Пункт меню База данных\Создать базу ... На форме указываем: сервер - локальный файл БД - путь к файлу (имя файла укажите MT4.fdb) имя пользователя - SYSDBA пароль - masterkey кодировка - Windows-1251 зарегистрировать после создания - установлено диалект - 3 все остальные поля ввода оставьте как они введены по-умолчанию после этого нажмите на кнопку ОК в открывшемся далее окне IBExpert предложит вам выбрать версию сервера. Укажите из выпадающего списка Firebird 1.5 и нажмите ОК База данных после этого должна быть зарегистрирована слева в дереве баз: Делаем двойной клик мышью на нашей базе. После этого надпись базы должна быть подсвеченной жирным шрифтом. Теперь можно приступать к редактированию состава базы данных.
-
Программное обеспечение Для управления базами данных нам понадобится программное обеспечение: Firebird 1.5 IBExpert Delphi 7 или старше с пакетом FBLib Всю информацию по скачиванию программных продуктов Вы можете получить перейдя по этой ветке, информацию по установке дополнительных пакетов - в репозитацрии классов.
-
Классы для работы с FireBird на Delphi Мы в своих разработках будем иcпользовать FBLib. Скачать их можно отсюда http://fblib.altervista.org/ или отсюда: FireBird.rar
-
Редактор для управления базами данных IBExpert Мощное средство для управления, регистрации баз данных, редактор таблиц и пр., удобная консоль для отладки создаваемых запросов и многое другое. Скачать последнюю версию (с руссификатором) можно отсюда (сайт требует регистрации): http://www.ibexpert.net/downloadcenter
-
Программное обеспечение для работы с FireBird Это реляционная БД предоставляющая множество преимуществ стандарта ANSI SQL, которая работает под Linux, Windows, и разнообразных Unix платформах. Firebird предлагает замечательную параллельную работу, высокую производительсть и мощьную языковую поддержку хранимых процедур и триггеров. Он использован в производственных системах под разными именами с 1981 года. Это некоммерческий проект программистов на С и С++, технических консультантов и работников служб тех.поддержки, разрабатывающих и улучшающих многоплатформенную реляционную систему управления основанную на исходном коде выпущенном Inprise Corp (ныне известной как Borland Sofware Corp) на 25 июля 2000. Т.к. ресурс некоммерческий, то живет он и развивается за счет добровольных пожертвований пользователей продукта. Т.е. отметим для себя один из важнейших критериев - БЕСПЛАТНЫЙ В наших разработках мы будем использовать версию 1.5. Скачать дистрибутив можно отсюда: http://www.firebirdsql.org/index.php?op=files&id=engine_156 Кроме этого для разработки может пригодиться драйвер ODBC для FireBird. Скачать драйвер можно отсюда: http://www.firebirdsql.org/index.php?op=files&id=odbc
-
как в одном известном анекдоте "Ну а теперь слайды" . Сразу хочется отметить, что примеров в Интеренте находится куча, так что мы тоже не будем изобретать велосипед - возьмем самый простой пример его разберем. Вот текст моделя создаваемой нами библиотеки: library MT_DLL; function _Sum(_a: integer; _b: integer): integer; stdcall; begin Result := _a + _b; end; exports _Sum name 'CustomSum'; begin end. Как видите, не такой уж это и страшный "зверь".Только два момента хочу отметить: 1. Вызов функции _Sum идет с указанием директивы stdcall (этому вопросу посвящен предыдущий пост) 2. Директивой exports функции переприсвоено имя, таким образом, из MT будет выполняться вызов функции по имени CustomSum а не _Sum а теперь сам текст скрипта на MQL: // директива импорта данных из библиотеки. // Библиотека должна находиться в каталоге "<Каталог установки МТ>\experts\libraries\" #import "MT_DLL.dll" // объявление функции, которая находится в библиотеке. int CustomSum(int a, int b); #import #property indicator_chart_window int init() { int _temp = 5; string Msg; // а вот и вызов нашей функции. int sum1 = CustomSum( 1, _temp); //---- индикация суммы Print( "Sum is: ", sum1); return(0); } Теперь добавьте индикатор на график. Если вы сделали все правильно после инициализации нашего индикатора на закладке "Эксперты" будет следующая запись: Sum is: 6 Можете себя поздравить - у нас получилось импортировать вызов функции из библиотеки в MT. исходные тексты можно скачать отсюда DllMT.rar
-
О правилах написания DLL для MT Ниже будут приведены примеры по написанию DLL для МТ. Краткое отступление: данный пост написан для людей не сильно разбирающихся в тонкостях программирования, знаний архитектуры компьютера и работы с памятью, по этому люди хорошо владеющие Delphi могут то что написано ниже не читать. Там где начинаются внешние вызовы библиотек - в действие вступает обработчик ядра - великий и могучий Windows. Основная проблема заключается как раз в том, что способы хранения данных в разных операционных системах отличаются (Borland Delphi разрабатывали для разных операционных систем), таким образом необходимо "подружить" ядро и Delphi. Начинающие программисты часто наступают на такие "грабли" - программы у них или выдают ошибки, или выдают "не те" данные либо "вешают" приложения . Этот пост написан как раз для того, чтобы такие ошибки по возможности исключить. Перед тем как приступить к описательной части необходимо сразу же озвучить несколько правил: 1. Первое и самое основное: библиотеки, которые мы будем создавать, оперируют своими собственными типами, которые может "не понять" Windows, поэтому необходимо все экспортируемым процедурам и функциям присваивать стандартный вызов - директиву stdcall. Без использования стандартного вызова обработчик ядра может вызвать исключение и остановить выполнение приложения, которое загрузило данную библиотеку (в нашем случае - этим приложением будет MT). 2. Следствие из п.1 - если мы используем стандартный вызов, то должны передавать в MT все данные с которыми "умеет" работать ядро. Ну и ничего страшного, нам в полне хватит и тех, которые знает Windows . 3. Следует так же уделить внимание передаче строковых переменных между MT4 и DLL. Надо помнить о том, что строковые данные могут храниться в различных кодировках. Ну этому будет посвящена отдельная статья. На этом краткое отступление закончено, если у кого есть желание изучить данную тему подробнее - рекомендую любую книжку по программированию Delphi или почитать ветку форума по начальной теории.
-
Необходимость использования DLL в платформе Metatrader В первую очередь необходимо ответить на самый главный вопрос "Для чего?" или "Зачем?". Задачи, которые будут решать библиотеки, как правило дополняют возможности торговой платформы MT4 и MT5, так как с плюсами у вышеперечисленных платформ есть и два существенных минуса: 1. Язык платформ не "всесилен". Это, я бы сказал, один из самых главных минусов. Метаязык MQL умеет многое, но имного чего не имеет (меня, например, не устраивают возможности MQL с точки зрения формирования отчетов, я могу захотеть, например чтобы мне MT отправлял SMS-ки с какой-нибудь информацией , хочу чтобы данные обрабатывались внешним SQL, скажем FireBird'ом и т.д.) 2. MQL при всех своих плюсах имеет очень ярко выраженный минус - он очень "прожорлив", т.е. съедает большое количество оперативной памяти компьютера (но это не так страшно при наших-то текущих возможностях: сходил в магазин, докупил модуль памяти и порядок ) и очень (я бы даже сказал - ОЧЕНЬ) медленно работает: это хорошо видно тогда, когда у Вас используется большое количество самописных индикаторов. Поскольку платформа Metatrader постоянно обновляет экран (это происходит при получении каждой новой котировки, т.е. выполняется функция start() и происходит дикая нагрузка на ядро - экран-то надо перерисовать... И у MT нет другого выхода он каждый новый тик перерисовывает экран, постоянно получает из базы и пересчитывает нужные данные . Что делать - за все приходится платить - простота программирования на MQL имеет и обрабную сторону медали. Но опять же развивая тему - MQL очень облегчает нам жизнь в плане визуализации информации, т.е. графической части, модуля связи с дилерами, экранных форм, готовых индикаторов и пр., имеет кучу готовых классов для работы с данными. Но хочется, как говорится, всегда большего - хочется такое же но ... как в известном фильме "с перламутровыми пуговицами". Поэтому предлагаю компромиссный вариант - оставить все "вкусности" MQL по визуальной части, а то что он делает (т.е. MQL) медленно - так это математическую обработку информации и выборку данных. Вот пусть этим и будут заниматься нами разрабатываемые библиотеки.
-
Вызов функции из библиотеки. Пример 1: program Example; {$APPTYPE CONSOLE} { Указываем, что функция находится в DLL } function AddNumbers(a, b: Double): Double; cdecl; external 'Example.dll'; { Используем функцию как обычно } var result: Double; begin result := AddNumbers(1, 2); Writeln('The result was: ', result) end. Пример 2: program Example; {$APPTYPE CONSOLE} uses Windows; // строчка добавлена мною для нормальной компиляции библиотеки под Windows var result: Double; LibHandle: Hmodule; AddNumbers: function(a, b: Double): Double; begin LibHandle := LoadLibrary('Example.dll'); // загружаем DLL if LibHandle <> 0 then begin @AddNumbers := GetProcAddress(LibHandle, 'AddNumbers'); // запоминаем адрес // необходимой функции if @AddNumbers <> nil then begin result := AddNumbers(1, 2); // используем функцию Writeln('The result was: ', result); end; FreeLibrary(LibHandle); // выгружаем DLL end; end. Текст модулей взят с сайта http://ru.wikipedia.org/wiki/DLL Оба примера демонстрируют нам вызов функции из ранее скопилированной библиотеки Example.dll из программы с той лишь разницей, что второй пример проверяет, что библиотека инициализирована и загружена в память. Первый и второй варианты демонстрируют нам вывод на экран результат сложения чисел a и b. Исходные файлы примеров можно скачать из данного поста по ссылке ниже. Перед запуском приложений не забудьте переписать Example.dll в каталог исполняемого файла. Простейшая библиотека и ее вызов.rar
-
Пример простейшей DLL. library Example; { Производим некие действия и возвращаем результат } function AddNumbers(a, b: Double): Double; cdecl; begin AddNumbers := a + b end; { Эта функция экспортируется } exports AddNumbers; { Инициализатор DLL, аналог функции main() в языках C и C++ } begin end. Информация взята с сайта http://ru.wikipedia.org/wiki/DLL Разберем указанный пример: library Example; library - зарезервированне слово в начале модуля, обозначает что данный исполняемый файл будет являться библиотекой. Example - имя создаваемой библиотеки. далее следует объявление функции AddNumbers, которая выполняет сложение двух чисел с плавающей запятой. exports AddNumbers; exports - зарезервированное слово, обозначает, что функция AddNumbers будет объявлена как экспортная и ее можно будет использовать другими приложениями. Ниже расположены begin end. основного модуля библиотеки. В момент ее инициализации будут выполнены директивы находящиеся в теле основного модуля.
-
Краткое отсутупление. DLL (англ. Dynamic-link library — библиотека динамической компоновки) — понятие операционных систем Microsoft Windows и IBM OS/2; динамическая библиотека, позволяющая многократное применение различными программными приложениями. K DLL относятся также элементы управления ActiveX и драйверы. Цели введения DLL Первоначально предполагалось, что введение DLL позволит эффективно организовать память и дисковое пространство, используя только один экземпляр библиотечного модуля для различных приложений. Это было особенно важно для ранних версий Microsoft Windows с жёсткими ограничениями по памяти. Далее, предполагалось улучшить эффективность разработок и использования системных средств за счёт модульности. Замена DLL-программ с одной версии на другую должна была позволить независимо наращивать систему, не затрагивая приложений. Кроме того, библиотеки DLL могли использоваться разнотипными приложениями — например, Microsoft Office, Microsoft Visual Studio и т. п. В дальнейшем идея модульности выросла в концепцию COM. Фактически, полных преимуществ от внедрения DLL получить не удалось по причине явления, называемого DLL hell («ад DLL»). DLL Hell возникает, когда несколько приложений требуют одновременно различные, не полностью совместимые, версии DLL-библиотек, что приводит к сбоям в этих приложениях. Когда система выросла до определённых размеров, количество DLL стало превышать многие тысячи, не все из них обладали полной надёжностью и совместимостью, и конфликты типа DLL Hell стали возникать очень часто, резко понижая общую надёжность системы. Поздние версии Microsoft Windows стали разрешать параллельное использование разных версий DLL, что свело на нет преимущества изначального принципа модульности. Информация взята с сайта http://ru.wikipedia.org/wiki/DLL
-
Ветка посвящена вопросам, касающимся программирования графики. В ветке мы будем создавать окно-чарт с отрисовкой на нем свечных конфигураций. Я подготовил класс на базе которого будет реализовано Chart-окно для работы с финансовыми инструментами. Функционал класса будет со временем расширяться. Окну можно найти массу применений - например использовать в качестве плагина или OCX-компонента, загружать в окно данные из файлов HST метатрейдера да и просто для того чтобы научиться программированию.
-
Данная ветка посвящена работе с разделами программирования, которые в конечном итоге понадобятся для создания приложений, библиотек и т.д. Эта ветка - как бы финальный результат работы всех других веток, здесь мы все основные разработанные модули собираем вместе. Каждый пост будет представлять собой отдельный модуль (класс) с описанием, для чего данный модуль нужен. Со временем расширения функционала модули будут обновляться. Просьба к разработчикам и посетителям данной ветки: при обнаружении ошибок в работе модулей сообщать модераторам в личку. Установка пакетов всегда может происходить по-разному, но в основном все сводится к двум действиям: 1. Если в составе пакета присутствует файл с расширением dpk - необходимо выполнить установку пакета чтобы входящие в его состав объекты появились в репозитарии классов 2. Указать Delphi путь к каталогу с исходными файлами пакета, чтобы Delphi "знал", где находятся модули Описание как быстро установить новый пакет покажу на примере FBLib. 1. Распакуйте архив в каталог на диске. Лучше создать новую папку в одном из каталогов (например в source) куда была произведена установка Delphi. 2. Запустите файл с расширением dpk, который соответствует версии Delphi (для седьмой версии это будет файл fblD7.dpk) 3. Нажмите на кнопкb Build, а затем Install на открывшейся форме (для Delphi версий 2005 и старше найдите соответствующие пункты м выпадающем меню в дереве проектов справа нажав на правую кнопку мыши). Закройте проект. 4. Выберите в горизонтальном меню Component\Install Packages..., в открывшейся форме найдите в списке Design Packages удостоверьтесь что напротив пакета FBLib - Firebird Library for Delphi стоит флажок. 5. Указание каталога с исходными файлами пакета: выберите в горизонтальном меню Tools\Options..., найдите на открывшейся форме в дереве пункт Library - Win32 (у меня в 2006 это здесь, у некторых других версий может называться по-другому) и в списке каталогов Library path добавьте путь к каталогу куда был записан пакет.
-
Доброго времени суток и профитов! Сегодня до конца ознакомился с материалами закрытого раздела. У меня просто слов нет... сколько времени и сил необходимо было потратить на все это. Евгению и всем соратникам САКСа - БРАВО и пять с огромным плюсом!
-
Здравствуйте, Евгений. Прошу записать меня на обучение. С условиями согласен.