Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Position in Scrollbox relativ zum absoluten Inhalt (https://www.delphipraxis.net/179007-position-scrollbox-relativ-zum-absoluten-inhalt.html)

superjojo 8. Feb 2014 09:47


Position in Scrollbox relativ zum absoluten Inhalt
 
Liste der Anhänge anzeigen (Anzahl: 2)
Hallo ich bin an einem Leveleditor für ein selbstgebasteltes jump'n'run.
Man kann in dem Leveleditor irgendwo in eine scrollbox reinklicken, die Position wird sich gemerkt und ein Quelltext generiert, der nachher im richtigen Spiel genau an der Stelle das Objekt erstellt.

Das Problem:

Wenn die Gesamt-map größer ist, als die Scrollbox werden die Positionen in der scrollbox immer relativ zur oberen-linken Ecke der scrollbox gespeichert (auch wenn man z.B. ganz runtergescrollt hat), und nicht relativ zur obersten-linkesten Position des Inhalts, der in dieser scrollbox existiert.
Wenn nun später das Objekt an der gespeicherten Stelle erzeugt wird, wird es nun logischerweise relativ zur linken oberen Ecke der scrollbox erstellt, unhabhängig wie die Position der scrollbalken (also quasi "wo man sich in der scrollbox aufgehalten hat") vorher war. Somit werden alle Objekte in den oberen linken teil der Map geklatscht, auch wenn sie da gar nicht hinsollen.

Schön wäre also, wenn ich die Position eines Objektes in der Scollbox relativ zum Inhalt der Scrollbox herausfinden könnte.


Zum besseren Verständnis hänge ich mal zwei Bilder an.

stahli 8. Feb 2014 10:45

AW: Position in Scrollbox relativ zum absoluten Inhalt
 
Wenn ich Dich richtig verstehe müsstest Du ScrollBarHorz.Position zu X addieren und für Y natürlich analog.

Die VCL ist für solche Spieleentwicklungen aber nicht unbedingt erste Wahl. Sie ist eben für andere Anwendungsfälle und Abläufe vorgesehen.
Allerdings weiß ich auch nicht, was man dafür am ehesten empfehlen sollte.

Bjoerk 8. Feb 2014 11:18

AW: Position in Scrollbox relativ zum absoluten Inhalt
 
Ich weiß nicht ob es das ist was du suchst?

Delphi-Quellcode:
function ClientRangeRect(Control: TControl): TRect;
var
  O: TPoint;
begin
  // Control = Client, Parent = ScrollBox, Result in Client-Koordinaten;
  O := Control.ClientToParent(Point(0, 0), Control.Parent);
  Result := Control.Parent.ClientRect;
  Result.Top := Result.Top - O.Y;
  Result.Left := Result.Left - O.X;
  Result.Bottom := Result.Bottom - O.Y;
  Result.Right := Result.Right - O.X;
  Result.Bottom := Min(Result.Bottom, Control.ClientHeight);
  Result.Right := Min(Result.Right, Control.ClientWidth);
end;

superjojo 8. Feb 2014 11:41

AW: Position in Scrollbox relativ zum absoluten Inhalt
 
Vielen Dank für die Antworten schon mal

@stahli:
Die Idee hatte ich auch schon, aber dann fiel mir ein, dass die Position der scrollbar ja auch relativ zur größe des Inhalts der scrollbox ist.
Beispiel:
Wenn der Inhalt 10.000 Pixel ist, dann müsste man bei einer Scrollbarposition von 10 genau 1.000 Pixel "draufrechnen".
Wenn der Inhalt nur 100 Pixel sind, dann müsste man bei einer Scrollbarposition von 10 nur noch 10 Pixel "draufrechnen".



@Bjoerk
Ich bin ein zimlicher Anfänger in Delphi und verstehe nicht ganz was dein Quelltext bewierkt, könntst du das vllt. noch mal für einen Laien erklären?

stahli 8. Feb 2014 12:11

AW: Position in Scrollbox relativ zum absoluten Inhalt
 
Mit der Position sollte das eigentlich gehen, da die Pixel-Verschiebung von 0 an dort angegeben wird.
Probiere es einfach mal aus.

Mit Bjoerks Funktion kann man die Position eines Controls in Bezug zu einem übergeordneten ermitteln.

Ich habe aber noch nicht verstanden, ob Du Controls auf die Scrollbox setzt oder eher zeichnest oder beides?

Bjoerk 8. Feb 2014 12:52

AW: Position in Scrollbox relativ zum absoluten Inhalt
 
Wenn du z.B. eine Paintbox (wäre das Control) in einer Scrollbox (wäre das Parent) hast, und das Width und/oder Heigh der Paintbox größer sind als die Abmessungen der Scrollbox (erst dann bekommst du ja Scrollbars angezeigt) kann man dieser Function das sichtbare Rect in PaintBoxKoordinaten ermitteln.


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:31 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