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;
Trzeba ponownie pomyśleć Twoje pytanie. :-) W drugim przykładzie lewy panel najprawdopodobniej wyciśnie najbardziej z prawej - co robisz w tym przypadku? –
+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
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