2016-07-03 10 views
-1

Welche Voraussetzungen müssen erfüllt sein, damit eine vertikale Bildlaufleiste angezeigt wird? Es scheint sehr zufällig zu sein.Alle Anforderungen für eine vertikale Bildlaufleiste angezeigt: Warum versteckt es sich?

I versucht:

HorzScrollBar.Range := 10000; // set the range to an higher number 
VertScrollBar.Range := 10000; // set the range to an higher number 
ShowScrollBar(Handle, SB_BOTH, True); 

In Kombination mit Bereichen in Objektinspektoren sowie Autoscroll-on/off, Client Höhe (von der Form) eingestellt wird. Ich denke, ich hatte in der letzten Stunde alle möglichen Kombinationen. Es scheint, als ob es egal ist, was ich mache, die Bildlaufleiste kommt nicht mehr zurück - wo es zuerst auftauchte, als ich einige Einstellungen nach dem Zufallsprinzip wieder anpasste (auf die gleichen Einstellungen?).

Was ich zu erreichen versuchen: wenn ich einen Knopf die Form drücken zeigt und auf dem rechten Seite des Bildschirms zeigen sollte, mit dem folgenden:

Form1.Height := Screen.Height - 40; 
Form1.Left := Screen.Width - 423; 
Form1.Show; 

Das Formular ist ein Optionsmenü, in dem alle Die Optionen passen perfekt auf den Bildschirm, den ich gerade benutze. Allerdings habe ich ein Panel erstellt, das länger wird (mehr Höhe) und alle anderen Optionen nach unten drückt, wenn eine bestimmte Option angeklickt wird. So DANN ist, wenn ich diese Bildlaufleiste brauche, wie Einstellungen vom Bildschirm fallen.

Im Idealfall würde es nur angezeigt, wenn diese Optionen angeklickt und verschwinden, wenn es nicht mehr nötig ist, aber irgendwie wird es überhaupt nicht angezeigt - es spielt keine Rolle, welche Größen oder Bereiche ich dem Formular gebe.

Welche andere Option vergesse ich zu setzen/was andere Abhängige AutoScroll oder nur VerticalScrollbar haben, um bei Bedarf angezeigt zu werden?


Mit ShowMessage-Funktion habe ich einige weitere Informationen. Ich habe eine Schaltfläche, die die folgende durchgeführt:

procedure TfrmInstellingenMenu.Button1Click(Sender: TObject); 
begin 
VertScrollBar.Visible := true; 
ShowMessage('Visible? ' + BoolToStr(VertScrollBar.IsScrollBarVisible)); 
    //returns "Visible? -1". -1 is TRUE*, so yes (*tnx Ken) 
ShowMessage('Autoscroll turned on? ' + BoolToStr(AutoScroll)); 
    //returns "Autoscroll turned on? 0". 0 is False, so no 
ShowMessage('Range=' + IntToStr(VertScrollBar.Range)); 
    //returns "Range=8000". 
end; 

So obwohl die VertScrollBar eingeschaltet, Autoscroll (deswegen) wird automatisch ausgeschaltet und der Bereich ist bei weitem genug, warum es immer noch versteckt?

Edit2: Einige weitere Details: Es ist ein VCL-Formular, Borderstyle ist auf bsSizable gesetzt. In der Form gibt es im Grunde nur zwei gleich große Panels. Sie haben beide Größenbeschränkungen und sind beim Start nach links und rechts ausgerichtet. Ein Button richtet sie nach Oben und Unten aus. Wenn ich den Knopf setze, um beide auf Top auszurichten, ist es egal, wie ich die Formhöhe eingestellt habe (wahrscheinlich wegen der Einschränkungen der beiden Panels). Es wird jedoch für meinen Computerbildschirm zu hoch und ein Teil des Formulars verschwindet vom Bildschirm. Wenn ich eins zum Ausrichten nach oben und das andere nach unten setze, ist das ganze Formular auf dem Bildschirm, aber die zwei Felder überlappen einander. Ah, und natürlich noch keine Scrollbar.

+1

> * "Form ist ein Optionsmenü" *> Dialograhmen? VCL-Autoscroll funktioniert mit einem großen Rahmen. –

+1

Sie liegen falsch. False ist 0. Wenn Sie 'BoolToStr (VertScrollBar.IsScrollBarVisible, True)' verwenden, sehen Sie die korrekten Werte. –

+0

Ist es möglich, dass sich das Optionsmenü in einem anderen Container befindet, der nicht entsprechend vergrößert wird? – NGLN

Antwort

2

Autoscroll auf

Autoscroll = true Einstellen der Bildlaufleiste angezeigt wird, wenn die Ausdehnungen der Komponenten auf dem Formular den Formular Client Größe überschreiten, wenn

  • Grenze Stil entweder bsSizeable (Standard) oder bsSizeToolWin ist.
  • und Sichtbarkeit nicht durch VertScrollBar.Visible = false
Einstellung verhindert

Hinweis! Wenn Sie den Rahmenstil in der IDE ändern und Autoscroll = true einstellen, wird die Bildlaufleiste für jeden Rahmenstil geöffnet, jedoch nur in der IDE. Das hat dich möglicherweise verwirrt.

Autoscroll-off

Einstellung VertScrollBar.Range größer als die Client Höhe der Form, bringt die Scrollbar, unabhängig von BorderStyle und unabhängig von Autoscroll Einstellung. In diesem Fall kann die Sichtbarkeit bei Bedarf mit VertScrollBar.Visible gesteuert werden.

Sie haben nicht gesagt, welchen Rahmenstil Sie verwenden möchten, aber wenn es einer der ist, der die Bildlaufleiste verbirgt, können Sie auch Ihre Steuerelemente auf Scrollbox mit Align = alClient platzieren.


bearbeiten nach edit2 in Frage:

Ihre „Edit2“ verändert den Kontext aber ich biete Ihnen folgende Test, den ich mit einem Vordruck zu prüfen, zwei Platten und einem Knopf. Um zu verhindern, dass sich die Bereiche in diesem Kontext überlappen (oder eine Lücke lassen), sollten Sie beide Bereiche auf setzen. Nachdem Sie Align (für horizontal/vertikal) geändert haben, setzen Sie einfach die Formularhöhe auf die richtige Größe zurück. Erklärt nach dem folgenden Code.

hinzugefügt, um die Form folgendes Feld:

private 
    Horizontal: boolean; 

Constraints von Panel1 und Panel2 werden auf 100, 150, 100, 150 (um, wie in OI)

Property Align beiden Platten festgelegt ist zu alTop. Die Größe des Formulars wird so geändert, dass es die beiden Bereiche umschließt.

Property Form5.AutoScroll wird auf True und Einschränkungen von Form5 werden auf 180, 180, 0, 0. Hinweis, wie die Scrollbar sichtbar ist, die Breite des Formulars wachsenden Raum zu machen.

Knopf auf Panel1 platziert und OnClick sieht wie folgt aus:

procedure TForm5.Button1Click(Sender: TObject); 
begin 
    Horizontal := not Horizontal; 
    if Horizontal then 
    begin 
    Panel2.Align := alLeft; 
    Panel1.Align := alLeft; 
    end 
    else 
    begin 
    Panel1.Align := alTop; 
    Panel2.Align := alTop; 
    Constraints.MaxHeight := 180; // set size of form back to what it should be 
    end; 
end; 

Der Grund für die Formen Höhe Zurücksetzen ist, dass die Formulare Einschränkungen bei der Berechnung von Ausmaßen, nicht eingehalten werden. Weiß nicht, ob wie entworfen oder nicht, aber ist sowieso warum Ihre Form schwebt über. Folglich ist das Festlegen der Formulareinschränkungen zur Entwurfszeit nicht wirklich erforderlich.

enter image description hereenter image description here

+0

Danke, ein separates Scrollbox im Formular könnte funktionieren, aber im Moment wird das Formular komplett durcheinander gebracht, wenn ich den Transform Button benutze (beschrieben in edit2 oder im obigen Kommentar). Ich werde darauf zurückkommen. – l3ob

+0

2theEdit: Danke! Genau das habe ich gebraucht. Ich versuche alle Einstellungen wie in diesem Beispiel in meinem Optionsmenü einzustellen. Haben Sie bemerkt, dass manchmal, wenn die H/V-Taste angeklickt wird, Panel 2 über Panel 1 oder Panel 2 auf ganz links eingestellt ist? Zumindest wenn ich diese Schritte befolgte, geschah es, irgendeine Idee, wie man das verhindert (wie man einen nach unten und einen anderen nach oben setzt). PS. Die Bildlaufleiste in meinem Menü ist noch nicht aufgetaucht, aber ich bin mir sicher, dass ich es bald mit diesem Beispiel herausfinden werde. lol – l3ob

+0

@ l3ob Nein, nachdem ich 'Panel2.Align' geändert habe, wenn ich horizontal ändere, wechselt es nie ihre Bestellung. Weder für die Vertikale. Wenn das passieren würde, würde ich versuchen, beide Panels "Align" zuerst auf "alNone" und dann auf das neue Align zu setzen. Für die vertikale Bildlaufleiste habe ich nur 'AutoScroll = True' gesetzt. Ich glaube, ich habe Ihre Frage zu den Auswirkungen auf die Sichtbarkeit der Bildlaufleiste beantwortet. Wenn Sie weitere Fragen zum Austauschen von Orientierungen usw. haben, schreiben Sie bitte eine neue Frage (sie sind kostenlos;)) –

Verwandte Themen