Wie auf einem TPanel ziehen
-
03-07-2019 - |
Frage
Ich brauche auf einem TPanel zu ziehen, idealerweise direkt so muss ich nicht eine andere Komponente auf ihm in den Weg mousevent-Ereignis immer Trapping (Ich möchte ein wenig „size-Griff“ ziehen). Wie soll ich über das tun dies gehen?
Lösung
Um wirklich richtig es, sollten Sie wahrscheinlich ein Nachkomme Klasse schreiben. Überschreiben der Paint
Methode auf die Leimung Griff zu ziehen, und überschreiben die MouseDown
, MouseUp
und MouseMove
Methoden Ändern der Größe Funktionalität der Steuerung hinzuzufügen.
Ich denke, das ist eine bessere Lösung als zu versuchen, auf einen TPanel
im Anwendungscode für ein paar Gründe zu ziehen:
- Die
Canvas
Eigenschaft wird inTPanel
geschützt, so dass Sie keinen Zugriff auf sie von außerhalb der Klasse. Sie können mit Typ-Casting um das zu bekommen, aber das ist Betrug. - Die „resizability“ klingt eher wie ein Merkmal der Platte als ein Merkmal der Anwendung, so legt es in Code für das Control Panel, nicht im Haupt Code Ihrer Anwendung.
Hier ist etwas für den Anfang:
type
TSizablePanel = class(TPanel)
private
FDragOrigin: TPoint;
FSizeRect: TRect;
protected
procedure Paint; override;
procedure MouseDown(Button: TMouseButton; Shift: TShiftState;
X, Y: Integer); override;
procedure MouseMove(Shift: TShiftState; X, Y: Integer); override;
procedure MouseUp(Button: TMouseButton; Shift: TShiftState;
X, Y: Integer); override;
end;
procedure TSizeablePanel.Paint;
begin
inherited;
// Draw a sizing grip on the Canvas property
// There's a size-grip glyph in the Marlett font,
// so try the Canvas.TextOut method in combination
// with the Canvas.Font property.
end;
procedure TSizeablePanel.MouseDown;
begin
if (Button = mbLeft) and (Shift = [])
and PtInRect(FSizeRect, Point(X, Y)) then begin
FDragOrigin := Point(X, Y);
// Need to capture mouse events even if the mouse
// leaves the control. See also: ReleaseCapture.
SetCapture(Handle);
end else inherited;
end;
Andere Tipps
Dies ist eine der vielen Möglichkeiten, wie viele Raize Komponenten kann Ihnen das Leben leichter machen. Ich gehe nur in Delphi, fallen auf einem TRzPanel, und geben Sie:
RzPanel1.Canvas.Rectangle ...
Ich bin sicher, es gibt auch andere Lösungen -. Aber ich habe nicht für sie mit Raize aussehen
(nur ein zufriedener Kunde seit etwa 10 Jahren ...)
EDIT: Da Ihr Ziel und Ihre Aussage, dass Sie Raize Komponenten bereits haben, sollte ich auch darauf hinweisen, dass TRzSizePanel Redimensionierung der Platte und nützliche Veranstaltungen wie OnCanResize Griffe (um festzustellen, ob Sie Ändern der Größe auf eine bestimmte neue Breite zulassen möchten oder Höhe).
Der einfachste Weg, es zu tun ist, um nur ein TImage auf dem Panel. Aber wenn Sie wirklich wollen nicht, das zu tun, geben Sie TCanvas in den Code-Editor, traf F1, und Spaß haben zu lernen, wie es funktioniert unter der Haube. (Sagen Sie nicht, ich hätte dich nicht gewarnt ...)
Wie Hinzufügen Größe Griffe zu Steuerelementen zur Laufzeit ändert Größe ist: http://delphi.about.com/library/weekly/aa110105a.htm
TAdvPanel: http://www.tmssoftware.com/site/advpanel.asp