Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   OnMouseDown and Parent Weiterleiten (https://www.delphipraxis.net/201161-onmousedown-parent-weiterleiten.html)

jacky213 27. Jun 2019 20:30

OnMouseDown and Parent Weiterleiten
 
Ich kann alle Panels mit einem Bestimmten Namen während der Laufzeit verschrieben solange eine Checkbox Checked ist. Nun habe ich aber auf einigen dieser Panels ein TImage mit dem Align auf alClient, sodass das TImage das komplette Panel bedeckt.

Wie schaffe ich es, dass ich den OnMouseDown Event des Panels auslöse wenn ich den OnMouseDown auf dem TImage auslöse?

DeddyH 27. Jun 2019 20:32

AW: OnMouseDown and Parent Weiterleiten
 
Einfach den Händler des Panels zuweisen?

jacky213 27. Jun 2019 20:33

AW: OnMouseDown and Parent Weiterleiten
 
Hättest du vielleicht ein kleines Beispiel zur Hand?

DeddyH 27. Jun 2019 20:35

AW: OnMouseDown and Parent Weiterleiten
 
Image anklicken, auf dem „Ereignisse“-Reiter OnMouseDown auswählen und da denselben Handler nehmen, den Du auch dem dazugehörigen Panel zugewiesen hast.

jacky213 27. Jun 2019 20:48

AW: OnMouseDown and Parent Weiterleiten
 
also ich habe im OnCreate der Form folgenden Code um auch später erzeugte Panels verschieben zu können

Delphi-Quellcode:
procedure TfrmMain.ControlMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
const
minWidth = 20;
minHeight = 20;
var
newPos: TPoint;
frmPoint : TPoint;
begin
if frmMain.inReposition then
begin
with TWinControl(Sender) do
begin
GetCursorPos(newPos);
if ssShift in Shift then
begin //resize
Screen.Cursor := crSizeNWSE;
frmPoint := ScreenToClient(Mouse.CursorPos);
if frmPoint.X > minWidth then
Width := frmPoint.X;
if frmPoint.Y > minHeight then
Height := frmPoint.Y;
end
else //move
begin
Screen.Cursor := crSize;
Left := Left - frmMain.oldPos.X + newPos.X;
Top := Top - frmMain.oldPos.Y + newPos.Y;
frmMain.oldPos := newPos;
end;
end;
end;
end; (*ControlMouseMove*)

procedure TfrmMain.ControlMouseUp(
Sender: TObject;
Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if frmMain.inReposition then
begin
Screen.Cursor := crDefault;
ReleaseCapture;
frmMain.inReposition := False;
end;
end; (*ControlMouseUp*)

procedure TfrmMain.ControlMouseDown(
Sender: TObject;
Button: TMouseButton;
Shift: TShiftState;
X, Y: Integer);
begin
if (MoveControls=true) AND
(Sender is TWinControl) then
   begin
   frmMain.inReposition:=True;
   SetCapture(TWinControl(Sender).Handle);
   GetCursorPos(frmMain.oldPos);
   end;
end;

Procedure CM;
var
i : integer;
begin
    for I:=0 to frmMain.ComponentCount-1 do
    if frmMain.Components[I] is TPanel then
    if Copy(TPanel(frmMain.Components[I]).Name,0,4)='PanCon' then
       begin
       TPanel(frmMain.Components[I]).OnMouseDown := frmMain.ControlMouseDown;
       TPanel(frmMain.Components[I]).OnMouseMove := frmMain.ControlMouseMove;
       TPanel(frmMain.Components[I]).OnMouseUp  := frmMain.ControlMouseUp;
       end;
end;
auf den Panels befinden sich auch die TImages

DeddyH 27. Jun 2019 20:57

AW: OnMouseDown and Parent Weiterleiten
 
Dann schau doch einfach nach, ob der Parent des jeweiligen Images ein TPanel ist und rufe in dem Fall dessen Handler auf, wobei Du den Sender-Parameter auf das Panel selbst setzt.

jacky213 27. Jun 2019 21:02

AW: OnMouseDown and Parent Weiterleiten
 
Hab das jetzt so versucht, aber es klappt nicht

Delphi-Quellcode:
    for I:=0 to frmMain.ComponentCount-1 do
    if frmMain.Components[I] is TImage then
    if Copy(TImage(frmMain.Components[I]).Name,0,5)='Image' then
       begin
       TImage(frmMain.Components[I]).OnMouseDown :=
       TPanel(TImage(frmMain.Components[I]).Parent).OnMouseDown;
       TImage(frmMain.Components[I]).OnMouseMove :=
       TPanel(TImage(frmMain.Components[I]).Parent).OnMouseMove;
       TImage(frmMain.Components[I]).OnMouseUp  :=
       TPanel(TImage(frmMain.Components[I]).Parent).OnMouseUp;
       end;
und habe geprüft ob der Parent also das Panel ist und das Stimmt.

DeddyH 27. Jun 2019 21:22

AW: OnMouseDown and Parent Weiterleiten
 
Dann steppe doch mal mit F7 durch, dabei wird Dir auffallen, dass ein TImage kein TWinControl ist. Du musst schon einen eigenen Händler für die Images schreiben, in der Art
Delphi-Quellcode:
if Sender is TImage then
  if Timage(Sender).Parent is TPanel then
    begin
       ThePanel := TPanel(TImage(Sender).Parent);
        if Assigned(ThePanel.OnMouseDown) then
          ThePanel.OnMouseDown(ThePanel,ShiftState, X, Y);
    end;

jacky213 27. Jun 2019 22:48

AW: OnMouseDown and Parent Weiterleiten
 
Vielen Dank DeddyH, das funktioniert sehr gut vielen Dank

jziersch 28. Jun 2019 08:45

AW: OnMouseDown and Parent Weiterleiten
 
Zitat:

Zitat von jacky213 (Beitrag 1435517)
Wie schaffe ich es, dass ich den OnMouseDown Event des Panels auslöse wenn ich den OnMouseDown auf dem TImage auslöse?

Wenn bei einem Control "Enabled" = false ist, wird es bei der Mausabfrage ignoriert. Vielleicht hilft dies ja bereits.


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:50 Uhr.
Seite 1 von 2  1 2      

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