Delphi-PRAXiS
Seite 1 von 2  1 2      

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 Dynamisch erstellte Form per gedrückter Maustaste verschiebe (https://www.delphipraxis.net/88742-dynamisch-erstellte-form-per-gedrueckter-maustaste-verschiebe.html)

Logic 20. Mär 2007 12:21


Dynamisch erstellte Form per gedrückter Maustaste verschiebe
 
Hallo,

ich hab eine Form dynamisch erstellt und hier im Forum folgenden Code gefunden:

Delphi-Quellcode:
  ReleaseCapture;
  Perform(wm_syscommand, $f012, 0);
Dieser Funktion, funktioniert bei meinen Anwendungen auch perfekt, nur leider wenn ich der dynamisch erstellten Form die OnMouseDown zuweisen will, kann ich nur eine OnMouseDown einer anderen Form verwenden... wenn ich aber das tue wird die andere Komponente nur verschoben.

Wie kann ich mir ne eigene Procedure bauen, die das Problem umgeht?

Thx
Logic

r2c2 20. Mär 2007 12:49

Re: Dynamisch erstellte Form per gedrückter Maustaste versch
 
Hallo :hi:
du kannst alle Methdoen zuweisen, die die entsprechende Signatur haben. Also einfach die Parameter entsprechend anpassen...

mfg

Christian

Logic 20. Mär 2007 13:14

Re: Dynamisch erstellte Form per gedrückter Maustaste versch
 
Mhh

Also ich verwende für ein schon vorhandenes Form ja folgende Procedure für die Aufgabe.

Delphi-Quellcode:
procedure TForm2.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  ReleaseCapture;
  Perform(wm_syscommand, $f012, 0);
end;
wie kann ich der nun sagen, dass die nen anderen Fenster verschieben soll?
Weil wenn ich ne eigene baue gehört die ja zu keiner Form mehr direkt.

Thx ^^

TBx 20. Mär 2007 13:17

Re: Dynamisch erstellte Form per gedrückter Maustaste versch
 
Hallo!

Du must Dir in der Klasse Deiner dynamisch generierten Form eine Prozedur definieren, die Du als Eventhandler dem OnMouseDown Deiner Form zuweist.

Beispiel:

Deklaration:
Delphi-Quellcode:
TMyForm = Class (TForm)
    procedure FormMouseDown(Sender : TObject;
                            Button : TMouseButton;
                            Shift  : TShiftState;
                            X,
                            Y      : Integer);
  public
    constructor Create (AOwner : TComponent); override;
end;
Implementation:
Delphi-Quellcode:
procedure TMyForm.FormMouseDown(Sender : TObject;
                                Button : TMouseButton;
                                Shift  : TShiftState;
                                X,
                                Y      : Integer);
begin
  ReleaseCapture;
  Perform(wm_syscommand, $f012, 0);
end;

constructor TForm1.Create(AOwner: TComponent);
begin
  inherited;
  OnMouseDown := FormMouseDown
end;
So als grober Überblick.

Hope it helps

onlinekater

r2c2 20. Mär 2007 13:22

Re: Dynamisch erstellte Form per gedrückter Maustaste versch
 
Aaalso...

- jede Forum ist erstmal ne Klasse(=Bauplan)
- dadurch, dass du das Formular erzeugst, erstellst du ein konkretes Formular-Objekt
- TControl.Perform is ne Methode(in dem Fall eine des Formulars(TForm erbt von TControl))
- Weist du also eine Methode eines anderen Formulars deinem als Ereignisbehandlungsroutine zu, dann wird AnderesFormular.Perforn ausgeführt und nicht DeinFormular.Perform
- erstelle also eine weitere Methode für die Klasse deines neuen formulars und weise die dem Event zu

Bei Fragen: fragen...

//Roter Kasten:
Och menno. zu langsam. Egal. Hab noch n paar Background-Infos...

mfg

Christian

Logic 20. Mär 2007 13:36

Re: Dynamisch erstellte Form per gedrückter Maustaste versch
 
Danke an euch beide erstmal!

Also ich erzeuge mit folgendem Code (siehe weiter unten) meine Form und u.a. ein bild, dass dann das OnMouseDown haben sollen.

D.h. ich füge die Deklaration in meine Unit, genauso wie die Implementierung ein. Bzw. ändere beim Erstellen TForm auf TMyForm um... nur leider meckert mir da Delphi:

Zitat:

[Error] notes.pas(181): Undeclared identifier: 'FormMouseDown'
[Error] notes.pas(47): Unsatisfied forward or external declaration: 'TMyForm.Create'
Delphi-Quellcode:
procedure makeZettel(nummer:integer);
begin
  zettel.zettel:=TForm.Create(Application);
  zettel.zettel.Color:=Form2.Color;
  zettel.zettel.BorderStyle:=Form2.BorderStyle;
  zettel.zettel.TransparentColor:=Form2.TransparentColor;
  zettel.zettel.TransparentColorValue:=Form2.TransparentColorValue;
  zettel.zettel.Width:=Form2.Width;
  zettel.zettel.Height:=Form2.Height;
  zettel.zettel.Name:='f_'+IntToStr(nummer);

  zettel.hintergrund:=TImage.Create(zettel.zettel);
  zettel.hintergrund.Picture:=Form2.Image1.Picture;
  zettel.hintergrund.Top:=Form2.Image1.Top;
  zettel.hintergrund.Left:=Form2.Image1.Left;
  zettel.hintergrund.Width:=Form2.Image1.Width;
  zettel.hintergrund.Height:=Form2.Image1.Height;
  zettel.hintergrund.Parent:=zettel.zettel;
  zettel.hintergrund.Name:='bild';
  zettel.hintergrund.Visible:=true;

  [...]

  zettel.zettel.Visible:=true;
end;
Der record sieht folgendermaßen aus:

Delphi-Quellcode:
type T_Forms = record
                  zettel           : TForm;
                  hintergrund      : TImage;
                  subject, nummer  : TLabel;
                  text             : TMemo;
                  close            : TButton;
                end;

r2c2 20. Mär 2007 13:39

Re: Dynamisch erstellte Form per gedrückter Maustaste versch
 
Wär gut, wenn du auch die Stellen posten könntest, wo die Fehler auftreten...

mfg

Christian

Logic 20. Mär 2007 13:55

Re: Dynamisch erstellte Form per gedrückter Maustaste versch
 
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  lines:=TStringList.Create;
  forms:=TStringList.Create;
  count:=0;
    inherited;
  OnMouseDown := FormMouseDown <-
end;
Delphi-Quellcode:
  public
    constructor Create (AOwner : TComponent); override; <-
  end;

r2c2 20. Mär 2007 14:00

Re: Dynamisch erstellte Form per gedrückter Maustaste versch
 
Scheint so, als hättest du einen Konstruktor deklariert, aber nicht implementiert. Solltest du doch eine Implementierung haben, zeig die mal...

Außerdem kennt der Compiler, wie er ja sagt, FormMouseDown nicht. Hast du das denn deklariert und implementiert?

BTW: inherited kommt immer an den Anfang von Create(und bei Desoroy immer ans Ende).

mfg

Christian

Logic 20. Mär 2007 14:07

Re: Dynamisch erstellte Form per gedrückter Maustaste versch
 
Also so siehts bei mir aus:

Delphi-Quellcode:
type
  TForm1 = class(TForm)
    Button1: TButton;
    ListBox1: TListBox;
    IdHTTP1: TIdHTTP;
    Panel1: TPanel;
    Button2: TButton;
    Button6: TButton;
    Button3: TButton;
    lb_forms: TListBox;
    CoolTrayIcon1: TCoolTrayIcon;
    PopupMenu1: TPopupMenu;
    delete1: TMenuItem;
    N1: TMenuItem;
    Beenden1: TMenuItem;
    lb_notes: TListBox;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);


    procedure Button6Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure lb_notesDblClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

  TMyForm = Class (TForm)
    procedure FormMouseDown(Sender : TObject;
                            Button : TMouseButton;
                            Shift  : TShiftState;
                            X,
                            Y      : Integer);
  public
    constructor Create (AOwner : TComponent); override;
  end;

type T_Forms = record
                  zettel           : TForm;
                  hintergrund      : TImage;
                  subject, nummer  : TLabel;
                  text             : TMemo;
                  close            : TButton;
                end;
var
  Form1: TForm1;
  lines, forms:TstringList;
  count:integer;
  anzahl_notes:integer;
  Zettel: T_Forms;

implementation

uses Unit2;

{$R *.dfm}

procedure TMyForm.FormMouseDown(Sender : TObject;
                                Button : TMouseButton;
                                Shift  : TShiftState;
                                X,
                                Y      : Integer);
begin
  ReleaseCapture;
  Perform(wm_syscommand, $f012, 0);
end;
Hab inherited jetzt an den Anfang gemacht, aber der Fehler ändert sich ned


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:09 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz