Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.06.10;
Скачать: CL | DM;

Вниз

published свойство - класс   Найти похожие ветки 

 
DevilDevil ©   (2006-08-14 14:42) [0]

у многих компонентов имеется свойство Font. Его опции можно настраивать и в Object Inspector. Вопрос собственно и заключается в том, как реализовать такое свойство. В моём случае правда не всё так просто. У меня есть нескольк класс - стиль (цвет, шрифт, ...). В моём компоненте имеется определённое число (на данный момент 3) стилей, которые необходимо уметь изменять в Инспекторе.
Причём желательно, чтобы выглядело всё это так: у компонента есть свойство Styles (с плюсиком). Нажимаешь на плюсик, появляются 3 опции: csStandart1, csStandart2, csStandart3 (у каждого плюсик). Нажимаешь на плюсик необходимого стиля, настраиваешь его опции...

Очень прошу помочь. Объясняя слов не жалеть! :)


 
DimaBr   (2006-08-14 15:56) [1]

Породите свой класс СТИЛЕЙ от TPersistent. В компоненте (в конструкторе) создаёте , а в деструкторе уничтожаете.

Если нужно несколько вариантов стилей (на одном месте в инспекторе), пишите класс родитель стилей, от коророго и порождаете собственные стили.


 
DimaBr   (2006-08-14 16:09) [2]

Нечто подобное:


type
TMyFirstStyle = class(TPersistent)
 private
    fFirstProperty: integer;
 public
    constructor Create(AOwner: TPersistent);virtual;
 published
    property FirstProperty: integer read fFirstProperty write fFirstProperty;
end;
TMySecondStyle = class(TPersistent)
.......
end;

TStyles = class(TPersistent)
 private
    fOwner: TPersistent;
    fFirstStyle: TMyFirstStyle;
    fSecondStyle: TMySecondStyle;
 public
    function GetOwner: TPersistent;override;
    constructor Create(AOwner: TPersistent);virtual;
    destructor Destroy;override;
 publiched
    property FirstStyle: TMyFirstStyle read fFirstStyle write fFirstStyle;
    property SecondStyley: TMySecondStyle read fSecondStyle write fSecondStyle;
end;

TMyComponent = class(TComponent) // или от чего другого
 private
    fMyStyle: TStyles;
 public
    constructor Create(AOwner: TComponent);override;
    destructor Destroy;override;
 published
   property Styles: TStyles read fMyStyle write ffMyStyle;
end;

implementation

constructor TMyComponent.Create(AOwner: TComponent);
begin
 inherited;
 fStyles := TStyles.Create(self);
end;

destructor TMyComponent.Destroy;
begin
 fStyles.free;
 inherited;
end;

constructor TStyles.Create(AOwner: TPersistent);
begin
 inherited Create;
 fOwner := AOwner;
 fFirstStyle := TMyFirstStyle.Create(AOwner);
 fSecondStyle := TMySecondStyle.Create(AOwner);
end;

destructor TStyles.Destroy;
begin
 fFirstStyle.free;
 fSecondStyle.Free;
 inherited;
end;

function TStyles.GetOwner: TPersistent;
begin
 Result := fOwner;
end;


 
DevilDevil ©   (2006-08-14 16:17) [3]

скоро попробую. Надеюсь, поможет...
В любом случае, Спасибо!


 
Юрий Зотов ©   (2006-08-14 19:28) [4]

Чем эти три класса стиля отличаются друг от друга? Они как-то пересекаются, или нет?

Или же это три разных СВОЙСТВА одного и того же типа "мой_стиль"? Или же это ОДНО свойство, но с тремя разными значениями csStandart1, csStandart2, csStandart3? Или еще что-то?


 
DimaBr   (2006-08-15 09:31) [5]


> Юрий Зотов ©   (14.08.06 19:28) [4]

Скорее всего, (предполагаю), это стили раличной отрисовки отрисовки и активен может быть только один стиль. Тогда :
> пишите класс родитель стилей, от которого и порождаете собственные
> стили.


TCustomStyle = class(TPersistent)

end;

TFirstStyle = class(TCustomStyle)
end;
TStyles = (csStandart1,csStandart2,csStandart3);

TMyComponent = class(TComponent)
 private
   fStyle: TStyle;
   fStyles: TCustomStyle;
 published
   property Styles: TCustomStyle read fStyles write fStyles;
   property Style: TStyles read fStyle write SetStyle;
end;

procedure TMyComponent.SetStyle(const Value: TStyles);
var OldStyle: TCustomStyle;
begin
 OldStyle := fStyles;
 try
   fStyles := nil;
   case Value of
     csStandart1: fStyles := TFirstStyle.Create(self);
     csStandart2: ;
     csStandart3: ;
     else raise Exception.Create("Invalide Style");
   end;{case}
   if fStyles <> nil then fStyle := Value;
   OldStyle.Free;
 except
   fStyles := OldStyle;
 end;{try}
end;


 
DevilDevil ©   (2006-08-15 15:31) [6]


> Юрий Зотов ©   (14.08.06 19:28) [4]
> DimaBr   (15.08.06 09:31) [5]

Спасибо, вроде первго и второго ответов должно хватить.

У меня почему то в дизайн тайм всё изменяется, а если я запускаю программу на выполнение, то всё остаётся по-старому. Из-за чего это может происходить?


 
DimaBr   (2006-08-15 15:49) [7]

Из-за того что вы скорее всего скапирывали компонент в другую папку а пути прописанны к старой.


 
DevilDevil ©   (2006-08-15 15:55) [8]

нет, у меня всё лежит в группе проектов, новых директорий и файлов я не создавал, всё писал в существующем модуле


 
DimaBr   (2006-08-15 15:58) [9]

Удалите DCU-шку компонента.


 
DevilDevil ©   (2006-08-15 19:09) [10]

Нет, чё-то не фига: и перебилдил, и перекомпилил, и переустановид - безрезультатно :(((


 
DimaBr   (2006-08-16 10:06) [11]

BreakPoint вам поможет.


 
DevilDevil ©   (2006-08-16 18:12) [12]

не поможет, - в DFM не сохраняется.
http://delphimaster.net/view/5-1155654550/



Страницы: 1 вся ветка

Текущий архив: 2007.06.10;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.017 c
15-1179214537
Флудер :)
2007-05-15 11:35
2007.06.10
Нужна анимированная картинка книги


3-1174464801
nick_van_rijn
2007-03-21 11:13
2007.06.10
тормоза при исполнении множественных запросов


15-1179160891
homm
2007-05-14 20:41
2007.06.10
Вылетает DOC программа …


2-1179486498
ambhtr
2007-05-18 15:08
2007.06.10
Как организовать работу case


15-1178900041
Juice
2007-05-11 20:14
2007.06.10
XML редактор