g-cont
> Каким образом происходит автогенерация этого кода? Там есть какие-то жесткие
> правила?
Ну вроде же очевидно, не? Проперти на чтение данных (которое read) должно вернуть эти самые данные. Проперти на установку данных (которое write) должно принять эти самые данные, и ничего не возвращать.
> Ну типа не более одного аргумента?
Может быть и более:
property Data[Index: Integer] : Integer read GetData write SetData;
Может быть вообще сколько угодно:
property Data[Index: Integer; Name: String; Foo: TFoo] : Integer read GetData write SetData;
> В чём вобщем смысл пропертей на вызовы функций? В С++ если уж что-то прячут,
> так прямой доступ к членам класса, а вовсе не функции
Смысл в том, что позволяет тебе работать с классом поддерживая состояние всего объекта согласованным + выглядит снаружи как поле класса. В плюсах на мой взгляд очень не хватает пропертей.
g-cont
> Здесь FCancelling булева переменная, всё просто и прозрачно. Но вот более
> сложный случай:
часто можно встретить прямое чтение, и запись через метод:
protected FCancelling: Boolean; property Cancelling: Boolean read FCancelling write SetCancelling;
MrShoor
> Может быть и более:
я бы снабдил примером, на доступ к такому проперти.
property Data[Index: Integer] : Integer
Синтаскически выглядит как обращение к массиву:
a.Data[i] := N;
(для крестов это перегрузка опертора [], но в паскале такого оператора нет)
skalogryz
> Но доступ к нии маскируется под обычные поля
Я смотрю это одна из основных парадигм Delphi. Сделать работу с функциями и членами класса неотличимой друг от друга в определённых случаях.
skalogryz
> В крестах ты вынужден завозить сеттер и геттер методы.
При условии что речь идёт о переменной. А метод я просто перенесу в public - секцию, да и всё.
g-cont
> Я смотрю это одна из основных парадигм Delphi. Сделать работу с функциями и
> членами класса неотличимой друг от друга в определённых случаях.
в Паскале не любят писать много - не кресты.
Да и задача рефакторинга упрощается.
g-cont
> При условии что речь идёт о переменной. А метод я просто перенесу в public - секцию, да и всё.
и доступ к данным (в интерфейсе класса) у тебя обрастает двумя точками setNNN getNNN,
тогда как в паскале остаётся только одна NNN, при том, что сохраняется ООП-шная инкапсуляция. Ведь поле не находится в прямом доступе
ronniko
Нет, Блез Паскаль из 17го века, изобретатель закона Паскаля, треугольника Паскаля, машины сумматора и пр
Aslan
> Нет, Блез Паскаль из 17го века, изобретатель закона Паскаля, треугольника
> Паскаля, машины сумматора и пр
язык был назван Паскалем, чтобы обеспечивать дополнительное давление на мозг!
g-cont
> В чём вобщем смысл пропертей на вызовы функций?
При редактировании формы в редакторе форм нужно как-то редактировать компоненты.
Напрашивается делать это в виде списка свойств, часто виртуальных (виртуальных как реальность, не как метод), хранящихся при работе в памяти в другом виде, не так как в исходнике формы.
Кроме того, при изменении свойств нужно перерисовывать компоненты.
Вобщем без свойств редактор форм не сделать, вопрос лишь в какой мере поддерживать их языком. А дальше они расползлись по всему рантайму.
CD
Примерно понял. В моей парадигме это будет лишняя сущность. Бакэнд у VM просто будет сам загружать dfm-подобные файлы со своего уровня абстракции безо всяких проблем, в отличии от Delphi. Я просто уберу префикс F у всех переменных и буду их находить и заполнять по имени.
Очередной вопрос. Что это такое:
TShortCut = Low(Word)..High(Word);
На структуру очевидно не похоже, на юнион тоже. Диапазоны значений вроде как не содержат слов Low\High.
g-cont
> Что это такое:
Low/High это встроенные функции над Ordinal Types, возвращающеие минимальное и максимальное значение. Так же Low/High работает над массивами, возвращает минимальный/максимальный индекс
https://gamedev.ru/code/forum/?id=268952&page=5&m=5552234#m61
Можно прочитать раздел Ordinal Types и Subrange Types на их странице про типы
https://docwiki.embarcadero.com/RADStudio/Sydney/en/Simple_Types_(Delphi)
g-cont
.. в объявлении типа - целый тип с заданным диапазоном. Например 1..10 - тип который может принимать значения от 1 до 10.
Low и High - возвращают соответственно нижнюю и высшую границу типа (работают для целых и для энумов).
Так что в данном случае получился просто хитрый аналог TShortCut = Word.
kipar
Да, я уже допетрил :)
Благодаря CD понял концепцию property, прикинул что это весьма удобная штука для VM.
Как раз в плане общения с бакэндом. Потому что часть членов класса может быть указателем, property позволяет вызвать функцию, внутри которой будет создан нужный объект например, или выполнить любое другое действие. До его разъяснения, я их воспринимал как какой-то аналог get\set методов, но это более интересная штука. Наверное добавлю их в свой язык тоже, пригодятся.
Потом покажу синтаксис, может что посоветуете.
skalogryz
> + а ещё есть Педро Паскаль!
Это ваши молодежные темы
> + и ещё Паскаль, названный в честь Паскаля
Ну хоть не честь Педро Паскаля
g-cont
> Потом покажу синтаксис, может что посоветуете.
Сразу могу посоветовать крайне удобную штуку в делфях, аналогов которой нет в других языках. Смотри как могу:
TSomeEnum = (stateOne, stateTwo, stateThree);
Это пока обычный энам, а вот это уже массив с индексами по энаму:
var MyArray: array [TSomeEnum] of Integer;
А вот цикл по всем элементам массива с индексом по энаму:
var i : TSomeEnum; begin for i := Low(TSomeEnum) to High( TSomeEnum) do WriteLn( MyArray[i]); end;
Основная фича тут в том, что расширяя энам у тебя автоматически расширяется массив и автоматически меняется количество итераций цикла.
А вот еще киллерфича:
const cMyConstArray: array [TSomeEnum] of Integer = (1,2,3);
Константный массив по энаму. И если ты расширил энам добавив еще одно значение, но при этом не изменил константу, то на этапе компиляции тебе скажут: "ошибка: милок, тут не хватает данных".
В общем на практике безумно удобная штука, и я решительно не понимаю почему в плюсах до сих пор нельзя объвлять массивы с индексацией по энаму, и надо каждый раз дрочиться с кастом к инту, самому следить за размером массивов, за итерациями в цикле и прочее.
удобную штуку в делфях, аналогов которой нет в других языках.
А вот еще киллерфича:
const cMyConstArray: array [TSomeEnum] of Integer = (1,2,3);
fasm такое могет.
MrShoor
> я решительно не понимаю почему в плюсах до сих пор нельзя объвлять массивы с индексацией по энаму,
Потому что индексы енама могут идти не с 0 и не подряд