Beispiel:
Alles zur Laufzeit und auf Userrequest:
Ich erzeuge 2 Label und eine Linie auf dem Canvas. Dies kann der Benutzer frei positionieren. Wenn der Benutzer das eine Ende der Linie auf einer bestimmten Stelle am Label (Connectionpoint) positioniert, so soll die Linie dort 'kleben' = 'snap' bleiben.
So wie in den Grafikprogrammen.
Hat schon wer mit dem Erfahrung ? Bis jetzt habe ich zur Laufzeit alles 'statisch' gemacht, würde da aber meinen Horizont gerne erweitern.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
Ich hätte da eine idee nur mir ist noch nicht klar was du bewegen kansnt: die line oder die komponenten ,oder beides ?
Lade mal ein bild hoch wie du es dir vorgestellt hast !
@Pluto: Alles ist beweglich. Nix is fix. Stell dir vor, du zeichnest eine FlowChart. Da positionierst zu eine Aktion und eine Verzeigung auf dem Canvas, dann verbindest du die beiden mit einem Pfeil. Das ist das ganze was ich will, ABER zur Laufzeit.
Dank eines Tips von obde, habe ich einen Anfang gefunden. In der jvcl gibt es eine Demo mit genau diesem Problemkreis. Und zwar unter 'jvcl\examples\JvDiagramShape\UseCaseEditor' befindet sich eine Demo zu dieser Aufgabenstellung. Das ganze basiert auf Informationen und Code von Jim Cooper (Artikel: Diagramming with Delphi Part 1 & 2).
Die Jedi ist in jedem Fall mal einen Blick wert. Der Nachteil, englisch ist dort ein muß (Was für mich kein Thema ist).
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
Hallo Andi,
ich hab mir mal ein paar Gedanken zu deinen Snap-Objekten gemacht.
Man könnte sich einige Objekte erstellen, die mit Snap-Punkten ausgerüstet werden können. Hier mal eine kleine Beschreibung meiner Idee.
Snappoint
Diese Snappoint kann sich durch drücken der linken Maustaste verschieben lassen. Er übergibt seine Bewegungen an einen Koordinator, der eine Zeichenfläche oder besser ein nicht sichtbare Komponente sein kann. Dieser Koordinator übernimmt die Verwaltung der Punkte untereinander. Er kennt die Position der Punkte und verwaltet eine Liste der eingerasteten Punkte. Der Snappoint selbst kennt noch Eigenschaften wie Fix, d.H. er ist nicht mit der Maus verschiebbar. Diese Eigenschaft wird benötigt wenn der Punkt auf einem Objekt, wie ein Rahmen, sitzt.
Gummibandlinie
Diese hat zwei Snappoints, an den Enden, die sich voneinander unabhängig bewegen lassen. Die Bewegung der Punkte werden wieder an den Koordinator und an das Linienobjekt zurückgegeben. Über das Event OnMove (vom Snappoint) kann man die Gummibandfunktion aktivieren und mit OnMouseUp das Neuzeichnen der Linie anstoßen.
Rahmenobjekt
Diese Objekt kann mehrere Snappoints haben, entweder fest eingebaut oder in einer Liste verwaltet. Verwendet man eine Liste, kann dem Objekt ein x-beliebiger Punkt zugeordnet werden. Die Punkte müssen aber die Eigenschaft Fix haben, da sie nur mit dem Objekt verschoben werden dürfen und nicht allein.
Das Rahmenobjekt könnte zusätzlich noch ganz normale Objekte, wie z.B. TLabel oder TEdit, aufnehmen. Hierbei ist es wichtig die Reihenfolge der Anordnung zu beachten. Das Labelobjekt muss unterhalb des Rahmen liegen, damit es sich durch einen einfachen Klick verschieben lasst. Ein Doppelklick könnte dann die Bearbeitung des Labels aufrufen, z.B. Text Eingabe.
Diese Komponenten sind zwar etwas aufwendiger, aber dafür universell einsetzbar.
Hallo obde,
einig mit dem Snappoint, Gummiband und Rahmenobjekt. Es ist für mich ein bischen zu früh, zuerst muß ich die Idee von Jim Cooper noch besser verstehen und vor allen das gewünschte Verhalten.
Vor allen der Snappoint kann ja singular oder plural sein. Wobei ich eher zu singular tendiere, da es einfacher zu implementieren ist und ich sowieso eine linieare Struktur damit abbilden will (Linien bzw. Kreisförmig).
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
Ich dachte ich hätte dich verstanden ! aber anscheiend doch noch nicht richtig !
Also möchtes du sowas wie in meinem Paint2 bauen ?
du hast objekte wenn du sie anklickst kommt ein Ramen und dieser Ramen hat 8 Punkte um in zu vergrößern oder zu verkleinern ! meinst du sowas ?
Klares Jein, nur hänge ich ein paar Gummibänder zwischen den Objekten auf. Die haben dann auch spezielle Eigenschaften, wie der Transport von Informationen von einem Objekt zu einem anderen.
Die Grafik ist eigentlich nur was für die Präsentation, die Objekte repräsentieren virtuelle Maschinen, die Verbindungen sind der Materialfluß. Das ganze ist dann eine Simulation einer Fertigung und somit später die Spielwiese für Betriebsdatenerfassung.
Zumindest theoretisch
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
Ach so.... dann machtes du mehrer objekte miteinander über eine(oder mehrer?) Linen verbinden ? und wenn ich eines der Objkete bewege soll sich die Line mit bewegen ...... und wenn ich auf die line klicke sollen sich die zwei Objekte mit bewegen.....
n der jvcl gibt es eine Demo mit genau diesem Problemkreis. Und zwar unter 'jvcl\examples\JvDiagramShape\UseCaseEditor' befindet sich eine Demo zu dieser Aufgabenstellung.
Wie ich schon sagte, dort ist eine Demo. Vielleicht habe ich demnächst auch eine fertig, zumindest s&d (engl. q&d).
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).