Einzelnen Beitrag anzeigen

delphifan2004

Registriert seit: 26. Nov 2004
Ort: Dresden
266 Beiträge
 
Delphi 10.3 Rio
 
#13

Re: Zwei Komponenten auf einmal verschieben (zur Laufzeit)

  Alt 19. Mär 2005, 21:06
Hallo!

Ich stöbere grad bissl in der DP rum und da komm ich grad auf diesen Thread und sehe diesen Quelltext:

Delphi-Quellcode:
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
const sc_dragmove = $f012;
begin
  ReleaseCapture;
  TWinControl(Edit1).perform(wm_syscommand,sc_dragmove, 0);
end;

procedure TForm1.FormPaint(Sender: TObject);
begin
Label1.Left := Edit1.Left;
Label1.Top := Edit1.Top - Label1.Height;
end;
Hab ich sofort ausprobiert. Funzt! Ich kann auch statt TWinControl(Edit1).... TWinControl(Sender)... schreiben. Funzt auch.

Nun interessiert mich, ob es eine Möglichkeit gibt, statt Image1MouseDown auch ComponentMouseDown zu schreiben, wobei ich damit meine, ob es ne Möglichkeit gibt, das ganze zu verallgemeinern. Ich weiß, das es zum Beispiel so hier geht:

Delphi-Quellcode:
unit main;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    ListBox1: TListBox;
    Label1: TLabel;
    Edit1: TEdit;
    procedure Panel1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure FormPaint(Sender: TObject);
    procedure Edit1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Panel1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
const sc_dragmove = $f012;
begin
  ReleaseCapture;
  TWinControl(Sender).perform(wm_syscommand,sc_dragmove, 0);
  //Statt Sender kann im Konkreten Fall auch Panel1 stehen
  //Der OriginalQuelltext verschiebt so ein TEdit
end;

procedure TForm1.FormPaint(Sender: TObject);
begin
  if Sender is TPanel then begin
  Label1.Left := TWinControl(Sender).Left;
  Label1.Top := TWinControl(Sender).Top - Label1.Height;
  end;
end;

procedure TForm1.Edit1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
   Panel1MouseDown(Sender,Button,Shift,X,Y);
end;

end.
Ich suche aber eine Möglichkeit, eine Komponente zur Laufzeit auf das Formular zu bringen und dann verschieben zu können. Möglichst ohne Erweiterung der Komponenten. Wenn ich beim Schreiben so drüber nachdenke geht das dann wohl doch nur mit Zuweisung der MouseDown Methode an OnMouseDown, wenn die Kompo auf der Form erzeugt wird. Weiterhin dürfte es dann auch nicht mehr allzu schwierig sein, einen Rahmen um die selektierte Kompo zu zeichnen. Der Hintergrund meiner Anfrage -> Lazarus Projekt -> FormDesigner. Den Quelltext dort kapier ich bloß nich. Das ganze sollte dann mit FCL und LCL genau so funzen.

Delphifan2004
  Mit Zitat antworten Zitat