 |  | |  | |
Модули для рисования математических формул | Полный текст материала
Другие публикации автора: Антон Григорьев
Цитата или краткий комментарий: «... Библиотека
содержит классы, достаточные для отображения практически любой формулы. ...» |
Важно:- Страница предназначена для обсуждения материала, его содержания, полезности, соответствия действительности и так далее. Смысл не в разборке, а в приближении к истине :о) и пользе для всех.
- Любые другие сообщения или вопросы, а так же личные эмоции в адрес авторов и полемика, не относящаяся к теме обсуждаемого материала, будут удаляться без предупреждения авторов, дабы не мешать жителям нормально общаться.
- При голосовании учитывайте уровень, на который расчитан материал. "Интересность и полезность" имеет смысл оценивать относительно того, кому именно предназначался материал.
- Размер одного сообщений не должен превышать 5К. Если Вам нужно сказать больше, сделайте это за два раза. Или, что в данной ситуации правильнее, напишите свою статью.
Всегда легче осудить сделанное, нежели сделать самому. Поэтому, пожалуйста, соблюдайте правила Королевства и уважайте друг друга.
Добавить свое мнение.
| | Содержит полезные и(или) интересные сведения | [1] | 21 | 100% | | | | Ничего особенно нового и интересного | [2] | 0 | 0% | | | | Написано неверно (обязательно укажите почему) | [3] | 0 | 0% | | Всего проголосовали: 21 | | | Все понятно, материал читается легко | [1] | 19 | 95% | | | | Есть неясности в изложении | [2] | 0 | 0% | | | | Непонятно написано, трудно читается | [3] | 1 | 5% | | Всего проголосовали: 20 |
[Синтаксический анализ, разбор выражений, парсинг] [Перерисовка компонент] [GDI, рисование на канве]
Отслеживать это обсуждение 
Всего сообщений: 8011-03-2014 22:23Vitek
Никакой специальной установки модулей не нужно, просто поместите файлы 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
25-05-2013 06:58Очень хорошая библиотека. Отвечаю. Сам использовал. |
|
24-05-2013 12:24сообщение от автора материала ExprDraw предназначен умеет только одно: отрисовывать нужную формулу там, где укажут. И ещё вычислять её размеры. Интегрирование этой формулы в Memo, в текст, в картинку - это отдельная задача, которую нужно решать самостоятельно тем способом, который наилучшим образом подходит именно для вашей задачи. Свой вариант решения этой задачи я вам, уж извините, не дам - слишком сложно выдирать этот код из проекта, а отдавать просто так весь такой большой проект не хочется. Но задачка-то элементарная, если немного подумать, сделать очень просто, тем более что при тех объёмах памяти, которые стоят на современных машинах, её можно решить намного изящнее, чем это сделал я десять с лишним лет назад. |
|
23-05-2013 00:08Пример, но не очень понятный. Отдельные формулки отрисовать получается, а как внедрить формулу в текст, да если ещё и много? Можно ли использовать с memo? |
|
21-05-2013 04:35ExprGuide - это и есть пример использования, разве нет? |
|
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
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
Я был неверно понят (или я неверно высказался). Я имел в виду, что не стоит для всего проекта отключать какой-то хинт или варнинг (ну, за исключением некоторых). А гасить каждый конкретный хинт в каждом месте его появления — наверное, это будет неплохо. |
|
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 |
|
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 нет ничего сложного. Но описание все же надо каким-то образом прочитать. |
|
20-10-2009 09:25переделать его под свою канву - задача для самых начинающих. - говорить легко...
Нажать F1, посмотреть свойства TBitmap, найди среди них Transparent и прочитать всё, что с ним связано - это тоже вполне по силам любому новичку. - весь FAQ на англ. языке, я язык не знаю, ток 2-3 слова...ставил Transparent - true все без толку. белый квадрат как был так и остается....
а просто залил бы предварительно Bitmap нужным мне цветом, а потом бы уже выводил. - а на как залить то, цветом... заранее спасибо |
|
20-10-2009 06:36>>> найди среди них Transparent
А я бы даже не стал возиться с Transparent, а просто залил бы предварительно Bitmap нужным мне цветом, а потом бы уже выводил. Результат получится лучше, если при выводе есть антиалиасинг. Если делать через Transparent, то у элементов будет светлая каемочка. |
|
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Т.е. сообщение о плите вы пропустили... Что и требовалось доказать... Не смешно... а пятая строка про что как не про плиту... Если бы было "не смешно" каждый раз когда на актёра что-то падает или он от куда-нибудь падает, то..., хотя фиг с ними, всё равно было бы смешно. |
|
30-04-2008 01:25- А почему ты не почистил ботинки? Ты уверен, что так и надо? - Ты видел какая грязь на улице от стройки... какой смысл?
- А почему ты не взял с собой носовой платок? - Я иду сегодня отдыхать на природу, на кой мне там платок?
- Видишь, на небе тучки. Почему ты не взял с собой зонтик? - До машины два шага.
- А почему ты не поздоровался соседкой из десятого подъезда? - А ты уверен что я знаю всех жильцов такого длинного дома?
- Мужик, на тебя сейчас может упасть бетонная плита... - Мы на съёмках фильма. Так и должно быть по сценарию.
- Сегодня одиннадцатое число, а ты не заплатил за телефон. Так и надо? - Карточки продают на каждом углу. Кончатся деньги куплю.
- У Иван Иваныча через два дня день рождения. А ты не купил подарок... - Иван Иваныч - чмо. Я ему сказал это в глаза. Ты думаешь он ждёт ещё и подарок?
Т.е. сообщение о плите вы пропустили... Что и требовалось доказать... Не смешно... |
|
30-04-2008 01:06- А почему ты не почистил ботинки? Ты уверен, что так и надо? - Ты видел какая грязь на улице от стройки... какой смысл?
- А почему ты не взял с собой носовой платок? - Я иду сегодня отдыхать на природу, на кой мне там платок?
- Видишь, на небе тучки. Почему ты не взял с собой зонтик? - До машины два шага.
- А почему ты не поздоровался соседкой из десятого подъезда? - А ты уверен что я знаю всех жильцов такого длинного дома?
- Мужик, на тебя сейчас может упасть бетонная плита... - Мы на съёмках фильма. Так и должно быть по сценарию.
- Сегодня одиннадцатое число, а ты не заплатил за телефон. Так и надо? - Карточки продают на каждом углу. Кончатся деньги куплю.
- У Иван Иваныча через два дня день рождения. А ты не купил подарок... - Иван Иваныч - чмо. Я ему сказал это в глаза. Ты думаешь он ждёт ещё и подарок?
:o) |
|
30-04-2008 01:04>>> Красиво Бел Амор перевёл разговор в другую плоскость. А то, что чела тупо ломает мысль заплатить, выкинул из контекста...
Хм... Тут и так всё понятно и разногласий не предвидится... Зачем повторяться? Кстати, речь шла не о "заплатить", а о том, что "если тебе надо, то исправь сам своими собственными ручками и используй...". Я хотел высказать несогласие с подходом, что "если ты профи и уверен, что предупреждение - не по делу, то можно игнорировать..." К Антону никаких претензий нет: он написал всё это для себя и сам волен определять что и как... Он просто поделился кодом. Любой может использовать идеи или куски из этого кода. Но я против пропаганды "забивательства" на предупреждения, наблюдающейся в комментариях... |
|
30-04-2008 00:17Красиво Бел Амор перевёл разговор в другую плоскость. А то, что чела тупо ломает мысль заплатить, выкинул из контекста... |
|
29-04-2008 15:18Geo:
Хм... Знаете, в общении человека с компьютером, последнее слово принято оставлять за человеком.
Жаль, что это принято не во всех мелких, а особенно, мягких фирмах... :)
Если программист один или есть небольшой коллектив разработчиков с высоким уровнем подготовки и ответственности, то эти правила не нужны.
Желательны...
Аналогия. Навряд ли взрослый сознательный человек будет стоять перед совершенно пустой дорогой в ожидании зеленого сигнала светофора.
Угу... Особенно на тихой английской улочке... :)
И даже если подойти к вопросу формально, то компилятор вовсе не ругается. Если перевести на русский, то получится примерно так:
-- Э, мужик! У тебя тут такая конструкция, что переменная может оказаться не инициализированной. Может поправишь?
-- На фиг! При выполненнии кода мы никак не сможем миновать либо этот, либо этот участок кода, где и произойдет инициализация. Забей!
Вариация на тему:
- А почему ты не почистил ботинки? Ты уверен, что так и надо?
- А почему ты не взял с собой носовой платок?
- Видишь, на небе тучки. Почему ты не взял с собой зонтик?
- А почему ты не поздоровался соседкой из десятого подъезда?
- Мужик, на тебя сейчас может упасть бетонная плита...
- Сегодня одиннадцатое число, а ты не заплатил за телефон. Так и надо?
- У Иван Иваныча через два дня день рождения. А ты не купил подарок...
Меня, кстати, уже замучила мелочная опека Excel'а, который регулярно сообщает мне, что есть число, которое я почему-то интерпретирую как строку. Задолбал! Ну, нне винеовать я в том, что работаю с текстовыми строками, состоящими исключительно из цифр. И не отключается же, зараза!
Хм... А почему бы не выделить несколько ячеек и не задать им формат "Текстовый"? |
|
29-04-2008 01:53Я полагал, что автору было бы интересно получить чистый код, на который компилятор не ругается. Хозяий барин. Придется удалить вашу библиотеку из проекта, что жаль.
:) Забавный коммент.
Предполагается, видимо, что Антон должен на этом месте расстроиться, что его код кто-то откуда-то удалил, и бысто побежать доделывать модули, чтобы не растерять "клиентов"
Я вот, кстати, тоже не люблю варнингов, и стараюсь их подавлять.
А здесь Вы перечислили не так уж много тех хинтов, чтобы самому все исправить, если уж Вам действительно нужна эта библиотека.
|
|
25-04-2008 04:57>>> Придется удалить вашу библиотеку из проекта, что жаль.
Очень странный подход. То есть Вы будете выкидывать любую бесплатную библиотеку с открытыми исходниками, если обнаружите в ней изъян (который автор не устранит)? Боюсь, Вам так придётся вообще всё с нуля писать (тоже вариант, конечно). |
|
25-04-2008 03:24>>> Если собирать весь проект и в нем пару тысяч warning'ов - очень легко не заметить ошибку.
Зависит от квалификации сборщика.
>>> Просто можно погасить конкретный warning соответствующей директивой компилятора.
Вообще-то плохой способ. И лучше его не использовать. Либо использовать очень и очень аккуратно.
Та же аналогия с дорогой и светфором. Вы предлагаете вообще не смотреть на сфетофор. А это плохо. |
|
25-04-2008 02:12to Geo:
Увы, в крупных проектах погашение всех warning'ов - мера, не столько зависящая от уровня подготовки разработчиков. Если собирать весь проект и в нем пару тысяч warning'ов - очень легко не заметить ошибку. Но выход есть. Просто можно погасить конкретный warning соответствующей директивой компилятора. |
|
25-04-2008 01:46>>> Я полагал, что автору было бы интересно получить чистый код, на который компилятор не ругается.
Хм... Знаете, в общении человека с компьютером, последнее слово принято оставлять за человеком.
Формальные правила, принятые в организациях, предназначены для уменьшения вероятности возникновения ошибок. И обусловлено это разным уровнем подготовки программистов. Если программист один или есть небольшой коллектив разработчиков с высоким уровнем подготовки и ответственности, то эти правила не нужны.
Аналогия. Навряд ли взрослый сознательный человек будет стоять перед совершенно пустой дорогой в ожидании зеленого сигнала светофора. А вот детей обычно в такой ситуации заставляют зеленого сигнала дожидаться. Именно потому, что у детей еще не выработан в должной степени механизм оценки ситуации.
Если Антон говорит, что он рассмотрел все варнинги и хинты, значит, это джействительно так. Если он принял решение не устранять их, значит он отвечает за то, что эти варнинги и хинты не приведут к ошибкам в работе кода. Соответственно, ему совершенно нет смысла дописывать лишний код только для того, чтобы успокоить компилятор. Особенно, если учесть, что Антон -- минималист по стилю программирования ;-)
И даже если подойти к вопросу формально, то компилятор вовсе не ругается. Если перевести на русский, то получится примерно так:
-- Э, мужик! У тебя тут такая конструкция, что переменная может оказаться не инициализированной. Может поправишь?
-- На фиг! При выполненнии кода мы никак не сможем миновать либо этот, либо этот участок кода, где и произойдет инициализация. Забей!
Меня, кстати, уже замучила мелочная опека Excel'а, который регулярно сообщает мне, что есть число, которое я почему-то интерпретирую как строку. Задолбал! Ну, нне винеовать я в том, что работаю с текстовыми строками, состоящими исключительно из цифр. И не отключается же, зараза!
>>> Придется удалить вашу библиотеку из проекта, что жаль.
Если подходить формально, то это Вам жаль. Так что это Ваши проблемы. |
|
24-04-2008 12:40 Все жти предупреждения я знаю и каждое из них проверил.
Мы так и думали, что все проверено.
Но это, к сажалению, не основание для отмены инструкций по форматированию кода.
Я полагал, что автору было бы интересно получить чистый код, на который компилятор не ругается. Хозяий барин. Придется удалить вашу библиотеку из проекта, что жаль.
За советы всем спасибо. |
|
24-04-2008 06:16Первый -- простой: скомпилировать втихаря и сказать начальству, что библиотека посталяется без исходных кодов. Этот обман подойдёт, если надо отговорить пользоваться библиотекой, но не как скрыть хинты :) А вообщё-то этой конторе правильнее поступить как в OpenSources проектах делают. |
|
24-04-2008 06:11Хм... Это требование начальства?
Требование то нормальное, но вот предъявляется оно явно за пределы их (начальства) влияния :-D. Неужели они считают, что вправе предъявлять требования к разработчику сторонних модулей, чью работу бесплатно используют в своих коммерческих целях. |
|
24-04-2008 05:53>>> Используем ваши модули, но у нас дисциплина разработки, чтобы по все хинты и предупреждения были ликвидированы.
Хм... Это требование начальства?
У Вас есть два выхода. Первый -- простой: скомпилировать втихаря и сказать начальству, что библиотека посталяется без исходных кодов. Второй -- сложнее: пройтись по всем хинтам и добиться их устронения, дописав очевидные куски текста, без которых легко можно обойтись. |
|
24-04-2008 04:08сообщение от автора материала Все жти предупреждения я знаю и каждое из них проверил.
Предупреждения вида Variable 'N' might not have been initialized возникают в следующих случаях:
if <условие> then
begin
...
N := ...;
...
end;
if <то же самое условие> then
begin
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
09-01-2003 14:12Видел какой-то редактор LaTex (Science Work Place, еще под Windows 3.1); нобор формул - через короткие клавиши или тыканием на пиктограммы. Выглядит похоже на ворд. |
|
24-12-2002 20:44>>>Однако, вызывает недоумение, почему автор разрабатывал свой
>>>собственный язык описания формул, есть же TeX, LaTeX и т.д.
Может кто встречал редакторы для ТеХ, которые помимо раскраски текста отображают уже готовые формулы во время набора текста?
|
|
09-12-2002 11:571. Пирогову.
А Вы сами пробовали использовать тех для вывода формул в виндоус-приложение?
Что касается 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:24OK.
При запуске откомпилированого файла 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, о котором слышал но не видел. |
|
|
|