Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi StringGrid: Breite der vertikalen Scrollbar ermitteln (https://www.delphipraxis.net/184064-stringgrid-breite-der-vertikalen-scrollbar-ermitteln.html)

Helmi 23. Feb 2015 12:58

StringGrid: Breite der vertikalen Scrollbar ermitteln
 
Hallo,

gibt es die Möglichkeit die Breite der vertikalen Scrollbar eines StringGrid zu ermitteln?

Ich hatte gehofft, dass sich ClientWidth dadurch ändert, aber leider bleibt der Wert mit/ohne Scrollbar gleich

Was will ich eigentlich tun?
(für manche eine schwierige Frage)

Wenn die vertikale Scrollbar sichtbar ist, dann möchte ich die Breiten der Spalten des StringGrids reduzieren.

Ob eine Scrollbar sichtbar ist, mach ich mit diesem Code:
Delphi-Quellcode:
if (GetWindowlong(Stringgrid1.Handle, GWL_STYLE) and WS_VSCROLL) <> 0 then
   ShowMessage('Vertical scrollbar is visible!');

if (GetWindowlong(Stringgrid1.Handle, GWL_STYLE) and WS_HSCROLL) <> 0 then
   ShowMessage('Horizontal scrollbar is visible!');
(gefunden bei den Schweizern)

ConnorMcLeod 23. Feb 2015 13:04

AW: StringGrid: Breite der vertikalen Scrollbar ermitteln
 
Schau Dir mal TGridDrawInfo an; vllt ersparst Du Dir dann das Gefummel mit den Scrollbars.
Besonders TGridDrawInfo.Horz.LastFullVisibleCell u dgl ...

DeddyH 23. Feb 2015 13:06

AW: StringGrid: Breite der vertikalen Scrollbar ermitteln
 
Versuch es mal mit GetSystemMetrics:
Zitat:

SM_CXVSCROLL

The width of a vertical scroll bar, in pixels.

Helmi 23. Feb 2015 13:07

AW: StringGrid: Breite der vertikalen Scrollbar ermitteln
 
Zitat:

Zitat von ConnorMcLeod (Beitrag 1291101)
Schau Dir mal TGridDrawInfo an; vllt ersparst Du Dir dann das Gefummel mit den Scrollbars.
Besonders TGridDrawInfo.Horz.LastFullVisibleCell u dgl ...

klingt interessant - werd ich mir mal zu Gemüte führen

hab aber bei den Schweizern noch einen Code für die Breite/Höhe gefunden link

ConnorMcLeod 23. Feb 2015 13:22

AW: StringGrid: Breite der vertikalen Scrollbar ermitteln
 
Viele Wege führen zum Kompilat.

Was mich bei der Scrollbar-Überlegung stört ist, daß die Scrollbars nicht Teil des Problems sind, sondern nur ein Symptom.

Das Problem ist ein zu breites Grid, das angepaßt werden muß.

Wenn aus diversen Gründen grundsätzlich keine Scrollbars angezeigt würden (Optionen verändert etc.), dann hättest Du keine Scrollbars, aber das Grid wäre immer noch zu breit.
Über die GridDrawInfo und LeftCol weißt Du alles, was Du wissen mußt:
Delphi-Quellcode:
var
  DrawInfo: TGridDrawInfo;
begin
  grdDemo.CalcDrawInfo(DrawInfo);

Helmi 23. Feb 2015 13:29

AW: StringGrid: Breite der vertikalen Scrollbar ermitteln
 
Zitat:

Zitat von ConnorMcLeod (Beitrag 1291110)
Viele Wege führen zum Kompilat.

Was mich bei der Scrollbar-Überlegung stört ist, daß die Scrollbars nicht Teil des Problems sind, sondern nur ein Symptom.

Das Problem ist ein zu breites Grid, das angepaßt werden muß.

Wenn aus diversen Gründen grundsätzlich keine Scrollbars angezeigt würden (Optionen verändert etc.), dann hättest Du keine Scrollbars, aber das Grid wäre immer noch zu breit.
Über die GridDrawInfo und LeftCol weißt Du alles, was Du wissen mußt:
Delphi-Quellcode:
var
  DrawInfo: TGridDrawInfo;
begin
  grdDemo.CalcDrawInfo(DrawInfo);

bei mir gibt es CalcDrawInfo nicht

ConnorMcLeod 23. Feb 2015 13:32

AW: StringGrid: Breite der vertikalen Scrollbar ermitteln
 
Ich habe D2010, da heißt es in Grids.pas / Zeile 2465:

Delphi-Quellcode:
procedure TCustomGrid.CalcDrawInfo(var DrawInfo: TGridDrawInfo);

Helmi 23. Feb 2015 13:49

AW: StringGrid: Breite der vertikalen Scrollbar ermitteln
 
in XE2 ist CalcDrawInfo protected

DeddyH 23. Feb 2015 13:56

AW: StringGrid: Breite der vertikalen Scrollbar ermitteln
 
Naja, da kommt man ja noch drum herum.

Helmi 23. Feb 2015 13:58

AW: StringGrid: Breite der vertikalen Scrollbar ermitteln
 
Zitat:

Zitat von DeddyH (Beitrag 1291116)
Naja, da kommt man ja noch drum herum.

verrätst du mir auch wie?
(habs ned so mit knacken :-) )

DeddyH 23. Feb 2015 14:00

AW: StringGrid: Breite der vertikalen Scrollbar ermitteln
 
Delphi-Quellcode:
type
  TStringGrid = class(Grids.TStringGrid)
  public
    procedure CalcDrawInfo(var DrawInfo: TGridDrawInfo);
  end;

  TFormDings = class(TForm)
    StringGrid1: TStringGrid;
    ...
  end;

...


procedure TStringGrid.CalcDrawInfo(var DrawInfo: TGridDrawInfo);
begin
  inherited;
end;

ConnorMcLeod 23. Feb 2015 14:04

AW: StringGrid: Breite der vertikalen Scrollbar ermitteln
 
Müßte auch so gehen (rein ausm Kopf):

Delphi-Quellcode:
type
  TMyDemoGrid = class(TStringGrid)
  end;

...

var
  FgrdDemo: TMyDemoGrid;

...

procedure MachWas;
var
  DrawInfo: TGridDrawInfo;
begin
  FgrdDemo.CalcDrawInfo(DrawInfo);

DeddyH 23. Feb 2015 14:10

AW: StringGrid: Breite der vertikalen Scrollbar ermitteln
 
Japp, solange "nur" protected (ohne strict).

Sir Rufo 23. Feb 2015 14:12

AW: StringGrid: Breite der vertikalen Scrollbar ermitteln
 
Also ich habe es gerade getestet (XE7) und Delphi-Referenz durchsuchenTStringGrid.ClientWidth ändert sich, wenn die Scrollbar ins Spiel kommt.
Delphi-Quellcode:
type
  TForm1 = class( TForm )
    StringGrid1: TStringGrid;
    Label1: TLabel;
    Button1: TButton;
    procedure Button1Click( Sender: TObject );
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click( Sender: TObject );
begin
  StringGrid1.RowCount := StringGrid1.RowCount + 1;
  Label1.Caption := StringGrid1.ClientWidth.ToString;
end;
Allerdings muss man aufpassen, wenn man innerhalb eines StringGrid-Events auf diese Eigenschaft zugreifen möchte. Diese wird nämlich quasi zum Abschluss der gesamten Aktualisierung gesetzt und ist somit erst nach Abarbeitung der ganzen Events verfügbar.

BadenPower 23. Feb 2015 14:56

AW: StringGrid: Breite der vertikalen Scrollbar ermitteln
 
Zitat:

Zitat von Helmi (Beitrag 1291117)
Zitat:

Zitat von DeddyH (Beitrag 1291116)
Naja, da kommt man ja noch drum herum.

verrätst du mir auch wie?

So würde es auch gehen:

Delphi-Quellcode:
implementation

{$R *.dfm}

type
   TStringGridAntiProtect = class(TStringGrid);

procedure TF_DevelopTest.Button1Click(Sender: TObject);
var
  DrawInfo: TGridDrawInfo;
begin
  TStringGridAntiProtect(StringGrid1).CalcDrawInfo(DrawInfo);
end;

Helmi 23. Feb 2015 15:04

AW: StringGrid: Breite der vertikalen Scrollbar ermitteln
 
Zitat:

Zitat von Sir Rufo (Beitrag 1291122)
Delphi-Quellcode:
procedure TForm1.Button1Click( Sender: TObject );
begin
  StringGrid1.RowCount := StringGrid1.RowCount + 1;
  Label1.Caption := StringGrid1.ClientWidth.ToString;
end;

In diesem Beispiel dürfte sich ClientWidth gar nicht verändern, da du nur Zeilen hinzufügst, dadurch die Höhe veränderst, nicht aber die Breite

Sir Rufo 23. Feb 2015 15:28

AW: StringGrid: Breite der vertikalen Scrollbar ermitteln
 
Zitat:

Zitat von Helmi (Beitrag 1291132)
Zitat:

Zitat von Sir Rufo (Beitrag 1291122)
Delphi-Quellcode:
procedure TForm1.Button1Click( Sender: TObject );
begin
  StringGrid1.RowCount := StringGrid1.RowCount + 1;
  Label1.Caption := StringGrid1.ClientWidth.ToString;
end;

In diesem Beispiel dürfte sich ClientWidth gar nicht verändern, da du nur Zeilen hinzufügst, dadurch die Höhe veränderst, nicht aber die Breite

Falsch, irgendwann können nicht mehr alle Zeilen angezeigt werden und dann kommt die Scrollbar und die Änderung der Breite

Helmi 23. Feb 2015 15:34

AW: StringGrid: Breite der vertikalen Scrollbar ermitteln
 
Zitat:

Zitat von Sir Rufo (Beitrag 1291139)
Zitat:

Zitat von Helmi (Beitrag 1291132)
Zitat:

Zitat von Sir Rufo (Beitrag 1291122)
Delphi-Quellcode:
procedure TForm1.Button1Click( Sender: TObject );
begin
  StringGrid1.RowCount := StringGrid1.RowCount + 1;
  Label1.Caption := StringGrid1.ClientWidth.ToString;
end;

In diesem Beispiel dürfte sich ClientWidth gar nicht verändern, da du nur Zeilen hinzufügst, dadurch die Höhe veränderst, nicht aber die Breite

Falsch, irgendwann können nicht mehr alle Zeilen angezeigt werden und dann kommt die Scrollbar und die Änderung der Breite

Ich geb mich geschlagen...


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:54 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz