1 procedura, wiele komponentów.

0

Witam. Mam dla Was kolejne bojowe zadanie :>

zadanko:
Chce stworzyc dynamicznie komponent Image i moc go przesowac. Ilosc taka stworzonych komponentow jest nieograniczona. Robie to tak:

procedure TForm1.Button4Click(Sender: TObject);
var
  Panel: TPanel;
begin
  stanowiska.dodaj;

{nie mozna przesowas samego komponentu Timage wiec trzeba go wstawic na komponent TPanel ktory daje nam taka mozliwosc}

{najpierw trzeb astowrzyc komponent Panel:TPanel. nastepnie jako dziecko tworzymy Timage}

  Panel:=TPanel.Create(self);    with Panel  do
    begin
      Width:=Image1.Width;
      Height:=Image1.Height;
      Left:=10;
      Top:=10;
      Parent:=self;
      Visible:=True;
    end;

  with TImage.Create(Panel) do
    begin                       //komponent bedzie mozna przemieszczac.
      Width:=Image1.Width;
      Height:=Image1.Height;
      Left:=0;
      Top:=0;
      Visible:=True;
      Parent:=Panel;
      OnMouseDown:=MyMouseDown;
      Picture:=Image1.Picture;

    end;

end;

Oczywiscie wyze mam ladnie zedefiniowana procedure zdarzenia:

procedure TForm1.MyMouseDown(Sender:TObject;Button:TMouseButton;Shift:TShiftState;X,Y:Integer);
begin
  ReleaseCapture;
  SendMessage(Panel1.Handle, WM_SYSCOMMAND, $F012, 0);
end;

Problem polega na tym ze kazdy panel ma byc presuwany przez przytrzymanie nad nim myszki. Mam z gory zdefioniowana procedure zdarzenia OnMouseDown i nie wiem jak zrobic by po przytrzymaniu myszki nad dynamicznie stworzonym komponentem Panel1 przesuwal sie Panel1, a gdy przytrzymamy mysz nad panelem Panel2 to przesunie sie wlasnie on.

Myslalem by zrobic cos w stylu:

procedure TForm1.MyMouseDown(Sender:TObject; Button:TMouseButton; Shift:TShiftState; X,Y:Integer; Panel:Tpanel);
begin
  ReleaseCapture;
  SendMessage(Panel.Handle, WM_SYSCOMMAND, $F012, 0);
end;

ale niestety nie da sie tak tego zrobic.

Macie moze jakies pomysły ??

0
noname napisał(a)
procedure TForm1.MyMouseDown(Sender:TObject; Button:TMouseButton; Shift:TShiftState; X,Y:Integer; Panel:Tpanel);
begin
  ReleaseCapture;
  SendMessage((Sender as TPanel).Handle, WM_SYSCOMMAND, $F012, 0);
end;

A tak sie da?

0

Hi noname!

Image daje sie przesuwac po formularzu bez paneli. A robi sie to mniej wiecej tak:

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure FormDragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean);
    procedure ImageMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    procedure FormDragDrop(Sender, Source: TObject; X, Y: Integer);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
  Image: TImage;

implementation

{$R *.dfm}

procedure TForm1.FormDragOver(Sender, Source: TObject; X, Y: Integer;
  State: TDragState; var Accept: Boolean);
begin
  Accept := (Source is TImage);
end;

procedure TForm1.ImageMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  (Sender as TImage).BeginDrag(True);
end;

procedure TForm1.FormDragDrop(Sender, Source: TObject; X, Y: Integer);
begin
if Source is TImage then
  begin
    TImage(Source).Left := X;
    TImage(Source).Top  := Y;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Image := TImage.Create(self);
  Image.Parent := Form1;
  Image.Top := 200;
  Image.Left := 200;
  Image.Picture.LoadFromFile('e:\tmp\tmp\bild1.bmp');
  Image.AutoSize := true;
  Image.OnMouseDown := ImageMouseDown;
end;

end.

Pozdrawiam
Markus
;)

0

Yo. Po pierwsze: WIELKIE dzieki MarkusB za naprowadzenie mnie na wlasciwa droge. Shrek niestety tak sienie da :P

MarkusB brakowali mi wlasnie takiego cudenka. W sumie to o tym apomnialem :p

(Sender as TImage).

Twoje rozwiazanie nie jest zle, ale podnoszenie i upuszczanie komponentu na forme jest dla mnie troszke niewygodne. Ja zrobilem to tak (oczywisice uzywajac panelu jako rodzica):

Najpierw definiujemy procedure obslugu zdarzenia:

procedure TForm1.MyMouseDown(Sender:TObject;Button:TMouseButton;Shift:TShiftState;X,Y:Integer);
begin
  ReleaseCapture;
  SendMessage((Sender as Timage).Parent.Handle, WM_SYSCOMMAND, $F012, 0);
end;
end;

zakladamy ze komunikaty beda przychodzili z komponentu Timage, co jest oczywiscie prawda, bo to za niego bedziemy "lapac"

To jest wlasnie najwazniejsza zmieniona czesc programu. Reszta jest dokladnie taka sama jak w powyzszym moim poscie, czyli:

procedure TForm1.Button4Click(Sender: TObject);
var
  Panel: TPanel;
begin
  stanowiska.dodaj; {dodajemy kolejne stanowisko}
{nie mozna przesuwac samego komponentu Timage wiec trzeba go wstawic na komponent TPanel ktory daje nam taka mozliwosc}
{najpierw trzeba stworzyc komponent Panel:TPanel. Nastepnie jako dziecko tworzymy Timage i gotowe}

  Panel:=TPanel.Create(self);
  with Panel  do
    begin
      Width:=Image1.Width;
      Height:=Image1.Height;
      Left:=10;
      Top:=10;
      Parent:=self;
      Visible:=True;
    end;

  with TImage.Create(Panel) do
    begin                       //komponent bedzie mozna przemieszczac.
      Width:=Image1.Width;
      Height:=Image1.Height;
      Left:=0;
      Top:=0;
      Visible:=True;
      Parent:=Panel;
      OnMouseDown:=MyMouseDown;
      Picture:=Image1.Picture; //mozna ladowac z pliku, lub z zasobow
    end;
end;

Jeszcze raz dzieki za pomoc [browar]

0
noname napisał(a)

Shrek niestety tak sienie da :P

Dalej upieram sie, ze sie da :) Po prostu nie wiedzialem, za co bedziesz lapal - wiec dalem RZUTOWANIE panelu, zamiast obrazka, ale wlasnie o rzutowanie mi chodzilo :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1