Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Größe von Objecten ändern (https://www.delphipraxis.net/176084-groesse-von-objecten-aendern.html)

Captnemo 11. Aug 2013 17:53

Größe von Objecten ändern
 
Hi,

ich schreibe grad an einen kleinen Formulareditor für einen Report einer Anwendung. Klar könnte ich auch Fastreport o.ä. benutzen, aber es geht nur einen ganz einfachen Report und der Designer sollte auf das absolut notwendigste beschränkt sein.

Ich habe einfach eine Scrollbox genommen, auf der ich zur Laufzeit mit TLabel, TShape und TImage die passenden Elemente platzieren kann.
Klappt auch alles. Das Verschieben mache ich mit OnMouseDown, OnMouseUp und OnMouseMove, und die Größe ändere ich über eingeblendete Edits. Ich würde das aber gerne so machen, wie das z.B. im Formulardesigner von Delphi geht, also die Ecken oder die Kanten des Object anfassen um damit die Größe zu ändern. Oder noch besser, einen Rahmen Drumherum darstellen, den ich entsprechend verwenden könnte.

Leider habe mal so gar keine Ahnung, wie ich das realisieren könnte?
Hat jemand eine Tipp für mich?

Vielleicht ist meine Idee mit der Scrollbox ja blöd, aber es funktioniert so herrlich gut :-)

Volker Z. 12. Aug 2013 02:21

AW: Größe von Objecten ändern
 
Hallo,

das folgende bezieht sich nur auf die Größenänderung Deiner Objekte.
Ist nur so 'ne Idee. Klatsche mal ein paar Controls auf ein Form (oder auch in eine ScrollBox; es ist nicht zwingend, dass es sich um die unten angegebenen Controls handelt) und leg noch eine PaintBox dazu.
Dann zeichnet Dir nachfolgender Code einen (5 Pixel dicken) Rahmen um ein selektiertes Control. Du kannst den Rahmen (im Beispiel) rechts oder unten mit der Maus packen und – mit gedrückter Maustaste – die Größe der PaintBox – und damit die Größe des Controls – ändern.
Delphi-Quellcode:
type
  TForm5 = class(TForm)
    ScrollBox1: TScrollBox;
    ListBox1: TListBox;
    Shape1: TShape;
    SpeedButton1: TSpeedButton;
    PaintBox1: TPaintBox;
    Edit1: TEdit;
    Label1: TLabel;
    Button1: TButton;
    Image1: TImage;
    procedure FormCreate(Sender: TObject);
    procedure PaintBox1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    procedure PaintBox1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TshiftState; X, Y: Integer);
    procedure PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
    procedure PaintBox1Paint(Sender: TObject);
  private
    { Private-Deklarationen }
    FControl : TControl;
    FMouse  : TPoint;
    FSizing : Boolean;
    procedure ControlMouseDown (Sender : TObject; Button : TMouseButton; Shift : TShiftState; X, Y : Integer);
  public
    { Public-Deklarationen }
  end;

const
  BORDER_WIDTH = 5;

procedure TForm5.FormCreate(Sender: TObject);
begin
  ListBox1.OnMouseDown    := ControlMouseDown;
  Edit1.OnMouseDown       := ControlMouseDown;
  Label1.OnMouseDown      := ControlMouseDown;
  Shape1.OnMouseDown      := ControlMouseDown;
  Button1.OnMouseDown     := ControlMouseDown;
  SpeedButton1.OnMouseDown := ControlMouseDown;
  Image1.OnMouseDown      := ControlMouseDown;

  FControl := nil;
  FSizing := False
end;

procedure TForm5.PaintBox1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  FSizing := True;
  FMouse.X := X;
  FMouse.Y := Y
end;

procedure TForm5.PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
var
  dx, dy : Integer;
  r     : TRect;
begin
  if not (FSizing and Assigned (FControl)) then
    Exit;

  dx := X - FMouse.X;
  dy := Y - FMouse.Y;
  r := PaintBox1.BoundsRect;
  Inc (r.Right, dx);
  Inc (r.Bottom, dy);
  PaintBox1.BoundsRect := r;

  Inc (r.Left, BORDER_WIDTH);
  Inc (r.Top, BORDER_WIDTH);
  Dec (dx, BORDER_WIDTH);
  Dec (dy, BORDER_WIDTH);
  Inc (r.Right, dx);
  Inc (r.Bottom, dy);
  FControl.BoundsRect := r;

  FMouse.X := X;
  FMouse.Y := Y
end;

procedure TForm5.PaintBox1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  FSizing := False
end;

procedure TForm5.PaintBox1Paint(Sender: TObject);
begin
  if not Assigned (FControl) then
    Exit;

  PaintBox1.Canvas.Brush.Color := clBlack;
  PaintBox1.Canvas.Brush.Style := bsSolid;
  PaintBox1.Canvas.Rectangle (PaintBox1.ClientRect)
end;

procedure TForm5.ControlMouseDown (Sender : TObject; Button : TMouseButton; Shift : TShiftState; X, Y : Integer);
var
  r : TRect;
begin
  if not (Sender is TControl) then
    begin
      FControl := nil;
      Exit
    end;

  FControl := TControl (Sender);

  r := FControl.BoundsRect;
  Dec (r.Left, BORDER_WIDTH);
  Dec (r.Top, BORDER_WIDTH);
  Inc (r.Right, BORDER_WIDTH);
  Inc (r.Bottom, BORDER_WIDTH);

  PaintBox1.BoundsRect := r;
  PaintBox1.BringToFront;
  FControl.BringToFront;
end;
Wenn dies Deinen Anforderungen entspricht, dann sollte der Rest (links, oben bzw. in den Ecken packen, selektiertes Control und Paintbox nach vorne bringen etc.) nur noch Fleißaufgabe sein

Gruß

Furtbichler 12. Aug 2013 07:30

AW: Größe von Objecten ändern
 
Das Problem und entsprechende Lösungen sind bekannt. Google doch einfach "Delphi drag controls at runtime"
Gleich der erste Link klingt vielversprechend: http://delphi.about.com/library/weekly/aa102505a.htm


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