Einzelnen Beitrag anzeigen

Delphi-Laie

Registriert seit: 25. Nov 2005
1.474 Beiträge
 
Delphi 10.1 Berlin Starter
 
#25

AW: Mehrere Formulare an Stringgridgröße anpassen

  Alt 30. Okt 2010, 22:21
Hallo hoika / Heiko, es könnte soo einfach sein, wie Du andeutetest:

Delphi-Quellcode:
Unit FormTools;

XXX

procedure AdjustForm(theForm: TForm; theStringGrid: TStringGrid);
begin
  dein Code

Heiko
Nun, meine Unit mit dem "tausendmal bewährten Code" (der in den einzelnen Units mit jeweils angepaßten Bezeichnern funktionert) sieht nunmehr so aus:
Delphi-Quellcode:
unit Formtools;

interface;

uses
 Windows
 , Forms
 , Grids
 ;

const Zeilenhoehe=17;Zellenbreitenzuschlag=6;

procedure Form_Skalieren(Form:TForm;StringGrid:TStringGrid);

implementation;

procedure Form_Skalieren(Form:TForm;StringGrid:TStringGrid);
var l,m:word;
begin
Form.Hide;

//Spaltenbreitenskalierung des Grids
for l:=0 to pred(StringGrid.ColCount) do StringGrid.ColWidths[l]:=Zellenbreitenzuschlag+StringGrid.Canvas.TextWidth(StringGrid.Cells[l,0]);//Skalieren nach Tabellenkopf
for l:=0 to pred(StringGrid.ColCount) do for m:=1 to pred(StringGrid.RowCount) do
  if StringGrid.ColWidths[l]<Zellenbreitenzuschlag+StringGrid.Canvas.TextWidth(StringGrid.Cells[l,m])
  then StringGrid.ColWidths[l]:=Zellenbreitenzuschlag+StringGrid.Canvas.TextWidth(StringGrid.Cells[l,m]);

//maximale horizontale Ausdehnung des Fensters ermitteln
Form.Width:=1;
while ((GetWindowlong(StringGrid.Handle,GWL_STYLE) and WS_HSCROLL)<>0) and (Form.width<screen.width) do Form.Width:=succ(Form.Width);

//maximale vertikale Ausdehnung des Fensters ermitteln
Form.Height:=succ(Form.Height-Form.ClientHeight);
while ((GetWindowlong(StringGrid.Handle,GWL_STYLE) and WS_VSCROLL)<>0) and (Form.Height<Screen.Height) do Form.Height:=succ(Form.Height);

//Horizontalkorrektur; es ginge wohl auch umgekehrt: 1. vertikale, 2. horizontale Ausdehnung ermitteln und schließlich Vertikalkorrektur
if ((GetWindowlong(StringGrid.Handle,GWL_STYLE) and WS_HSCROLL)=0) then //Horizontalscrollleiste nicht zu sehen
  begin
  while (GetWindowlong(StringGrid.Handle,GWL_STYLE) and WS_HSCROLL)=0 do Form.Width:=pred(Form.Width);
  Form.Width:=succ(Form.Width)
  end;

Form.Position:=poScreenCenter;
Form.Show

end;
end.
Es funktioniert - aber leider nur beim Formular "Form1". Bei den anderen Formularen bleibt der Code hängen, und zwar in der Zeile (unter "Horizontalkorrektur")

while (GetWindowlong(StringGrid.Handle,GWL_STYLE) and WS_HSCROLL)=0 do Form.Width:=pred(Form.Width) ,

und zwar wird dort die Breite ("Width") aus unerklärlichen Gründen in der While-Schleife nicht mehr verändert (dekrementiert). Was nützt (mir) der eigentlich sehr gute Debugger, wenn er nicht das tut, was im Quelltext angezeigt wird? Nichts!

Daß diese Funktion insgesamt überhaupt funktionieren soll (und es beim Form1 sogar zu meiner Verblüffung tut), ist mir völlig schleierhaft, weil hier doch nur Werteparameter, jedoch keine Variablenparameter übergeben werden (schließlich möchte ich ja das Originalformular verändern, also in seiner Größe anpassen, nicht jedoch irgendeine seiner Kopien). Ich kenne es von Pascal so, daß bei Werteparametern lokale Kopien angelegt werden, deshalb kam mir so etwas einfaches wie Dein obiger Vorschlag gar nicht erst in den Sinn. Doch das Formular und das StringGrid als Variablenparameter übergeben zu wollen/versuchen, war der Beginn meiner ersten und leider abenteuerlich-frustrationsreichen Exkursion in die (Un)Tiefen der objektorientierten Programmierung, die mich schließlich hilfesuchend in dieses Forum trieben. Doch trotz aufoperungsvoller Hilfe aller hier Beteiligen bin ich momentan meinem Ziel kein Quentchen nähergekommen.

Geändert von Delphi-Laie (31. Okt 2010 um 09:41 Uhr)
  Mit Zitat antworten Zitat