![]() |
Wie Rectangle im TForm zentrieren ?
Hallo,
Aufgabe: Ich habe ein TForm mit TPaintBox, TScrollBox und versuche einen MarkierungsRectangle mit dem Maus vom Koordinaten (StartPlace.X/Y bis EndPlace.X/Y) über den TPaintBox zu zeichnen und genau diesen Rectangle versuche ich je nach Größe der Höhe oder Breite an dem TForm.Client anzupassen und zentriert ausgeben. Um den TPaintBox bis zum TFormRänder gebe ich einen Rahmen (cAbstRahmen=10) aus. Problem: wenn ich cAbstRahmen=0 setze, wird mit dem nachfolgenden DelphiSource der MarkierungsRectangle genau zentriert ausgegeben. Wenn ich (cAbstRahmen=10) setze, wird mit dem nachfolgenden DelphiSource der MarkierungsRectangle nicht zentriert sondern mit einem Abstand ±links/rechts oder ±oben/unten ausgegeben, was ich gar nicht verstehen. Frage ?: wie kann ich mit (cAbstRahmen=10) MarkierungsRectangle zentriert ausgeben ?
Delphi-Quellcode:
mfg
Procedure TfrmPrintPreview.PaintBox1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin if (StartPlace.X<>EndPlace.X) and (StartPlace.Y<>EndPlace.Y) then begin // SkalierungBrechnen if ((EndPlace.X-StartPlace.X)>(EndPlace.Y-StartPlace.Y)) then iScal:= frmPrintPreview.ClientWidth div (EndPlace.X-StartPlace.X){+(frmPrintPreview.ClientWidth mod (EndPlace.X-StartPlace.X)) div 2} // BreiteGroß, ZoomFaktorX else iScal:= Trunc(frmPrintPreview.ClientHeight/(EndPlace.Y-StartPlace.Y)); // HöheGröß, ZoomFaktorY PaintBox1.Visible:= False; // Skalierung PaintBox1.Width := PaintBox1.Width *iScal; PaintBox1.Height:= PaintBox1.Height*iScal; // Rahmen PaintBox1.Left:= cAbstRahmen; PaintBox1.Top := cAbstRahmen; PaintBox1.Visible:= True; // Rectanglemitte zum Zentrieren iX:= iSca*Trunc(StartPlace.X+cAbstRahmen+(EndPlace.X-StartPlace.X) div 2+(EndPlace.X-StartPlace.X) mod 2); iY:= iSca*Trunc(StartPlace.Y+cAbstRahmen+(EndPlace.Y-StartPlace.Y) div 2+(EndPlace.Y-StartPlace.Y) mod 2); // ScrollBox Steuerung zum Zentrieren ScrollBox1.HorzScrollBar.Position:= Abs(iX)-ScrollBox1.ClientWidth div 2-ScrollBox1.ClientWidth mod 2; // ScrollBox1.VertScrollBar.Position:= Abs(iY)-ScrollBox1.ClientHeight div 2-ScrollBox1.ClientHeight mod 2; // end end; |
Re: Wie Rectangle im TForm zentrieren ?
Ich habe deinen Code ein wenig vereinfacht, um erst einmal die eigentliche Funktion zu erkennen:
Delphi-Quellcode:
Wo wird StartPlace und EndPlace zugewiesen?
Procedure TfrmPrintPreview.PaintBox1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var dx, dy: Integer; begin dx := EndPlace.X - StartPlace.X; dy := EndPlace.Y - StartPlace.Y; if (dx <> 0) and (dy <> 0) then begin // Skalierung berechnen if dx > dy then iScal := frmPrintPreview.ClientWidth div dx // BreiteGroß, ZoomFaktorX else iScal := frmPrintPreview.ClientHeight div dy; // HöheGröß, ZoomFaktorY PaintBox1.Visible := False; // Skalierung PaintBox1.Width := PaintBox1.Width * iScal; PaintBox1.Height := PaintBox1.Height * iScal; // Rahmen PaintBox1.Left := cAbstRahmen; PaintBox1.Top := cAbstRahmen; PaintBox1.Visible := True; // Rectanglemitte zum Zentrieren iX := iSca * (StartPlace.X + cAbstRahmen + dx div 2 + dx mod 2); iY := iSca * (StartPlace.Y + cAbstRahmen + dy div 2 + dy mod 2); // ScrollBox Steuerung zum Zentrieren ScrollBox1.HorzScrollBar.Position := Abs(iX) - ScrollBox1.ClientWidth div 2 - ScrollBox1.ClientWidth mod 2; ScrollBox1.VertScrollBar.Position := Abs(iY) - ScrollBox1.ClientHeight div 2 - ScrollBox1.ClientHeight mod 2; end; end; Warum wird einmal mit iScal und dann mit iSca gerechnet? Beim Zentrieren wird cAbstRahmen mit dem Faktor iSca multipliziert, Paintbox.Left und .Top sind aber konstant cAbstRahmen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:22 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz