05.05 Dialoge skalierbar machen
Dialoge mit Positionszeilen und Textbearbeitungsfenster können so geändert werden, dass Sie zur Laufzeit mit der Maus in der Größe angepasst werden können. Es folgt am Beispiel von PDV121 Positionszeilendialog (PDV121_R1) und PDV121 Textbearbeitungsfenster (PDV121_90) eine Anleitung für die Änderung weiterer Dialoge.
Anpassung eines Positionszeilendialogs
-
Grundsätzliche BemerkungAlle in den Interpreterzeilen enthaltenen programmspezifischen IDs (wie z.B. PDV121_R1_LB) müssen in anderen Dialogen durch die entsprechenden IDs des zu ändernden Dialogs ersetzt werden.
-
Im Grit-Editor den Positionszeilendialog (hier PDV121_R1) auswählen und über das Menü „Bearbeiten – Attribute“ das Fenster „Attributes“ öffnen.Hier muss die Einstellung „Scrollbars“ auf „Nein“ geändert werden. Die anderen Einstellungen müssen i.d.R. nicht geändert werden.

-
Achtung! Besonderheit! In einem Standarddialog liegen die Schaltflächen (also Ok, Schließen, etc.) auf einem Template-Container.Dieser Container hat bei Positionszeilendialogen i.d.R. die ID „OLD_PB_SCROLL1“. Da im Dialog PDV121_R1 aber nicht die Standardschaltflächen benutzt werden, existiert hier kein Container, auf dem explizit nur die Schaltflächen liegen.Daher muss hier ein Container eingefügt werden, der alle Schaltflächen beherbergt. Dabei wurde folgendermaßen vorgegangen:
-
Ein Container von der Größe 584x34 wurde in den Dialog eingefügt
-
Der Container bekommt (der Einfachheit halber) die ID „OLD_PB_SCROLL1“
-
Alle Schaltflächen (unterhalb der Positionszeilen) werden auf den neuen Container gezogen und dort in den ehemaligen Abständen positioniert (erste Schaltfläche X/Y: 2/2).
-
Der neue Container wird so positioniert, dass die nun auf ihm liegenden Schaltflächen in etwa an der ursprünglichen Position im Dialog liegen (X-Position: 8).
Den Positionszeilendialog (hier PDV121_R1) öffnen und auf dem Hauptcontainer im Dialog (das ist der Container, der den Hintergrund für den gesamten Dialog bildet) mit einem rechten Mausklick den Dialog „Funktionen“ (Callbacks) öffnen.
Für das Ereignis „CBResize“ die folgenden Interpreterzeilen eintragen:
{
GwCore title=this.child("PDV121_R1_TITLE");
GwCore positionen=this.child("PDV121_R1_LB");
GwCore text=this.child("PDV121_R1_F60");
GwCore buttons=this.child("OLD_PB_SCROLL1");
GwCore sbar=this.child("SBAR_STATEBAR");
// Titelzeile auf die neue Breite bringen
title.set_dimension(this.width()-10,title.height());
// Höhe der Positionsliste berechnen
int height = this.height() - positionen.posy();
if ( text )
height = height - text.height()-5;
if ( sbar )
height = height - sbar.height()-5;
if ( buttons )
height = height - buttons.height()-5;
// Code zur Schadensbegrenzung – hier wird eine Mindesthöhe vorgegeben,
// damit beim Verkleinern nicht der untere Container (mit Pushbuttons etc.)
// in den oberen Dialogbereich rutscht.
if ( height < 16 )
{
this.set_dimension(this.width(),this.height()+16-height);
return 0;
}
// Positionsliste auf neue Breite und errechnete Höhe bringen
positionen.set_dimension(this.width()-10,height);
// Textcontrol auf die neue Position und die neue Breite bringen
if ( text )
{
int textposy = positionen.posy() + height + 5;
text.set_position(text.posx(),textposy);
text.set_dimension(this.width()-10,text.height());
}
// Buttons neu platzieren
int buttonsposy = this.height() - buttons.height() - 5;
if ( sbar )
buttonsposy = buttonsposy - sbar.height();
buttons.set_position(buttons.posx(),buttonsposy);
// Statuszeile zur Positionsaktualisierung zwingen
if ( sbar )
sbar.set_dimension(sbar.width()-1,sbar.height());
}
-
Die zuvor Fett/Kursiv dargestellten Codezeilen sind nur notwendig, wenn im Positionslistendialog unterhalb der Positionslisteein weiteres Dialogelement (hier ein Textcontrol) auf die Größenänderung reagieren muss.
Anpassung eines Textbearbeitungsdialogs
-
Grundsätzliche Bemerkung:Alle in den Interpreterzeilen enthaltenen programmspezifischen IDs (wie z.B. PDV121_9_F60) müssen in anderen Dialogen durch die entsprechenden IDs des zu ändernden Dialogs ersetzt werden.
-
Im Grit-Editor den Textbearbeitungsdialog (hier PDV121_90) auswählen und über das Menü „Bearbeiten – Attribute“ das Fenster „Attributes“ öffnen.Hier muss die Einstellung „Scrollbars“ auf „Nein“ geändert werden. Die anderen Einstellungen müssen i.d.R. nicht geändert werden.
-
Die Umstellung des Textbearbeitungsdialogs gestaltet sich etwas schwieriger, da hier viele Dialogelement, die auf eine Größenänderung reagieren müssen, nicht auf einem isolierten Container untergebracht wurden.Der erste Schritt bestand demnach darin, zunächst alle Elemente, die unterhalb des Textcontrols (das ist das einzige Dialogelement, das mit dem Dialog wächst oder schrumpft) angeordnet sind, auf einen eigenen (neuen) Container gelegt werden. Der neue Container hat die ID „PDV121_9_PBCONT“ bekommen.
-
Neben dem Textcontrol befindet sich ein Container mit Markierungsknöpfen. Da dieser Container ebenfalls bei einer Größenänderung verschoben werden muss, benötigt er eine ID – hier „PDV121_9_TBCONT“
-
Der Interpretercode für die Reaktion auf die Größenänderung wird wieder beim Hauptcontainer des Dialogs hinterlegt.Den Textbearbeitungsdialog (hier PDV121_90) öffnen und auf dem Hauptcontainer im Dialog (das ist der Container, der den Hintergrund für den gesamten Dialog bildet)mit einem rechten Mausklick den Dialog „Funktionen“ (Callbacks) öffnen.
Für das Ereignis „CBResize“ die folgenden Interpreterzeilen eintragen:
{
GwCore sbar=this.child("SBAR_STATEBAR");
GwCore pushbtns=this.child("PDV121_9_PBCONT");
GwCore togglebtns=this.child("PDV121_9_TBCONT");
GwCore text=this.child("PDV121_9_F60");
// Höhe des Textcontrols berechnen
int textheight = this.height() - text.posy();
int textwidth=this.width() - 10;
if ( sbar )
textheight = textheight - sbar.height()-5;
if ( pushbtns )
textheight = textheight - pushbtns.height()-5;
if ( togglebtns )
textwidth = textwidth - togglebtns.width()-10;
// Code zur Schadensbegrenzung – hier wird eine Mindesthöhe vorgegeben,
// damit beim Verkleinern nicht der untere Container (mit Pushbuttons etc.)
// in den Container mit den Markierungsfeldern rutscht.
if ( togglebtns
&& text.posy()+textheight < togglebtns.posy()+togglebtns.height()
)
{
// Dialog wird zu klein, also Hauptcontainer nicht weiter verkleinern
int diff = togglebtns.posy()+togglebtns.height()-text.posy()-textheight;
this.set_dimension(this.width(),this.height()+diff);
return 0;
}
// Textcontrol auf errechnete Höhe setzen
text.set_dimension(textwidth,textheight);
// Position des Containers mit Pushbuttons etc. anpassen
if ( pushbtns )
pushbtns.set_position(pushbtns.posx(),text.posy()+textheight+5);
// Position des Containers mit Togglebuttons etc. anpassen
if ( togglebtns )
togglebtns.set_position(text.posx()+textwidth+10,togglebtns.posy());
// Statuszeile zu Neupositionierung anregen (die macht das dann selbst)
if ( sbar )
sbar.set_dimension(sbar.width()-1,sbar.height());
}
