Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Wie Rectangle im TForm zentrieren ? (https://www.delphipraxis.net/139092-wie-rectangle-im-tform-zentrieren.html)

madina 23. Aug 2009 13:28


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:
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;
mfg

Blup 24. Aug 2009 13:37

Re: Wie Rectangle im TForm zentrieren ?
 
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.


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