Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Scrollbars (https://www.delphipraxis.net/166872-scrollbars.html)

Bjoerk 3. Mär 2012 13:52

Scrollbars
 
Ich habe viele Forms mit 2 Panels, ein Panel alTop für die Speedbuttons und das andere alClient auf dem sich verschiedene Tabsheets befinden. Wenn nun das cleintArea des Bildschirm kleiner ist, z.b. bei einem Notebook, dann sollen Scrollbars angezeigt werden, da sonst der untere Bereich des Programms nicht zu sehen ist. Autoscroll der Form auf true bringt da nicht, weil das Panel alClient ist. Wie kann ich trotzdem Windows dazubrigen, mir ein paar Scrollbars zu spendieren?

Fridolin622 3. Mär 2012 14:00

AW: Scrollbars
 
Hi,

kannst du nicht statt nem Panel eine ScrollBox nehmen?

Gruß,

Fridolin

himitsu 3. Mär 2012 14:12

AW: Scrollbars
 
Du könntest die Scrollleisten auch in dem Panel anzeigen. Notfalls eine ScrollBox statt des Panels oder in das Panel.
Oder eben auf das alClient verzichten.

[edit]
ups, zulange gewartet und dann den armen Fridolin übersehn (wäre auch zu praktisch, wenn wir eine RedBox hätten, welche uns warnt :roll: ).

Bjoerk 3. Mär 2012 14:16

AW: Scrollbars
 
Fridolin, eine Scrollbox zeigt nur Scrollbars, wenn eine Steuerelement auf ihr, größer ist, als die selbst. Bei alClient kann das jedoch nie passieren.

Fridolin622 3. Mär 2012 14:26

AW: Scrollbars
 
Wieso soll das bei alClient NIE passieren können? Die Elemente in der Scrollbox sind ja nicht immer auch alClient. In deinem Fall hab ich nur die Tabsheets übersehen, die du ja wahrscheinlich auch auf alClient hast. Dann könntest du aber in jedes Tabsheet eine scrollbox legen...

himitsu 3. Mär 2012 14:32

AW: Scrollbars
 
Dem Panel ist es egal, es verkleinert sich auch, wenn dessen Inhalt nicht ganz reinpassen würde.
Die Form reagiert nur auf die Größe des Panels und da es sich in die Form einpaßt, steht es nicht über den Rand der Form drüber und deshalb braucht die Form keine Scrollbar anzuzeigen.

Du könntest höchstes dem Panel aber auch eine Minimalgröße vorgeben.

Bjoerk 3. Mär 2012 15:00

AW: Scrollbars
 
Eine Panelmindeströße vorgeben bringt da auch nix, genau das ist mein Problem…

Bei alClient holen sich die Steuerelemente die Größe vom übergeordneten Container, die Form also von Screen, das Panel von Form usw.. Der Form ist es dabei egal, was auf dem Panel so drauf ist.

jaenicke 3. Mär 2012 15:41

AW: Scrollbars
 
Also erstens: Warum nimmst du für das untere Panel alClient, wenn du genau das gar nicht willst? Das ist dafür gedacht, dass der vorhandene Platz ausgefüllt wird. Du willst aber eine bestimmte Größe. Wenn du nicht alClient nimmst, funktionieren auch die Scrollbars.

Zweitens: Du kannst die Scrollbox ja auf das Panel drauf legen und dahinein die Elemente, die zu groß für das Formular sein könnten.

Bjoerk 3. Mär 2012 15:50

AW: Scrollbars
 
Ja, ich weiß, ihr habt da alle Recht. Mich bitte auch jetzt nicht falsch verstehen. Ich hab meine Gründe, warum ich das so frage. Normalerweise arbeite ich constraints usw., zur Not mit einer Scrollbox und fertig. Ich hab‘ ca. 100 Forms, bei denen das so ist, wie oben beschrieben. Wenn ich da jetzt anfange zu ändern, wird‘ ich nie mehr fertig. Dann hab ich in OnResize auch noch einiges stehen. Meine Notlösung sah bis bisher so aus:

Delphi-Quellcode:
procedure MainFormPaint;
var
  ATop, ALeft, AWidth, AHeight, SWidth, SHeight, SLeft, STop, T: integer;
begin
  ALeft:= Application.MainForm.Left;
  ATop:= Application.MainForm.Top;
  AWidth:= Application.MainForm.Width;
  AHeight:= Application.MainForm.Height;

  SWidth:= Screen.WorkAreaWidth;
  SHeight:= Screen.WorkAreaHeight;
  STop:= Screen.WorkAreaTop;
  SLeft:= Screen.WorkAreaLeft;

  if ((SWidth-AWidth) < 0) or ((SHeight-AHeight) < 0) then
  begin
    Application.MainForm.HorzScrollBar.Range:= AWidth;
    Application.MainForm.VertScrollBar.Range:= AHeight;
    AWidth:= SWidth;
    AHeight:= SHeight;
  end;

  T:= ALeft;
  while (T+SLeft+AWidth) > SWidth do Dec(T);
  if T < SLeft then T:= SLeft;
  ALeft:= T;

  T:= ATop;
  while (T+STop+AHeight) > SHeight do Dec(T);
  if T < STop then T:= STop;
  ATop:= T;

  Application.MainForm.SetBounds(ALeft, ATop, AWidth, AHeight);
end;

Bjoerk 3. Mär 2012 22:39

AW: Scrollbars
 
Ich werd's jetzt doch ändern. So geht's eigentlich ganz gut mit relativ wenig Aufwand. Statt des einen Panels dann halt doch eine Scrollbox. Den fehlenden Text kann ich mir über eine Suchen und Ersetzenroutine vor Formcreate erst mal reinschaffen. Der Compiler bleibt ja dann später an der entsprechen Stelle stehen und ich kann's dann weiter ändern.

Delphi-Quellcode:
procedure TForm1.PageControlChange(Sender: TObject);
begin
  with PageControl do
  begin
    if ActivePage = TabSheet1 then
    begin
      Width:= GroupBox1.Width+40;
      Height:= GroupBox1.Height+50;
    end;
    if ActivePage = TabSheet2 then
    begin
      Width:= GroupBox4.Width+40;
      Height:= GroupBox4.Height+50;
    end;
    Self.ClientWidth:= Width + 2*Left;
    Self.ClientHeight:= Height + 2*Top + StatusBar.Height + Panel2.Height;
  end;
  with ScrollBox.HorzScrollBar do if IsScrollBarVisible then Position:= 0;
  with ScrollBox.VertScrollBar do if IsScrollBarVisible then Position:= 0;
  UmspeichernNachMaske(Sender);
end;


procedure TForm1.FormCreate(Sender: TObject);
begin
  Scaled:= false;
  PageControl.Align:= alNone;
  PageControl.ActivePage:= TabSheet1;
  Constraints.MaxWidth:= Screen.WorkAreaWidth;
  Constraints.MaxHeight:= Screen.WorkAreaHeight;
  AbelHelp1.Execute;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:07 Uhr.

Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf