AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Wie Rectangle im TForm zentrieren ?
Thema durchsuchen
Ansicht
Themen-Optionen

Wie Rectangle im TForm zentrieren ?

Ein Thema von madina · begonnen am 23. Aug 2009 · letzter Beitrag vom 24. Aug 2009
Antwort Antwort
madina

Registriert seit: 1. Nov 2005
153 Beiträge
 
#1

Wie Rectangle im TForm zentrieren ?

  Alt 23. Aug 2009, 13:28
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
mfg
madina
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.429 Beiträge
 
Delphi 10.4 Sydney
 
#2

Re: Wie Rectangle im TForm zentrieren ?

  Alt 24. Aug 2009, 13: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
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:47 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