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

Я изменил название пулл реквеста. Просто на форуме название не обновилось.

Восстановил версию на сайте после сбоя.

Крупные кнопки - это результат сбоя в локальном репозитории.

Сбой обновления с закрытием среды - это результат некорректного исправления ошибки с асинхронным обновлением. Вернул всё назад. Пусть будет синхронное.

4 лайка

Здравствуйте! Очень хотелось бы увидеть в Pascal NET темную тему. Возможно ли это в будущем? PS: Возможно про темную тему уже писали, мне просто лень читать все комментарии

2 лайка

Что то последнее время снова об этом часто стали писать… Вот последнее:

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

4 лайка

Видимо, очередной кульный хацкер с неважным знанием русского языка.

1 лайк

Тьма!

Темная тема давно назрела. Помню, раньше был аргумент, что «серьёзные ide» такое не используют, но сейчас основные игроки: Visual Studio, IntelliJ IDEA — обладают такой опцией.

1 лайк

А еще в Америке и на Западе процветают идеи феминизма и ЛГБТ-сообществ. И что нам до них? Будем в Справке делать опцию, чтобы о PascalABC.NЕТ можно было читать и говорить в женском и среднем роде?

2 лайка

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

1 лайк
type
  T0 = class
  public
    auto property X: integer;
  end;
  
  T1 = class
  private
    instance: T0;

  public
    property X: integer read instance.X write instance.X; // Program3.pas(11) : Ожидалось имя процедуры или функции
  end;
  
begin
end.

Это адекватная реакция компилятора?

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

1 лайк

А есть ли что то плохое в том чтоб расширить старый синтаксис тут?

1 лайк

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

1 лайк

Вопрос внутри кода

{$reference 'System.Windows.Forms.dll'}
{$reference 'System.Drawing.dll'}

uses 
  System, System.Windows.Forms, System.ComponentModel;


procedure SomeClosing(s: object; e: FormClosingEventArgs);
begin
  writeln('выполнилось');
end;


begin
  var MainForm := new Form;
  MainForm.FormClosing += SomeClosing;
  
  // Как мне тут удалить все делегаты из MainForm.Closing не используя имя SomeClosing. (т.е. так нельзя MainForm.Closing -= SomeClosing;)
  // в C# это делается приравниванием к null
  // MainForm.Closing := nil; но тут ошибка
  
  Application.Run(MainForm);
end.

Никак. И даже если бы можно было - это говнокод. Правильно - выбирать поведение в SomeClosing, через if, или лучше case.

Это не очень хороший выход из ситуации (не зависимо от языка). Может, например, возникнуть потребность вернуть всё как было - до приравнивания к null. То есть, придётся каким-то образом добавлять всё обратно. Это - лишняя работа. Лучше хранить, например, в какой-то переменной типа bool флаг, указывающий используются ли делегаты из MainForm.Closing или нет. В виде кода:

    /// <summary>
    /// Какой-то класс.
    /// </summary>
    public class MyClass
    {
        /// <summary>
        /// Событие.
        /// </summary>
        public event Action Event;

        /// <summary>
        /// Метод, вызывающий событие.
        /// </summary>
        public void Method()
        {
            // Какой-то код.
            Event?.Invoke();
            // Какой-то код.
        }
    }

    internal class Program
    {
        private static bool flag;

        private static void MethodA()
        {
            if (!flag)
                return;
            // Какой-то код.
        }

        private static void MethodB()
        {
            if (!flag)
                return;
            // Какой-то код.
        }

        private static void Main(string[] args)
        {
            MyClass x = new MyClass();
            x.Event += MethodA;
            x.Event += MethodB;
            Flag = true;
            x.Method(); // Действия из MethodA, MethodB - выполняются.
            Flag = false;
            x.Method(); // Никаких действий не произойдёт.
        }
    }

, либо:

    internal class Program
    {
        private static bool flag;

        private static void MethodA()
        {
            // Какой-то код.
        }

        private static void MethodB()
        {
            // Какой-то код.
        }

        public static void MainMethod()
        {
            if (!flag)
                return;
            MethodA();
            MethodB();
        }

        private static void Main(string[] args)
        {
            MyClass x = new MyClass();
            x.Event += MainMethod;
            Flag = true;
            x.Method();
            Flag = false;
            x.Method();
        }

В pabcnetc копирайт до сих пор 2018)

image

Откатил правки Kotov - т.к. GenerateAllSetups перестал собирать инсталлят

1 лайк

Это не про то, что я писал в свое время? :stuck_out_tongue_winking_eye:

1 лайк