Sinhrono spreminjanje velikosti forme in komponent na njej

Vse o grafiki, canvasu, directdraw, itd.
Silver_War
Prispevkov: 662
Pridružen: 01.06.2004 14:50:41

Sinhrono spreminjanje velikosti forme in komponent na njej

OdgovorNapisal/-a Silver_War » 04.04.2005 02:22:08

Ker se je pred nekoliko časa pisalo o tem, kako bi lahko spremenil velikost forme in hkrati tudi komponent, ki so na njej, brez večjega popačenja, sem se spustil in napisal kodo, ki to naredi. Zaenkrat koda omogoča prilagajanje velikosti komponentam, ki so bile postavljene na formo že pri oblikovanju in ne dinamično. Za dinamično kreirane komponente in pa za komponente, ki so naknadno premikane na formi, se bom pa moral še malo potrudit in izpopolnit kodo. Vendar pričakujte koda kaj kmalu.

Tu je pa še koda.

Koda: Izberi vse

 unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TKontrola = record
    Height: Integer;
    Width: Integer;
    Left: Integer;
    Top: Integer;
  end;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure AdjustControls;
    procedure FormCreate(Sender: TObject);
    procedure FormResize(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  StartHeight,StartWidth: Integer;
  ChildControl: TControl;
  Con: Array of TKontrola;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var N: Integer;
begin
    StartWidth := Width;
    StartHeight := Height;
    SetLength(Con, Form1.ControlCount);
    for N:=0 to Form1.ControlCount-1 do
    begin
        Con[N].Height := Form1.Controls[N].Height;
        Con[N].Width := Form1.Controls[N].Width;
        Con[N].Left := Form1.Controls[N].Left;
        Con[N].Top := Form1.Controls[N].Top;
    end;
end;

procedure TForm1.AdjustControls;
var N,HeightRatio,WidthRatio: Integer;
begin
    WidthRatio := Form1.Width*100 div StartWidth;
    HeightRatio := Form1.Height*100 div StartHeight;
    for N:=0 to Form1.ControlCount-1 do
    begin
        Form1.Controls[N].Height := Con[N].Height*HeightRatio div 100;
        Form1.Controls[N].Width := Con[N].Width*WidthRatio div 100;
        Form1.Controls[N].Left := Con[N].Left*WidthRatio div 100;
        Form1.Controls[N].Top := Con[N].Top*HeightRatio div 100;
    end;
end;

procedure TForm1.FormResize(Sender: TObject);
begin
    Form1.AdjustControls;
end;

end.
 

Miha-R
Prispevkov: 2153
Pridružen: 14.05.2001 21:29:53

Sinhrono spreminjanje velikosti forme in komponent na njej

OdgovorNapisal/-a Miha-R » 04.04.2005 02:48:21

Ena misel o uporabnosti take kode:

Tvoja koda bi se mogoče obnesla pri umotvoru, ki ga ponazarja zaslonska slika (naj mi avtorji programa oprostijo, ker sem jih dal kot primer, ampak kaj še bolj nepreglednega res težko najdeš), vendar so redki programi, kjer je zaželjeno, da se ob spremembi velikosti okna spremeni velikost vsem komponentam na tej formi. Običajno je okno sestavljeno tako, da se spremembi velikosti prilagaja le del okna, medtem ko ostali del(i) ohrani(jo) prvotno velikost.

Sicer pa tvoja koda verjetno dobro opravi svojo nalogo.

Fortuna
Prispevkov: 1097
Pridružen: 26.06.2004 09:59:52

Sinhrono spreminjanje velikosti forme in komponent na njej

OdgovorNapisal/-a Fortuna » 04.04.2005 10:55:34

Zelo zanimivo. Nestrpno pričakujem nadaljevanje.

Lp.

Silver_War
Prispevkov: 662
Pridružen: 01.06.2004 14:50:41

Sinhrono spreminjanje velikosti forme in komponent na njej

OdgovorNapisal/-a Silver_War » 04.04.2005 13:54:10

Se opravičujem, ker moja koda ni komentirana, vendar ko sem se včeraj spomnil, da sem pozabil vnesti še komentarje, mi ni več pustilo vnašati popravke za moj post, ker drugače, bi bili komentarji tudi vključeni. Bom pa ob objavi nadaljevanja vključil komentarje za celotno kodo.

Res pa je, da se moram naučiti sprotnega vnašanja komentarjev v kodo.

Kar se pa tiče prilagajanja velikosti komponent na formi z velikostjo same forme, pa to pride prav, še posebej, če hočeš, da bo program morda deloval tudi na nekoliko starejših računalnikih, ki so pri resolucijah 800:600 ali večjih, že tako počasni, da se z njimi sploh neda delat. Vglavnem to omogoča večjo združljivost programa z starejšimi sitemi, ki pa dandanes še vedno pride prav.
Zadnjič spremenil Silver_War, dne 04.04.2005 13:58:34, skupaj popravljeno 1 krat.

fatG
Prispevkov: 494
Pridružen: 22.05.2001 23:14:08

Sinhrono spreminjanje velikosti forme in komponent na njej

OdgovorNapisal/-a fatG » 05.04.2005 02:11:17

S tem mislis, da ce preneses program na star sistem, ki ima slabso resolucijo, da se tam potem vse komponente pomanjsajo?

Kar s tem dosezes je to, da na dalec forma res zgleda enako, kaj pa vidljivost komponent? Pomisli na label/text komponente, besedilo v njih ni vec vidno. Pri raznih gridih se gre, ker se jim samo zmanjsa podrocje, pa je vec za scrollat. Pri ostalih pa se ne bo v redu izslo.
you're never too fat to do it

Silver_War
Prispevkov: 662
Pridružen: 01.06.2004 14:50:41

Sinhrono spreminjanje velikosti forme in komponent na njej

OdgovorNapisal/-a Silver_War » 05.04.2005 12:09:56

Zato pa nameravam mojo kodo še izboljšat tako, da bo po potrebi prilagajala tudi text v samih komponentah. Namreč funkcija ScaleBy prilagaja tudi text v samih komponentah, vendar ne pa prilagaja lastnosti left in top, tako da pri povečavi forme pride do prekrivanja komponent ene čez drugo. In če bo meni uspelo naredit, to kar sem si zamislil, bom kodo poslal tudi na Borlanda, tako bojo lahko kodo dodali samemu delphiju. Ker ta koda ni uporabna samo za starejše računalnike, temveč tudi za novejše. Primer: Nekaj let nazaj, dokler je SoftWarePower kot vmesnik za pregledovanje CD-ja uporabljal program, ki ni temeljil na internetni strani, kakor sedaj, je bilo vmesnik možno uporabljati le pri resoulucijah 800:600 ali večjih. Seveda pri resoluciji 800:600 je vmeznik zavzemal celoten ekran, s tem ko pa je pri večjih lastnostih, le ta zavzemal le del ekrana. Ob morebitni uporabi fajn velike resolucuje npr. 1280:1024 bi ta program zavzemal le nekaj več kot 60% celotne površine ekrana. Samo besedilo, gumbi in vsi gradniki na programu, bi bili tako majhni, da bi jih stežka brali oz. videli. Zato imajo sedaj program, ki na podlagi datotek, ki so na CD-ju ustvari internetno stran, katere velikost se prilagaja velikosti programa.
Lahko pa si pogledaš tudi kateri drug program npr. Winword. Winword je optimiziran za resolucijo 800:600. Pri manjši resoluciji nevidimo celotnih Toolbarjev, pri večji resoluciji, pa v vrsticah, kjer imamo Toolbarje ostaja prazen prostor, ki ponavadi ni izkoriščen. Res je da mi ki smo že malo bolj napredni uporabniki, si program prilagodimo, tako da čimbolj izkoristimo ta preostali prostor, s tem ko pa uporabniki, ki se toliko ne spoznajo na računalnik, tega ne naredijo, ker nevejo kako. Tu bi tudi lahko moja procedura prišla prav, ker bi velikost komponent prilagajala sami velikosti programa, oziroma zaslona.

Uporabniški avatar
JernejL
Prispevkov: 1292
Pridružen: 17.11.2001 10:14:23
Kontakt:

Sinhrono spreminjanje velikosti forme in komponent na njej

OdgovorNapisal/-a JernejL » 05.04.2005 12:46:16

okna imajo že vgrajeno "scaliranje" oken glede na nastavljeno velikost pisav (primer so visokokontrastne sheme..)
a vsi programi tega ne znajo ali ne morejo pravilno uporabiti. za prav lep primer kako bi se vsebina forme
samodejno prilagaja velikosti okna pa vas lahko napotim da si prenesete winamp 3 ali 5 kjer lahko velikost
glavnega okna spreminjaš kolikor želiš vsebina pa je vedno uporabna.
Igre in Delphi - WIP projekt, ki traja že od leta 2003. [url]http://mathpudding.com/[/url]

Miha-R
Prispevkov: 2153
Pridružen: 14.05.2001 21:29:53

Sinhrono spreminjanje velikosti forme in komponent na njej

OdgovorNapisal/-a Miha-R » 05.04.2005 13:03:26

... vas lahko napotim da si prenesete winamp 3 ali 5 kjer lahko velikost glavnega okna spreminjaš kolikor želiš vsebina pa je vedno uporabna.

Dobro, scaling nastavim na 300% in zdaj WinAmp okno zasede četrt zaslona. Odprem meni in dobim standardno velike črke. Torej ni vse povečano, kajne?
Vedno sem želel napisati prav tak odgovor.

matej
Prispevkov: 1837
Pridružen: 03.01.2002 20:40:38

Sinhrono spreminjanje velikosti forme in komponent na njej

OdgovorNapisal/-a matej » 05.04.2005 13:44:32

Še nekaj v razmislek. Zakaj si ljudje (vključno z mano) kupujejo velike monitorje z visoko resolucijo? A zato, ker bi bili slepi in bi slabo videli ali zato, da bodo lahko imeli "več stvari hkrati" na enkranu? Menim da zaradi slednjega. Če si kupim večji monitor (npr. 20" lcd-ja ki podpira resolucijo 1600x1200) nikakor ne želim da bi programi ki jih uporabljam imeli sedaj "povečane" ikone in fonte, pač pa želim normalno velikost s tem da lahko imam sedaj večji delovni prostor.
Ali z drugimi besedami. Kot je že nekdo pred menoj povedal imajo praviloma uporabniški vmesniki 2 dela. Enega "fiksnega" ki se ne spreminja z velikostjo in enega "prilagodljivega" (tistega "glavnega") ki se povečuje/pomanjšuje glede na velikost okna. "Sinhrono" spreminjanje velikosti komponent se meni osebno zdi zelo čudno in si nebi želel uporabljati programa s takšno "funkcionalnostjo".

Seveda pa je to moje osebno mnenje.

matej

Silver_War
Prispevkov: 662
Pridružen: 01.06.2004 14:50:41

Sinhrono spreminjanje velikosti forme in komponent na njej

OdgovorNapisal/-a Silver_War » 05.04.2005 14:50:57

Ja res je, da to nebo všeč vsem uporabnikom programa, vendar pa ob prvi uporabi programa uporabnika vprašaš in potem si on sam izbere način prilagajanja forme glede na njegove zahteve. Seveda omogočiš, da si lahko uporabnik naknadno to možnost vklopi oz. izklopi.


Vrni se na

Kdo je na strani

Po forumu brska: 0 registriranih uporabnikov in 4 gostov