Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проектирование компонента, Цвета, как в VirtualStringTree 
V
    Опции темы
CHERRY
Дата 13.9.2012, 12:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Прохожий
*


Профиль
Группа: Участник
Сообщений: 150
Регистрация: 17.6.2002
Где: Одесса

Репутация: нет
Всего: -2



Хотел сделать присвоение цвета в компоненте по аналогии с VirtualStringTree, т.е. выпадающий список свойств в инспекторе и каждому можно присвоить свой цвет. В инспекторе все появилось, но цвета не присваиваютя ни в дизайн ни в рантайм. Процедура TFileManager.SetColors вообще не вызывается. Помогите разобраться!
Код

unit FileMan;

interface

uses
  Windows, SysUtils, Classes, Controls, Dialogs, CommCtrl,
  ExtCtrls, Messages, Forms, StdCtrls, Graphics, ComCtrls, StrUtils, ImgList,
  Buttons,
  FMPanel;

Type
  TFileManager = class;// Oпережающее определение класса

   // class to collect all switchable colors into one place
  TFMColors = class(TPersistent)
  private
    FOwner: TFileManager;
    FColors: array[0..2] of TColor;
    function  GetColor(const Index: Integer): TColor;
    procedure SetColor(const Index: Integer; const Value: TColor);
  public
    constructor Create(AOwner: TFileManager);
    procedure   Assign(Source: TPersistent); override;
  published
    property TopPanelColor: TColor index 0 read GetColor write SetColor default clRed;
    property MidPanelColor: TColor index 1 read GetColor write SetColor default clGreen;
    property BotPanelColor: TColor index 2 read GetColor write SetColor default clBlue;
 end;


  TFileManager = class(TWinControl)
  private
    LeftPanel,RightPanel,MenuPanelBottom,MenuPanelTop:TPanel;
    Split:TSplitter;
    FColors: TFMColors;
  protected
    procedure SetColors(const Value: TFMColors);
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  published
   property Align;
   property Visible;
   property Colors: TFMColors read FColors write SetColors;
  end;


procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('ChLibSearch', [TFileManager]);
end;


//TFMColors
constructor TFMColors.Create(AOwner: TFileManager);
begin
  FOwner := AOwner;
  FColors[0] := clRed;      // TopPanelColor
  FColors[1] := clGreen;    // MidPanelColor
  FColors[2] := clBlue;     // BotPanelColor
 End;

function TFMColors.GetColor(const Index: Integer): TColor;
begin
  Result := FColors[Index];
end;

procedure TFMColors.SetColor(const Index: Integer; const Value: TColor);
begin
  if FColors[Index] <> Value then
  begin
    FColors[Index] := Value;
    FOwner.Invalidate;
  end;
end;

procedure TFMColors.Assign(Source: TPersistent);
begin
  if Source is TFMColors then
  begin
    FColors := TFMColors(Source).FColors;
    FOwner.Invalidate;
  end
  else
    inherited;
end;
//TFMColors


{$Region 'Формируем компонент' }

constructor TFileManager.Create(AOwner: TComponent);
Var i:Byte;
Begin
 inherited Create(AOwner);
 // Основной компонент
 Width  := 700;
 Height := 480;

 MenuPanelTop := TPanel.Create(Self);
 MenuPanelTop.Parent:=Self;
 MenuPanelTop.Height:=28;
 MenuPanelTop.Align:=alTop;

 LeftPanel := TPanel.Create(Self);
 LeftPanel.Parent:=Self;
 LeftPanel.Align:=alLeft;
 LeftPanel.BevelOuter:=bvRaised;
 LeftPanel.BevelInner:=bvLowered;
 LeftPanel.Width:= Width div 2;
 LeftPanel.Caption:='LEFT';

 Split:=TSplitter.Create(Self);
 Split.Parent:=Self;
 Split.Align:=alLeft;
 Split.Left:=LeftPanel.Width;

 RightPanel:= TPanel.Create(Self);
 RightPanel.Parent:=Self;
 RightPanel.Align:=alClient;
 RightPanel.BevelOuter:=bvRaised;
 RightPanel.BevelInner:=bvLowered;

 //Нижняя панель кнопок меню
 MenuPanelBottom := TPanel.Create(Self);
 MenuPanelBottom.Parent:=Self;
 MenuPanelBottom.Align:=alBottom;
 MenuPanelBottom.Width:=Width;
 MenuPanelBottom.Height:=28;

 FColors := TFMColors.Create(Self);
End;

destructor TFileManager.Destroy;
Begin
 FColors.Free;
 inherited Destroy;
End;

{$Endregion}

procedure TFileManager.SetColors(const Value: TFMColors);
begin
  FColors.Assign(Value);
  MenuPanelTop.Color   := FColors.TopPanelColor;
  LeftPanel.Color      := FColors.MidPanelColor;
  MenuPanelBottom.Color:= FColors.BotPanelColor;
end;

end.

--------------------
Трясу надежды ветвь, но где желанный плод?
PM MAIL WWW   Вверх
CHERRY
Дата 13.9.2012, 15:34 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Прохожий
*


Профиль
Группа: Участник
Сообщений: 150
Регистрация: 17.6.2002
Где: Одесса

Репутация: нет
Всего: -2



После того, как изменил процедуру
Код

procedure TFMColors.SetColor(const Index: Integer; const Value: TColor);
begin
  FColors[Index] := Value;
  FOwner.SetColors(FOwner.FColors);
end;


все заработало. 
FOwner -> TFileManager
Процедура TFileManager.SetColors(const Value: TFMColors); стала вызываться.
Привожу работающий пример полностью. Может кому пригодится
Код

unit FileMan;

interface

uses
  Windows, SysUtils, Classes, Controls, Dialogs, CommCtrl,
  ExtCtrls, Messages, Forms, StdCtrls, Graphics, ComCtrls, StrUtils, ImgList,
  Buttons,
  FMPanel;

Type
  TFileManager = class;// Oпережающее определение класса

   // class to collect all switchable colors into one place
  TFMColors = class(TPersistent)
  private
    FOwner: TFileManager;
    FColors: array[0..2] of TColor;
    function  GetColor(const Index: Integer): TColor;
    procedure SetColor(const Index: Integer; const Value: TColor);
  public
    constructor Create(AOwner: TFileManager);
    procedure   Assign(Source: TPersistent); override;
  published
    property TopPanelColor: TColor index 0 read GetColor write SetColor default clRed;
    property MidPanelColor: TColor index 1 read GetColor write SetColor default clGreen;
    property BotPanelColor: TColor index 2 read GetColor write SetColor default clBlue;
 end;


  TFileManager = class(TWinControl)
  private
    LeftPanel,RightPanel,MenuPanelBottom,MenuPanelTop:TPanel;
    Split:TSplitter;
    FColors: TFMColors;
    FColor: TColor;
  protected
    procedure SetColors(const Value: TFMColors);
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  published
   property Align;
   property Visible;
   property Colors: TFMColors read FColors write SetColors;
  end;


procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('ChLibSearch', [TFileManager]);
end;


//TFMColors
constructor TFMColors.Create(AOwner: TFileManager);
begin
  FOwner := AOwner;
  FColors[0] := clRed;      // TopPanelColor
  FColors[1] := clGreen;    // MidPanelColor
  FColors[2] := clBlue;     // BotPanelColor
 End;

function TFMColors.GetColor(const Index: Integer): TColor;
begin
  Result := FColors[Index];
end;

procedure TFMColors.SetColor(const Index: Integer; const Value: TColor);
begin
  FColors[Index] := Value;
  FOwner.SetColors(FOwner.FColors);
end;

procedure TFMColors.Assign(Source: TPersistent);
begin
  if Source is TFMColors then
  begin
    FColors := TFMColors(Source).FColors;
    FOwner.Invalidate;
  end
  else
    inherited;
end;
//TFMColors


{$Region 'Формируем компонент' }

constructor TFileManager.Create(AOwner: TComponent);
Var i:Byte;
Begin
 inherited Create(AOwner);
 // Основной компонент
 Width  := 700;
 Height := 480;

 MenuPanelTop := TPanel.Create(Self);
 MenuPanelTop.Parent:=Self;
 MenuPanelTop.Height:=28;
 MenuPanelTop.Align:=alTop;

 LeftPanel := TPanel.Create(Self);
 LeftPanel.Parent:=Self;
 LeftPanel.Align:=alLeft;
 LeftPanel.BevelOuter:=bvRaised;
 LeftPanel.BevelInner:=bvLowered;
 LeftPanel.Width:= Width div 2;
 LeftPanel.Caption:='LEFT';

 Split:=TSplitter.Create(Self);
 Split.Parent:=Self;
 Split.Align:=alLeft;
 Split.Left:=LeftPanel.Width;

 RightPanel:= TPanel.Create(Self);
 RightPanel.Parent:=Self;
 RightPanel.Align:=alClient;
 RightPanel.BevelOuter:=bvRaised;
 RightPanel.BevelInner:=bvLowered;

 //Нижняя панель кнопок меню
 MenuPanelBottom := TPanel.Create(Self);
 MenuPanelBottom.Parent:=Self;
 MenuPanelBottom.Align:=alBottom;
 MenuPanelBottom.Width:=Width;
 MenuPanelBottom.Height:=28;

 FColors := TFMColors.Create(Self);
 MenuPanelTop.Color   := FColors.TopPanelColor;
 LeftPanel.Color      := FColors.MidPanelColor;
 MenuPanelBottom.Color:= FColors.BotPanelColor;
End;

destructor TFileManager.Destroy;
Begin
 FColors.Free;
 inherited Destroy;
End;

{$Endregion}

procedure TFileManager.SetColors(const Value: TFMColors);
begin
  Colors.Assign(Value);
  MenuPanelTop.Color   := FColors.TopPanelColor;
  LeftPanel.Color      := FColors.MidPanelColor;
  MenuPanelBottom.Color:= FColors.BotPanelColor;
end;


end.

Спасибо за внимание!
--------------------
Трясу надежды ветвь, но где желанный плод?
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0440 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.