Delphi-PRAXiS
Seite 2 von 2     12   

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 Zwei Komponenten auf einmal verschieben (zur Laufzeit) (https://www.delphipraxis.net/41146-zwei-komponenten-auf-einmal-verschieben-zur-laufzeit.html)

Thorben77 27. Feb 2005 21:12

Re: Zwei Komponenten auf einmal verschieben (zur Laufzeit)
 
Du kannst sonts ja auch ein LabeledEdit (ein Edit mit nem Label verbunden^^) verwenden, dann brauchst du nur eine Komponente verschieben.

sniper_w 27. Feb 2005 21:20

Re: Zwei Komponenten auf einmal verschieben (zur Laufzeit)
 
Zitat:

Du kannst sonts ja auch ein LabeledEdit (ein Edit mit nem Label verbunden^^) verwenden, dann brauchst du nur eine Komponente verschieben.
Nein, so geht das nicht, leider zugegeben.

Ah, noch was.Man kann es einfacher schreiben:
Delphi-Quellcode:
//TWinControl(Edit1).perform(wm_syscommand,sc_dragmove, 0);
 Edit1.perform(wm_syscommand,sc_dragmove, 0);
"checked typecast" ist heir überflussig.

delphifan2004 19. Mär 2005 21:06

Re: Zwei Komponenten auf einmal verschieben (zur Laufzeit)
 
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

davar 19. Mär 2005 21:34

Re: Zwei Komponenten auf einmal verschieben (zur Laufzeit)
 
ich weiss nicht, ob das gerade die beste Form ist und ob das deine Frage beantwortet, aber wie folgt geht es:

Delphi-Quellcode:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
    procedure Bewegen(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
var MyEdit: TEdit;
begin
  MyEdit := TEdit.Create(Form1);
  with MyEdit do begin
    Parent := Form1;
    Name := 'Edit1';
    Left := 50;
    Top := 50;
    OnMouseDown:= Bewegen;
  end;
end;

procedure TForm1.Bewegen(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
const sc_dragmove = $f012;
begin
  ReleaseCapture;
  TEdit(Sender).perform(wm_syscommand,sc_dragmove, 0);
end;



end.
mfg

davar

SirThornberry 19. Mär 2005 21:53

Re: Zwei Komponenten auf einmal verschieben (zur Laufzeit)
 
pack das edit und das label auf ein panel und führe das perform auf das Panel aus

delphifan2004 19. Mär 2005 22:53

Re: Zwei Komponenten auf einmal verschieben (zur Laufzeit)
 
Hallo davar!

Dake erst mal für die schnelle Antwort! Super. Funktionirt!

Hab allerdings noch folgendes machen müssen:

Delphi-Quellcode:

type
 TForm1 = class(TForm)
 private
    counter: array[0..1] of Integer; //bei mehr Kompos größeres- oder dynamisches Array nehmen
 public
    procedure Bewegen...
 end;

implementation

procedure TForm1.Button1Click(Sender: TObject);
var MyEdit: TEdit;
begin
   MyEdit := TEdit.Create(Form1);
   with MyEdit do begin
     Parent := Form1;
     Name := 'EditKompo' + IntToStr(Counter[0]); // HIER
     Left := 50;
     Top := 50;
     OnMouseDown:= Bewegen;
     Inc(Counter[0]);                            // UND HIER
   end;
end;
habe ich den Zähler einfügen müssen, sonst klappt der Einfügevorgang nur ein einziges mal. Danach kommt Exception: EComponentError -> Meldung: "Es gibt bereits Kompo mit gl. Namen"

Deshalb der Zähler. Nun hat jede Kompo nen anderen Namen.

Noch mal Danke für die schnelle Antwort.

Es grüßt

Delphifan2004


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:26 Uhr.
Seite 2 von 2     12   

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