Ich schreibe ein Skript, das eine grafische Benutzeroberfläche zur Anzeige von Bildern generiert und dabei einen Rowstate-Handler verwendet, um die Bilder an das Fenster zu übergeben.
Gibt es eine Möglichkeit, ein PictureBox-Objekt so einzustellen:
- An Fenstergröße anpassen (mit definierter Minimal- und Maximalgröße)
- Das ursprüngliche Seitenverhältnis beibehalten (z. B. quadratisch) (siehe Skript 2).
- Direkte Größenänderung durch Benutzer verbieten.
Hier ist etwas JSL, das die Beispieltabelle mit Bildern verwendet.
Clear Globals();
Names Default To Here(1);
dt = Open( "$SAMPLE_DATA/Big Class Families.jmp" );
//Set the picture equal to selected row
rs_updateviewer = Expr(
SelectedRows = (dt << Get Selected Rows());
i = If(N Items(SelectedRows) == 0, 1, SelectedRows[1]);
img = column(dt, "pet")[i];
pb << Set Image(img);
);
//Viewer Window
Viewer = New Window(
"Viewer",
Show Menu( 0 ),
<< On Close(Clear Globals(rs);
),
<< Size Window( 1000, 700),
vb = V List Box("Center",
H Center Box( Text Box( "Viewer" ) ),
H List Box(
// tb = dt << New Data Box(),
tb = Data Grid Box(),
pb = Picture Box()
)
)
,
pb << Set Stretch( "Fill", "Fill" );
pb << Border( 1 );
tb << Set Stretch( "Off", "Off" );
tb << Set Data Table( dt );
tb << Close Side Panels( 1 );
);
//Initiate image
rs_updateviewer;
// Define the handler function
f = Function( {a},
rs_updateviewer
);
// Register the row state handler to the table
set_rowstate = Expr(
rs = dt << Make Row State Handler( f );
);
set_rowstate;
Hier ist ein Beispiel für ein Diagramm mit fixiertem Seitenverhältnis aus dem Skriptindex – genau das Verhalten, das ich mir für das Bild wünsche.
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
gb = Graph Builder( Show Control Panel( 0 ), Variables( X( :height ), Y( :weight ) ), Elements( Points( X, Y ), Smoother( X, Y ) ) );
gb << Fit to Window( "Maintain Aspect Ratio" );
Welche Mindest-/Maximalgröße wurde festgelegt (Fenster oder Bild)? Soll der Benutzer das Fenster, aber nicht das Bild vergrößern oder verkleinern dürfen? Und wenn der Benutzer das Fenster vergrößern oder verkleinern darf, soll sich dann auch das Bild an die neue Fenstergröße anpassen können?
Verwenden wir minimale/maximale Größen von 100x100 bis 800x800 für das Bild und 200x300 bis 1000x900 für das Fenster.
Der Benutzer kann die Fenstergröße ändern, nicht die des Bildes (direkt).
Das Bild passt sich der Fenstergröße an, behält aber sein quadratisches Seitenverhältnis bei. Das bedeutet, dass bei kurzen und breiten oder hohen und schmalen Fenstern etwas leerer Raum entsteht.
Ich glaube nicht, dass man eine minimale/maximale Größe für das Fenster festlegen kann; man kann nur die Anfangsgröße einstellen.
Am einfachsten wäre es wohl, den Graph Builder zu verwenden und ihn mit dem Bild zu füllen, da so das Seitenverhältnis erhalten bleibt. Allerdings bin ich mir nicht sicher, wie man die minimale und maximale Größe festlegt, ohne es vorher zu testen. Alternativ könnte man ein Grafikskript verwenden, um die Anzeigeelemente anzupassen, da dieses Skript bei jeder Änderung der Fenstergröße erneut ausgeführt wird.