После того, как изменил процедуру | Код | 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.
|
Спасибо за внимание!
--------------------
Трясу надежды ветвь, но где желанный плод?
|