SpeedButton-Breite bei AutoSize=true dynamisch anpassen

Rund um die LCL und andere Komponenten
Antworten
aldicek
Beiträge: 37
Registriert: Do 6. Mär 2008, 12:48
OS, Lazarus, FPC: WinXP/Mint13KDE (Lazarus 1.0.8 FPC 2.6.2)
CPU-Target: 64 Bit
Wohnort: Halle (Saale)

SpeedButton-Breite bei AutoSize=true dynamisch anpassen

Beitrag von aldicek »

Ich möchte einem SpeedButton mit Icon und zugewiesener TAction zur Laufzeit eine andere Action zuweisen.
Das klappt soweit ganz gut, die Beschriftung, das Glyph und der Hint werden automatisch geändert. Was mich etwas wurmt ist, dass ich bisher nur eine einzige funktionierende Idee habe, wie ich die Breite des SpeedButtons nach dem Wechsel dynamisch anpassen kann (siehe angehängten Quellcode:

Code: Alles auswählen

unit Unit1;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ComCtrls,
  Buttons, ActnList, ExtCtrls;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    ImageList: TImageList;
    ToolBar: TToolBar;
      SBtn: TSpeedButton;
    ActionList: TActionList;
      Action1: TAction;
      Action2: TAction;
    procedure Action1Execute(Sender: TObject);
    procedure Action2Execute(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.lfm}
 
{ TForm1 }
 
procedure TForm1.Action1Execute(Sender: TObject);
begin
  SetSpeedButtonAction(SBtn, Action2);
end;
 
procedure TForm1.Action2Execute(Sender: TObject);
begin
  SetSpeedButtonAction(SBtn, Action1);
end;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  Action2Execute(Sender);
end;
 
procedure TForm1.SetSpeedButtonAction(Btn: TSpeedButton; newAction: TAction);
begin
  with Btn do begin
    Glyph.Clear;
    Action := newAction;
    ClientWidth := Glyph.Width + Canvas.TextWidth(Caption) + 3*Spacing;
  end;
end;
 
end.
 
und das Form dazu:

Code: Alles auswählen

object Form1: TForm1
  Left = 692
  Height = 240
  Top = 247
  Width = 320
  Caption = 'Form1'
  ClientHeight = 240
  ClientWidth = 320
  OnCreate = FormCreate
  LCLVersion = '1.0.8.0'
  object ToolBar: TToolBar
    Left = 0
    Height = 26
    Top = 0
    Width = 320
    Caption = 'ToolBar'
    Images = ImageList
    TabOrder = 0
    object SBtn: TSpeedButton
      Left = 1
      Height = 24
      Top = 2
      Width = 4
      Align = alLeft
      NumGlyphs = 0
      OnClick = Action1Execute
      ShowHint = True
      ParentShowHint = False
    end
  end
  object ActionList: TActionList
    Images = ImageList
    left = 200
    top = 160
    object Action1: TAction
      Caption = 'Stop - Anhalten!'
      Hint = 'Action1'
      ImageIndex = 0
      OnExecute = Action1Execute
    end
    object Action2: TAction
      Caption = 'MD5'
      Hint = 'Action2'
      ImageIndex = 1
      OnExecute = Action2Execute
    end
  end
  object ImageList: TImageList
    left = 77
    top = 91
    Bitmap = {
      4C69020000001000000010000000000000000000000007071100000000000000
      4E60515196B0525296AF525296AF525296AF525296AF4D4D94B0000029480000
      000000000000000000000000000000000000060611000000000002024E56BABA
      E5FFE4E4FFFFE2E2FFFFE2E2FFFFE2E2FFFFE2E2FFFFE5E5FFFF8686C9FF0000
      2C47000000000000000000000000060611000000000009095052B7B7E7FFCFCF
      FEFFCDCDFEFFCDCDFEFFCACAF8FFCACAF9FFCCCCFDFFCCCCFDFFD3D3FDFF7F7F
      C7FF02022F4600000000000000000000000001014E56B3B3E7FFC0C0FDFFBDBD
      FDFFBDBDFDFFBBBBFAFFD7D7D5FFCBCBD1FFBBBBF7FFBBBBFBFFBBBBFBFFC4C4
      FCFF7A7AC6FF00002C470000000000004D60AAAAE5FFAEAEFCFFAAAAFCFFA9A9
      FCFF9090B1FFF7F7F6FFE4E4E4FFDADADAFFE4E4E4FFA7A7FEFFA5A5F8FFA5A5
      F8FFB2B2F8FF7A7AC7FF00002B4A474794B0B6B6FFFF9393F9FF9393F9FF8787
      D3FFDDDDDBFFF8F8F8FFE4E4E4FFDFDFDFFFE1E1E0FF9191FBFF9090F8FF9090
      F7FF8D8DF4FFC3C3FFFF1616628D444494AFA7A7FDFF8282F7FF8181F6FF6969
      A6FFE8E8E7FFF7F7F7FFE1E1E1FFD1D1D1FFCCCCCBFF3D3DF3FF2D2D4BFF2424
      6FFF3D3DE9FF9696F8FF1414628C383892AF6C6CF6FF4040EEFF4343EEFF2121
      6AFFE7E7E6FFB9B9B9FF9D9D9DFF909090FFCACAC9FF2222A3FFFCFCFBFF1F1F
      99FF2929E3FF8080F3FF1111628C383892AF6868F3FF3333EAFF3131E8FF0E0E
      5CFFB1B1B0FFF6F6F6FFFFFFFFFFFFFFFFFFD6D6D7FF969695FFBBBBBCFF2525
      DCFF2424DEFF7D7DF0FF1111628C383892AF6464F0FF2D2DE5FF2C2CE5FF1010
      71FFF8F8F7FFFFFFFFFFFFFFFFFFBBBBBBFFEEEEEEFFFFFFFEFF0B0B34FF2121
      DCFF2020DAFF7B7BEEFF1111618C33338EAF6969EFFF2828E1FF2828E1FF1A1A
      ABFFECECEAFFFFFFFFFFEAEAEAFFD2D2D2FFFFFFFFFFCCCCCCFF1D1DD7FF1D1D
      D8FF1A1AD6FF7B7BECFF0F0F608C000027485959C1FF4747E3FF2323DDFF2323
      E0FFA7A7ADFFFFFFFFFFCCCCCCFFFFFFFFFFF8F8F7FF04043AFF1A1AD5FF1919
      D4FF5858E0FF3A3AA6FC0000053A0000000000002A475151BDFF4141DFFF1D1D
      D8FF1515A6FF5B5B58FFA9A9A6FF91918BFF0B0B4FFF1717D4FF1616D2FF5858
      DFFF3333A2FF00000E3F00000000000000000000000000002D464F4FBCFF3D3D
      DBFF1818D5FF1616CFFF1313C5FF1313C7FF1515D3FF1313D0FF5555DDFF3232
      A2FF00001240050500000000000000000000000000000000000000002A475454
      BDFF7676E9FF7474E8FF7373E7FF7272E7FF7272E7FF7474E6FF3939A5FB0000
      0D3F050500000000000000000000000000000000000000000000000000000000
      2A490F0F608D1010618C1010618C1010618C1010618C0E0E5F8C0000053A0000
      0000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00D7B278FFD7B278FFD7B278FFD5B0
      76FFD2AD73FFCFAA70FFCBA76DFFC7A36AFFFFFFFF00D7B278FFD5B076FFD5B0
      76FFD3AF75FFFFFFFF00FFFFFF00FFFFFF00D5B076FFD2AD73FFCFAA70FFCBA7
      6DFFC7A36AFFC39F66FFBE9B62FFBA965DFFFFFFFF00D2AD73FFCDA86FFFFFFF
      FF00C9A56BFFC7A36AFFFFFFFF00FFFFFF00CBA76DFFC7A36AFFFFFFFF00BE9B
      62FFBA965DFFFFFFFF00B08D54FFAB8850FFFFFFFF00C39F66FFC39F66FFFFFF
      FF00BB975EFFB6935AFFFFFFFF00FFFFFF00BE9B62FFBA965DFFFFFFFF00B08D
      54FFAB8850FFFFFFFF00A07E46FF9B7941FFFFFFFF00B6935AFFB08D54FFFFFF
      FF00AD8A52FFA7854DFFFFFFFF00FFFFFF00B08D54FFAB8850FFFFFFFF00A07E
      46FF9B7941FFFFFFFF008F6E37FF8A6932FFFFFFFF00A5834BFFA38149FFFFFF
      FF0096743DFF96743DFFFFFFFF00FFFFFF00A07E46FF9B7941FFFFFFFF008F6E
      37FF8A6932FFFFFFFF007F5F28FF7A5A24FFFFFFFF0096743DFF8F6E37FFFFFF
      FF008A6932FF85642DFFFFFFFF00FFFFFF008F6E37FF8A6932FFFFFFFF007F5F
      28FF7A5A24FFFFFFFF0070511BFF6C4C16FFFFFFFF0083622BFF7D5D26FFFFFF
      FF00785821FF74541EFFFFFFFF00FFFFFF007F5F28FF7A5A24FFFFFFFF007051
      1BFF6C4C16FFFFFFFF0063440EFF5F400BFFFFFFFF0072531DFF6F501AFF6C4C
      16FF694914FF644510FFFFFFFF00FFFFFF0070511BFF6C4C16FFFFFFFF006344
      0EFF5F400BFFFFFFFF00583904FF553702FFFFFFFF00644510FF61420DFF5F40
      0BFF5C3E08FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00D7B278FFD7B278FFD7B278FFD7B2
      78FFD7B278FFD7B278FFD7B278FFD3AF75FFCDA86FFFC4A067FFBE9B61FFB693
      5AFFAD8A52FFA38149FFFFFFFF00FFFFFF00D7B278FFD7B278FFD7B278FFD3AF
      75FFCFAA70FFC7A36AFFBE9B61FFB6935AFFAD8A52FFA38149FF9B7941FF906F
      38FF87662FFF7D5D26FFFFFFFF00FFFFFF00CDA86FFFC4A067FFBE9B62FFB693
      5AFFAD8A52FFA38149FF96743DFF94733BFF85642DFF7D5D26FF74541EFF6C4C
      16FF644510FF5C3E08FFFFFFFF00FFFFFF00AD8A52FFA38149FF9B7941FF906F
      38FF85642DFF7D5D26FF74541EFF694914FF644510FF5C3E08FF583904FF5335
      00FF533500FF553702FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
      FF00FFFFFF00FFFFFF00FFFFFF00
    }
  end
end
). Ganz gleich was auch immer ich bisher noch probiert habe, nix hat gefruchtet. Muss doch auch anders gehen, als SpeedButton.AutoSize:=false und die Breite selber zu ermitteln? (Nicht, dass mich der Schreibaufwand stören würde, vermutlich ist die Lösung eines Gurus auch nicht viel aufwändiger - ich möchte nur einfach durchblicken und auch mal ein paar andere Meinungen hören (bzw. dem Medium geschuldet lesen), denn ursprünglich hatte ich vermutet, man bräuchte nur die Action zu ändern und das wär's... - den Rest würde das Control sozusagen allein erledigen.)
Also, falls jemand da eine alternative Lösung kennt, ich bin für jeden Tipp dankbar!

Grüße Aldicek

Benutzeravatar
theo
Beiträge: 10893
Registriert: Mo 11. Sep 2006, 19:01

Re: SpeedButton-Breite bei AutoSize=true dynamisch anpassen

Beitrag von theo »

Ist sicher nicht ganz sauber, evtl. ein Bug.

Probier mal diesen Workaround mit AutoSize=true

Code: Alles auswählen

    procedure TForm1.Action1Execute(Sender: TObject);
    begin
        SBtn.Hide;
        SBtn.Action := Action2;
        SBtn.Show;
    end;
 
    procedure TForm1.Action2Execute(Sender: TObject);
    begin
        SBtn.Hide;
        SBtn.Action := Action1;
        SBtn.Show;
    end;      
Und noch ein Tipp: Verwende kein "with", das sorgt nur für zusätzliche Konfusion.

Antworten