Einzelnen Beitrag anzeigen

Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.477 Beiträge
 
Delphi 12 Athens
 
#2

Re: Wie Rectangle im TForm zentrieren ?

  Alt 24. Aug 2009, 14:37
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.
  Mit Zitat antworten Zitat