Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Dynamische Scrollbox (https://www.delphipraxis.net/201317-dynamische-scrollbox.html)

delphicoder123 11. Jul 2019 14:00

Dynamische Scrollbox
 
Hallo,
in meinem Formular habe ich eine Scrollbox. Das Formular hat die Höhe vom Bildschirm.
Innerhalb der Scrollbox habe ich ein TImage (Scrollbox und TImage sind alClient ausgerichtet).
Die Scrollbox soll nur eine Scrollbar haben, wenn der erzeugte Inhalt nicht auf das Image draufpasst. Inhalte sind Zeichnungen in Form von Rechtecken.
Die Scrollbox soll auch nur so hoch sein, wie der erzeugte Inhalt, sollte aber mindestens X Pixel hoch sein.


Das Schwierige wird sein, die Scrollbar ein und auszublenden. Wie kann ich das realisieren?

peterbelow 11. Jul 2019 16:24

AW: Dynamische Scrollbox
 
Zitat:

Zitat von delphicoder123 (Beitrag 1436516)
Hallo,
in meinem Formular habe ich eine Scrollbox. Das Formular hat die Höhe vom Bildschirm.
Innerhalb der Scrollbox habe ich ein TImage (Scrollbox und TImage sind alClient ausgerichtet).
Die Scrollbox soll nur eine Scrollbar haben, wenn der erzeugte Inhalt nicht auf das Image draufpasst. Inhalte sind Zeichnungen in Form von Rechtecken.
Die Scrollbox soll auch nur so hoch sein, wie der erzeugte Inhalt, sollte aber mindestens X Pixel hoch sein.


Das Schwierige wird sein, die Scrollbar ein und auszublenden. Wie kann ich das realisieren?

Setze Align für das TImage auf alNone und left und top auf 0. Du mußt dann image.width und height and die Größe des Inhalts anpassen, das geht nicht von selbst. Dabei mußt Du nicht nur das TImage selbst anpassen sondern auch image.picture.bitmap width und height, das ist nicht automatisch. Die Scrollbox bekommt scrollbars when ihr Inhalt über die Grenzen der Client area hinausreicht, das ist automatisch.

Andreas L. 12. Jul 2019 08:55

AW: Dynamische Scrollbox
 
Zitat:

Zitat von peterbelow (Beitrag 1436531)
Du mußt dann image.width und height and die Größe des Inhalts anpassen, das geht nicht von selbst.[/B]

TImage hat die Eigenschaft AutoSize. Width & Height muss also nicht selbst angepasst werden.

peterbelow 12. Jul 2019 12:55

AW: Dynamische Scrollbox
 
Zitat:

Zitat von Andreas L. (Beitrag 1436551)
Zitat:

Zitat von peterbelow (Beitrag 1436531)
Du mußt dann image.width und height and die Größe des Inhalts anpassen, das geht nicht von selbst.[/B]

TImage hat die Eigenschaft AutoSize. Width & Height muss also nicht selbst angepasst werden.

Stimmt, man muss nur die Größe der Bitmap anpassen.

delphicoder123 22. Jul 2019 10:48

AW: Dynamische Scrollbox
 
Zitat:

Zitat von Andreas L. (Beitrag 1436551)
Zitat:

Zitat von peterbelow (Beitrag 1436531)
Du mußt dann image.width und height and die Größe des Inhalts anpassen, das geht nicht von selbst.[/B]

TImage hat die Eigenschaft AutoSize. Width & Height muss also nicht selbst angepasst werden.

Hallo,
wenn ich das TImage auf align none, top und left auf 0 setze, dann passt sich die Breite und Höhe des TImage nicht
anhand des Inhalts an. Es behält die gleiche Größe.
Das TImage ist innerhalb der Scrollbox.
Eine Bitmap verwende ich in meinem Formular nicht.

delphicoder123 22. Jul 2019 20:59

AW: Dynamische Scrollbox
 
Das wäre der zugehörige Code dazu.

Delphi-Quellcode:
an I implement this?
These questions are so important.

unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls;

type
  TForm1 = class(TForm)
    ScrollBox1: TScrollBox;
    Image1: TImage;
    procedure FormActivate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormActivate(Sender: TObject);
begin
  left:=5;
  top:=10;
  form1.Width:=Screen.Width-15;
  form1.Height:=Screen.Height-50;
  ScrollBox1.Align:=alClient;
  image1.Left:=0;
  image1.Top:=0;
  image1.Width:=ScrollBox1.Width;
  image1.Height:=ScrollBox1.Height;
  image1.Canvas.Rectangle(1400,50,2000,100);
end;

end.

peterbelow 23. Jul 2019 10:37

AW: Dynamische Scrollbox
 
Zitat:

Zitat von delphicoder123 (Beitrag 1437247)
Zitat:

Zitat von Andreas L. (Beitrag 1436551)
Zitat:

Zitat von peterbelow (Beitrag 1436531)
Du mußt dann image.width und height and die Größe des Inhalts anpassen, das geht nicht von selbst.[/B]

TImage hat die Eigenschaft AutoSize. Width & Height muss also nicht selbst angepasst werden.

Hallo,
wenn ich das TImage auf align none, top und left auf 0 setze, dann passt sich die Breite und Höhe des TImage nicht
anhand des Inhalts an. Es behält die gleiche Größe.
Das TImage ist innerhalb der Scrollbox.
Eine Bitmap verwende ich in meinem Formular nicht.

Doch, wenn Du auf dem image.canvas zeichnest dann verwendest Du eine Bitmap, allerdings eine, die TImage für dich anlegt (über image.picture.bitmap kann man darauf zugreifen). du mußt die Größe dieser Bitmap ändern wenn Du mehr Zeichenfläche brauchst. Ob image.autosize das mnitbekommt mußt Du testen, kann sein, dass es nur zuschlägt, wenn man eine Grafik aus einer Datei lädt. Oh, und Image.stretch und image.center sollten false sein.

delphicoder123 23. Jul 2019 13:31

AW: Dynamische Scrollbox
 
Liste der Anhänge anzeigen (Anzahl: 1)
Was mache ich falsch?

Delphi-Quellcode:
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls;

type
  TForm1 = class(TForm)
    ScrollBox1: TScrollBox;
    Image1: TImage;
    procedure FormActivate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormActivate(Sender: TObject);
begin
  ScrollBox1.Align:=alClient;
  ScrollBox1.HorzScrollBar.Visible:=true;
  image1.Align:=alnone;
  image1.Left:=0;
  image1.Top:=0;
  image1.Stretch:=false;
  image1.center:=false;
  image1.Picture.Bitmap.Width:=900;
  image1.Picture.Bitmap.Height:=900;
  image1.Canvas.Rectangle(600,600,800,800);
end;

end.

EWeiss 23. Jul 2019 13:34

AW: Dynamische Scrollbox
 
Wo ist das Bitmap für Image1 das du geladen hast? Sehe keins..

gruss

delphicoder123 23. Jul 2019 14:02

AW: Dynamische Scrollbox
 
Ich weiß nicht, wie das geht

EWeiss 23. Jul 2019 14:05

AW: Dynamische Scrollbox
 
Zitat:

Zitat von delphicoder123 (Beitrag 1437413)
Ich weiß nicht, wie das geht

Delphi-Quellcode:
image1.picture.bitmap.loadfromFile('Mein.bmp')


Die weite und höhe setzt sich dann automatisch abhängig vom eingeladenen Bitmap die brauchst du nicht zuweisen..
Wenn das Bitmap größer ist als der Viewport dann werden die Scroll Bars entsprechend sichtbar.

gruss

peterbelow 23. Jul 2019 14:12

AW: Dynamische Scrollbox
 
Zitat:

Zitat von delphicoder123 (Beitrag 1437409)
Was mache ich falsch?

Delphi-Quellcode:
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls;

type
  TForm1 = class(TForm)
    ScrollBox1: TScrollBox;
    Image1: TImage;
    procedure FormActivate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormActivate(Sender: TObject);
begin
  ScrollBox1.Align:=alClient;
  ScrollBox1.HorzScrollBar.Visible:=true;
  image1.Align:=alnone;
  image1.Left:=0;
  image1.Top:=0;
  image1.Stretch:=false;
  image1.center:=false;
  image1.Picture.Bitmap.Width:=900;
  image1.Picture.Bitmap.Height:=900;
  image1.Canvas.Rectangle(600,600,800,800);
end;

end.

https://community.idera.com/developer-tools/programming-languages/

Füge mal hinzu:

Delphi-Quellcode:
  image1.Width:=900;
  image1.Height:=900;

EWeiss 23. Jul 2019 14:14

AW: Dynamische Scrollbox
 
Zitat:

Füge mal hinzu:
Dann hat er immer noch kein Bild sondern ein leeres Image.
Die Image weite und höhe setzt sich entsprechend der Größe des eingeladenen Bitmaps.

gruss

peterbelow 23. Jul 2019 14:15

AW: Dynamische Scrollbox
 
Zitat:

Zitat von EWeiss (Beitrag 1437416)
Zitat:

Füge mal hinzu:
Dann hat er immer noch kein Bild sondern ein leeres Image.
Die Image weite und höhe setzt sich entsprechend der Größe des eingeladenen Bitmaps.

gruss

Er will das Image als Zeichenfläche benutzen, nicht um eine existierende Bitmap anzuzeigen.

EWeiss 23. Jul 2019 14:16

AW: Dynamische Scrollbox
 
Zitat:

Zitat von peterbelow (Beitrag 1437417)
Zitat:

Zitat von EWeiss (Beitrag 1437416)
Zitat:

Füge mal hinzu:
Dann hat er immer noch kein Bild sondern ein leeres Image.
Die Image weite und höhe setzt sich entsprechend der Größe des eingeladenen Bitmaps.

gruss

Er will das Image als Zeichenfläche benutzen, nicht um eine existierende Bitmap anzuzeigen.

Ok dann hast du recht ;)
Aber schaden tut es nicht das er jetzt weis wie man ein Bitmap einladen tut.
Und das er dann die weite und Höhe nicht selber setzen muss.

gruss

delphicoder123 23. Jul 2019 14:22

AW: Dynamische Scrollbox
 
Zitat:

Zitat von peterbelow (Beitrag 1437415)
Zitat:

Zitat von delphicoder123 (Beitrag 1437409)
Was mache ich falsch?

Delphi-Quellcode:
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls;

type
  TForm1 = class(TForm)
    ScrollBox1: TScrollBox;
    Image1: TImage;
    procedure FormActivate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormActivate(Sender: TObject);
begin
  ScrollBox1.Align:=alClient;
  ScrollBox1.HorzScrollBar.Visible:=true;
  image1.Align:=alnone;
  image1.Left:=0;
  image1.Top:=0;
  image1.Stretch:=false;
  image1.center:=false;
  image1.Picture.Bitmap.Width:=900;
  image1.Picture.Bitmap.Height:=900;
  image1.Canvas.Rectangle(600,600,800,800);
end;

end.

https://community.idera.com/developer-tools/programming-languages/

Füge mal hinzu:

Delphi-Quellcode:
  image1.Width:=900;
  image1.Height:=900;


Danke, euch beiden. Es hat geklappt.

Andreas L. 28. Jul 2019 14:29

AW: Dynamische Scrollbox
 
Zitat:

Zitat von delphicoder123 (Beitrag 1437409)
Was mache ich falsch?

Du musst noch die AutoSize-Property des Images setzen:

Delphi-Quellcode:
...

procedure TForm1.FormActivate(Sender: TObject);
begin
  ScrollBox1.Align:=alClient;
  ScrollBox1.HorzScrollBar.Visible:=true;
  image1.Align:=alnone;
  image1.Left:=0;
  image1.Top:=0;
  image1.Stretch:=false;
  image1.center:=false;
  image1.Picture.Bitmap.Width:=900;
  image1.Picture.Bitmap.Height:=900;
  image1.Canvas.Rectangle(600,600,800,800);

  // --> AutoSize setzen:
  image1.AutoSize := True;
end;

...


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

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