[gelöst] TShape in Runtime in Größe u. Position verändern

Rund um die LCL und andere Komponenten
Antworten
Helios
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

Beitrag von Helios »

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
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.

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: TShape zur Runtime in Größe u. Position veränderbar umse

Beitrag von wp_xyz »

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*)

Helios
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

Beitrag von Helios »

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

Helios
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

Beitrag von Helios »

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

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: TShape zur Runtime in Größe u. Position veränderbar umse

Beitrag von wp_xyz »

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.

Antworten