Замечания и предложения

Товарищи, приведенный тут пример из С++ вообще не из реалий .NET. Зачем оно в нем нужно - иметь возможность объявлять всякие массивы на стеке с вычисляемым количеством значений(int Arr[N]), генерить шаблоны с переменными-аргументами, значения которых должны быть известны на этапе компиляции (template <int N>)… Таких проблем в Паскалях нет, и делать костыли для их решения абсолютно бессмысленно.

Кстати, вроде ж когда-то кто-то писал в качестве дипломной, или еще какой работы, плагин для Eclipse? Мертв?

Простите, генерация магических чисел в коде - вообще не лучший паттерн. Совсем.

Все плагины для Эклипса пишутся в расчёте на конкретную версию Эклипса и с другими не работают. По крайней мере, с другими я не талкивался. Тот плагин благополучно 4 года назад работал с какой-то версией Эклипса.

Собственно, нет проблем. Если кто-то хочет взяться - можно внедрить консольный компилятор в Visual Studio Code - говорят, очень хороший редактор.

Так и не надо!

@Admin как насчёт выложить презентации с pascalabc.net на гитхаб? Там тонна ошибок, в основном опечаток и остальной мелочи, вроде того что в последовательностях Range('a','z').Println ставит пробелы между буквами, хотя если запустить в паскале - выводит без пробелов.

Сколько бы там нибыло ошибок - там всё объясняется всё же лучше, чем смог бы я, поэтому я обычно на эти презентации посылаю новичков с куберфорума. Но, всё же, не хорошо, что там так много моментов которые запутывают.

Я когда то пробовал писать сюда что именно не так, но ничего из этого не вышло. Пулл реквестами исправлять было бы проще, и за того сколько там ошибок.

1 лайк

Сделал новую тему:

В каком формате выкладывать и как Вы планируете править?

А не хотите на Киберфоруме сделать ссылки на раздел книги на нашем сайте?

Где? Я в закреплённые темы не писал, и, это скорее ваша работа, как разработчиков.

А на презентации я даю ссыль в каждой конкретной ситуации отдельно.

Ясно. Ну, киберфорум - не наша вотчина

Как насчёт добавить перегрузки операторов += и -= для System.IntPtr? В C# они автоматически выводятся из + и -, а вы вроде для всего стандартного, даже такого как BigInteger эти перегрузки в PABCSystem делали.

Опять пытаемся сползти к арифметике указателей? Очередной круг? Было бы неплохо прочитать тут, кому, в каких случаях и как часто это может быть нужно.

Арифметику указателей уже согласились сделать и issue уже висит.

Тут другое, это стандартный тип, при чём, совместимый с object и используемый чаще указателей.

Это не ответ. Например, если указатели используются в 0.01% программ, то 0.02% - это вдвое (!) чаще, но все равно лишь два случая на десять тысяч.

А на что вы собираетесь делать указатели? Если на массивы, для чего в первую очередь предназначена арифметика указателей, то в PascalABC.NET это сделать просто не получится. Если для чего-то специфического, то это незачем встраивать в язык - сделайте перегрузку += самостоятельно и пользуйтесь.

Итак, для чего?

Самый простой пример - Bitmap.LockBits. И так же это работает с любым другим буфером в графике.

Да и если массив - в GCHandle ничего сложного нет. Хотя тут полезность спорная, конечно.

Ну и, далее эти IntPtr нужны в чём то вроде System.Buffer.MemoryCopy.

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

PascalABC.NET позиционируется как высокоуровневый язык - ну и - если вы помните - я делал топик, где обсуждал его основное предназначение - образование и академическая сфера.

2 лайка

Предлагаю сделать возможность создания объекта ABCObject, без немедленной отрисовки. Например:

  1. Constructor RectangleABC.Create(x,y,w,h: integer; cl: GColor, Flag: boolean:= true);
  2. begin
  3. inherited Init(x,y,w,h,cl);
  4. if Flag then InternalDraw;
  5. end;

ABCObjects, как и все остальные модули использующие GDI - более не поддерживаются. Сейчас вместо них используются GraphWPF, WPFObjects и т.п.

А насчёт предложения - если надо чтоб несколько объектов появились одновременно:

uses GraphWPF, WPFObjects;

begin
  var rects_created := false;
  
  BeginFrameBasedAnimation(()->
  begin
    
    if not rects_created then
    begin
      rects_created := true;
      Sleep(500);
      
      for var x := 0 to 50 do
        for var y := 0 to 20 do
          new RectangleWPF(20+x*10,20+y*10,10,10,Color.FromRgb(Random(255),Random(255),Random(255)));
      
    end;
    
  end);
end.

BeginFrameBasedAnimation в GraphWPF работает примерно как LockDrawing в GraphABC.
Пока процедура перерисовки не закончит выполнятся - экран не обновится.

Может и в GraphABC можно так же сделать через LockDrawing, но лучше всё же забыть про него и перейти на WPF.

P.S. Код на этом форуме выделяется так:

```
код
```

будет выглядеть как:

код

А так же:
`однострочный код`

будет выглядеть как:
однострочный код

Знак ` находится в англ раскладке, за Ё.

Заметил что в GraphABC.Redraw() отсутствует tempbmp.Dispose(); Мне нужна была частичная перерисовка, написал такую функцию:

procedure Redraw(rect:Rectangle);
var
  tempbmp: Bitmap;
  gr:Graphics:= GraphWindowGraphics;
begin
  if MainForm.WindowState = FormWindowState.Minimized then exit;
  
  tempbmp := GetView(GraphBufferBitmap, rect);
  //tempbmp.SetResolution(gr.DpiX, gr.DpiY);
  System.Threading.Monitor.Enter(GraphAbcControl);
    var m := gr.Transform;
    gr.ResetTransform;
    gr.DrawImage(tempbmp, rect.X, rect.Y);
    gr.Transform := m; 
  System.Threading.Monitor.Exit(GraphAbcControl);
  tempbmp.Dispose();
end;

Ещё раз:

Если не понимаете - это значит что их уже не будут исправлять и дополнять. Используйте модули на основанные на WPF. Или используйте System.Drawing напрямую, без стандартных модулей.