GraphWPF - вопросы

Предлагаю выкладывать сюда вопросы по GraphWPF.

1 лайк

Вопрос: Что такое 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 когда вы так же пишете - вам показывает вторую перегрузку при наведении мышки:

image

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.

Перед тем, как задать вопрос, скачал новую версию, удалил вручную папку \PABCWork.NET\ (где-то на форуме прочел такую рекомендацию), установил свежую версию, но … не помогло. Сейчас попробую деинсталировать PAscalABC.Net, вручную удалить его папку из Program Files (может там какие-то “хвосты” остаются?)

Выполнил и это. Все удалил ручками. Поставил заново, указал другую папку для проектов, зашел в нее, открыл файл Система координат.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>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e</td></tr>
<tr><td><code>/// Тип кисти;</code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ameters = static class</td></tr>
<tr><td><code>/// Цвет кисти;</code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;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. Пусть он старый, но больше подходит под мои замыслы.

Обнаружил несостыковку работы двух модулей GraphWPF и TurtleWPF. Черепаха не реагирует на команду SetMathematicCoords и перемещается на пиксели (это видно по команде Forw(50))

Такого не наблюдается при связке Turtle и GraphWPF

Напишите везде Pnt(-4,0)

Посмотрите внимательнее, на что это был ответ. Справа сверху сообщения админа. Сразу можно тыкнуть чтобы открыть.

думал на черепашку

Что я должен понять из этого? Что Черепаха двигается не так? Или, что не возникает коллизии при подключении еще одного модуля? Или это к разработчикам?