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 Dynamische StrigGrid breite will nicht. (https://www.delphipraxis.net/116697-dynamische-striggrid-breite-will-nicht.html)

xSkaschY 4. Jul 2008 13:51


Dynamische StrigGrid breite will nicht.
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo zusammen,

ich probiere gerade meinem TStringGrid beizubringen, wenn das Formular resized wird, sich automatisch der neuen Größe anzupassen.

Das Problem ist, das bei bestimmten Größen die Breite nicht angepasst wird sondern nur ab einer bestimmten Breite. (siehe Dateianhang).


Ich habe hierfür die Breiten in Prozent angegeben.

Delphi-Quellcode:
type
        TDynamicWidth = record
                iWidth: Integer;
        end;

var
        aDynamicWidth: Array of TDynamicWidth;

Die eigentliche Prozedure sieht wie folgt aus:

Delphi-Quellcode:
type
        TStringGridHack = class(TStringGrid)
                public
                        procedure setDynamicWidth(fTarget: TStringGrid; aWidth: Array of TDynamicWidth);

        end;

var
        oStringGridHack: TStringGridHack;

procedure TStringGridHack.setDynamicWidth(fTarget: TStringGrid; aWidth: Array of TDynamicWidth);
var
        i: Integer;
        iGridWidth: Integer;
begin
        if Length(aWidth) > 0 then begin
                iGridWidth := fTarget.Width;
                for i := 0 to Length(aWidth) - 1 do begin
                        fTarget.ColWidths[i] := iGridWidth div 100 * aWidth[i].iWidth;
                end;

        end;
end;
aufgerufen wird das ganze so..:

Delphi-Quellcode:
procedure TPreferences.FormResize(Sender: TObject);
var
        aWidth: Array of TDynamicWidth;
begin
        // 3 Spalten im TStringGrid
        SetLength(aWidth, 3);

        // Werte in Prozent
        aWidth[0].iWidth := 40;
        aWidth[1].iWidth := 20;
        aWidth[2].iWidth := 40;
       

        oStringGridHack.setDynamicWidth(sgBindings, aWidth);
        SetLength(aWidth, 0);
end;


Weiß jemand warum die breite der einzelnen Spalten nicht präzise berechnet werden?


LG Toby

DeddyH 4. Jul 2008 13:55

Re: Dynamische StrigGrid breite will nicht.
 
Ganzzahlige Division ist immer extrem ungenau. Benutze doch Gleitkommazahlen und runde dann einfach.

QuickAndDirty 4. Jul 2008 14:00

Re: Dynamische StrigGrid breite will nicht.
 
Colwidths[i] enthält die INNERE breite der Zellen. Da kommt also noch mindestens ein pixel prozelle hinzu.
zu dem solltest du den Style flat Machen um den Gitter Rand zu entfernen

xSkaschY 4. Jul 2008 14:05

Re: Dynamische StrigGrid breite will nicht.
 
Zitat:

Zitat von DeddyH
Ganzzahlige Division ist immer extrem ungenau. Benutze doch Gleitkommazahlen und runde dann einfach.

Danke das war des Rätselslösung!

Zitat:

Zitat von QuickAndDirty
Colwidths[i] enthält die INNERE breite der Zellen. Da kommt also noch mindestens ein pixel prozelle hinzu.
zu dem solltest du den Style flat Machen um den Gitter Rand zu entfernen

Ja, habe ich gerade gemerkt. Auch dir danke für den Tip! :-)


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:25 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