AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Größe von Objecten ändern
Thema durchsuchen
Ansicht
Themen-Optionen

Größe von Objecten ändern

Ein Thema von Captnemo · begonnen am 11. Aug 2013 · letzter Beitrag vom 12. Aug 2013
Antwort Antwort
Benutzerbild von Captnemo
Captnemo

Registriert seit: 27. Jan 2003
Ort: Bodenwerder
1.126 Beiträge
 
Delphi XE4 Architect
 
#1

Größe von Objecten ändern

  Alt 11. Aug 2013, 18:53
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
Dieter
9 von 10 Stimmen in meinem Kopf sagen ich bin nicht verrückt. Die 10. summt dazu die Melodie von Supermario Bros.
MfG Captnemo
  Mit Zitat antworten Zitat
Volker Z.

Registriert seit: 4. Dez 2012
Ort: Augsburg, Bayern, Süddeutschland
419 Beiträge
 
Delphi XE4 Ultimate
 
#2

AW: Größe von Objecten ändern

  Alt 12. Aug 2013, 03:21
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ß
Volker Zeller
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#3

AW: Größe von Objecten ändern

  Alt 12. Aug 2013, 08:30
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
  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 23:22 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