Конференция "Компоненты" » Где изменить свойство, чтобы после загрузки формы оно изменилось? [D7]
 
  • TheEd (11.06.15 09:26) [0]
    Тему сумбурно сформулировал, но ситуация следующая: есть наследник от 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);
     { Private declarations }
     protected
     { Protected declarations }
     procedure DrawTitleCell(ACol, ARow: Longint; AreaCol, AreaRow: Longint;
       ARect: TRect; AState: TGridDrawState; CellAreaType: TCellAreaTypeEh); override;
    public
     { Public declarations }
     constructor Create(AOwner: TComponent); override;
     destructor Destroy; override;
    published
     { Published declarations }
       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 := '#';
    { (4) ######## это не помогает ! ##################}
     FTitleReadOnlyDecoration.FPict.Bitmap.Transparent := true;
     FTitleReadOnlyDecoration.FPict.Bitmap.TransparentMode := tmAuto;
    {########### end of это не помогает ! #############}
    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;
    { (2) ######### это работает, но не оптимально! ########}
         TitleReadOnlyDecoration.Pict.Bitmap.Transparent := true;
         TitleReadOnlyDecoration.Pict.Bitmap.TransparentMode := tmAuto;
    {##### end of это работает, но не оптимально! ########}
         Canvas.Draw(x, y, TitleReadOnlyDecoration.Pict.Bitmap);
       end
       else // no bitmap - paint asteriks
       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;

         ...
    { TTitleFieldDecoration }

    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;
    { (3) ######### и здесь не работает! ########}
     FPict.Bitmap.Transparent := true;
     FPict.Bitmap.TransparentMode := tmAuto;
    {########### end of и здесь не работает! ########}
     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
    { (1) ##### и здесь не работает! ####}
       FPict.Bitmap.Transparent := true;
       FPict.Bitmap.TransparentMode := tmAuto;
    {##### end of и здесь не работает! ####}
     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.

  • DimaBr © (15.06.15 07:35) [1]

    > Подскажите как отловить загрузку картинки из DFM, чтобы
    > свойство прозрачность установить после него?

    1. Установите обработчик OnChange на свойство property Pict : TPicture, в котором и изменяйте прозрачность
    2. Переопределите Loaded у компонента, в котором и устанавливайте прозрачность
  • TheEd (26.06.15 15:08) [2]
    Спасибо! Loaded - то что надо!
 
Конференция "Компоненты" » Где изменить свойство, чтобы после загрузки формы оно изменилось? [D7]
Есть новые Нет новых   [118488   +59][b:0][p:0.003]