Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - TImage in TScrollBox


Tongamann - Mo 28.12.09 12:53
Titel: TImage in TScrollBox
Ich habe ein TImage, in dem bei Mausclick kleine Dreiecke gezeichnet werden. Ich hätte gerne die Möglichkeit, auch ausserhalb des sichtbaren Bereiches weiterzeichnen zu können, indem Scroll-Balken erscheinen und ich dann eine größere Fläche für das Zeichnen von weiteren Dreiecken habe.

Habe gelesen, dass ich hierfür das TImage in eine TScrollBox einbetten muss, die mir dann jegliches Scrollen ermöglicht. Gesagt, getan - nur macht er das noch nicht entsprechend...

Wo bzw. wie kann ich ihm sagen, welchen Bereich er darstellen soll und er ggf selber entscheidet, ob er ScrollBalken einfügt oder nicht?

Als Eigenschaften im Object Inspector habe ich bei der ScrollBox folgende:

HorzScrollBar : Visible : True
VertScrollBar : Visible : True
AutoScroll : True
AutoSize : False

Hoffe, mein Anliegen ist einigermassen klar geworden...


iKilledKenny - Mo 28.12.09 13:01

Du musst das Image in die ScrollBox legen (Image.Left = 0 und Image.Top = 0) und dann einfach die Größe des Images (Image.Width und Image.Height) ändern, das Scrollen wird dann automatisch von der ScrollBox übernommen.


Tongamann - Di 29.12.09 08:13

Aha, da kommen wir der Sache schon eine ganze Ecke näher.

Ich habe aber noch ein Problem, dass die Mausposition nun nicht mehr korrekt zum Zeichnen funktioniert, wenn das Bild ein wenig zur Seite gescrollt ist. Gibt es da eine Möglichkeit die Position der Scrollbalken zu der Mausposition hinzuzurechnen, so dass das Zeichnen dann auch wirklich an der Stelle erfolgt, auf die gerade geklickt wird? Zur Zeit nutze ich "ScreenToClient(Mouse.CursorPos)"...

Gibt es auch die Möglichkeit, die Image.Width "on the fly zu erweitern"? Beim Prorammstart male ich auf der gesamten sichtbaren Fläche ohne Scrollbalken. Wenn nun ein Dreieck an den Rand gemalt wird, soll die Zeichenfläche automatisch erweitert werden. Wenn ich hier ein image.width einfüge, erstellt er mir einen entsprechenden Scrollbalken und ich kann diesen auch benutzen, nur schiebt er das Image aber aus dem Bild raus, - die Grösse des Images bleibt aber unverändert. Oder muss ich jedesmal bei einer neuen Zuweisung von image.width das gesamte Bild neu zeichnen lassen?


iKilledKenny - Di 29.12.09 11:30

user profile iconTongamann hat folgendes geschrieben Zum zitierten Posting springen:
Gibt es da eine Möglichkeit die Position der Scrollbalken zu der Mausposition hinzuzurechnen, so dass das Zeichnen dann auch wirklich an der Stelle erfolgt, auf die gerade geklickt wird? Zur Zeit nutze ich "ScreenToClient(Mouse.CursorPos)"...

Die Position der ScrollBar läßt sich auch ermitteln:

Delphi-Quelltext
1:
2:
ScrollBox.VertScrollBar.Position
ScrollBox.HorzScrollBar.Position

Die musst du in der Berechnung deiner Position auf dem Image natürlich berücksichtigen.

user profile iconTongamann hat folgendes geschrieben Zum zitierten Posting springen:
Gibt es auch die Möglichkeit, die Image.Width "on the fly zu erweitern"?

Ja, gibt es. Einfach mal probieren, die Properties im Code zu setzen.

Beim Rest verstehe ich nicht wirklich, was du meinst. Vielleicht nochmal genauer erklären. :nixweiss: