![]() |
Objekte dynamisch mit Form skalieren
Hallo!
als beispiel: ich habe auf einem form ein stringgrid. wenn ich zur laufzeit die größe des fensters ändere, soll sich das stringgrid mitskalieren! da sind noch weitere objekte. scrollbox, pagecontrol, panels, usw. die sollen im endeffekt auch mit skaliert werden kann mir da jemand helfen? Gruß, dopeline |
Re: Objekte dynamisch mit Form skalieren
nuja was gibts da gross zu helfen... ist nur ne Menge Tipparbeit und ein bisserl Rechnerei.
Über width/height top/left lässt sich ja dann alles einstellen in Bezug auf die Grösse des Programmfensters (im Resize-event). Kannst natürlich auch tools benutzen, die sowas vereinfachen, da gabs hier mal nen Link...aber ich hab die nie ausprobiert. |
Re: Objekte dynamisch mit Form skalieren
Wie stelle ich die größe in den bezug zum formular?
dopeline |
Re: Objekte dynamisch mit Form skalieren
Hallo Smokey,
seit D4 unterstützt besitzt die Basisklasse TControl die Eigenschaft Anchors. Sieh einmal in der OH nach und spiel ein wenig damit herum, vielleicht lässt sich so das gewünschte Resultat auch ohne eine Zeile Code realisieren... |
Re: Objekte dynamisch mit Form skalieren
das mit dem anchors funzt super!
allerdings kann ich es nicht auf die spalten des stringgrids anwenden. :( gibt es da auch noch einen trick? die spalten sollen sich proportional verbreitern... Gruß, dopeline |
Re: Objekte dynamisch mit Form skalieren
Geh ins onResize des Grids und ändere dort die Spalten.
|
Re: Objekte dynamisch mit Form skalieren
Also bei mir gibt es in den tabelleneigenschaften kein onResize :(
hast du solch ein ereignis? Gruß, dopeline |
Re: Objekte dynamisch mit Form skalieren
also ich habe es im onresize des hauptformulars versucht. mit
StringGrid1.ColWidths[0]:=StringGrid1.ColWidths[0]+1; allerdings ändert es sich nicht proportional zur fenstergröße, sondern wird immer um 1 größer, sobald ich das fenster skaliere... dopeline |
Re: Objekte dynamisch mit Form skalieren
ist ja auch klar. Da steht doch x:=x+1
Probiers lieber mit
Delphi-Quellcode:
for i:=0 to StringGrid.ColCount-1 do
StringGrid.ColWidths[i]:=StringGrid.width div StringGrid.ColCount |
Re: Objekte dynamisch mit Form skalieren
na das ist doch schon fast perfekt! allerdings sind die spalten unterschiedlich groß und sie werden durch dein verfahren gleichgroß!
Gruß, dopeline |
Re: Objekte dynamisch mit Form skalieren
Gnah Anchors hätte mir heut echt etwas arbeit erspart, da ich heut vormittag resizing programmiert habe *fg*
Zu den Columns : Ich habs so gelöst : Mir zur Designzeit die Werte für die Breiten des Grids und der einzelnen Spalten aufgeschrieben und daraus einen Breitenfaktor errechnet. Das sieht dann bei mir so aus :
Delphi-Quellcode:
Das mit den Rundungsfehlern kannste vermutlich weglassen, bei mir musste es nur sehr genau sein.
//columns im grid
iGridSize := DBGrid1.Width - 27; // 27 ist breite der vertikalen scrollbar dblFaktor := 68/722; DBGrid1.Columns.Items[0].Width := round(dblFaktor*iGridSize); dblFaktor := 102/722; DBGrid1.Columns.Items[1].Width := round(dblFaktor*iGridSize); dblFaktor := 91/722; DBGrid1.Columns.Items[2].Width := round(dblFaktor*iGridSize); dblFaktor := 107/722; DBGrid1.Columns.Items[3].Width := round(dblFaktor*iGridSize); dblFaktor := 105/722; DBGrid1.Columns.Items[4].Width := round(dblFaktor*iGridSize); dblFaktor := 81/722; DBGrid1.Columns.Items[5].Width := round(dblFaktor*iGridSize); dblFaktor := 100/722; DBGrid1.Columns.Items[6].Width := round(dblFaktor*iGridSize); dblFaktor := 68/722; DBGrid1.Columns.Items[7].Width := round(dblFaktor*iGridSize); //rundungsfehler korrigieren iTemp := 0; for i:= 0 to DBGrid1.Columns.Count -1 do begin iTemp := iTemp + DBGrid1.Columns.Items[i].Width; end; //gesamtbreite aller columns nach resize (iTemp) sollte gleichgross sein wie Gridbreite - Scrollbarbreite iTemp := iGridSize - iTemp; if not (itemp = 0) then //abweichungen werden durch resizen der Column Zone ausgeglichen DBGrid1.Columns.Items[1].Width := DBGrid1.Columns.Items[1].Width + iTemp; Das Resizen der Columns kannst auch vereinfachen indem du die Faktoren in ein Array packst oder so und dann (wie beim addieren unten) in einer Schleife die Columns einstellst. Nur ich musste das schnell hinter mich bringen und hatte keine lust mir da was zu überlegen und habs dann so hingeschmiert 8) |
Re: Objekte dynamisch mit Form skalieren
:| ähm.... ja...
ich habe keinen schimmer! welche typen haben denn deine variablen? und wie rechnest du den gridfaktor aus? sorry, bin noch nicht so weit in delphi... Gruß, dopeline |
Re: Objekte dynamisch mit Form skalieren
also das mit dem resizen funktionert super!
nur das mit der einen spalte, zu der dann die übrichgebliebene "breite" hinzugefügt wird, funktionert bei mir nicht er sagt in der letzten zeile (s.u.) " Inkompatible Typen: 'Integer' und 'Extended' " vielleicht habe ich die variablen falschen typen zugeordnet...
Delphi-Quellcode:
woran kann das liegen?
procedure TFormHaupt.FormResize(Sender: TObject);
var i:byte; iTemp,iGridSize,dblFaktor:real; begin iGridSize := SGS.Width; dblFaktor := 40/899; SGS.ColWidths[0] := round(dblFaktor*iGridSize); dblFaktor := 99/899; SGS.ColWidths[1] := round(dblFaktor*iGridSize); dblFaktor := 128/899; SGS.ColWidths[2] := round(dblFaktor*iGridSize); dblFaktor := 51/899; SGS.ColWidths[3] := round(dblFaktor*iGridSize); dblFaktor := 135/899; SGS.ColWidths[4] := round(dblFaktor*iGridSize); dblFaktor := 146/899; SGS.ColWidths[5] := round(dblFaktor*iGridSize); dblFaktor := 144/899; SGS.ColWidths[6] := round(dblFaktor*iGridSize); dblFaktor := 128/899; SGS.ColWidths[7] := round(dblFaktor*iGridSize); iTemp := 0; for i:= 0 to SGS.ColCount -1 do iTemp := iTemp + SGS.ColWidths[i]; iTemp := iGridSize - iTemp; if not (itemp = 0) then SGS.ColWidths[7] := SGS.ColWidths[7] + iTemp; // an dieser stelle meckert er (s.o.) end; @Smokey wie hast denn deine variablen deklariert? Gruß, dopeline |
Re: Objekte dynamisch mit Form skalieren
Preisfrage: Was ist die oberste Property im OI für ein StringGrid?
|
Re: Objekte dynamisch mit Form skalieren
Align?
|
Re: Objekte dynamisch mit Form skalieren
Zitat:
Verteile ein paar Panel auf deinem Form, ein bisschen mit Align gespielt und schon wirds immer schön skaliert. Die Anchors funktionieren nämlich nicht immer so wie sie sollten. |
Re: Objekte dynamisch mit Form skalieren
Joa nur wenn du unter Zeitdruck in einer dir neuen Programmiersprache entwickelst, verwendest du nicht viel Zeit auf das Finden der Ideallösung für den Resize deiner Form.
Vor allem nicht, wenn dir der händische Weg so klar ist, dass du in runtertippen kannst. Gerade für so Sachen wie "rumprobieren was alle Align einstellungen machen" hat man da wenig Zeit und nerv. Aber deshalb les ich ja parallel in Foren. Wenn da eine Idealere Lösung steht wird sie halt schnell genutzt (wie Anchors *g*). Aber für die Einstellung fixer und unterschiedlicher Columnsizes hab ich bisher noch nichts gelesen so beim gelegentlichen stöbern. Und bisher liefs auch sauber 8) Gerade im Bereich Oberflächen ist mir Delphi noch etwas suspekt...irgendwie anders als alle anderen Programmiersprachen die ich bisher hatte...(Ich sage nur ShowModal :roll: ein absoluter Krampf in Delphi). Nuja Tips + lesen machen klüger, rumprobieren bei so unwichtigen, simpel anders zu lösenden Sachen, macht zuviel Zeitaufwand. Sodele nu aber ins verdiente Wochenende und den Strand geniessen 8) Smk |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:21 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz