Chcę zrobić takie coś, że jak będę miał wciśnięty lpm, a mysz będzie na ort! image1, to będę przenosił okno myszą. Tylko musi być tak, że nie zacznie się przenosić, jeśli najadę z już wciśniętym przyciskiem, tylko jeśli kliknę na image1 i zacznę z wciśniętym lpm ruszać myszą. I jest możliwość, że na image1 będzie zachodzić inny ort! (np label1) i wtedy też musi się przenosić, nawet jeśli mysz zachodzi na label1.
Zajrzyj do źródła PilotMP3. Link w stopce. Tam forma CocpitForm jest w podobny sposób przesuwana.
Niestety nie mogę otworzyć tego w delphi :(
Napisze jak próbowałem to zrobić. Może ktoś mi powie gdzie popełniam błąd
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls;
type
TForm1 = class(TForm)
Image1: TImage;
procedure Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure Image1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
x: Integer;
y: Integer;
przenoszenie: Boolean;
implementation
{$R *.dfm}
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
x:= Mouse.CursorPos.x-Left;
przenoszenie:= True;
end;
procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
x:= 0;
przenoszenie:= False;
end;
procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if przenoszenie = true then
left:= Mouse.CursorPos.X-x;
end;
end.
Tu jest oczywiście tylko przenoszenie w poziomie, ale jeśli będę wiedział jak zrobić poziomo to pionowo sobie też poradzę. Jeśli ktoś wie co tu jest źle to niech pomoże
// Stosuj tag <code class="delphi"></code>
[diabel] - Q
procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if ssleft in Shift then
begin
left:=Mouse.CursorPos.X-Image1.left;
Caption:=Char(Random(50)+50);
end;
end;
To ci powinno pomóc ale nie działa do końca, bo nie mam czasu dopracować bo ide na wigilie :P
Wygeneruj procedurę onMouseDown dla FORMY
Następnie przypisz tą procedurę onMouseDown dla TImage
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if Button= mbLeft then
begin
SendMessage(Handle, WM_LButtonUp, 0, 0);
SendMessage(Handle, WM_NCLButtonDown, htCaption, 0 );
end;
end;
zmienne globalne:
var
MD : Boolean;
P : TPoint;
i teraz w zdarzeniach:
procedure TImage.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
MD := True;
P := Point(X, Y);
end;
procedure TImage.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if MD then
begin
Left := Left + (X - P.X);
Top := Top + (Y - P.Y);
end;
end;
procedure TImage.FormMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
MD := False;
end;
Pomyłka !! powinno być tak:
zmienne globalne:
var
MD : Boolean;
P : TPoint;
i teraz w zdarzeniach:
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
MD := True;
P := Point(X, Y);
end;
procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if MD then
begin
Left := Left + (X - P.X);
Top := Top + (Y - P.Y);
end;
end;
procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
MD := False;
end;
sorki za błąd.
OnMouseMove obrazka
if Button = mbleft then
begin
ReleaseCapture;
Form1.Perform(WM_SysCommand, SC_SIZE+9 ,0);
end;
oczywiscie zamiast form1 dasz sobie nazwe formy czy co tam przenosisz :P</b>
OnMouseDown:
begin
if Button = mbLeft then
begin
ReleaseCapture;
SendMessage(Handle, WM_NCLButtonDown, htCaption, 0);
end;
end;
Moim zdaniem jest to najprostsze</ort> przenoszenie okna:
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
ReleaseCapture;
Perform(WM_SYSCOMMAND, $F012, 0);
end;
I jak jest jeszcze na Image jakiś Label to zrob tak:
Wpisz całe polecenie na nowo lub jeszcze prościej w Label ustaw w Events OnMouseDown na Image1MouseDown.
I już...
Pozdrawiam...
// Tag <code class="delphi"></code>
- Q
Ludzie juź mi pomógł Inter :) Ale skoro macie tyle pomysłów to fajnie :)