Войти
ПрограммированиеФорумОбщее

Вопросы по Delphi (17 стр)

Страницы: 112 13 14 15 16 17
#240
11:29, 21 июня 2022

g-cont
протектед свойств даже в VCL полно. Скажем, есть текстовое поле, у него свойство Text. У него есть наследник "текстовое поле из БД", у которого поле напрямую недоступно, а читается из базы данных.
Или даже проще - есть абстрактный компонент со свойством "высота". А у его наследников - у одних высота доступна напрямую, у других - вычисляется автоматически. Решается тем что у родителя делаем поле protected, а у потомков у каких надо делаем его public.

#241
(Правка: 13:10) 13:09, 21 июня 2022

Вобщем что придумалось навскидку. Пример псевдокласса со свойствами:

class Foo
{
  int  variable;
  int  foo[4];

  int GetVariable( void ) { return variable; }
  int SetVariable( int value ) { variable = value; }
  int SetVariable( string value ) { variable = atoi( value ); }

  int GetFoo( int index )
  {
    assert( index >= 0 && index < 4 );
    return foo[index];
  }
  void SetFoo( int value, int index )
  {
    assert( index >= 0 && index < 4 );
    foo[index] = value;
  }
public:
  prop "MyVar"
  {
    read( program, backend )  variable;
    write( program, backend )  variable;
    write( network )    GetVariable();
    read( network )    SetVariable( int );
    read( txtfile )    SetVariable( string );
    write( binfile )    SetVariable( void* );
  };

  prop "Left"
  {
    read( program, backend )  foo[0];
    write( program, backend )  foo[0];
  };

  prop "Right"
  {
    read( program, backend )  foo[1];
    write( program, backend )  foo[1];
  };

  prop "Top"
  {
    read( program, backend )  GetFoo( 2 );
    write( program, backend )  SetFoo( int, 2 );
  };

  prop "Bottom"
  {
    read( program, backend )  GetFoo( 3 );
    write( program, backend )  SetFoo( int, 3 );
  };
};

Имена свойств можно указывать как обычные имена, так и как строки, возможно для кого-то вариант со строками окажется нагляднее.
В данном примере все имена свойств - строки.
read и write открывают набор перечисления битовых флагов, для чего следует использовать данный вызов. Доступны следующие зарезервированные слова:
program  - доступ из программы (чтение\запись)
backend  - доступ из бакэнда виртуальной машины (чтение\запись)
network  - отправка и приём по сети
txtfile  - чтение и запись в свойств в текстовый файл
binfile  - чтение и запись свойств в бинарный файл
predict  - чтение и запись в машину состояний

Правая часть объявления - что будет вызвано при обращении к свойству в различных ситуациях. Прямой доступ к той или иной переменной, либо вызов функции с заведомо объявленными параметрами. Не объявлять параметры очевидно нельзя - дедуктор перегрузки функций сойдет с ума.
Есть возможность явного доступа в ячейку массива. Передаваемое значение для методов Set объявляется просто как тип, без имени.
Соответственно есть возможность передавать туда не только атомарные типы, но и пользовательские классы (ну по крайней мере из бакэнда).
Теоретически предлагаемая конструкция не завязана на объектах, можно к примеру объявить глобальный property, если это потребуется ( а у меня есть такая необходимость ).
По здравом размышлении от секции property решил отказаться, т.к. всё же остаются некоторые спорные моменты в таком подходе.
Перегрузка свойств осуществляется по обычному принципу наследования. Если какой-то метод доступа уже был в родителе - он будет переопределён. Если в потомке метод не был указан - будет унаследован. Явный запрет на унаследования какого-либо действия можно описать, например как

read( program, backend )  0;

Важно понимать, что всё вышеописанное, пока что плод моей фантазии и пример предлагаемого синтаксиса. Покритикуйте, если вам конечно интересна эта тема. Может здесь где-то притаился UB, который я не заметил.

#242
13:10, 21 июня 2022

kipar
ну да, я уже отказался от этой идеи.

#243
(Правка: 16:06) 16:02, 22 июня 2022

> А может есть реализация парсера на С++? Меня интересует только сам формат dfm, а не язык Delphi.

Вы не правильный путь избрали. 
Парсер вам может понадобиться лишь в том случае, если вы пожелаете улучшить функциональность dfm. 
В противном случае исходники dfm просто получить путем разбора бинарного файла dfm /из ресурсов/. 
Его формат прост и разбор его не сложен. 
Говорю об этом не голословно ...

#244
(Правка: 0:24) 0:14, 24 июня 2022

две структуры.

  Enemy[0] := ZeroEnemy[0];
  move(ZeroEnemy[0], Enemy[0], SizeOf(TPerson));

что из них быстрее работает? Или опять самому подсчитывать? )))

сравнил. Второй вариант на 0.01 (примерно) работает быстрее.

#245
0:40, 24 июня 2022

Mirrel
> Второй вариант на 0.01 (примерно) работает быстрее.
Второй вариант не безопасен, если структура содержит ARC поля. Например string, динамический массив или интерфейс. Да и при рефакторинге есть риск сломать код, т.к. типы данных не проверяются.

#246
3:30, 24 июня 2022

MrShoor, да, это я понимаю. Что там динамические размеры... которые накрыться медным тазом могут быть.
В данном случае статично всё делаю.

#247
12:07, 24 июня 2022

Mirrel
> Что там динамические размеры...
Не в динамичности размеров там проблема, а в счетчике ссылок.

#248
18:48, 24 июня 2022

MrShoor
> Не в динамичности размеров там проблема, а в счетчике ссылок.
собственно пример:
https://ideone.com/QPyFcd

SRefCount из документации

Страницы: 112 13 14 15 16 17
ПрограммированиеФорумОбщее