AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Zwei Komponenten auf einmal verschieben (zur Laufzeit)
Thema durchsuchen
Ansicht
Themen-Optionen

Zwei Komponenten auf einmal verschieben (zur Laufzeit)

Ein Thema von davar · begonnen am 26. Feb 2005 · letzter Beitrag vom 19. Mär 2005
Antwort Antwort
Seite 2 von 2     12   
Thorben77

Registriert seit: 22. Okt 2004
359 Beiträge
 
#11

Re: Zwei Komponenten auf einmal verschieben (zur Laufzeit)

  Alt 27. Feb 2005, 22:12
Du kannst sonts ja auch ein LabeledEdit (ein Edit mit nem Label verbunden^^) verwenden, dann brauchst du nur eine Komponente verschieben.
  Mit Zitat antworten Zitat
Benutzerbild von sniper_w
sniper_w

Registriert seit: 12. Dez 2004
Ort: Wien, Österriech
893 Beiträge
 
Delphi 6 Enterprise
 
#12

Re: Zwei Komponenten auf einmal verschieben (zur Laufzeit)

  Alt 27. Feb 2005, 22:20
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.
Katura Haris
Es (ein gutes Wort) ist wie ein guter Baum, dessen Wurzel fest ist und dessen Zweige in den Himmel reichen.
  Mit Zitat antworten Zitat
delphifan2004

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

Re: Zwei Komponenten auf einmal verschieben (zur Laufzeit)

  Alt 19. Mär 2005, 22: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
davar

Registriert seit: 4. Feb 2005
311 Beiträge
 
Turbo Delphi für Win32
 
#14

Re: Zwei Komponenten auf einmal verschieben (zur Laufzeit)

  Alt 19. Mär 2005, 22:34
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
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#15

Re: Zwei Komponenten auf einmal verschieben (zur Laufzeit)

  Alt 19. Mär 2005, 22:53
pack das edit und das label auf ein panel und führe das perform auf das Panel aus
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
delphifan2004

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

Re: Zwei Komponenten auf einmal verschieben (zur Laufzeit)

  Alt 19. Mär 2005, 23:53
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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 04:30 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