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/)
-   -   TStringgrid - Width und ColWidth (https://www.delphipraxis.net/207514-tstringgrid-width-und-colwidth.html)

Delbor 1. Apr 2021 15:25

TStringgrid - Width und ColWidth
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi zusammen

In einem Containerframe habe ich 4 Frameinstanzen( im Endeffekt sollen es 12 sein):
Anhang 53833
Im Container gibts dies:
Delphi-Quellcode:
   for i := Low(Monate) to High (Monate) do
   begin
      case i of     //ContentDayNumberFrameUnit;   DayNrFrameApril
         1: begin
               Self.DayNrFrameJanuary.InitDayNumberFrame;
               LMonth := I;
               Self.DayNrFrameJanuary.FirstMonthDay := StartOfAMonth(LYear, LMonth);
               Self.DayNrFrameJanuary.LastMonthDay := EndOfAMonth(LYear, LMonth);
               Self.DayNrFrameJanuary.LblCaption.Caption := Monate[i];
               Self.DayNrFrameJanuary.HorzDayNumbersMonths;
            end;
         2: begin
               Self.DayNrFrameFebruary.InitDayNumberFrame;
               LMonth := I;
               {Die Einstellungen hier sind Wiederholungen auf eine andere Instanz}
            end;
         3: ...

         4: ...

         5: ....

         12:...

            end;
      end;
Im Basisframe gibts die Public deklarierte Prozedur InitDayNumberFrame, die, da sie Public deklariert ist, an Frameinstanzen wie DayNrFrameFebruary oder DayNrFrameApril vererbt werden sollte:
Delphi-Quellcode:
procedure TDayNumberFrame.InitDayNumberFrame;
begin
  Self.StrGCalendarMonthFrame.ColWidths[0] := 40;
  Self.StrGCalendarMonthFrame.ColWidths[1] := 30;
  Self.StrGCalendarMonthFrame.ColWidths[2] := 30;
  Self.StrGCalendarMonthFrame.ColWidths[3] := 30;
  Self.StrGCalendarMonthFrame.ColWidths[4] := 30;
  Self.StrGCalendarMonthFrame.ColWidths[5] := 30;
  Self.StrGCalendarMonthFrame.ColWidths[6] := 30;
  Self.StrGCalendarMonthFrame.ColWidths[7] := 30;
  Self.StrGCalendarMonthFrame.Width := 8*30;
end;
Das Strinnggrid sollte zur Laufzeit also nicht breiter als die Summe seiner Spaltenbreiten sein. Ist aber nicht. Das grid und seine Breitenverhältnisse werden genauso dargestellt, wie im jpeg widergegeben.
Was ist da falsch?

Gruss
Delbor

bcvs 1. Apr 2021 15:39

AW: TStringgrid - Width und ColWidth
 
Was ist denn das Alignment von dem StrGCalendarMonthFrame? Wenn das alClient ist, bringt ja
Delphi-Quellcode:
Width := 8*30
nichts

himitsu 1. Apr 2021 16:25

AW: TStringgrid - Width und ColWidth
 
Abgesehn von einem eventuellen Align, stimmt da eh etwas nicht.

* deine Rechnung ist Falsch
40+7*30, denn siehe
Delphi-Quellcode:
ColWidths[0] := 40;

und muüßte man nicht noch die Linie zwischen den Columns hinzurechnen?
also 41+7*31

und vielleicht auch noch eine eventuelle Scrollbar, falls malc mehr Rows/Zeilen

* und wie man genau sieht, sind alle Spalten gleich breit, was auch nicht stimmen kann, denn siehe
Delphi-Quellcode:
ColWidths[0] := 40;

"sollte" ist kein "ist wirklich so", was man aber mit dem Debugger bestimmt leicht prüfen könnte

Delbor 1. Apr 2021 17:36

AW: TStringgrid - Width und ColWidth
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi zusammen

Zitat:

Zitat von bcvs (Beitrag 1486436)
Was ist denn das Alignment von dem StrGCalendarMonthFrame? Wenn das alClient ist, bringt ja
Delphi-Quellcode:
Width := 8*30
nichts

Das war der wichtige Hinweis - ich habe das alClient durch
Delphi-Quellcode:
alignal := Custom
ersetzt und die Anchors stehen lassen. Ich hab zwar nie wirklich verstanden, was das "alCustom" bewirkt oder bewirken soll. Klar ist nur: das Grid klebt jetzt an der linken Seite.

Die Breitenzuweisung, auch für TDayNumberFrame, ist nun so:
Delphi-Quellcode:
  Self.StrGCalendarMonthFrame.Width := (7*30) + 40 + 10;
  Self.Width := StrGCalendarMonthFrame.Width;
GridLineWidth ist hier das (Standard-) 1 - da hab ich mich erstmal verzählt und nur den Wert 7 statt 9 eingesetzt. Schliesslich habe ich stattdessen sogar auf 10 erhöht. Korrekt wäre wohl eher Borderwith*2...

Im Moment sieht das so aus:
Anhang 53834

Zitat:

Zitat von himitsu (Beitrag 1486439)
Abgesehn von einem eventuellen Align, stimmt da eh etwas nicht.

* deine Rechnung ist Falsch
40+7*30, denn siehe
Delphi-Quellcode:
ColWidths[0] := 40;

und muüßte man nicht noch die Linie zwischen den Columns hinzurechnen?
also 41+7*31

Ja, die Rechnung war falsch - und sorry, sie ist es leider auch so noch. Zwischen den 8 Spalten sind 7 Trennlinien plus eine vor der ersten und eine nach der letzten Spalte. Es reicht also nicht, jeder Spalte eine Trennlinie dazuzurechnen. Aber zugegeben: das ist meine Theorie und kein Blick in die .pas.

Zitat:

Zitat von himitsu (Beitrag 1486439)
und vielleicht auch noch eine eventuelle Scrollbar, falls malc mehr Rows/Zeilen

Die Scrollbars kommen weg. Das Grid soll die Tage eines Monats anzeigen, nicht mehr und nicht weniger. Wenn letztlich noch gescrollt werden muss, so der Container. der diese Frameinstanzen enthält.

Zitat:

Zitat von himitsu (Beitrag 1486439)
* und wie man genau sieht, sind alle Spalten gleich breit, was auch nicht stimmen kann, denn siehe
Delphi-Quellcode:
ColWidths[0] := 40;

"sollte" ist kein "ist wirklich so", was man aber mit dem Debugger bestimmt leicht prüfen könnte

[/QUOTE]
Das verstehe ich jetzt nicht wirklich. Die erste Spalte ist momentan breiter als die anderen, weil sie nebst dem 'W' auch noch die Wochennummer aufnehmen soll.
Eine Alternative wäre, das W in die 1. Zeile vor die Tagesname zu schreiben und ansonsten in der ersten Spalte nur noch die Wochennummern hinzuschreiben.

Gruss
Delbor

himitsu 1. Apr 2021 17:50

AW: TStringgrid - Width und ColWidth
 
Zitat:

Zitat von Delbor (Beitrag 1486440)
Das verstehe ich jetzt nicht wirklich.
Die erste Spalte ist momentan breiter als die anderen,

Aber nicht in dem Bild in Post #1. Dort sind alle Spalten gleich breit. :zwinker:

Zitat:

Es reicht also nicht, jeder Spalte eine Trennlinie dazuzurechnen. Aber ...
Ja OK, die Columns, die Trenner dawischen/davor/dahinter (können auch teilweise ins ColWidth einbezogen sein) und natürlich noch der Rahmen der Komponente drumrum.

Delphi.Narium 1. Apr 2021 22:07

AW: TStringgrid - Width und ColWidth
 
Zitat:

Zitat von Delbor (Beitrag 1486440)
Ich hab zwar nie wirklich verstanden, was das "alCustom" bewirkt oder bewirken soll.

Das heißt schlicht und einfach: Die Werte von Left, Width, Top und Height sind für die Darstellung maßgebend.
Oder: Jeder Automatismus für die Positionierung der Komponente ist ausgeschaltet.

Das Design, die Position, Höhe, Breite müssen selbst geregelt werden, also genau das, was Du gerade beabsichtigst.

Delbor 1. Apr 2021 23:49

AW: TStringgrid - Width und ColWidth
 
Hi Delphi-Natrium

Zitat:

Zitat von Delphi.Narium (Beitrag 1486455)
Zitat:

Zitat von Delbor (Beitrag 1486440)
Ich hab zwar nie wirklich verstanden, was das "alCustom" bewirkt oder bewirken soll.

Das heißt schlicht und einfach: Die Werte von Left, Width, Top und Height sind für die Darstellung maßgebend.
Oder: Jeder Automatismus für die Positionierung der Komponente ist ausgeschaltet.

Das Design, die Position, Höhe, Breite müssen selbst geregelt werden, also genau das, was Du gerade beabsichtigst.

Damit wäre es dasselbe wie Align := alNone, wenn ich das jetzt (und bisher eigentlich auch) richtig verstanden habe. Danke für die Info.

Gruss
Delbor

himitsu 2. Apr 2021 06:39

AW: TStringgrid - Width und ColWidth
 
Zitat:

Zitat von Delbor (Beitrag 1486456)
Damit wäre es dasselbe wie Align := alNone,

Nein.

Schonmal auf die Idee gekommen die Hilfe zu fragen?
Delphi-Referenz durchsuchenVcl.Controls.TAlign

alNone macht garnichts

und bei alCustom mußt DU, in entsprechend Events, das selbst ausrichten,
oder der Parent enthält Funktionen, um seine Untercontrols auszurichten.

Delbor 3. Apr 2021 20:03

AW: TStringgrid - Width und ColWidth
 
Hi zusammen
Zitat:

Zitat von himitsu (Beitrag 1486458)
Schonmal auf die Idee gekommen die Hilfe zu fragen?
Delphi-Referenz durchsuchenVcl.Controls.TAlign

alNone macht garnichts

und bei alCustom mußt DU, in entsprechend Events, das selbst ausrichten,
oder der Parent enthält Funktionen, um seine Untercontrols auszurichten.

Ja, eigentlich schon - nur eben bei Align&Co eher nicht. Hab dies mal etwas nachgeholt:
TAlign
CustomAlignInsertBefore
CustomAlignPosition
OnAlignPosition

Trotzdem bleiben mir noch einige Verständnisfragen. alCustom ausgerichtete Komponenten müssen über NewLeft, NewTop,NewRight und NewBottom erfasst/ausgerichtet werden, sonst schweben die irgendwo im Nirwana (und eher zufällig auf dem Bildschirm).

Frage1: Können TAlign-Typen und Events wie OnAlignPosition auch automatisch auf Grössenänderungen reagieren, wie zB.Skalierungen aller Art?
Meine Überlegung dahinter: X := 5 ist in einem bereits skalierten Objekt nicht am selben Ort wie in einem selben, aber nicht skalierten Objekt.
Frage2: Was ist vorteilhafter / aufwändiger: Left&CO direkt zuzuweisen oder über Align:= al Custom?

Gruss
Delbor


Alle Zeitangaben in WEZ +2. Es ist jetzt 11:16 Uhr.

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