Avatar billede js_delphi Nybegynder
30. juli 2008 - 13:22 Der er 7 kommentarer og
2 løsninger

Skaermoploesninger og docking stations.

Hej,

jeg bruger foelgende kode til at tilpasse visuelle komponenter paa formen ved forskellige skaermoploesninger:

ScreenScaleHeight := Screen.Height/768;
ScreenScaleWidth := Screen.Width/1024;

for i := 0 to FrmMain.ComponentCount-1 do
begin
  //Set new Height, Width, Left and Top for buttons.
  if (Components[i] is TButton) then
  with (Components[i] as TButton) do
  begin
    Height := Round(Height*ScreenScaleHeight);
    Width := Round(Width*ScreenScaleWidth);
    Top := Round(Top*ScreenScaleHeight);
    Left := Round(Left*ScreenScaleWidth);
  end;
  ...

Det fungerer ret godt, i modsaetning til de faerdige komponenter, jeg kunne finde til formaalet.

Dog er der et problem, som jeg ikke kan greje:
Jeg har testet programmet paa en baerbar, som er sat i en docking station.
Baerbarens skaerm har en lavere oploesning end den skaerm, billedet vises paa via docking stationen. 
Problemet er, at mit program bliver resizet 2 gange, ser det ud til.
Dvs., min kode laeser oploesningen paa den store skaerm korrekt, og tilpasser alt derefter. Desvaerre ser det saa ud til, at "docking stationen" ligeledes laver en opskalering.
Resultatet er selvfoelgelig, at mit program skaleres alt for stort.

Nogen, som kender en loesning paa dette?

Paa forhaand tak!
Avatar billede hrc Mester
30. juli 2008 - 21:28 #1
Jeg tror løsningen hedder ScaleBy som du kan bruge til at skalere programmet i forhold til den opløsning det "lever" i.

http://www.youtube.com/watch?v=X_XU2F6UsdM
Avatar billede js_delphi Nybegynder
31. juli 2008 - 12:06 #2
Hej hrc,

det er desvaerre heller ikke den perfekte maade at goere det paa, som programmoeren selv er inde paa. Jeg kunne ogsaa forstille mig, at det vil give problemer med f.eks. TBevels, som jeg anvender som streger, hvor f.eks. bredden ikke maa aendre sig.

Hvordan tilpasser du selv visuelle komponenter paa formen ved forskellige skaermoploesninger?


Ved du i oevrigt, hvordan man kan saette Height, Width, Top og Left paa alle komponenter i et loop, uden at skulle tage hensyn til, hvilken komponent, det handler om (selvfoelgelig skal ovennaevnte proporties vaere tilstede)?
F.eks. som det her:

for i := 0 to FrmMain.ComponentCount-1 do
begin
  //Set new Height, Width, Left and Top for all components.
  with (Components[i]) do
  begin
    Height := Round(Height*ScreenScaleHeight);
    Width := Round(Width*ScreenScaleWidth);
    Top := Round(Top*ScreenScaleHeight);
    Left := Round(Left*ScreenScaleWidth);
  end;
  ...
Avatar billede hrc Mester
31. juli 2008 - 15:24 #3
Fik ikke set YouTuben til ende - det burde jeg måske have gjort.

I et gammelt program, i et firma hvor jeg ikke længere arbejder, fik jeg løst det. Problemstillingen var ikke skærmopløsningen, men at punktstørrelsen (DPI, under skærmopsætningen) blev ændret. Tingene stod af h. til.

Her mener jeg at jeg løste det ved, at pløje mine forme igennem, i runtime, og justere dem efter bedste evne, altså sådan som du selv gør det ovenfor - men jeg kontrollerede også dimensionerne efter deres parents og justerede dem den vej.

Som sagt, en gammel hedgangen ansættelse. Det betyder jeg knap kan huske det og slet ikke fremskaffe kode.
Avatar billede js_delphi Nybegynder
01. august 2008 - 09:01 #4
Hej hrc, tak for dit svar.

Hvordan goer du saa med de programmer, du laver idag?

Jeg har nu endelig fundet problemet med den doppelte skalering:
I hovedformens OnCreate laeser jeg de oprindelige Height, Width, Left og Top, og skalerer componenterne derefter.
I nogle docking stations bliver mit program skaleret op FOER jeg kan naa at laese de oprindelige Height, Width, Left og Top i OnCreate!
Dvs., de oprindelige Height, Width, Left og Top, som jeg laeser i OnCreate er saa allerede for store.

Er der en maade at fange de oprindelige Height, Width, Left og Top, foer formen bliver created, uden at det skal "hard codes"?
Avatar billede hrc Mester
01. august 2008 - 10:16 #5
I dag gør jeg ikke noget. Programmerne er enten for gamle til at det er værd at rode i eller for nye (funktionaliteten er lavt prioriteret). Brugerne må holde nallerne væk fra DPI'erne.
Programmerne håndterer dog at brugeren bevæger sig fra en maskines skærmopløsning til en anden. Jeg registrerer nemlig ikke absolutte værdier, som Left og Top men deres position og størrelse relativ til skærmen. På den måde er jeg ligeglad med opløsningen - og jeg skalerer ikke andet end hvad en enkelt linje med ScaleBy kan klare:

  if fScaleForms then
  begin
    OrgFactor := fScaleFactor;

    WindowState := wsMaximized;

    ScaleBy(self.Width, fScaleFactor);
    fScaleFactor := self.Width;

    pStatus1.ScaleBy(pStatus1.Width,MulDiv(pStatus1.Width,OrgFactor,Self.Width));
    pStatus2.ScaleBy(pStatus2.Width,MulDiv(pStatus2.Width,OrgFactor,Self.Width));
    pStatus3.ScaleBy(pStatus3.Width,MulDiv(pStatus3.Width,OrgFactor,Self.Width));
    pStatus4.ScaleBy(pStatus4.Width,MulDiv(pStatus4.Width,OrgFactor,Self.Width));
    pStatus5.ScaleBy(pStatus5.Width,MulDiv(pStatus5.Width,OrgFactor,Self.Width));
    pStatus7.ScaleBy(pStatus7.Width,MulDiv(pStatus7.Width,OrgFactor,Self.Width));
  end;

fScaleFactor er den mindste skærmbredde programmet kører i, eksempelvis 800 pixel i bredden.

Det andet program jeg arbejder på, er ikke klar til jeg bekymrer mig om det. Der er finpudsning af brugerrettigheder, kolonner i listviews, validering af data
Avatar billede hrc Mester
01. august 2008 - 10:37 #6
Mine pStatus'er er TPanels på mainformen. Håber ovenstående kan hjælpe dig. Jeg har desværre ikke andet p.t.
Avatar billede js_delphi Nybegynder
23. august 2008 - 17:21 #7
Hej hrc,

jeg har nu gemt de oprindelige data for komponenterne i en ini fil, saa jeg altid har samme udgangspunkt, naar formen resizes osv.
Absolut ikke en optimal loesning, da denne fil saa skal opdateres hver gang programmet aendres.
Indtil jeg en dag falder over en loesning, som er smartere, og som virker(!), beholder jeg det saadan.

Man tak for dine inputs, lad os dele point.
Avatar billede js_delphi Nybegynder
23. august 2008 - 17:22 #8
... mit svar ...
Avatar billede hrc Mester
23. august 2008 - 23:03 #9
OK
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester