Тему сумбурно сформулировал, но ситуация следующая: есть наследник от TDBGridEh, который некоторым образом меняет отображение шапки таблицы. В нём для группировки свойств присутствует класс, в котором есть свойство Pict : TPicture, подгружаемое в дизайнтайме.
Так вот, когда я в редакторе свойств подгружаю картинку, она онображается с прозрачностью, т.к. сразу после загрузки отрабатыват чать кода (1). Проект сохраняю, закрываю, открываю - болт. прозрачности нет (если часть кода (2) закомментировать). (2) решает проблему, но это неоптимально - при всякой перерисовке менять свойства компонента.
Подскажите как отловить загрузку картинки из DFM, чтобы свойство прозрачность установить после него?
Заранее спасибо!
unit DBGridEhEx;
...
type
TTitleFieldDecorationOffset = class(TPersistent)
private
FOwner: TControl;
FPoint: TPoint;
procedure SetX(const Value: integer);
procedure SetY(const Value: integer);
public
constructor Create(AOwner: TControl);
procedure Assign(Source: TPersistent); override;
published
property X : integer read FPoint.X write SetX;
property Y : integer read FPoint.Y write SetY;
end;
TTitleFieldDecoration = class(TPersistent)
private
FOwner: TControl;
FOffset: TTitleFieldDecorationOffset;
FAutoBold: boolean;
FSign: char;
FSignColor: TColor;
FPict: TPicture;
procedure SetPict(const Value: TPicture);
...
procedure SetOffset(const Value: TTitleFieldDecorationOffset);
public
constructor Create(AOwner: TControl);
destructor Destroy; override;
procedure Assign(Source: TPersistent); override;
published
property Offset : TTitleFieldDecorationOffset read FOffset write SetOffset;
property AutoBold : boolean read FAutoBold write SetAutoBold default false;
property Sign : char read FSign write SetSign;
property SignColor : TColor read FSignColor write SetSignColor;
property Pict : TPicture read FPict write SetPict;
end;
TDBGridEhEx = class(TDBGridEh)
private
FTitleReadOnlyDecoration: TTitleFieldDecoration;
procedure SetTitleReadOnlyDecoration(const Value: TTitleFieldDecoration);
protected
procedure DrawTitleCell(ACol, ARow: Longint; AreaCol, AreaRow: Longint;
ARect: TRect; AState: TGridDrawState; CellAreaType: TCellAreaTypeEh); override;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
published
property TitleReadOnlyDecoration : TTitleFieldDecoration read FTitleReadOnlyDecoration write SetTitleReadOnlyDecoration;
end;
...
constructor TDBGridEhEx.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FTitleReadOnlyDecoration := TTitleFieldDecoration.Create(self);
FTitleReadOnlyDecoration.FAutoBold := false;
FTitleReadOnlyDecoration.FSignColor := clGrayText;
FTitleReadOnlyDecoration.FSign := '#';
FTitleReadOnlyDecoration.FPict.Bitmap.Transparent := true;
FTitleReadOnlyDecoration.FPict.Bitmap.TransparentMode := tmAuto;
end;
destructor TDBGridEhEx.Destroy;
begin
FTitleReadOnlyDecoration.Free;
inherited;
end;
procedure TDBGridEhEx.DrawCell(ACol, ARow: Integer; ARect: TRect;
AState: TGridDrawState);
begin
inherited;
end;
procedure TDBGridEhEx.DrawTitleCell(ACol, ARow, AreaCol, AreaRow: Integer;
ARect: TRect; AState: TGridDrawState; CellAreaType: TCellAreaTypeEh);
var
DrawColumn: TColumnEh;
x, y, h, w : integer;
bmp_flag : boolean;
begin
if DataSource = nil then
begin
inherited;
exit;
end;
DrawColumn := Columns[AreaCol];
if DrawColumn.Field.ReadOnly and TitleReadOnlyDecoration.AutoBold
then
DrawColumn.Title.Font.Style := DrawColumn.Title.Font.Style + [fsBold];
inherited;
DrawColumn := Columns[AreaCol];
if DrawColumn.Field.ReadOnly then
begin
if TitleReadOnlyDecoration.Pict.Bitmap <> nil
then bmp_flag := not TitleReadOnlyDecoration.Pict.Bitmap.Empty
else bmp_flag := false;
if bmp_flag
then
begin
if DrawColumn.Title.Alignment = taRightJustify then
x := ARect.Left + TitleReadOnlyDecoration.Offset.X
else
x := ARect.Right - TitleReadOnlyDecoration.Offset.X
- TitleReadOnlyDecoration.Pict.Bitmap.Width;
if TitleReadOnlyDecoration.Offset.Y <> -1 then
y := ARect.Top + TitleReadOnlyDecoration.Offset.Y
else
y := (ARect.Top + ARect.Bottom - TitleReadOnlyDecoration.Pict.Bitmap.Height) div 2;
TitleReadOnlyDecoration.Pict.Bitmap.Transparent := true;
TitleReadOnlyDecoration.Pict.Bitmap.TransparentMode := tmAuto;
Canvas.Draw(x, y, TitleReadOnlyDecoration.Pict.Bitmap);
end
else
begin
...
end
end;
end;
procedure TDBGridEhEx.SetTitleReadOnlyDecoration(
const Value: TTitleFieldDecoration);
begin
FTitleReadOnlyDecoration.Assign(Value);
end;
procedure TDBGridEhEx.SetTitleRequiredDecoration(
const Value: TTitleFieldDecoration);
begin
FTitleRequiredDecoration.Assign(Value);
end;
...
procedure TTitleFieldDecoration.Assign(Source: TPersistent);
begin
inherited Assign(Source);
if Source is TTitleFieldDecoration then
begin
FOffset.Assign(TTitleFieldDecoration(Source).Offset);
FAutoBold := TTitleFieldDecoration(Source).AutoBold;
FSign := TTitleFieldDecoration(Source).Sign;
FSignColor := TTitleFieldDecoration(Source).SignColor;
FPict.Assign(TTitleFieldDecoration(Source).Pict);
end;
end;
constructor TTitleFieldDecoration.Create(AOwner: TControl);
begin
inherited Create;
FOwner := AOwner;
FOffset := TTitleFieldDecorationOffset.Create(AOwner);
FPict := TPicture.Create;
FPict.Bitmap.Transparent := true;
FPict.Bitmap.TransparentMode := tmAuto;
AutoBold := true;
Sign := '*';
SignColor := clRed;
end;
destructor TTitleFieldDecoration.Destroy;
begin
FPict.Free;
FOffset.Free;
inherited;
end;
...
procedure TTitleFieldDecoration.SetPict(const Value: TPicture);
begin
FPict.Assign(Value);
if FPict.Bitmap <> nil then
begin
FPict.Bitmap.Transparent := true;
FPict.Bitmap.TransparentMode := tmAuto;
end;
FOwner.Invalidate;
end;
procedure TTitleFieldDecoration.SetSign(const Value: char);
begin
if FSign = Value then
exit;
FSign := Value;
FOwner.Invalidate;
end;
procedure TTitleFieldDecoration.SetSignColor(const Value: TColor);
begin
if FSignColor = Value then
exit;
FSignColor := Value;
FOwner.Invalidate;
end;
end.