Rambler's Top100
"Knowledge itself is power"
F.Bacon
Поиск | Карта сайта | Помощь | О проекте | ТТХ  
 Сокровищница
  
 

Фильтр по датам

 
 К н и г и
 
Книжная полка
 
 
Библиотека
 
  
  
 


Поиск
 
Поиск по КС
Поиск в статьях
Яndex© + Google©
Поиск книг

 
  
Тематический каталог
Все манускрипты

 
  
Карта VCL
ОШИБКИ
Сообщения системы

 
Форумы
 
Круглый стол
Новые вопросы

 
  
Базарная площадь
Городская площадь

 
   
С Л С

 
Летопись
 
Королевские Хроники
Рыцарский Зал
Глас народа!

 
  
ТТХ
Конкурсы
Королевская клюква

 
Разделы
 
Hello, World!
Лицей

Квинтана

 
  
Сокровищница
Подземелье Магов
Подводные камни
Свитки

 
  
Школа ОБЕРОНА

 
  
Арсенальная башня
Фолианты
Полигон

 
  
Книга Песка
Дальние земли

 
  
АРХИВЫ

 
 

Сейчас на сайте присутствуют:
 
  
 
Во Флориде и в Королевстве сейчас  23:18[Войти] | [Зарегистрироваться]

Обсуждение материала
Модули для рисования математических формул
Полный текст материала


Другие публикации автора: Антон Григорьев

Цитата или краткий комментарий:

«... Библиотека содержит классы, достаточные для отображения практически любой формулы. ...»


Важно:
  • Страница предназначена для обсуждения материала, его содержания, полезности, соответствия действительности и так далее. Смысл не в разборке, а в приближении к истине :о) и пользе для всех.
  • Любые другие сообщения или вопросы, а так же личные эмоции в адрес авторов и полемика, не относящаяся к теме обсуждаемого материала, будут удаляться без предупреждения авторов, дабы не мешать жителям нормально общаться.
  • При голосовании учитывайте уровень, на который расчитан материал. "Интересность и полезность" имеет смысл оценивать относительно того, кому именно предназначался материал.
  • Размер одного сообщений не должен превышать 5К. Если Вам нужно сказать больше, сделайте это за два раза. Или, что в данной ситуации правильнее, напишите свою статью.
Всегда легче осудить сделанное, нежели сделать самому. Поэтому, пожалуйста, соблюдайте правила Королевства и уважайте друг друга.



Добавить свое мнение.

Результаты голосования
Оценка содержания

  Содержит полезные и(или) интересные сведения
[1]21100%
 
  Ничего особенно нового и интересного
[2]00%
 
  Написано неверно (обязательно укажите почему)
[3]00%
 
Всего проголосовали: 21

Оценка стиля изложения

  Все понятно, материал читается легко
[1]1995%
 
  Есть неясности в изложении
[2]00%
 
  Непонятно написано, трудно читается
[3]15%
 
Всего проголосовали: 20




Смотрите также материалы по темам:
[Синтаксический анализ, разбор выражений, парсинг] [Перерисовка компонент] [GDI, рисование на канве]

Комментарии жителей
Отслеживать это обсуждение

Всего сообщений: 80

11-03-2014 22:23
Vitek
Никакой специальной установки модулей не нужно, просто поместите файлы ExprDraw.pas и ExprMake.pas в один из тех каталогов, в которых Delphi ищет библиотеки, и добавьте ExprDraw и ExprMake в раздел uses своего модуля.
Надо было это предложение набрать красным рубленым шрифтом, высотой примерно 36pt :)


09-03-2014 14:23
С точки зрения продвинутого прогера, может и полезная штука. Для начинающих - ни как установить, ни как использовать на примере - ноль. Может в недалеком будущем и пригодится мне. А пока это слишком сложно.


20-10-2013 06:39
сообщение от автора материала
У меня есть два больших уравнения, написанных при помощи ExprDraw. как теперь их объединить в систему? функция System же только строки принимает?

А вы посмотрите, как реализована функция System, и сделайте аналогично. Сначала надо с помощью AddNext к первому выражению присоединить второе, затем создать экземпляр TExprStand, передав ему ссылку на первое выражение, а потом создать экземпляр TExprBracketed с одной фигурной скобкой слева и передать в него получившийся экземпляр TExprStand.


20-10-2013 05:00
Здравствуйте. У меня есть два больших уравнения, написанных при помощи ExprDraw. как теперь их объединить в систему? функция System же только строки принимает?


03-06-2013 16:00
http://18delphi.blogspot.com/2013/06/offtopic.html

Извините, если - offtopic


25-05-2013 06:58
Очень хорошая библиотека. Отвечаю. Сам использовал.


24-05-2013 12:24
сообщение от автора материала
ExprDraw предназначен умеет только одно: отрисовывать нужную формулу там, где укажут. И ещё вычислять её размеры. Интегрирование этой формулы в Memo, в текст, в картинку - это отдельная задача, которую нужно решать самостоятельно тем способом, который наилучшим образом подходит именно для вашей задачи. Свой вариант решения этой задачи я вам, уж извините, не дам - слишком сложно выдирать этот код из проекта, а отдавать просто так весь такой большой проект не хочется. Но задачка-то элементарная, если немного подумать, сделать очень просто, тем более что при тех объёмах памяти, которые стоят на современных машинах, её можно решить намного изящнее, чем это сделал я десять с лишним лет назад.


23-05-2013 00:08
Пример, но не очень понятный. Отдельные формулки отрисовать получается, а как внедрить формулу в текст, да если ещё и много? Можно ли использовать с memo?


21-05-2013 04:35
ExprGuide - это и есть пример использования, разве нет?


20-05-2013 16:21
Можно ли узнать пошаговую установку и использование компонента?
Установить-то установил, а вот использовать как не очень понимаю.
Или скиньте проект, где используется этот компонент, там сам разберусь.


03-09-2012 09:20
сообщение от автора материала
Интересно почему вы выбрали именно Delphi 5 в качестве среды разработки?

Потому что когда я эту штуку писал, пятёрка была самой последней версией :)


03-09-2012 09:07
Антон здравствуйте!
Простите что вопрос не совсем по существу. Интересно почему вы выбрали именно Delphi 5 в качестве среды разработки?


20-08-2012 02:06
Соглашусь, при большом объеме текста такой подход представляется единственно возможным. Понравилась идея со скроллингом больших формул - тогда необходимость в переносе отпадает вообще.


19-08-2012 11:15
сообщение от автора материала
Когда-то я решал подобную задачу. Я внедрял формулы в текст. По сути, объединил ExprDraw и вот это: http://delphikingdom.com/asp/viewitem.asp?catalogid=171

На мой взгляд, этот подход лучше, потому что ширина не фиксирована, а выравнивание выполняется достаточно красиво. Если вам интересно, как это в итоге выглядит, можете скачать интерактивный учебник PlasmaBook со страницы http://plasma.mephi.ru/ru/%D0%9E%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5


19-08-2012 03:13
Спасибо за ответ, но дело в том, что внутри этих функций не работает функция string.
Вообще говоря, стоит задача набора небольших школьных задач, представляющих собой текст с вкраплениями формул (дробей, переменных и т.п.). Как лучше такой текст формировать: как собственно текст со вставленными изображения формул либо как одну большую формулу с текстом внутри? Во втором случае и у меня возникает необходимость в переходе на новую строку


18-08-2012 00:08
сообщение от автора материала
А можно еще вопрос - переход на новую строку внутри одной формулы концептуально не заложен или есть какой-то управляющий символ?

Есть функции StandL, StandC и StandR для этих целей.


14-08-2012 17:34
Антон, спасибо за ответ, можно было и самостоятельно догадаться :)
Пока заменил string на AnsiString, char на AnsiChar - всё заработало, потом будет время - попробую разобраться с юникодом, во всяком случае, простая замена на CharInSet не помогла.
А можно еще вопрос - переход на новую строку внутри одной формулы концептуально не заложен или есть какой-то управляющий символ?


13-08-2012 12:57
сообщение от автора материала
но если вместо латиницы использовать кириллицу "Дробь & space(5) & 90/25", выводится только первая буква Д.
Хотелось бы понять - так и должно быть или я что-то делаю неправильно?


Видимо, всё дело в этом:

Скомпилировалась под Delphi XE без проблем.

Потому что под семёркой всё работает как надо. Предполагаю, что дело в переходе на двухбайтный Char. Надо весь код анализатора прошерстить и посмотреть, где там могут быть проблемы. Скорее всего, какие-нибудь глюки с конструкциями вида if S[1] in ['A'..'Z','a'..'z','А'..'я'] - двухбайтные множества Delphi обрабатывает не всегда корректно.


06-08-2012 13:40
Спасибо за библиотеку, не требует подключения тяжеловесных dll или activex, при этом обладает богатым функционалом.
Скомпилировалась под Delphi XE без проблем.
Такой вопрос: если задаю формулу в виде "Fructure & space(5) & 90/25", все отрисовывается как и положено,
но если вместо латиницы использовать кириллицу "Дробь & space(5) & 90/25", выводится только первая буква Д.
При этом вариант с использованием функции String(Дробь) работает.
Хотелось бы понять - так и должно быть или я что-то делаю неправильно?


31-05-2011 12:28
>>> И вот здесь я категорически не согласен с уважаемым GEO
Я был неверно понят (или я неверно высказался). Я имел в виду, что не стоит для всего проекта отключать какой-то хинт или варнинг (ну, за исключением некоторых). А гасить каждый конкретный хинт в каждом месте его появления — наверное, это будет неплохо.
 Geo


27-05-2011 05:32
Добавлю свои пять копеек на тему)

В первую очередь — Антон, спасибо. Второй год собираемся подправить ваш код под свои нужды (перевести язык описаний формул к стандарту TeX), но все никак.. Вы не думали выложить библиотеку на SourceForge или еще куда-то (в смысле, перевести на рельсы opensource, чтобы заинтересованная общественность могла улучшать и дорабатывать библиотеку общими усилиями)?

Собственно, по поводу Warnings и Hints)
Наличие предупреждений компилятора — безусловное благо, т.к. позволяет в некоторых случаях отлавливать незаметные несинтаксические ошибки (а иногда и ошибки дизайна кода). Но как уже сказал Антон — компилятор да, иногда таки ошибается в предположениях. Как следствие — засоряется окно messages, а значит действительно важные замечания (которые способствуют отлову багов) могут просто остаться незамеченными на фоне множества перестраховок компилятора.

Тратить процессорное время на выполнение успокаивающих инструкций для компилятора — тоже не дело. Остается гасить конкретные рекомендации соответствующей директивой по месту их возникновения. И вот здесь я категорически не согласен с уважаемым GEO. Да, гашение рекомендаций — это очень острый инструмент, и использовать его нужно с осторожностью. Но когда возникает рекомендация (как в случае с кодом Антона) явно из-за неидеальности кодоанализатора, и избавиться от неё посредством рефакторинга невозможно — погасить её локально, ИМХО, оптимальный вариант. И глаз не замыливается (см. пред. абзац), и компилятор спокоен и процессорное время не тратится впустую.

Здесь, кстати, могу упомянуть еще одну полезную практику на мой взгляд: введение собственных рекомендаций директивами {$MESSAGE WARN/HINT '|'}. Скажем, я ставлю их всегда, когда вынужден оперативно закрыть дыру в коде каким-то малопроверенным куском кода ли просто заглушкой. TODO-шки не всегда в начале работы смотришь, а вот за WARNINGS взгляд цепляется, и дыра в коде оставшаяся после прошлого рабочего дня ликвидируется быстро.

Извините за оффтоп, не удержался)


22-10-2009 17:26
>>> а как же тогда прорисовать формулу, если не через Canvas??
Через Canvas, через Canvas. Вопрос только в том, через Canvas чего? Читайте внимательно, что написал Антон. Есть Image1.Canvas, а есть Image1.Picture.Bitmap.Canvas

Или Вам все равно на какой канве рисовать? Мржет быть, Вам также все равно, в какой карман деньги класть? Тогда кладите в мой :D
 Geo


22-10-2009 16:48
сам факт появления у TImage публичного свойства Canvas - это, видимо, ошибка разработчиков VCL, постарайтесь его никогда не использовать. - а как же тогда прорисовать формулу, если не через Canvas??...я больше способов не знаю...подскажите, каким еще образом можно прорисовать формулу...заранее спс


21-10-2009 00:35
сообщение от автора материала
скажите правильно это будет, для начала хотя бы

А вас самого не смущает, что закрашиваете вы Image1.Picture.Bitmap.Canvas, а формулу потом рисуете на Image1.Canvas? В вашем случае всё, может быть, и работает, но вообще сам факт появления у TImage публичного свойства Canvas - это, видимо, ошибка разработчиков VCL, постарайтесь его никогда не использовать. Можете интереса ради покопаться на Круглом столе, посмотреть, сколько проблем получают люди, которые используют TImage.Canvas. А в остальном явных ошибок нет, хотя целесообрзность именно такого кода у меня вызывает сомнения. Если вы пока просто экспериментируете, пробуете библиотеку на зуб, то это нормально, а вот если это часть более серьёзной программы, то, возможно, имеет смысл подойти к рисованию по-другому. Как именно - зависит от ваших целей. Если вы их здесь изложите, попробуем что-то подсказать.


20-10-2009 10:33
я кажись что то получил, вот кусок исходника, скажите правильно это будет, для начала хотя бы...:

var
    a:string;
    z:texprclass;
begin
with Image1.Picture.Bitmap do
    begin
     Width:=2000;
     Height:=1000;
     Canvas.Brush.Style:=bsSolid;
     Canvas.Brush.Color:=clskyblue;
     Canvas.FillRect(Rect(0,0,Width,Height))
    end;
  a:='C_2*H_5*OH';
  z:=buildexpr(a);
  z.Canvas:=image1.Canvas;
  z.Font.Size:=12;
  z.Draw(10,10,ehLeft,evtop);
end;



20-10-2009 10:11
>>> FAQ на англ. языке, я язык не знаю, ток 2-3 слова
Ну, тогда или учите английский, или ищите документацию на русском. Как Вы можете разрабатывать программы, если Вы не владеете инструментом разработки и не имеете возможности (желания?) этот инструмент изучать?

Поясняю: умение запустить Delphi и разместить на форме компоненты НЕ эквивалентно владению инструментом.

P.S. В методах класса TCanvas нет ничего сложного. Но описание все же надо каким-то образом прочитать.
 Geo


20-10-2009 09:25
переделать его под свою канву - задача для самых начинающих. - говорить легко...
Нажать F1, посмотреть свойства TBitmap, найди среди них Transparent и прочитать всё, что с ним связано - это тоже вполне по силам любому новичку. - весь FAQ на англ. языке, я язык не знаю, ток 2-3 слова...ставил Transparent - true все без толку. белый квадрат как был так и остается....
а просто залил бы предварительно Bitmap нужным мне цветом, а потом бы уже выводил. - а на как залить то, цветом... заранее спасибо


20-10-2009 06:36
>>> найди среди них Transparent
А я бы даже не стал возиться с Transparent, а просто залил бы предварительно Bitmap нужным мне цветом, а потом бы уже выводил. Результат получится лучше, если при выводе есть антиалиасинг. Если делать через Transparent, то у элементов будет светлая каемочка.
 Geo


20-10-2009 02:12
сообщение от автора материала
а по подробнее можно, как это сделать...я ток новичок в дельфи

А куда ж ещё подробнее? Пример того, как рисовать формулы на канве, у вас есть, переделать его под свою канву - задача для самых начинающих. Нажать F1, посмотреть свойства TBitmap, найди среди них Transparent и прочитать всё, что с ним связано - это тоже вполне по силам любому новичку.


19-10-2009 13:38
"В зависимости от того, что вам нужно, вы можете либо вообще отказаться от промежуточного растра и рисовать формулу прямо на нужной канве, либо включить для этого растра режим прозрачности." - а по подробнее можно, как это сделать...я ток новичок в дельфи...заранее спасибо..


19-10-2009 04:24
сообщение от автора материала
почему виден белый квадрат(размер соответствующий image в котором отображается формула) на другом фоне, можно ли его убрать??

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


18-10-2009 13:45
примечание к предыдущему моему коменту: не красивая прога, у меня получается...а то можно подумать как будто не красивая прога автора...прога классная, спс автору....


18-10-2009 13:43
У меня такой вопрос, почему виден белый квадрат(размер соответствующий image в котором отображается формула) на другом фоне, можно ли его убрать?? ...а то не красивая прога получается... заранее спасибо.


11-01-2009 09:47
Эпохальная работа. По поводу хинтов - не согласен с автором, лишнее процессорное время - небольшая плата за очистку окна компилятора от мусора, мешающего замечать действительно полезную информацию. Тем более, в некоторых случаях и излишний код не нужен, скорее лишний код нужно сократить.

В случае с Val - при повторном вызове можно использовать StrToInt из SysUtils.

По поводу обрезания обоих типов операндов (integer и cardinal) - это правильное предупреждение, ибо это разные типы данных, и integer(cardinal(high(cardinal) div 2)+1)=low(integer). Если есть уверенность в своих действиях, можно указать приведение типов явно, например, в строке 2359:
                    Canvas.Rectangle(X+2*WX+GM.gmptGlyphOrigin.x,Y1,X+2*WX+GM.gmptGlyphOrigin.x+integer(GM.gmBlackBoxX),Y1+WY)

После этого хинта не будет.

Однако, с энтузиастами, удалившими библиотеку из проекта, я тоже не согласен. Своих рук нет или радиус загиба мал? ;)


10-01-2009 18:51
Еще одно огромное спасибо автору за разработку.

Г-ну Виктору по поводу
Вот список хинтов и предупреждений, возникающих при компиляции с модулями ExprDraw.pas и ExprMake.pas
хотелось бы заметить, что мне потребовалось не более получаса для того, чтобы все их устранить путем тривиальной доработки кода.

Заодно добавил еще два токена 'AND' и 'OR' для операций логического умножения и сложения - транслирую их в unicode $2227 и $2228.


07-12-2008 13:23
Извиняюсь, забыл в примерчик заглянуть


07-12-2008 11:45
сообщение от автора материала
как можно узнать размер формулы в пикселях?

Странный вопрос. Вы не заметили, что у TExprClass есть свойства Width и Height?


07-12-2008 10:46
Спасибо за формулы. Очень помогли. Вот только у меня один вопрос: как можно узнать размер формулы в пикселях? Я ее рисую на картинке и затем сохраняю. Нужно чтобы размер картинки соответствовал размеру формулы.


12-05-2008 05:53
(задумчиво) Вот и Geo из отпуска вернулся...


30-04-2008 01:36
Т.е. сообщение о плите вы пропустили... Что и требовалось доказать... Не смешно... а пятая строка про что как не про плиту... Если бы было "не смешно" каждый раз когда на актёра что-то падает или он от куда-нибудь падает, то..., хотя фиг с ними, всё равно было бы смешно.
 riff


30-04-2008 01:25
- А почему ты не почистил ботинки? Ты уверен, что так и надо? - Ты видел какая грязь на улице от стройки... какой смысл?
- А почему ты не взял с собой носовой платок? - Я иду сегодня отдыхать на природу, на кой мне там платок?
- Видишь, на небе тучки. Почему ты не взял с собой зонтик? - До машины два шага.
- А почему ты не поздоровался соседкой из десятого подъезда? - А ты уверен что я знаю всех жильцов такого длинного дома?
- Мужик, на тебя сейчас может упасть бетонная плита... - Мы на съёмках фильма. Так и должно быть по сценарию.
- Сегодня одиннадцатое число, а ты не заплатил за телефон. Так и надо? - Карточки продают на каждом углу. Кончатся деньги куплю.
- У Иван Иваныча через два дня день рождения. А ты не купил подарок... - Иван Иваныч - чмо. Я ему сказал это в глаза. Ты думаешь он ждёт ещё и подарок?


Т.е. сообщение о плите вы пропустили... Что и требовалось доказать... Не смешно...


30-04-2008 01:06
- А почему ты не почистил ботинки? Ты уверен, что так и надо? - Ты видел какая грязь на улице от стройки... какой смысл?
- А почему ты не взял с собой носовой платок? - Я иду сегодня отдыхать на природу, на кой мне там платок?
- Видишь, на небе тучки. Почему ты не взял с собой зонтик? - До машины два шага.
- А почему ты не поздоровался соседкой из десятого подъезда? - А ты уверен что я знаю всех жильцов такого длинного дома?
- Мужик, на тебя сейчас может упасть бетонная плита... - Мы на съёмках фильма. Так и должно быть по сценарию.
- Сегодня одиннадцатое число, а ты не заплатил за телефон. Так и надо? - Карточки продают на каждом углу. Кончатся деньги куплю.
- У Иван Иваныча через два дня день рождения. А ты не купил подарок... - Иван Иваныч - чмо. Я ему сказал это в глаза. Ты думаешь он ждёт ещё и подарок?

:o)
 riff


30-04-2008 01:04
>>> Красиво Бел Амор перевёл разговор в другую плоскость. А то, что чела тупо ломает мысль заплатить, выкинул из контекста...

Хм... Тут и так всё понятно и разногласий не предвидится... Зачем повторяться? Кстати, речь шла не о "заплатить", а о том, что "если тебе надо, то исправь сам своими собственными ручками и используй...". Я хотел высказать несогласие с подходом, что "если ты профи и уверен, что предупреждение - не по делу, то можно игнорировать..." К Антону никаких претензий нет: он написал всё это для себя и сам волен определять что и как... Он просто поделился кодом. Любой может использовать идеи или куски из этого кода. Но я против пропаганды "забивательства" на предупреждения, наблюдающейся в комментариях...


30-04-2008 00:17
Красиво Бел Амор перевёл разговор в другую плоскость. А то, что чела тупо ломает мысль заплатить, выкинул из контекста...
 riff


29-04-2008 15:18
Geo:
Хм... Знаете, в общении человека с компьютером, последнее слово принято оставлять за человеком.


Жаль, что это принято не во всех мелких, а особенно, мягких фирмах... :)

Если программист один или есть небольшой коллектив разработчиков с высоким уровнем подготовки и ответственности, то эти правила не нужны.

Желательны...

Аналогия. Навряд ли взрослый сознательный человек будет стоять перед совершенно пустой дорогой в ожидании зеленого сигнала светофора.

Угу... Особенно на тихой английской улочке... :)

И даже если подойти к вопросу формально, то компилятор вовсе не ругается. Если перевести на русский, то получится примерно так:
-- Э, мужик! У тебя тут такая конструкция, что переменная может оказаться не инициализированной. Может поправишь?
-- На фиг! При выполненнии кода мы никак не сможем миновать либо этот, либо этот участок кода, где и произойдет инициализация. Забей!


Вариация на тему:
- А почему ты не почистил ботинки? Ты уверен, что так и надо?
- А почему ты не взял с собой носовой платок?
- Видишь, на небе тучки. Почему ты не взял с собой зонтик?
- А почему ты не поздоровался соседкой из десятого подъезда?
- Мужик, на тебя сейчас может упасть бетонная плита...
- Сегодня одиннадцатое число, а ты не заплатил за телефон. Так и надо?
- У Иван Иваныча через два дня день рождения. А ты не купил подарок...

Меня, кстати, уже замучила мелочная опека Excel'а, который регулярно сообщает мне, что есть число, которое я почему-то интерпретирую как строку. Задолбал! Ну, нне винеовать я в том, что работаю с текстовыми строками, состоящими исключительно из цифр. И не отключается же, зараза!

Хм... А почему бы не выделить несколько ячеек и не задать им формат "Текстовый"?


29-04-2008 01:53
Я полагал, что автору было бы интересно получить чистый код, на который компилятор не ругается. Хозяий барин. Придется удалить вашу библиотеку из проекта, что жаль.

:) Забавный коммент.
Предполагается, видимо, что Антон должен на этом месте расстроиться, что его код кто-то откуда-то удалил, и бысто побежать доделывать модули, чтобы не растерять "клиентов"

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


25-04-2008 04:57
>>> Придется удалить вашу библиотеку из проекта, что жаль.
Очень странный подход. То есть Вы будете выкидывать любую бесплатную библиотеку с открытыми исходниками, если обнаружите в ней изъян (который автор не устранит)? Боюсь, Вам так придётся вообще всё с нуля писать (тоже вариант, конечно).


25-04-2008 03:24
>>> Если собирать весь проект и в нем пару тысяч warning'ов - очень легко не заметить ошибку.
Зависит от квалификации сборщика.

>>> Просто можно погасить конкретный warning соответствующей директивой компилятора.
Вообще-то плохой способ. И лучше его не использовать. Либо использовать очень и очень аккуратно.

Та же аналогия с дорогой и светфором. Вы предлагаете вообще не смотреть на сфетофор. А это плохо.
 Geo


25-04-2008 02:12
to Geo:
Увы, в крупных проектах погашение всех warning'ов - мера, не столько зависящая от уровня подготовки разработчиков. Если собирать весь проект и в нем пару тысяч warning'ов - очень легко не заметить ошибку. Но выход есть. Просто можно погасить конкретный warning соответствующей директивой компилятора.


25-04-2008 01:46
>>> Я полагал, что автору было бы интересно получить чистый код, на который компилятор не ругается.
Хм... Знаете, в общении человека с компьютером, последнее слово принято оставлять за человеком.

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

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

Если Антон говорит, что он рассмотрел все варнинги и хинты, значит, это джействительно так. Если он принял решение не устранять их, значит он отвечает за то, что эти варнинги и хинты не приведут к ошибкам в работе кода. Соответственно, ему совершенно нет смысла дописывать лишний код только для того, чтобы успокоить компилятор. Особенно, если учесть, что Антон -- минималист по стилю программирования ;-)

И даже если подойти к вопросу формально, то компилятор вовсе не ругается. Если перевести на русский, то получится примерно так:
-- Э, мужик! У тебя тут такая конструкция, что переменная может оказаться не инициализированной. Может поправишь?
-- На фиг! При выполненнии кода мы никак не сможем миновать либо этот, либо этот участок кода, где и произойдет инициализация. Забей!

Меня, кстати, уже замучила мелочная опека Excel'а, который регулярно сообщает мне, что есть число, которое я почему-то интерпретирую как строку. Задолбал! Ну, нне винеовать я в том, что работаю с текстовыми строками, состоящими исключительно из цифр. И не отключается же, зараза!

>>> Придется удалить вашу библиотеку из проекта, что жаль.
Если подходить формально, то это Вам жаль. Так что это Ваши проблемы.
 Geo


24-04-2008 12:40
Все жти предупреждения я знаю и каждое из них проверил.

Мы так и думали, что все проверено.
Но это, к сажалению, не основание для отмены инструкций по форматированию кода.
Я полагал, что автору было бы интересно получить чистый код, на который компилятор не ругается. Хозяий барин. Придется удалить вашу библиотеку из проекта, что жаль.

За советы всем спасибо.


24-04-2008 06:16
Первый -- простой: скомпилировать втихаря и сказать начальству, что библиотека посталяется без исходных кодов. Этот обман подойдёт, если надо отговорить пользоваться библиотекой, но не как скрыть хинты :) А вообщё-то этой конторе правильнее поступить как в OpenSources проектах делают.
 riff


24-04-2008 06:11
Хм... Это требование начальства?

Требование то нормальное, но вот предъявляется оно явно за пределы их (начальства) влияния :-D. Неужели они считают, что вправе предъявлять требования к разработчику сторонних модулей, чью работу бесплатно используют в своих коммерческих целях.
 Ins


24-04-2008 05:53
>>> Используем ваши модули, но у нас дисциплина разработки, чтобы по все хинты и предупреждения были ликвидированы.
Хм... Это требование начальства?

У Вас есть два выхода. Первый -- простой: скомпилировать втихаря и сказать начальству, что библиотека посталяется без исходных кодов. Второй -- сложнее: пройтись по всем хинтам и добиться их устронения, дописав очевидные куски текста, без которых легко можно обойтись.
 Geo


24-04-2008 04:08
сообщение от автора материала
Все жти предупреждения я знаю и каждое из них проверил.

Предупреждения вида Variable 'N' might not have been initialized возникают в следующих случаях:

if <условие> then
begin
  ...
  N := ...;
  ...
end;
// Ещё код, который должен выполняться всегда
if <то же самое условие> then
begin
  // Здесь используется N
end;



За пределами блоков if переменная N не используется, а то, что условие в первом и втором блоках if одинаковое и, следовательно, переменная обязательно будет инициализирована, компилятор замечать не умеет, поэтому и предупреждает. Присваивание переменной N фиктивного значения вне блока if я считаю пустой тратой процессорного времени.

Предупреждения вида Value assigned to 'R' never used - последствия использования процедуры Val. У неё два выходных параметра. По алгориму во многих случаях меня интересует только один из них. Но компилятор не даёт возможности вызывать эту процедуру, не передавая ничего в качестве ненужного мне выходного параметра. А потом ругается, что я его не использую. Фиктивное использование, лишь бы компилятор не ругался, я тоже считаю неэффективным расходванием ресурсов.

Предупреждения типа Return value of function 'TExprCap.CapWidth' might be undefined меня самого сильно достают. У этой функции есть параметр перечислимого типа. Внутри функции - case, в котором я честно перечисляю все возможные значения этого типа. Тем не менее, компилятор считает, что этот case можно как-то обойти. Глупый он, этот компилятор.

Предупреждения типа Combining signed and unsigned types - widened both operands - это смешения Cardinal и Integer. В некоторых случаях мне нужны переменные, которые могут принимать отрицательные значения, но их приходится сравнивать со значениями, которые система считает неотрицательными. Скорее всего, дело в версии Delphi - старые версии часто путали Integer и Cardinal при импорте системных функций, и то, что нормально компилировалось в старых версиях, стало компилироваться с предупреждениями в новых.

Что же касается "Не могли бы вы доработать модуль так, чтобы их не было?", то я в тексте статьи написал, как я отношусь к подобным вопросам.


24-04-2008 03:44
Вот список хинтов и предупреждений, возникающих при компиляции с модулями ExprDraw.pas и ExprMake.pas.
Не могли бы вы доработать модуль так, чтобы их не было?
Используем ваши модули, но у нас дисциплина разработки, чтобы по все хинты и предупреждения были ликвидированы. Довольно часто это помогает найти логическую некорректность или ошибку, которая пока сидит в "засаде".

Спасибо.

  [Warning] ExprDraw.pas(2014): Variable 'N' might not have been initialized
  [Warning] ExprDraw.pas(2021): Variable 'DX' might not have been initialized
  [Warning] ExprDraw.pas(2347): Combining signed and unsigned types - widened both operands
  [Warning] ExprDraw.pas(2348): Combining signed and unsigned types - widened both operands
  [Warning] ExprDraw.pas(2359): Combining signed and unsigned types - widened both operands
  [Warning] ExprDraw.pas(2931): Return value of function 'TExprCap.CapWidth' might be undefined
  [Warning] ExprDraw.pas(2985): Variable 'TW' might not have been initialized
  [Warning] ExprDraw.pas(2985): Variable 'CX' might not have been initialized
  [Warning] ExprDraw.pas(3825): Variable 'H1' might not have been initialized
  [Warning] ExprDraw.pas(3826): Variable 'H2' might not have been initialized
  [Warning] ExprDraw.pas(3908): Variable 'H1' might not have been initialized
  [Warning] ExprDraw.pas(3909): Variable 'H2' might not have been initialized
  [Warning] ExprDraw.pas(3911): Variable 'PP' might not have been initialized
  [Warning] ExprMake.pas(438): Variable 'Sign' might not have been initialized
  [Warning] ExprMake.pas(468): Variable 'Sign' might not have been initialized
  [Hint] ExprMake.pas(572): Value assigned to 'R' never used
  [Hint] ExprMake.pas(586): Value assigned to 'R' never used
  [Warning] ExprMake.pas(788): Variable 'WasIndex' might not have been initialized
  [Warning] ExprMake.pas(789): Variable 'J' might not have been initialized
  [Hint] ExprMake.pas(891): Value assigned to 'K' never used
  [Hint] ExprMake.pas(1169): Value assigned to 'K' never used
  [Hint] ExprMake.pas(1233): Value assigned to 'K' never used
  [Hint] ExprMake.pas(1290): Value assigned to 'K2' never used
  [Hint] ExprMake.pas(1285): Value assigned to 'K' never used
  [Hint] ExprMake.pas(1388): Value assigned to 'K' never used
  [Hint] ExprMake.pas(1426): Value assigned to 'K' never used
  [Hint] ExprMake.pas(1508): Value assigned to 'MD' never used
  [Hint] ExprMake.pas(1500): Value assigned to 'Dig' never used
  [Hint] ExprMake.pas(1492): Value assigned to 'Pr' never used
  [Hint] ExprMake.pas(1482): Value assigned to 'X' never used
  [Hint] ExprMake.pas(1525): Value assigned to 'K' never used


11-02-2008 01:40
сообщение от автора материала
Проблема (кк мне кажется) в разделителе ",", стоящем в параметраз ОС.

ExprMake действительно допускает использование в качестве разделителя целой и дробной части только точки, потому что запятая используется в других целях - как разделитель аргументов функции, например. Чтобы функция FloatFormat независимо от настроек системы выдавала число с точкой, используйте её перегруженную версию с параметром FormatSettings, в котором будет установлен нужный DecimalSeparator.


11-02-2008 01:27
Доброго времени суток, Антон (:

В первую очередь, примите искренние слова благодарности, за оказавшиеся для меня модули! Естественно, "Для отображения математических формул используются
модули ExprDraw и ExprMake, разработанные Григорьевым Антоном, e-mail: grigorievab@mail.ru" будет добавлено (:

Вот только возник вопрос отображения вещественных чисел. Проблема (кк мне кажется) в разделителе ",", стоящем в параметраз ОС. Поясню на примере:

Procedure TForm1.Button1Click(Sender:TObject);
Var
  Formula                                               :String;
  Demo                                                  :TExprClass;
  X                                                     :Real;
Begin
X:=0.5;
Formula:='y=A*.B/('+FormatFloat('0.0',X)+'*.D)';
Demo:=BuildExpr(Formula);
Demo.Font.Size:=12;
Demo.Canvas:=Image1.Canvas;
Demo.Draw(0,0,ehLeft,evTop);
Demo.Free;
End;

Получаю ошибку "... EIncorrectExpr ... "Ожидается ")" в позиции 9". Подскажите пожалуйста, я где-то неправ?


05-07-2007 18:53
А какие есть компоненты для .Net выполняющие схожие функции. Сейчас мне это очень нужно


05-07-2007 07:12
сообщение от автора материала
Можно ли мне как-нибудь использовать эти модули в .NET

Только после серьёзной переделки. Всю графическую часть придётся подвергнуть ревизии, потому что там активно используется GDI, а в .NET нет GDI, только GDI+.


05-07-2007 07:10
Можно ли мне как-нибудь использовать эти модули в .NET


28-04-2006 01:54
Ссылка на архив поправлена.
Проверено: архив не битый.


13-11-2003 11:36
Что каксается TeX, то можно использовать его разновидность, которая используется в пакете WebEq (www.dessci.com/webmath/webeq/features.stm ) и позволяет вставлять формулы в html-страницы в виде Java-аплетов.


27-01-2003 15:18
архив битый - есть альтернативный адрес для скачивания?


21-01-2003 20:29
Григорьеву:
А я уже хотел свой компонент лепить.
Обязательно упомяну Вас в подробном About.
http://kgrlab.narod.ru/krepl_w2.html


09-01-2003 14:12
Видел какой-то редактор LaTex (Science Work Place, еще под Windows 3.1); нобор формул - через короткие клавиши или тыканием на пиктограммы. Выглядит похоже на ворд.


24-12-2002 20:44
>>>Однако, вызывает недоумение, почему автор разрабатывал свой  
>>>собственный язык описания формул, есть же TeX, LaTeX и т.д.

Может кто встречал редакторы для ТеХ, которые помимо раскраски текста отображают уже готовые формулы во время набора текста?


09-12-2002 11:57
1. Пирогову.
А Вы сами пробовали использовать тех для вывода формул в виндоус-приложение?
Что касается MathML, то попробуйте-ка найти в интернете ActiveX-ы, позволяющие производить редактирование или хотя бы вывод на экран, не так это все просто.
2. Автору.
Несколько лет назад я хотел написать что-то подобное и точно с такой же целью. Вплотную до дела не дошло, но я хотя бы испробовал варианты с тем же техом, латехом, MicrosoftEquation, MathML, маткадом и матлабом. Что-то, конечно, почерпнул, но сделал вывод, что это все не годится, и нужно писать свое. Времени у меня не было и не будет, так что Вам большое спасибо за результат, который, может быть, и не на пять с плюсом, но зато вполне реальный, а это не так-то и просто. Если время и силы все же найдутся, все проверю и пришлю замечания и предложения (тоже, надеюсь, уже готовые).


05-12-2002 10:43
Спасибо за исправление, отличный компонент.


05-12-2002 10:36
сообщение от автора материала
Кузнецову Алексею:

Вернусь к вопросу о функции exp. Её я не ввёл по следующей причине: в формулах в разных случаях пишут либо e^x, либо exp(x). Если ввести в ExprMake функцию Exp, которая будет превращать выражение в e^x, то exp(x) написать уже не получится. А сейчас у человека есть выбор.


04-12-2002 19:01
Уважаемые жители, обновление архива (с решенной проблемой работы под Windows 98/ME) выложено на сервер 04 декабря.



03-12-2002 11:27
сообщение от автора материала
Алексею Кузнецову:

>>> Как насчет добавть в библиотеку, точнее в разборщик выражений (для большей совместимости с Borland Object Pascal-ем), следущие функции: Power(e1, e2) и Exp(e1), ведь поддержка ф-ии Abs реализована...

Да я и Abs и Sqr больше по инреции добавил, не нужны они там по большому счёту. А если это нужно лично вам, то добавить-то нетрудно.

>>> И еще один вопрос, а где автор (с какой целью) применяет свою библиотеку (мне просто интересно).

Я аспирант МИФИ, сейчас разрабатываю движок для создания электронных учебных пособий. Так как ориентировано это всё на физику (прежде всего, физику плазмы - мою специальность), формул там предостаточно.


Для всех, у кого Windows 98/ME: я нашёл причину ошибок, возникающих в этих ОС. Они связаны с неполной поддержкой Unicode в них. Почему не возникает проблем на моей машине с Windows 95 OSR 2.1, я так и не понял. Возможно, установлены дополнительные компоненты, реализующие эту поддержку. В любом случае, в ближайшем будущем появится обновлённая версия модулей, совместимая с Windows 98/ME, которая с разрешения Королевы будет выложена здесь.


02-12-2002 14:02
Автору: Как насчет добавть в библиотеку, точнее в разборщик выражений (для большей совместимости с Borland Object Pascal-ем), следущие функции: Power(e1, e2) и Exp(e1), ведь поддержка ф-ии Abs реализована... И еще один вопрос, а где автор (с какой целью) применяет свою библиотеку (мне просто интересно). Я - в своем редакторе формул, в режиме просмотра воткнул отрисовку с помощью этой замечательной библиотеки. И последнее, что интересно, мой внутренний формат хранения формул совпал с вашим на 99% :) и поэтому все так легко интегрировалось, хотя я до последнего времени ничего про эту либу не знал :)


29-11-2002 11:24
OK.
При запуске откомпилированого файла ExprGuide - выдается сообщение - "неверный параметр", ошибка возникает, наверно, при обращении к одной из функций GDI.
При работе с исходным кодом - Delphi6(7) - добавляем в uses модуль types - там описан тип TagSize (модуль windows в delphi5). (Кстати, есть разница в декларации типа в delphi5 и delphi6). runtime-ошибка возникает в процедуре MakePict - неправильно вычисляется координата DY - такое ощущение, что идет неправильное приведение или переполнение типа в процедуре TExprClass.Draw. Путь ошибки такой MakePict ->Expr.Draw(5,DY,ehLeft,evTop) -> Paint(X,Y)-> вычисление смещения положения элемента относительно базовой линии. Посколько код работает в win2000, winXP (проверялось) возможно ошибка скорее в microsoft :) (т.е. специфика типов, GDI в win98). Но, думаю, автор разберется лучше меня.


29-11-2002 10:32
сообщение от автора материала
Для creo: не вы первый мне об этом сообщаете. Про 98 и про ME. Вот только никто не хочет мне точно сказать, в каком месте и какая ошибка возникает. А у меня самого нет машины с 98-ым, на которой я мог бы это проверить. Будет точная информация - будет исправление.


29-11-2002 10:29
сообщение от автора материала
Кузнецову Алексею: для числовых индексов не обязательно использовать "_", ваше выражение можно написать ещё короче: "f=x1*z1". А умножение без знака модули не понимают потому, что иначе получается неопределённость в трактовании некоторых выражений. Например, tg(x) - это то ли тангенс x, то ли t, умноженное на g(x). Человек, конечно, в такой записи разберётся, а вот научить этому компьютер - задача хоть и выполнимая, но непростая.

Редактор типа MS Equation сделать вполне реально, хотя понадобится долго "вылизывать" код. Не уверен, правда, что это будет работать быстро - ExprDraw с точки зрения скорости далёк от идеала. Но передо мной такая задача не стоит, а свободного времени для написания такого редактора просто так мне явно не хватает, так что в ближайшем будущем я заниматься им не буду.


29-11-2002 10:13
Замечательная библиотека, большое спасибо ее автору!!!

Я ее подключил к своему проекту буквально за 30 минут, все прекрасно работает. Хотя оказалось что разборщик выражений не берет например такое: f = x_1z_1, ему в таком случае надо явно указывать f = x_1*z_1.

Хотелось бы спросить у автора, а насколько сложно будет реализовать следующий шаг - редактор а-ля как в MS Word-е -> MS Equation


29-11-2002 09:54
под windows98 SE не работает :(


28-11-2002 10:48
сообщение от автора материала
Пирогову А.В.: потому что я писал этот модуль для себя, а с Tex"ом и т.д. мне работать не приходилось, я не знаю, какой там язык используется. И мне легче было придумать свой, чем искать документацию по чужому и разбираться с ней.


28-11-2002 10:16
Безусловно модуль интересный и полезный.
Однако, вызывает недоумение, почему автор разрабатывал свой собственный язык описания формул, есть же TeX, LaTeX и т.д.
Правда, есть достаточно распростаненный MathML, о котором слышал но не видел.


Добавьте свое cообщение

Вашe имя:  [Войти]
Ваш адрес (e-mail):На Королевстве все адреса защищаются от спам-роботов
контрольный вопрос:
Какой месяц идет после марта?
в качестве ответа на вопрос или загадку следует давать только одно слово в именительном падеже и именно в такой форме, как оно используется в оригинале.
Надоело отвечать на странные вопросы? Зарегистрируйтесь на сайте.

Оценка содержания
 
Содержит полезные и(или) интересные сведения
 
Ничего особенно нового и интересного
 
Написано неверно (обязательно укажите почему)


Оценка стиля изложения
 
Все понятно, материал читается легко
 
Есть неясности в изложении
 
Непонятно написано, трудно читается

Текст:
Жирный шрифт  Наклонный шрифт  Подчеркнутый шрифт  Выравнивание по центру  Список  Заголовок  Разделительная линия  Код  Маленький шрифт  Крупный шрифт  Цитирование блока текста  Строчное цитирование
  • вопрос Круглого стола № XXX

  • вопрос № YYY в тесте № XXX Рыцарской Квинтаны

  • сообщение № YYY в теме № XXX Базарной площади
  • обсуждение темы № YYY Базарной площади
  •  
     Правила оформления сообщений на Королевстве
      
    Время на сайте: GMT минус 5 часов

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

    Web hosting for this web site provided by DotNetPark (ASP.NET, SharePoint, MS SQL hosting)  
    Software for IIS, Hyper-V, MS SQL. Tools for Windows server administrators. Server migration utilities  

     
    © При использовании любых материалов «Королевства Delphi» необходимо указывать источник информации. Перепечатка авторских статей возможна только при согласии всех авторов и администрации сайта.
    Все используемые на сайте торговые марки являются собственностью их производителей.

    Яндекс цитирования