Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Objekte dynamisch mit Form skalieren (https://www.delphipraxis.net/14436-objekte-dynamisch-mit-form-skalieren.html)

dopeline 9. Jan 2004 13:24


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

Smokey 9. Jan 2004 13:31

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.

dopeline 9. Jan 2004 13:39

Re: Objekte dynamisch mit Form skalieren
 
Wie stelle ich die größe in den bezug zum formular?

dopeline

choose 9. Jan 2004 13:40

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...

dopeline 9. Jan 2004 13:51

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

Thunderchild 9. Jan 2004 14:21

Re: Objekte dynamisch mit Form skalieren
 
Geh ins onResize des Grids und ändere dort die Spalten.

dopeline 9. Jan 2004 14:31

Re: Objekte dynamisch mit Form skalieren
 
Also bei mir gibt es in den tabelleneigenschaften kein onResize :(

hast du solch ein ereignis?


Gruß, dopeline

dopeline 9. Jan 2004 14:36

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

Thunderchild 9. Jan 2004 14:56

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

dopeline 9. Jan 2004 15:00

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

Smokey 9. Jan 2004 15:19

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:
//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 mit den Rundungsfehlern kannste vermutlich weglassen, bei mir musste es nur sehr genau sein.

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)

dopeline 9. Jan 2004 16:48

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

dopeline 9. Jan 2004 17:35

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:
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;
woran kann das liegen?

@Smokey wie hast denn deine variablen deklariert?


Gruß, dopeline

Robert_G 9. Jan 2004 17:56

Re: Objekte dynamisch mit Form skalieren
 
Preisfrage: Was ist die oberste Property im OI für ein StringGrid?

dopeline 9. Jan 2004 18:06

Re: Objekte dynamisch mit Form skalieren
 
Align?

Robert_G 9. Jan 2004 18:52

Re: Objekte dynamisch mit Form skalieren
 
Zitat:

Zitat von Smokey
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.

Brauchst du alles nicht. Viele Kompos besitzen diese nette Property (jupp Align).
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.

Smokey 9. Jan 2004 19:39

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