AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Fenster verschieben?

Ein Thema von DualCoreCpu · begonnen am 11. Sep 2009 · letzter Beitrag vom 29. Mai 2016
Antwort Antwort
Seite 2 von 5     12 34     Letzte »    
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#11

Re: Fenster verschieben?

  Alt 11. Sep 2009, 21:48
Zitat von himitsu:
Zitat von Neutral General:
Dann im OnMouseMove wird die neue Position mithilfe der aktuellen, globalen Mauskoordinaten und dem Punkt vom MouseDown (als ne Art Offset) berechnet.
Delphi-Referenz durchsuchenClientToScreen
Das ist nicht mal nötig. Es reicht, die relative Bewegung zu kennen, und die Distanz zu den Koordinaten der Form dazu zu addieren.
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#12

Re: Fenster verschieben?

  Alt 12. Sep 2009, 01:53
Hi,

Ich addiere nichtmal dazu.

Ich setze Left,Top der Form = Mouse.CursorPos und addiere den offset der Maus innerhalb des Formulars drauf.
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

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

Re: Fenster verschieben?

  Alt 12. Sep 2009, 09:52
Zitat von Neutral General:
Ich addiere nichtmal dazu....und addiere den offset der Maus...
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#14

Re: Fenster verschieben?

  Alt 12. Sep 2009, 09:57
Zitat von Larsi:
Delphi-Quellcode:
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
if ssLeft in Shift then
    begin
      ReleaseCapture;
      Form1.Perform(WM_SYSCOMMAND,$F012,0);
    end;
end;
Der Code würde das gewünscht bewirken aber berechnet wird da natrülich von dir nichts. Der Code stammt von DeddyH.

Für den Algorithmus denn du machen willst hilft dir eventuell ClientToScreen.
Hab ich das wirklich so geschrieben ? Falls das jemand nutzen sollte, bitte das "Form1." vor dem Perform weglassen.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Larsi

Registriert seit: 10. Feb 2007
2.262 Beiträge
 
Delphi 2007 Professional
 
#15

Re: Fenster verschieben?

  Alt 12. Sep 2009, 10:19
Du hast Panel1.Perform geschrieben, ich hab das durch Form1 ausgetauscht.
Ein Tag ohne Delphi ist ein verlorener Tag!

Homepage zu meinem neuen Programm: StreamZ
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#16

Re: Fenster verschieben?

  Alt 12. Sep 2009, 10:20
Ahaaaa, dann erscheint das schon in einem anderen Licht. Aber wie gesagt, lass das Form1 weg oder ersetze es durch self, dann ist das auch richtig.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#17

Re: Fenster verschieben?

  Alt 12. Sep 2009, 11:04
Blank Window Example (nonvcl)
Delphi-Quellcode:
program DemoFormMovement;

{$A+,B-,C-,D-,E-,F-,G+,H+,I-,J-,K-,L-,M-,N+,O+,P+,Q-,R-,S-,T-,U-,V+,W-,X+,Y-,Z1}
{$APPTYPE GUI}

type
  TWndClassEx = packed record
    cbSize: Cardinal;
    style: Cardinal;
    lpfnWndProc: Pointer;
    cbClsExtra: Integer;
    cbWndExtra: Integer;
    hInstance: Cardinal;
    hIcon: Cardinal;
    hCursor: Cardinal;
    hbrBackground: Cardinal;
    lpszMenuName: PAnsiChar;
    lpszClassName: PAnsiChar;
    hIconSm: Cardinal;
  end;

  TPoint = packed record
    X: Longint;
    Y: Longint;
  end;

  TMsg = packed record
    hwnd: Cardinal;
    message: Cardinal;
    wParam: Integer;
    lParam: Integer;
    time: Cardinal;
    pt: TPoint;
  end;

const
  kernel32 = 'kernel32.dll';
  user32 = 'user32.dll';

  _Classname: PChar = 'WndDmoCls';
  _Width: Word = 320;
  _Height: Word = 240;

  {Windows Rip}
  HWND_TOP = 0;
  COLOR_WINDOW = 5;
  WS_EX_TOOLWINDOW = $80;
  GWL_STYLE = -16;
  WS_VISIBLE = $10000000;
  WS_CAPTION = $C00000;
  VK_ESCAPE = 27;
  SWP_SHOWWINDOW = $40;
  IDC_ARROW = Pointer(32512);

  {Messages Rip}
  WM_DESTROY = $0002;
  WM_KEYUP = $0101;
  WM_LBUTTONDOWN = $0201;
  WM_MOUSEMOVE = $0200;
  WM_LBUTTONUP = $0202;

var
  hWnd: Cardinal;
  mMsg: TMsg;
  wWnd: TWndClassEx;

  InitialFormMousePosition,
  ScreenMouse: TPoint;
  MouseIsDown: Boolean;

{Windows Rip}
function RegisterClassEx(const WndClass: TWndClassEx): Word; stdcall;
  external user32 name 'RegisterClassExA';
function LoadCursor(Cardinalance: Cardinal; lpCursorName: PChar): Cardinal; stdcall;
  external user32 name 'LoadCursorA';
function CreateWindowEx(dwExStyle: Cardinal; lpClassName: PChar;
  lpWindowName: PChar; dwStyle: Cardinal; X, Y, nWidth, nHeight: Integer;
  hWndParent: Cardinal; hMenu: Cardinal; Cardinalance: Cardinal; lpParam: Pointer): Cardinal;
  stdcall; external user32 name 'CreateWindowExA';
function SetWindowLong(hWnd: Cardinal; nIndex: Integer; dwNewLong: Longint): Longint; stdcall;
  external user32 name 'SetWindowLongA';
function GetMessage(var lpMsg: TMsg; hWnd: Cardinal;
  wMsgFilterMin, wMsgFilterMax: Cardinal): Boolean; stdcall;
  external user32 name 'GetMessageA';
function TranslateMessage(const lpMsg: TMsg): Boolean; stdcall;
  external user32 name 'TranslateMessage';
function DispatchMessage(const lpMsg: TMsg): Longint; stdcall;
  external user32 name 'DispatchMessageA';
function UnregisterClass(lpClassName: PChar; Cardinalance: Cardinal): Boolean; stdcall;
  external user32 name 'UnregisterClassA';
function GetLastError: Cardinal; stdcall;
  external kernel32 name 'GetLastError';
procedure PostQuitMessage(nExitCode: Integer); stdcall;
  external user32 name 'PostQuitMessage';
function GetCursorPos(var lpPoint: TPoint): Boolean; stdcall;
  external user32 name 'GetCursorPos';
function SetWindowPos(hWnd: Cardinal; hWndInsertAfter: Cardinal;
  X, Y, cx, cy: Integer; uFlags: Cardinal): Boolean; stdcall;
  external user32 name 'SetWindowPos';
function DefWindowProc(hWnd, Msg: Cardinal; wParam, lParam: Integer ): Integer; stdcall;
  external user32 name 'DefWindowProcA';

function WndProc( hWnd, uMsg: Cardinal; wParam, lParam: Integer ): Integer; stdcall;
begin
  Result := 0;
  case uMsg of
    WM_DESTROY:
      PostQuitMessage(0);
    WM_KEYUP:
      case Word( wParam ) of
        VK_ESCAPE:
          WndProc( hWnd, WM_DESTROY, 0, 0 );
      end;
    WM_LBUTTONDOWN:
    begin
      with InitialFormMousePosition do
      begin
        X := Word( lParam );
        Y := Word( lParam shr 16 );
      end;
      MouseIsDown := True;
    end;
    WM_MOUSEMOVE:
    if MouseIsDown then
    begin
      GetCursorPos( ScreenMouse );
      SetWindowPos( hWnd, HWND_TOP, ScreenMouse.X - InitialFormMousePosition.X,
        ScreenMouse.Y - InitialFormMousePosition.Y, _Width, _Height, SWP_SHOWWINDOW );
    end;
    WM_LBUTTONUP:
      MouseIsDown := False;
  else
    Result := DefWindowProc( hWnd, uMsg, wParam, lParam );
  end;
end;

begin
  with wWnd do
  begin
    cbSize := SizeOf( wWnd );
    lpfnWndProc := @WndProc;
    hCursor := LoadCursor( 0, IDC_ARROW );
    hbrBackground := COLOR_WINDOW;
    lpszClassName := _Classname;
  end;
  RegisterClassEx( wWnd );
  hWnd := CreateWindowEx( WS_EX_TOOLWINDOW, _Classname, NIL, WS_VISIBLE,
    100, 100, _Width, _Height, 0, 0, 0, NIL );
  SetWindowLong( hWnd, GWL_STYLE, WS_VISIBLE and (not WS_CAPTION) );
  while GetMessage( mMsg, 0, 0, 0 ) do
  begin
    TranslateMessage( mMsg );
    DispatchMessage( mMsg );
  end;
  UnregisterClass( _Classname, 0 );
  ExitCode := GetLastError;
end.
Angehängte Dateien
Dateityp: rar demoformmovement_274.rar (3,2 KB, 10x aufgerufen)
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG
  Mit Zitat antworten Zitat
Benutzerbild von Matze
Matze
(Co-Admin)

Registriert seit: 7. Jul 2003
Ort: Schwabenländle
14.929 Beiträge
 
Turbo Delphi für Win32
 
#18

Re: Fenster verschieben?

  Alt 12. Sep 2009, 11:08
Das ist sicher genau das, was ein Lehrer von einem Delphi-Neuling verlangt.

Gerade über OnMouseDown (wurde alles genannt) geht es doch sehr einfach und das ist vermutlich das, was der Lehrer sehen möchte. Ich denke es geht um das Verstehen und Anwenden der VCL-Ereignisse.
  Mit Zitat antworten Zitat
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#19

Re: Fenster verschieben?

  Alt 12. Sep 2009, 11:50
I know
Aber einem Neuling wird ein Lehre sicher das nicht abkaufen!
Also von daher

MfG
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#20

Re: Fenster verschieben?

  Alt 12. Sep 2009, 11:59
Um wieder zur eigentlichen Aufgabenstellung zurückzukehren: die generelle Vorgehensweise wurde mindestens 2 mal bereits genannt. Hier etwas ausführlicher: im Ereignis OnMouseDown, das ausgelöst wird, sobald auf dem Formular eine Maustaste gedrückt wird, merkst Du Dir den aktuellen Punkt des Mauszeigers (die X- und Y-Koordinate werden freundlicherweise bereits als Parameter übergeben) in einer globalen Variablen (@all: keine Meckereien jetzt!!). Dabei solltest Du aber auswerten, welche Maustaste gedrückt wurde, was wiederum im Button-Parameter steht, dieser sollte für die linke Maustaste mbLeft sein. In Pseudo-Code sieht das dann so aus:
Delphi-Quellcode:
var MausPos: TPoint;

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X,Y: integer);
begin
  wenn Button mbLeft ist
    MausPos ist der Punkt(X,Y)
end;
Im MouseMove-Ereignis wiederum kannst Du nun die Differenz zwischen den einzelnen Koordinaten errechnen und die Eigenschaften Top bzw. Left des Formulars so setzen, dass der Mauszeiger wieder an der gemerkten relativen Position innerhalb des Formulars steht (auch in diesem Ereignis werden wieder X und Y übergeben). Ob die linke Maustaste dabei gedrückt ist, kannst Du feststellen, indem Du prüfst, ob ssLeft in der Menge Shift enthalten ist.
Delphi-Quellcode:
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,Y: integer);
begin
  wenn ssLeft in Shift enthalten
    Left ist gleich Left + Differenz aus X und MausPos.X
    Top ist gleich Top + Differenz aus Y und MausPos.Y
end;
Ich hoffe, das war ein halbwegs verständlicher Ansatz. Versuch es einfach einmal auf diesem Wege, falls Du nicht klarkommst, helfen wir gerne weiter.
Sollte ich hier Fehler gemacht haben (da aus dem Kopf getippt), bitte ich einen Wissenden um Korrektur.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 5     12 34     Letzte »    


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 18:12 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