Ein Element verkleinern, vergössern, verschieben

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
malabarista
Beiträge: 321
Registriert: Sa 11. Jun 2016, 12:16
OS, Lazarus, FPC: Linux Mint 18.1 L1.6.2-1 FPC 3.0.0
CPU-Target: 64Bit
Wohnort: Konstanz

Ein Element verkleinern, vergössern, verschieben

Beitrag von malabarista »

Ich suche ein grafisches Element, welches der Anwender (nicht ich) so vergrössern, verkleinern, verschieben kann, wie es in der IDE möglich ist.

Hintergrund: es sollen (in gewissen Grenzen) die Möbel eines Raumes dargestellt werden als Grundriss, nicht perspektivisch.
Runde Elemente sind nicht notwendig, rechteckig genügt.

Hat da jemand eine Idee, wie diese grafische Steuerung übernommen werden kann ?

Mathias
Beiträge: 6207
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Ein Element verkleinern, vergössern, verschieben

Beitrag von Mathias »

Meinst du das Rechteck mit den 8 schwarzen Punkten, welches die Komponente umrahmt ?

Diese modifizier-Komponente müsste eigentlich irgendwo in Lazarus zu finden sein. Man müsste nur wissen wie diese heisst.

In Thundbird ist sowas auch vorhanden, wen man dort Bilder einfügt.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Ein Element verkleinern, vergössern, verschieben

Beitrag von Socke »

Mathias hat geschrieben:Diese modifizier-Komponente müsste eigentlich irgendwo in Lazarus zu finden sein. Man müsste nur wissen wie diese heisst.

Lazarus verwendet keine eigene Komponente hierfür, das Vorgehen ist um einiges komplexer:
  • TComponent.ComponentState steuert den aktuellen Zustand der Komponente; csDesigning heißt, dass die Komponente durch den User verändert werden kann
  • TCustomForm.Designer enthält ein Objekt, dass für die Design-Time-Verarbeitung zuständig ist; dies ist z.B. das Zeichnen des Punktmusters, Copy und Paste der Komponenten etc.
  • Das Designer-Objekt (Klass TDesigner aus Lazarus\designer\designer.pp) wird von Lazarus erstellt und dem Form zugewiesen.
  • Beim Erstellen des Designer-Objekts muss ein TControlSelection-Objekt (Unit Lazarus\designer\controlselection.pp) mitgegeben werden; dieses enthält eine Liste der aktuell ausgewählten Objekte. Es ist auch für das Verschieben, Snapping, sowie das Zeichnen der "Grabbers" (die Punkte zum Vergrößern/Verkleinern der Komponenten) zuständig

Da Lazarus Open Source ist, könnte man auf die Idee kommen, die vorhandenen Units ebenfalls zu verwenden.
Jedoch gibt es dabei ein paar Fallstricke:
  • Die Lazarus IDE selbst ist unter der GNU GPL veröffentlicht; werden diese Units verwendet, muss auch das fertige Programm unter die GPL gestellt werden (bei den normalen LCL-Kompnenten ist dies nicht der Fall)
  • Es gibt einige Abhängigkeiten, so sind die Packages zur Ide-Integration (IDEIntf und DebuggerIntf) sowie SynEdit ebenfalls in das Projekt aufzunehmen (von der Lizenz kein Problem)
  • Verschiedene weitere Units und Include-Files der IDE werden benötigt
Hat man alles in sein Projekt integriert (Suchpfade entsprechend angepasst), kommt man mit dem naiven Ansatz, einfach einen Designer und eine TControlSelection zu erstellen, nicht weiter.

Code: Alles auswählen

procedure TForm1.FormCreate(Sender: TObject);
begin
  self.SetDesigning(True, True);
  self.Designer := TDesigner.Create(Self, TControlSelection.Create);
end;

Das Projekt lässt sich zwar kompilieren, jedoch läuft es direkt auf eine SIGSEGV-Ausnahme. Für mich ein Zeichen, dass irgendwo noch ein Objekt erwartet wird, das es noch erstellt werden müsste.

Einfacher dürfte es werden, eine eigene Designer-Klassen zu schreiben. Abgucken ist erlaubt - aber nicht Abschreiben!
--
Jetzt seid ihr an der Reihe :D
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

malabarista
Beiträge: 321
Registriert: Sa 11. Jun 2016, 12:16
OS, Lazarus, FPC: Linux Mint 18.1 L1.6.2-1 FPC 3.0.0
CPU-Target: 64Bit
Wohnort: Konstanz

Re: Ein Element verkleinern, vergössern, verschieben

Beitrag von malabarista »

Ich hatte befürchtet, dass es so ausgeht.

Mittlerweile habe ich in einem kleinen Testprogramm ein TPanel als Grundelement verwendet, und durch die geeigente Auswertung seiner verschiedenen OnMouse-Events scheint alles so zu funktionieren, wie ich es mir vorstelle.
Statt des "Snappers" verwende ich verschiedene Cursorformen, die anzeigen, was gerade gemacht werden kann.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6213
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Ein Element verkleinern, vergössern, verschieben

Beitrag von af0815 »

In der JVCL von Jediprojekt sind die Diagramming-Komponenten von Jim Cooper enthalten (seit 2002). Ich habe die in der Vergangenheit mit Lazarus mal zum laufen bekommen.

https://sourceforge.net/p/jvcl/code/HEAD/tree/trunk/jvcl/examples/JvDiagramShape/

Das sind auch 2 .doc files drinnen mit Erklärungen wie das ganze funktioniert.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Antworten