Предлагаю выкладывать сюда вопросы по GraphWPF.
Вопрос: Что такое GraphWPF.CountVisuals?
Внутренняя переменная, которую зачем то засунули в интерфейсную часть модуля))
По крайней мере - она явно должна быть readonly, если программист должен мочь её читать - надо функцию…
Добрый день. Пытаюсь заставить работать Polygon в GraphWPF. Поиск ничего вразумительного не подсказал. В GraphABC использовал простой синтаксис Polygon((x1, y1), (x2, y2), …,(xn, yn)); Но он не проходит в GraphWPF - сообщение такое “Отсутствует перегруженная подпрограмма Polygon с таким количеством параметров”, хотя при наборе команды подсказка предлагает 2 варианта использования.
В папке \PABCWork.NET\Samples\Graphics\GraphWPF\ имеется файл с примером использования Polygon, но он также не работает. В нем предлагается такой вариант записи Polygon(Arr((-3,2),(2,1),(-2,-4)),ARGB(100,255,228,196)); Но компилятор сообщает об ошибке “Возможны 2 преобразования типов” Вопрос: как заставить работать Polygon в GrpahWPF?В GraphABC
когда вы так же пишете - вам показывает вторую перегрузку при наведении мышки:
params
значит что параметры можно перечислить, из них автоматически сделает массив.
А тип (integer,integer)
это картёж. Этот тип получается, когда вы перечисляете несколько значений любых типов в скобках.
В GraphWPF
такую перегрузку нельзя сделать, потому что в отличии от GraphABC
- допускаются координаты типа real
. А если вы пропишете что то типа:
Polygon( (1,2), (3,4.5), (6.7,8) );
То в Polygon
, получается, передаются 3 значения разных типов: (integer,integer)
, (integer,real)
и (real,integer)
- автоматически сделать из этого массив не выйдет.
Чтобы автоматически преобразовать все integer
в real
- система выведения типов слишком слабая.
А если заставить пользователя каждому числу дописывать .0
- будет ещё больше путаницы.
В общем смотрите на типы, которые показывает на вашем же скриншоте - и используйте их, вместо того чтобы пытаться передать что-то другое. Я думаю до этого вы могли бы сами догадаться, чтобы хотя бы с чего-то начать:
## uses GraphWPF;
var a: array of Point := (new Point(1,2), new Point(3,4));
Polygon(a);
А уже после этого можно искать как сократить. К примеру используя функцию Pnt
и синтаксис для создания массива внутри строчки, без доп. переменной:
## uses GraphWPF;
Polygon(|Pnt(1,2), Pnt(3,4)|);
Спасибо за ответ. Перед тем, как задать вопрос, я много чего перепробовал. Но везде “наступал на грабли”. Более всего недопонимания вносил пример из папки Samples. По логике, примеры из этой папки должны работать, но только не этот.
Все примеры тестируются перед созданием установщиков. Если где то ошибка - установщик не запакуется. Скорее всего у вас остался пример из более старой версии, который удалили и заменили чем то другим.
P.S. Нашёл PABCWork.NET\Samples\Graphics\GraphWPF\Система координат.pas
:
Polygon(Arr((-3,2),(2,1),(-2,-4)),ARGB(100,255,228,196));
И у меня это работает. Попробуйте обновиться, что ли…
В модуле GraphWPFBase
на строке ~300 для этого реализовано несколько костылей, чтобы массив картежей всё же преобразовывался к массиву точек в некоторых случаях. Подключать не нужно - он подключается из GraphWPF
.
Выполнил и это. Все удалил ручками. Поставил заново, указал другую папку для проектов, зашел в нее, открыл файл Система координат.pas, но ошибка та же самая.
Может с версией .Net Framework как то связано… Сообщите его и попробуйте обновить. Хотя это вряд ли связано…
Ну, основной план действий в таких случаях - взять содержимое GraphWPFBase
(напишите его на отдельной строчке или в uses
и Ctrl+тыкните чтобы открыть исходник) и скопировать его в отдельную программу. Добавить подпрограмму с теми же параметрами что Polygon
, но с пустым телом. И из полученного кода удалять куски, так чтобы ошибка не пропадала. В итоге хотя бы станет понятно, какая комбинация элементов программы вызывает это поведение. Затем можно будет закопаться в компилятор…
Проверю на других компьютерах. Спасибо за план. Буду выполнять. На счет версии .Net тоже возник вопрос. У меня Win10, она автоматом обновила платформу. Сейчас установлена версия 4.8.04084. А в решении остановился на предложенном выше способе: Polygon(|Pnt(-3, 2), Pnt(2, 1), Pnt(-2, -4)|); Кстати, попробовал записать так: Polygon(Arr((-3.0, 2.0),(2.0, 1.0),(-2.0, -4.0))); получил такую же ошибку “Возможны 2 преобразования типов”
Для Объекта Brush в GraphWPF реализовано только указание цвета? Стиль заливки для кисти указать нельзя?
Кхм, да, страница справки и в оригинале сломана.
<HTML><HEAD><object type="application/x-oleobject" classid="clsid:1e2a7bd0-dab9-11d0-b93a-00c04fc99f9e">
<param name="Keyword" value="Параметры">
<param name="Keyword" value="Тип">
<param name="Keyword" value="Цвет"></object>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251"><link rel="StyleSheet" href="../../../default.css">
</HEAD><body><H1>Класс BrushType</H1>
<table border=0 cellpadding=5><tr><td><code>/// Параметры рисования;</code>
<br> e</td></tr>
<tr><td><code>/// Тип кисти;</code>
<br> ameters = static class</td></tr>
<tr><td><code>/// Цвет кисти;</code>
<br> shType = class</td></tr>
</table>
</body></HTML>
Это сразу на баг тракер IDE.
Но справка тут не нужна - подсказки по наведению и Ctrl+Space уже дают более релевантную информацию. Ну и опять же, Ctrl+тык на имена чтобы открыть их исходник.
Из того что я вижу с исходников - да, только цвет настраивается.
В принципе, отдельные отдельные вещи можно более точно рисовать используя низкоуровщену:
## uses GraphWPF;
// Без этого ломается анализатор кода, хотя код компилируется...
{$reference PresentationCore.dll}
FastDraw(dc->
begin
var br := new System.Windows.Media.SolidColorBrush(Colors.Red);
var pen := default(System.Windows.Media.Pen); // nil
dc.DrawEllipse(br, pen, Pnt(100,100), 50,30);
end);
Хотя если уж так - можно подумать и о том чтобы напрямую WPF использовать, без GraphWPF, создавая своё окно.
Наверное на вашем уровне ещё будет сложно… Но простота всегда идёт взамен на возможности.
А если это предлагается ученикам 7-8 классов? В итоге, решил пока не трогать GraphWPF, а остаться на GraphABC. Пусть он старый, но больше подходит под мои замыслы.
Такого не наблюдается при связке Turtle и GraphWPF
Напишите везде Pnt(-4,0)
Посмотрите внимательнее, на что это был ответ. Справа сверху сообщения админа. Сразу можно тыкнуть чтобы открыть.
думал на черепашку
Что я должен понять из этого? Что Черепаха двигается не так? Или, что не возникает коллизии при подключении еще одного модуля? Или это к разработчикам?