2012-08-25 9 views
5

Diciamo che la mia barra di stato ha 3 riquadri e lui più a sinistra è il nome del file su cui funziona l'app.Ridimensiona i riquadri della barra di stato per adattarli ai contenuti

che potrebbe mi c:\my.log o c:\a\very\deeply\nested\sub-directory\extremely_long_file_name_indeed.log

C'è un modo semplice per regolare le dimensioni dei pannelli a barre 3 di stato quando carico un nuovo file? (forse anche un componente VCL FOSS - anche se non riesco a trovarne uno)?

+3

È necessario ripensare la tua domanda. :-) Con il secondo esempio, il pannello di sinistra probabilmente spremerà più a destra - cosa fai in questo caso? –

+0

+1 @Ken Sì, ci ho pensato. Cosa faccio? Come nel caso delle dimensioni fisse. Se le informazioni totali sono troppe, perderò qualcosa. Prple tooltip, immagino che – Mawg

+1

sia la posizione più a sinistra è un must? In caso contrario, che ne dici di utilizzare il pannello più a destra? È più semplice, poiché non è necessario ridimensionarlo. – Hendra

risposta

11

Questo, in realtà è più simile prima versione di TLama della sua risposta cancellato, che mi è piaciuto migliore:

type 
    TForm1 = class(TForm) 
    StatusBar1: TStatusBar; 
    procedure FormResize(Sender: TObject); 
    private 
    procedure SetLeftPanelWidth; 
    .. 

uses 
    filectrl, commctrl; 

... 

procedure TForm1.SetLeftPanelWidth; 
var 
    Borders: array[0..2] of Integer; 
    PanelWidth, MaxWidth: Integer; 
begin 
    // calculate a little indent on both sides of the text (credit @TLama) 
    SendMessage(StatusBar1.Handle, SB_GETBORDERS, 0, LPARAM(@Borders)); 

    StatusBar1.Canvas.Font := StatusBar1.Font; 
    PanelWidth := StatusBar1.Canvas.TextWidth(StatusBar1.Panels[0].Text) 
     + 2 * Borders[1] + 2; 

    // Per Ken's comment, specify a maximum width, otherwise the panel can overgrow 
    MaxWidth := StatusBar1.Width div 4 * 3; // arbitrary requirement 
    if PanelWidth > MaxWidth then begin 
    StatusBar1.Panels[0].Text := MinimizeName(TFileName(StatusBar1.Panels[0].Text), 
     StatusBar1.Canvas, MaxWidth); 
    // recalculate 
    PanelWidth := StatusBar1.Canvas.TextWidth(StatusBar1.Panels[0].Text) + 
     2 * Borders[1] + 2; 
    end; 
    StatusBar1.Panels[0].Width := PanelWidth; 
end; 

procedure TForm1.FormResize(Sender: TObject); 
begin 
    // have to set the text again since original filename might have been minimized 
    StatusBar1.Panels[0].Text := ...; 
    SetLeftPanelWidth; 
end; 


È possibile che accorcia il percorso se non si adatta ad una larghezza massima, ma l'originale il nome del file non è visibile all'utente in alcun modo. Per poter utilizzare il supporto suggerimento nativo per i pannelli della barra di stato, la larghezza di un pannello deve essere inferiore a quella che il testo può contenere.

Così, in alternativa, il sotto tronca la parte finale del nome del file quando si è più lungo di una larghezza massima e mostra un tooltip al passaggio del mouse con il mouse:

type 
    TStatusBar = class(comctrls.TStatusBar) 
    protected 
    procedure CreateParams(var Params: TCreateParams); override; 
    end; 

    TForm1 = class(TForm) 
    StatusBar1: TStatusBar; 
    procedure FormResize(Sender: TObject); 
    private 
    procedure SetLeftPanelWidth; 
    .. 


procedure TStatusBar.CreateParams(var Params: TCreateParams); 
begin 
    inherited; 
    Params.Style := Params.Style or SBT_TOOLTIPS; 
end; 

procedure TForm1.SetLeftPanelWidth; 
var 
    Borders: array[0..2] of Integer; 
    PanelWidth, MaxWidth: Integer; 
begin 
    SendMessage(StatusBar1.Handle, SB_GETBORDERS, 0, LPARAM(@Borders)); 

    StatusBar1.Canvas.Font := StatusBar1.Font; 
    PanelWidth := StatusBar1.Canvas.TextWidth(StatusBar1.Panels[0].Text) 
     + 2 * Borders[1] + 2; 

    MaxWidth := StatusBar1.Width div 4 * 3; // arbitrary requirement 
    if PanelWidth > MaxWidth then begin 
    SendMessage(StatusBar1.Handle, SB_SETTIPTEXT, 0, 
     NativeInt(PChar(StatusBar1.Panels[0].Text))); 
    PanelWidth := MaxWidth; 
    end else 
    SendMessage(StatusBar1.Handle, SB_SETTIPTEXT, 0, 0); 

    StatusBar1.Panels[0].Width := PanelWidth; 
end; 

procedure TForm1.FormResize(Sender: TObject); 
begin 
    SetLeftPanelWidth; 
end; 
+0

+1. Molto bella. Non ho potuto ottenere il secondo modo per mostrare effettivamente il suggerimento, ma è probabilmente qualcosa che mi sto dimenticando di fare, ed è troppo tardi per pensarci troppo a lungo. :-) –

+0

MinimizeName utilizza PathCompactPath o è puro Pascal? –

+1

@David - È Pascal. –

Problemi correlati