Ich habe deinen Code ein wenig vereinfacht, um erst einmal die eigentliche Funktion zu erkennen:
Delphi-Quellcode:
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;
Wo wird StartPlace und EndPlace zugewiesen?
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.