2012-08-25 11 views
5

Załóżmy, że mój pasek stanu ma 3 panele, a lewy skrajny to nazwa pliku, w którym działa aplikacja.Zmiana rozmiaru paneli paska stanu w celu dopasowania zawartości

że może mi c:\my.log lub c:\a\very\deeply\nested\sub-directory\extremely_long_file_name_indeed.log

Czy istnieje prosty sposób, aby dostosować rozmiar 3 Stan paneli kreskowych gdy załadować nowy plik? (może nawet składnik FOSS VCL - choć nie mogę go znaleźć)?

+3

Trzeba ponownie pomyśleć Twoje pytanie. :-) W drugim przykładzie lewy panel najprawdopodobniej wyciśnie najbardziej z prawej - co robisz w tym przypadku? –

+0

+1 @Ken Tak, myślałem o tym. Co ja robię? Tak samo, jak w przypadku o stałym rozmiarze. Jeśli całkowita ilość informacji jest zbyt duża, stracę cokolwiek. Sugestia programu Prolly, domyślam się, że – Mawg

+1

to pozycja najbardziej na lewo? Jeśli nie, to co powiesz na użycie panelu znajdującego się najbardziej na prawo? Jest to prostsze, ponieważ nie musisz zmieniać jego rozmiaru. – Hendra

Odpowiedz

11

To rzeczywiście jest bardziej jak pierwszej wersji TLama za jego usunięty odpowiedź, która mi się podobało lepiej:

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; 


Powyższy skraca ścieżkę, jeśli nie pasuje do maksymalnej szerokości, ale oryginał nazwa pliku nie jest widoczna dla użytkownika w żaden sposób. Aby móc korzystać z natywnej obsługi podpowiedzi dla paneli paska stanu, szerokość panelu musi być krótsza, niż mieści się w tekście.

Więc, jako alternatywa, poniżej obcina część tylną nazwy pliku, gdy jest on dłuższy niż maksymalna szerokość i pokazuje podpowiedź kiedy unosił się za pomocą myszki:

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. Bardzo dobrze. Nie mogłem uzyskać drugiego sposobu na wyświetlenie podpowiedzi, ale jest to prawdopodobnie coś, o czym zapomniałem, a za późno, by za długo myśleć. :-) –

+0

Czy MinimizeName używa PathCompactPath, czy jest to czysty Pascal? –

+1

@ David - To jest pascal. –

Powiązane problemy