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

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

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

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

Сообщение gvido » 25.09.2017 15:45:21

Добрый день коллеги. Ломаю голову как описать поле и , возможно ли такое.
Вот приблизительный, упрощенный каркас класса.
Код: Выделить всё
type TNekiyspisok = array of AnyType;
type TMyClass = class
    pole1: integer;
    pole2:boolean;
    pole3:TNekiySpisok
end;


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

Понимаю, что нагородил огород, но может тут есть кто что-то подобное реализовывал?
gvido
постоялец
 
Сообщения: 176
Зарегистрирован: 28.03.2012 11:35:31

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

Сообщение vitaly_l » 25.09.2017 15:55:53

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

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

И затем хоть 1 000 000 различных массивов туда подключайте. И можете даже все 1 000 000 с различной иерархией.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3108
Зарегистрирован: 31.01.2012 16:41:41

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

Сообщение serbod » 25.09.2017 16:26:56

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

Либо второй массив (который будет пустым), либо тот же самый массив использовать, ведь судя по примеру он может хранить любые типы.
Аватара пользователя
serbod
постоялец
 
Сообщения: 215
Зарегистрирован: 16.09.2016 11:03:02
Откуда: Минск

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

Сообщение MysticCoder » 26.09.2017 02:44:01

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

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

Сообщение gvido » 26.09.2017 09:45:23

MysticCoder
Во, Спасибо. А то я тут такого нагородил, что показывать страшно. :) Это не совсем то, что я хотел, но очень близко. :)
А что если pole3 задать как индексированное поле булевого типа?
Код: Выделить всё
Property pole3[index:boolean]:TNekiySpisok read GetNekiySpisok write SetNekiySpisok;

Тогда это более похоже на то, что я хотел бы получить. Но как ограничить индекс двумя элементами и явно задать значения - первому элементу индекса False, второму элементу True?
gvido
постоялец
 
Сообщения: 176
Зарегистрирован: 28.03.2012 11:35:31

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

Сообщение MysticCoder » 26.09.2017 14:02:22

gvido писал(а):
Код: Выделить всё
Property pole3[index:boolean]:TNekiySpisok read GetNekiySpisok write SetNekiySpisok;

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


вот встань на этот код который ты сейчас написал курсором, нажми ctrl-shift-c и оно само сгенерит объявления функций Get и Set. Объявление проперти правильное.
MysticCoder
постоялец
 
Сообщения: 118
Зарегистрирован: 14.09.2013 00:20:28

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

Сообщение gvido » 26.09.2017 14:45:01

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

Не, Это то все понятно.
Меня интересует ограничение на индекс
Код: Выделить всё
[index:boolean]
.
При создании( в конструкторе Create) класса сразу запилить оба значения True и False и не париться?
gvido
постоялец
 
Сообщения: 176
Зарегистрирован: 28.03.2012 11:35:31

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

Сообщение MysticCoder » 26.09.2017 16:48:48

ну да.
тупо Fpole3True := somedata1; Fpole3False := somedata2;. Ну или pole3[true] := somedata1; pole3[false] := somedata2;
MysticCoder
постоялец
 
Сообщения: 118
Зарегистрирован: 14.09.2013 00:20:28

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

Сообщение gvido » 26.09.2017 18:01:25

Да, другого выхода не вижу. Все равно к этому опорному свойству прикрутил, как советовали, два поля массива одинакового типа. И Добавлять элементы в эти массивы лучше оптом. То есть предварительно заполнив промежуточную переменную с типом элемента массива. Затем запихну в новый элемент массива.
И, Да!!!, в моем случае значения индекс 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;

А дальше работа именно с массивом, собственно мне это и нужно было. :)
gvido
постоялец
 
Сообщения: 176
Зарегистрирован: 28.03.2012 11:35:31

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

Сообщение serbod » 27.09.2017 11:11:48

gvido, опиши лучше реальную задачу. Может там все не так сложно?
Аватара пользователя
serbod
постоялец
 
Сообщения: 215
Зарегистрирован: 16.09.2016 11:03:02
Откуда: Минск

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

Сообщение wadman » 27.09.2017 11:30:33

Так не вариант?
Код: Выделить всё
type

    TSomeRecord = record
        case boolean of
            false: (valint: integer);
            true: (valint64: int64);
    end; 
wadman
новенький
 
Сообщения: 74
Зарегистрирован: 18.10.2016 15:54:28

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

Сообщение tema » 28.09.2017 00:22:49

wadman писал(а):Так не вариант?
Код: Выделить всё
type

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

Интересный код такого ещё не видел!
А как это использовать в программе?
tema
постоялец
 
Сообщения: 352
Зарегистрирован: 24.03.2011 20:19:27

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

Сообщение Снег Север » 28.09.2017 08:05:22

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

стандартный record-case, существует со времен турбо-паскаля, описан в сотнях книжек...
Только надо немного иначе - http://wiki.freepascal.org/Record
Аватара пользователя
Снег Север
энтузиаст
 
Сообщения: 965
Зарегистрирован: 27.11.2007 16:14:47

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

Сообщение vitaly_l » 28.09.2017 09:03:12

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;
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3108
Зарегистрирован: 31.01.2012 16:41:41

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

Сообщение tema » 28.09.2017 12:30:39

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

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

В турбопаскале такого точно нет. Описание по ссылке есть, но легче не стало. Там тоже написано только объявление, но как этим пользоваться в программе непонятно... Примерчик бы использования.. :)
tema
постоялец
 
Сообщения: 352
Зарегистрирован: 24.03.2011 20:19:27

След.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex [Bot] и гости: 5

Рейтинг@Mail.ru