Свой тип (класс) с некоторым завихом.

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

gvido
постоялец
Сообщения: 188
Зарегистрирован: 28.03.2012 11:35:31

Свой тип (класс) с некоторым завихом.

Сообщение gvido »

Добрый день коллеги. Ломаю голову как описать поле и , возможно ли такое.
Вот приблизительный, упрощенный каркас класса.

Код: Выделить всё

type TNekiyspisok = array of AnyType;
type TMyClass = class
    pole1: integer;
    pole2:boolean;
    pole3:TNekiySpisok
end;


Хотелось бы сделать "финт ушами" такой:
Как привязать(срастить, скрестить) к логическому значению pole2 (True или False) pole3,то есть массив какого-то произвольного типа.
В результате получится развилка на два списка(массива): 1 при значении True, второй при False.

Понимаю, что нагородил огород, но может тут есть кто что-то подобное реализовывал?
Аватара пользователя
vitaly_l
долгожитель
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41
Контактная информация:

Сообщение vitaly_l »

gvido писал(а):pole3:

Код: Выделить всё

pole3:pointer;

И затем хоть 1 000 000 различных массивов туда подключайте. И можете даже все 1 000 000 с различной иерархией.
Аватара пользователя
serbod
постоялец
Сообщения: 449
Зарегистрирован: 16.09.2016 10:03:02
Откуда: Минск
Контактная информация:

Сообщение serbod »

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

Либо второй массив (который будет пустым), либо тот же самый массив использовать, ведь судя по примеру он может хранить любые типы.
MysticCoder
постоялец
Сообщения: 154
Зарегистрирован: 14.09.2013 00:20:28

Сообщение MysticCoder »

делаешь 2 поля типа FPole3True, FPole3False : TNekiySpisok; Делаешь проперти типа property Pole3 : TNekiySpisok read GetPole3; закидываешь в функцию GetPole3 код возвращающий одно из двух полей в зависимости от значения Pole2. Юзаешь проперти. Ну в случае с массивом возможно лучше будет возвращать не массив, а указатель на массив.
gvido
постоялец
Сообщения: 188
Зарегистрирован: 28.03.2012 11:35:31

Сообщение gvido »

MysticCoder
Во, Спасибо. А то я тут такого нагородил, что показывать страшно. :) Это не совсем то, что я хотел, но очень близко. :)
А что если pole3 задать как индексированное поле булевого типа?

Код: Выделить всё

Property pole3[index:boolean]:TNekiySpisok read GetNekiySpisok write SetNekiySpisok;

Тогда это более похоже на то, что я хотел бы получить. Но как ограничить индекс двумя элементами и явно задать значения - первому элементу индекса False, второму элементу True?
MysticCoder
постоялец
Сообщения: 154
Зарегистрирован: 14.09.2013 00:20:28

Сообщение MysticCoder »

gvido писал(а):

Код: Выделить всё

Property pole3[index:boolean]:TNekiySpisok read GetNekiySpisok write SetNekiySpisok;

Тогда это более похоже на то, что я хотел бы получить. Но как ограничить индекс двумя элементами и явно задать значения - первому элементу индекса False, второму элементу True?


вот встань на этот код который ты сейчас написал курсором, нажми ctrl-shift-c и оно само сгенерит объявления функций Get и Set. Объявление проперти правильное.
gvido
постоялец
Сообщения: 188
Зарегистрирован: 28.03.2012 11:35:31

Сообщение gvido »

MysticCoder писал(а):вот встань на этот код который ты сейчас написал курсором, нажми ctrl-shift-c и оно само сгенерит объявления функций Get и Set. Объявление проперти правильное.

Не, Это то все понятно.
Меня интересует ограничение на индекс

Код: Выделить всё

[index:boolean]
.
При создании( в конструкторе Create) класса сразу запилить оба значения True и False и не париться?
MysticCoder
постоялец
Сообщения: 154
Зарегистрирован: 14.09.2013 00:20:28

Сообщение MysticCoder »

ну да.
тупо Fpole3True := somedata1; Fpole3False := somedata2;. Ну или pole3[true] := somedata1; pole3[false] := somedata2;
gvido
постоялец
Сообщения: 188
Зарегистрирован: 28.03.2012 11:35:31

Сообщение gvido »

Да, другого выхода не вижу. Все равно к этому опорному свойству прикрутил, как советовали, два поля массива одинакового типа. И Добавлять элементы в эти массивы лучше оптом. То есть предварительно заполнив промежуточную переменную с типом элемента массива. Затем запихну в новый элемент массива.
И, Да!!!, в моем случае значения индекс True/False в этом поле работают стрелкой, только и всего. :)

Код: Выделить всё

procedure TFormOt.SetFormFiles(index: boolean; AValue: TFormFiles);
begin
      if index then
          FFormFilesTrue:=AValue
      else
          FFormFilesFalse:=AValue;
end;

Код: Выделить всё

function TFormOt.GetFormFiles(index: boolean): TFormFiles;
begin
     if index then
           result:= FFormFilesTrue
     else
           result:= FFormFilesFalse;
end;

А дальше работа именно с массивом, собственно мне это и нужно было. :)
Аватара пользователя
serbod
постоялец
Сообщения: 449
Зарегистрирован: 16.09.2016 10:03:02
Откуда: Минск
Контактная информация:

Сообщение serbod »

gvido, опиши лучше реальную задачу. Может там все не так сложно?
wadman
постоялец
Сообщения: 122
Зарегистрирован: 18.10.2016 14:54:28
Контактная информация:

Сообщение wadman »

Так не вариант?

Код: Выделить всё

type

    TSomeRecord = record
        case boolean of
            false: (valint: integer);
            true: (valint64: int64);
    end; 
tema
постоялец
Сообщения: 376
Зарегистрирован: 24.03.2011 19:19:27

Сообщение tema »

wadman писал(а):Так не вариант?

Код: Выделить всё

type

    TSomeRecord = record
        case boolean of
            false: (valint: integer);
            true: (valint64: int64);
    end; 

Интересный код такого ещё не видел!
А как это использовать в программе?
Аватара пользователя
Снег Север
долгожитель
Сообщения: 3067
Зарегистрирован: 27.11.2007 15:14:47
Контактная информация:

Сообщение Снег Север »

tema писал(а):Интересный код такого ещё не видел!
А как это использовать в программе?

стандартный record-case, существует со времен турбо-паскаля, описан в сотнях книжек...
Только надо немного иначе - http://wiki.freepascal.org/Record
Аватара пользователя
vitaly_l
долгожитель
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41
Контактная информация:

Сообщение vitaly_l »

tema писал(а):как это использовать

Можно ещё вот так объявить и будет Вам счастье:

Код: Выделить всё

type TNekiyspisok = array of integer;
type TMyClass = class
    pole1: integer;
    pole2:boolean;
    pole3: array[boolean] of TNekiySpisok
end;

a заполнять соответственно:

Код: Выделить всё

var MyClass: TMyClass;
begin
....
MyClass.pole3[MyClass.pole2] :=  NekiySpisok;

class - лучше заменить на record, если не будете использовать TMyClass как class;
tema
постоялец
Сообщения: 376
Зарегистрирован: 24.03.2011 19:19:27

Сообщение tema »

Снег Север писал(а):
tema писал(а):Интересный код такого ещё не видел!
А как это использовать в программе?

стандартный record-case, существует со времен турбо-паскаля, описан в сотнях книжек...
Только надо немного иначе - http://wiki.freepascal.org/Record

В турбопаскале такого точно нет. Описание по ссылке есть, но легче не стало. Там тоже написано только объявление, но как этим пользоваться в программе непонятно... Примерчик бы использования.. :)
Ответить