Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Panel bewegen und groesse auf Form ändern ? (https://www.delphipraxis.net/116604-panel-bewegen-und-groesse-auf-form-aendern.html)

taktaky 2. Jul 2008 22:20


Panel bewegen und groesse auf Form ändern ?
 
Hallo,

ich möchte ein Image oder einen Panel auf meine verschielbar machen und
seine Abmessung (Width und height) direkt mit der Maus ändern


Wie kann sowas schaffen ?

SearchBot 2. Jul 2008 22:46

Re: Panel bewegen und groesse auf Form ändern ?
 
Hallo,

vielleicht geht es mit den Events onMouseEnter, dann auf Mousebutton prüfen (onMouseDown) und Flag setzen für onMouseMove. So irgendwie würde ich es versuchen.

_frank_ 3. Jul 2008 07:15

Re: Panel bewegen und groesse auf Form ändern ?
 
Delphi-Quellcode:
    if (Button=mbLeft) and (sender is TImage) then
    begin
        ReleaseCapture;
        (sender as TImage).Parent.Perform(WM_NCLBUTTONDOWN,HTcaption,0);
    end;
mit dem vergrößern ist das nicht ganz so einfach, dazu gibt es aber z.b. TSizeCtrl von www.angusj.com/delphi oder du implementierst es selbst...auch hier ist evtl ein blick in die SelImage-Klasse nicht verkehrt.

ein anderer Ansatz wäre z.b. so (hier nur für die Ecken, aber die kanten sollten auch kein Problem sein...):

Delphi-Quellcode:
type
  TEdge=(eNone,eTopLeft,eTopRight,eBottomLeft,eBottomRight);
  TForm1 = class(TForm)
...
  private
    { Private-Deklarationen }
    r1,r2,r3,r4:TRect;
    edge:TEdge;
...
procedure TForm1.Panel1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  if ptinRect(r1,Point(x,y)) then edge:=eTopLeft else
  if PtInRect(r3,Point(x,y)) then edge:=eBottomRight else
  if ptinRect(r2,Point(x,y)) then edge:=eTopRight else
  if PtInRect(r4,Point(x,y)) then edge:=eBottomLeft else
    edge:=eNone;
  case edge of
    eNone:Panel1.Cursor:=crDefault;
    eTopLeft,eBottomRight:Panel1.Cursor:=crSizeNWSE;
    eTopRight,eBottomLeft: Panel1.Cursor:=crSizeNESW;
  end;
end;

procedure TForm1.Panel1Resize(Sender: TObject);
begin
  r1:=rect(0,0,5,5);
  r3:=rect(panel1.width-5,panel1.height-5,panel1.width,panel1.height);
  r2:=rect(r1.left,r3.top,r1.right,r3.bottom);
  r4:=rect(r3.left,r1.top,r3.right,r1.bottom);
end;

procedure TForm1.Panel1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if edge<>eNone then
  begin
    releaseCapture;
    case edge of
      eTopLeft:Panel1.PerForm(WM_SysCommand, $F004, 0);
      eTopRight:Panel1.PerForm(WM_SysCommand, $F007, 0);
      eBottomLeft:Panel1.PerForm(WM_SysCommand, $F005, 0);
      eBottomRight:Panel1.PerForm(WM_SysCommand, $F008, 0);
    end;
  end;
end;
HTH Frank

extrem 3. Jul 2008 07:19

Re: Panel bewegen und groesse auf Form ändern ?
 
Hi

Bei einem TPanel müsste auch folgendes funktionieren:
Delphi-Quellcode:
type
  TPanel= class(ExtCtrls.TPanel)
    procedure WMNCHitTest(var Message: TWMNCHitTest); message WM_NCHITTEST;
  protected
    procedure CreateParams(var Params: TCreateParams); override;
  end;

...


procedure TPanel.CreateParams(var Params: TCreateParams);
begin
  inherited CreateParams(Params);

  Params.Style := Params.Style or WS_SIZEBOX;
end;

procedure TPanel.WMNCHitTest(var Message: TWMNCHitTest);
begin
  inherited;
  if Message.Result = htClient then
    Message.Result := htCaption;
end;

taktaky 3. Jul 2008 15:01

Re: Panel bewegen und groesse auf Form ändern ?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Danke Frank

mit dem Vorschlag kann ich den Panel an seine 4 Ecken seine Groesse ändern

Ich wollte das Prinzip mit dem ein Shape leider hat ein Shape nicht alle Events !
Es fehlt die Event Onresize by Shape

Blackheart 3. Jul 2008 15:41

Re: Panel bewegen und groesse auf Form ändern ?
 
Ich hab hier diese Function gefunden und dort jene Procedur,
nur leider verhalten die sich nicht so wie ich das gerne möchte.
Programmieren besteht nicht daraus sich im Internet fertigen
Quellcode zu suchen und daraus mit Hilfe anderer ein halbwegs laufendes
Programm zum laufen zu bringen. :wink:

_frank_ 3. Jul 2008 17:20

Re: Panel bewegen und groesse auf Form ändern ?
 
Zitat:

Zitat von taktaky
Ich wollte das Prinzip mit dem ein Shape leider hat ein Shape nicht alle Events !
Es fehlt die Event Onresize by Shape

dann bau dir das event dazu :) ich würde ne klase ableiten, SetBounds überschreiben, darin inherited (also den code der Vorlageklasse) aufrufen und danach das event aufrufen, wenns definiert ist.

Delphi-Quellcode:
TMyShape=class(TShape)
  private
    fOnResize:TNotifyEvent;
  public
    procedure Setbounds(ALeft, ATop, AWidth, AHeight: Integer); override;
  published
    property onResize:TNotifyEvent read fOnResize write fOnResize;
...

procedure TMyShape.Setbounds(ALeft, ATop, AWidth, AHeight: Integer);
begin
  inherited;
  if assigned(fOnResize) then fOnResize(self);
end;
wie immer ungetested, nur ums Prinzip zu veranschaulichen.

Gruß Frank

extrem 3. Jul 2008 17:36

Re: Panel bewegen und groesse auf Form ändern ?
 
Da TShape von TControl abgeleited wurde, ist das onResize Ereignis schon vorhanden, man muss es nur als published deklarieren.
Delphi-Quellcode:
type
  TMyShape= class(TShape)
  published
    property onResize;
  end;


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