Hallo Liebe Pascal/Lazarus Gemeinde,
für ein größeres Projekt möchte ich Rechtecke (z.B. mit TShapes) erzeugen und diese sollen sich zur Laufzeit auch
verändern lassen. Somit soll Größe und Position sich zur Desingntime mit der Maus anpassen lassen.
Prima wäre es auch, wenn 8 "Handles" umgesetzt wären, wie es auch vorbildlich im Lazarus Designeditor umgesetzt ist.
Ich habe mich jetzt schon mehrere Tage durchs Internet "gequält", aber kein entsprechendes Codesnipplet gefunden,
das die gewünschte Funktion für das TShape umsetzt. An den Sourcecode von Lazarus traue ich mich (noch) nicht ran:-)
Ist das so ein Hexenwerk?
Derzeit entwickle ich unter Debian 9 - 64Bit (stretch) und Lazarus 1.8.4.
Das Beispiel im Anhang folgt den Ausführungen von Zarko Gajic
https://www.thoughtco.com/how-to-move-and-resize-controls-at-run-time-4092542
Ein Button lässt sich damit schon mal auf dem Canvas schön verschieben (wenn die entsprechende Check Box aktiviert ist).
Beim TShape klappt das leider nicht (wieso?) und Vergrössern und Verkleinern des Shapes ist leider auch noch nicht mit meinen Kenntnissen möglich.
Vielen Dank für jede Rückmeldung und noch einen schönen Abend bei hoffentlich angenehmen (Innen)Temperaturen < 22°C:-)
Gruß
Arne
[gelöst] TShape in Runtime in Größe u. Position verändern
-
- Lazarusforum e. V.
- Beiträge: 106
- Registriert: Mi 29. Jun 2011, 22:36
- OS, Lazarus, FPC: Lazarus 2.2.4 Windows 10 64Bit / Lazarus 2.0.12 Debian 11.7 „Bullseye" 64Bit
- CPU-Target: 64Bit
- Wohnort: Leonberg
[gelöst] TShape in Runtime in Größe u. Position verändern
- Dateianhänge
-
- SelectObjectsMainForm.zip
- (127.04 KiB) 107-mal heruntergeladen
Zuletzt geändert von Helios am Mi 26. Jun 2019, 15:18, insgesamt 1-mal geändert.
Re: TShape zur Runtime in Größe u. Position veränderbar umse
Helios hat geschrieben:Beim TShape klappt das leider nicht (wieso?)
Weil dein Code prüft, ob das zu verschiebende Control von TWinControl abstammt. TShape ist aber ein TGraphicControl. Nimm einfach den gemeinsamen Vorfahren von TShape und TButton, TControl. Also: Ändere in ControlMouseDown das "Sender is TWinControl" in "Sender is TControl" und in ControlMouseMove das "with TWinControl(Sender)" in "TControl(Sender)" um und entferne das unnötige "SetCapture(TWinControl(Sender).Handle)"; dann funktioniert alles. Wobei das Updaten von oldPos noch falsch platziert war.
Außerdem kannst du dir die Aufrufe von GetCursorPos sparen, denn die MouseDown / MouseMove-Events erhalten die Mauskoordinaten als Parameter, und zwar bezogen auf das Control.
Code: Alles auswählen
procedure TForm1.ControlMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
if (CheckBox1.Checked) AND (Sender is TControl) then
begin
inReposition:=True;
oldPos := Point(X, Y);
end;
end; (*ControlMouseDown*)
procedure TForm1.ControlMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
const
minWidth = 20;
minHeight = 20;
var
newPos: TPoint;
frmPoint : TPoint;
begin
if inReposition then
begin
with TControl(Sender) do
begin
newPos := Point(X, Y);
if ssShift in Shift then
begin //resize
Screen.Cursor := crSizeNWSE;
frmPoint := Point(Width + X - oldPos.X, Height + Y - oldPos.Y);
if frmPoint.X > minWidth then
Width := frmPoint.X;
if frmPoint.Y > minHeight then
Height := frmPoint.Y;
oldPos := newPos;
end
else //move
begin
Screen.Cursor := crSize;
Left := Left - oldPos.X + newPos.X;
Top := Top - oldPos.Y + newPos.Y;
end;
end;
end;
end; (*ControlMouseMove*)
-
- Lazarusforum e. V.
- Beiträge: 106
- Registriert: Mi 29. Jun 2011, 22:36
- OS, Lazarus, FPC: Lazarus 2.2.4 Windows 10 64Bit / Lazarus 2.0.12 Debian 11.7 „Bullseye" 64Bit
- CPU-Target: 64Bit
- Wohnort: Leonberg
Re: TShape zur Runtime in Größe u. Position veränderbar umse
Hallo wp_xyz ,
vielen Dank für Deine Rückmeldung. Mit Deinen vorgeschlagenen Änderungen funktioniert das Verschieben wunderbar und ich habe wieder mehr von der OOP verstanden.
Leider funktioniert das Resizing noch nicht (vielleicht auch ein Problem mit meinem Linux auf meinem derzeitigen Rechner).
Hast Du da noch einen Tipp für mich? Evtl. auch noch zu den 8 "Handles" um das Ganze noch etwas mehr "Lazarus Designtime" zu bekommen?
Vielen Dank und Gruß
Arne
vielen Dank für Deine Rückmeldung. Mit Deinen vorgeschlagenen Änderungen funktioniert das Verschieben wunderbar und ich habe wieder mehr von der OOP verstanden.
Leider funktioniert das Resizing noch nicht (vielleicht auch ein Problem mit meinem Linux auf meinem derzeitigen Rechner).
Hast Du da noch einen Tipp für mich? Evtl. auch noch zu den 8 "Handles" um das Ganze noch etwas mehr "Lazarus Designtime" zu bekommen?
Vielen Dank und Gruß
Arne
-
- Lazarusforum e. V.
- Beiträge: 106
- Registriert: Mi 29. Jun 2011, 22:36
- OS, Lazarus, FPC: Lazarus 2.2.4 Windows 10 64Bit / Lazarus 2.0.12 Debian 11.7 „Bullseye" 64Bit
- CPU-Target: 64Bit
- Wohnort: Leonberg
Re: TShape zur Runtime in Größe u. Position veränderbar umse
Nachtrag:
Auch das Resizing funktioniert! Sorry, das habe ich eben erst beim ausgiebigen Testen gesehen.
Wenn ich das mit den Handles noch hinbekomme stelle ich das Ergebnis zur Prüfung/Vorlage hier nochmal rein.
So wie es jetzt ist, passt das aber schon mal für das Projekt.
Vielen Dank nochmal und Gruß
Arne
Auch das Resizing funktioniert! Sorry, das habe ich eben erst beim ausgiebigen Testen gesehen.
Wenn ich das mit den Handles noch hinbekomme stelle ich das Ergebnis zur Prüfung/Vorlage hier nochmal rein.
So wie es jetzt ist, passt das aber schon mal für das Projekt.
Vielen Dank nochmal und Gruß
Arne
Re: TShape zur Runtime in Größe u. Position veränderbar umse
Ich denke, es ist nicht trivial, die Griffe zu zeichnen, da sie über die Grenzen der Shape-Komponente hinausreichen. Sieh dir stattdessen mal TJvMovableBevel an (https://sourceforge.net/p/lazarus-ccr/s ... ebevel.pas), dort ändert sich der Mauszeiger schon beim drüberfahren (und nicht erst wie bei dir beim Klicken), so dass die Bedienung auch ohne Handles sehr eingängig ist.
Ansonsten kannst du dir auch die RunTime-Komponenten von JVCL ansehen, dort wird eine Design-Oberfläche ähnlich dem Lazarus-Formular-Designer implementiert. Ist vielleicht Overkill, aber vielleicht findest du eine Idee wie die Griff zu machen sind. JVCL installierst du am einfachsten mit dem Online-Package-Manager, es reichen die Packages JvCoreLazR, JvCoreLazD, JvRuntimeDesignR und JvRuntimeDesignD. Allerdings weiß ich nicht, ob da das Beispielprogramm mitkommt, zur Not kannst du dir die paar Dateien einzeln von https://sourceforge.net/p/lazarus-ccr/s ... vDesigner/ herunterladen.
Ansonsten kannst du dir auch die RunTime-Komponenten von JVCL ansehen, dort wird eine Design-Oberfläche ähnlich dem Lazarus-Formular-Designer implementiert. Ist vielleicht Overkill, aber vielleicht findest du eine Idee wie die Griff zu machen sind. JVCL installierst du am einfachsten mit dem Online-Package-Manager, es reichen die Packages JvCoreLazR, JvCoreLazD, JvRuntimeDesignR und JvRuntimeDesignD. Allerdings weiß ich nicht, ob da das Beispielprogramm mitkommt, zur Not kannst du dir die paar Dateien einzeln von https://sourceforge.net/p/lazarus-ccr/s ... vDesigner/ herunterladen.