Entwickler-Ecke

Algorithmen, Optimierung und Assembler - Fenster Seitenverhältnis anpassen


AXMD - Mo 08.08.05 18:09
Titel: Fenster Seitenverhältnis anpassen
N'Abend!

Ich will ein Fenster in der Größe so anpassen, dass es einem bestimmten Seitenverhältnis entspricht (was ja prinzipiell nicht schwer ist), ABER es sollen nur reine Integer-werte sein (also es soll exakt stimmen). Beispiel:

600x400 bei 3:2 ist ok
5:3,5 bei 10:7 nicht, weil 3,5 keine ganze Zahl ist.

Das Seitenverhältnis soll natürlich variabel sein - kann also auch z.B. 11 sein. Wie geh ich am besten vor? Ich ahne Dinge wie KGV und infolgedessen auch GGT ;)

AXMD

//EDIT: Gültiges Beispiel hinzugefügt :P


uall@ogc - Mo 08.08.05 18:16

nä ich würds so machen:

a := 600;
b := 200;

verhältnis 3:2

if (a * 2 = b * 3) and ganzzahlig(a) and ganzzahlig(b) then
// gültig


AXMD - Mo 08.08.05 18:21

Ich will aber nicht prüfen, OB es gültig ist, sondern etwas erzeugen, DAS gültig ist. Das heißt, deine Bedingung soll erfüllt sein - ich will die Form so hinbiegen, dass sie dann ein Seitenverhältnis von 3:2 hat (z.B.)

AXMD


TM - Mo 08.08.05 18:36

Meinst du so was?

Delphi-Quelltext
1:
2:
3:
4:
if not ganzzahlig(form1.clientheight/2then
 form1.clientheight:=form1.clientheight+1//ganzzahlig machen

form1.clientwidth:=form1.clientheight*3/2;


..


AXMD - Mo 08.08.05 18:40

@TM: nein. Hab jetzt eine Lösung von BenBE (thxvm). Lösung sieht wie folgt aus (Anmerkung: PaintBox muss 3:2 sein, daher die Herumrechnerei mit der Differenz Form PaintBox):


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
procedure TMainForm.SetHeightButtonClick(Sender: TObject);
var
  w: Integer; //Weite der Paintbox
begin
  w := Width - 8;
  Width := w - w mod Round(intervalsre) + 8//Gannzahlig bleiben! (8 Pixel = Rand)
  Height := Round(intervalsim) * (w div Round(intervalsre)) + (Height - PaintBox1.Height);
end;

procedure TMainForm.SetWidthButtonClick(Sender: TObject);
var
  h: Integer; //Weite der Paintbox
begin
  h := PaintBox1.Height;
  Height := h - h mod Round(intervalsim) + (Height - h); //Gannzahlig bleiben! (8 Pixel = Rand)
  Width := Round(intervalsre) * (h div Round(intervalsim)) + 8//8 Pixel = Rand
end;


Im Anhang (falls es jemanden interessiert) das Ganze zum Spielen :P. Einfach die Formularweite/-höhe ändern und dann die zwei letzten Buttons in der zweiten Toolbar ausprobieren. Ist leider noch sehr unausgereift. Das Seitenverhältnis gibt der Re-/Im-Raster (auch zweite Toolbar) an.

AXMD