Autor Beitrag
spacemanspiff
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 53
Erhaltene Danke: 1



BeitragVerfasst: Do 22.11.12 11:48 
Hallo zusammen...

ich habe schon ein wenig gegoogelt zum Thema "Zeichnen in Delphi" aber ich habe nicht das Richtige gefunden, bzw. sind die normalen Zeichenfunktionen glaube ich nicht das Richtige für mich.

Ich muss den Zustand eines Automaten beschreiben bzw. zeichnen. Es geht um einen Gasflussplan mit knapp 120 Ventilen. Diesen möchte ich gerne wie ein Puzzle aus Bildern zusammensetzen. Ein Bild ist dann entweder ein Ventil (an, aus, horizontal, vertikal) oder ein Stück Leitung (Gerade, Kurve, Kreuzung). Allerdings weiß ich nicht, auf was für einer Oberfläche man so etwas unterbringen könnte. Ich möchte eigentlich nur ungern mehrere hundert TImages verwenden, sondern lieber dynamisch bei FormCreate oder so das Bild zeichnen.

Während des Laufs muss ich dann auf alle Positionen (Bilder) zugreifen können, um z.B. das Bild eines geschlossenen Ventils gegen das Bild eines geöffneten Ventils tauschen zu können. Außerdem müssen manche Bereiche aktiv sein, da ein Klick auf ein bestimmtes Ventil dessen Zustand (an/aus) ändert.

Fällt Euch da ein Ansatz ein, mit dem dies umzusetzen wäre?

Ich dachte irgendwie an so etwas wie ein Grid, in das ich die Bilder lege, aber ich kenne mich mit den ganzen Delphi-Komponenten nicht gut genug aus. (Ich habe die komplette LMD-Suite ebenfalls zur Verfügung)

Hoffe, ihr könnt mir auf die Sprünge helfen.


Vielen Dank und beste Grüße,
Thomas
Nersgatt
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1581
Erhaltene Danke: 279


Delphi 10 Seattle Prof.
BeitragVerfasst: Do 22.11.12 11:55 
Da Du nicht nur zeichnen musst, sondern die Komponenten (Ventile, Leitungen, etc.) noch Funktionen ausführen müssen, würde ich persönlich für jedes Teil ein Komponente schreiben. Also ein TVentil mit entsprechenden Properties ( z.B. Ventil.Offen := true -> Komponente zeichnet sich in Form eines Offenen Ventils selbst neu). Sieht zwar auf den ersten Blick nach mehr Aufwand aus, aber dadurch hast Du den Code der Komponenten sauber logisch getrennt. So wirst Du nicht so schnell den Überblick verlieren.

_________________
Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
spacemanspiff Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 53
Erhaltene Danke: 1



BeitragVerfasst: Do 22.11.12 12:12 
Hi,

danke für den Beitrag.

An eigene Komponenten habe ich auch schon gedacht. Allerdings stünde ich dann vor einem ähnlichen Problem wie mit TImages. Ich muss hunderte Objekte allein für die Visualisierung verwalten (vielleicht geht es aber auch eh nicht anders)
mandras
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 429
Erhaltene Danke: 107

Win 10
Delphi 6 Prof, Delphi 10.4 Prof
BeitragVerfasst: Do 22.11.12 12:37 
Willst Du nur ein vorh. System visualisieren, evtl. für Dokumentation?
Da gäbe es entspr. Programm, ich verwende für ähnliches yEditor (www.yworks.com)

Wenn Du es mit Delphi selber machen willst würde ich folgenden Ansatz wählen anhand der von Dir gegebenen Daten:

Das System besteht aus einem "Schachbrett" von x*y Kacheln, jede hat eine best. Größe (zB dx*dy Pixel)
Jedes Feld des Schachbretts hat Eigenschaften, zB (leer, Ventil, Leitung) mit weiteren Eigenschaften (Ventilrichtung, Ventilaktiv bzw. LeitungNO, LeitungNS, etc)
Das Schachbrett ist also ein einfaches (evtl dynamsiches) Array.

Zum Zeichnen würde ich nun eine Paintbox verwenden. Da jedes Feld eine feste Größe hat ist auch die Reaktion auf Mausaktionen recht leicht zu realisieren.
spacemanspiff Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 53
Erhaltene Danke: 1



BeitragVerfasst: Do 22.11.12 13:07 
Hi und danke für den Beitrag,

es dient nicht nur der Dokumentation, dann würde ich es mir nicht so schwer machen :-)

Auf die Idee mit dem Schachbrett bin ich auch schon gekommen, aber das war in dem Zug, als ich noch überlegte eigene Komponenten zu schreiben. Aktuell muss erst mal ne recht flotte Umsetzung her, damit der Kunde was sieht. Eine intelligente Lösung kann dann nachher produziert werden.

Damit ich voran komme fummle ich das Aussehem grad per TImages zurecht :-/
bummi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1248
Erhaltene Danke: 187

XP - Server 2008R2
D2 - Delphi XE
BeitragVerfasst: Do 22.11.12 13:45 
Bei dem Demo im Anhang (tut etwas anderes als bei Dir, das Prinzip ist das gleiche)
Ist nur eine von TGraphicControl abgeleitete Komponenete im Einsatz.
Diese wird an eine Datasource angehängt.
"Gemalt" wird mit GDI+ alle Aktionen werden direkt über die Komponente gehandelt.
Einloggen, um Attachments anzusehen!
_________________
Das Problem liegt üblicherweise zwischen den Ohren H₂♂
DRY DRY KISS
spacemanspiff Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 53
Erhaltene Danke: 1



BeitragVerfasst: Do 22.11.12 16:10 
Vielen Dank für Deinen Beitrag, bummi :-)

Das ist aber schon zu viel des Guten und überlastet mich jetzt. Die Zeit fehlt mir momentan, mir das im Detail anzusehen. Vielleicht mache ich das mal, wenn der Kunde die Oberfläche absegenet und ein wenig mehr Zeit einräumt :-)

Ich habe mal eine PNG angehangen, die meinen Gasflussplan zeigt. Diesen habe ich jetzt mit mehreren hundert 24x24 px großen TImages zusammengesetzt. Das Dunkelrot dient nur dem Kontrast, die Buttons waren nur ein Test.

Nach Start des Systems wird eine Dichtigkeitsprüfung für jedes Ventil vorgenommen (mit einem nicht eingezeichneten Druckmesser). Ist das Ventil dicht, wird der orangene Punkt grün, ansonsten rot und das System lässt sich nicht starten.

Sind alle Punkte grün (System geht in Leerlauf) kann ich in den manuellen Modus gehen und Ventile einzeln schalten, indem ich darauf klicke (Bild für Ventil ändert sich dann).

Damit habt ihr wohl jetzt auch eine bessere Vorstellung von dem, was die Oberfläche und ein Teil der Logik können muss.

Ich mache jetzt erst mal mit den TImages weiter, bin aber nach wie vor an einer intelligenteren Lösung interessiert :-)


Vielen Dank bis hierher und beste Grüße,
Thomas
Einloggen, um Attachments anzusehen!
bummi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1248
Erhaltene Danke: 187

XP - Server 2008R2
D2 - Delphi XE
BeitragVerfasst: Do 22.11.12 19:43 
Dann nimm, als Vorschlag eine Paintbox und lasse dort die entsprechenden Graphics malen, statt einer Ansammlung von Images.

_________________
Das Problem liegt üblicherweise zwischen den Ohren H₂♂
DRY DRY KISS
spacemanspiff Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 53
Erhaltene Danke: 1



BeitragVerfasst: Fr 23.11.12 08:30 
Moin bummi,

danke für den Hinweis. :-)

Würdest Du mir bitte noch erläutern, warum Du diese Herangehensweise bevorzugst? Welchen Vorteil hat das Deiner Ansicht nach? (Entschuldige, aber ich komme aus einem C-Umfeld und habe mit Delphi und GUI-Entwicklung immer nur am Rande zu tun, daher ist mir das nicht klar)

Beste Grüße,
Thomas
bummi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1248
Erhaltene Danke: 187

XP - Server 2008R2
D2 - Delphi XE
BeitragVerfasst: Fr 23.11.12 09:58 
Dass Du die Darstellung von der Logik trennst. Wenn Du neue Elemente brauchst, fügst Du diese einfach einer Objektliste hinzu.
Das ganze Zoomen, drehen, drucken, exportieren(BMP,SVG,Metafile) überlässt Du einer Containerklasse, die das Canvas manipulieren kann oder eben auch Exportformate ausgeben kann.

_________________
Das Problem liegt üblicherweise zwischen den Ohren H₂♂
DRY DRY KISS
Sinspin
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1321
Erhaltene Danke: 117

Win 10
RIO, CE, Lazarus
BeitragVerfasst: Sa 24.11.12 07:54 
Wieviele verschiedene Flusspläne gibt es denn? Bei solch einem Problem hat man doch eher die Anforderung das es übersichtlich sein muss anstatt das man irgendwelche total genialen und irre kommplexen Lösungen baut für die ein haufen Zeit drauf geht ohne der eigentlichen Lösung näher gekommen zu sein. Wenn der Flussplan sich "nie wieder" ändert und nur wenige unterschiedliche in einer Anwedung vorhanden sind.
Worauf ich hinaus will, den statischen Teil, also das was sich nie ändert einfach in einem Malprogramm zeichnen und als Bitmap/Gif ins Programm einbinden. Die veränderlichen Teile kannst du dann durch überzeichnen oder Shapes darstellen. Wobei ich für die runden Signalfelder eindeutig Shapes bevorzuge. Habe ich schon x-mal in verschieden Mensch Maschiene Interfaces so gemacht und bisher hat sich noch keiner beschwehrt das ihm die Shapes nicht gefallen.
Sind die Shapes einmmal alle passend positioniert (Bild muss also zur Designzeit zumindest testweise schon geladen sein) kann man die Shapes einzeln ansprechen und deren Farbe und Form ändern wenn man die entsprechenden Signale von der Hardware erhält.

_________________
Wir zerstören die Natur und Wälder der Erde. Wir töten wilde Tiere für Trophäen. Wir produzieren Lebewesen als Massenware um sie nach wenigen Monaten zu töten. Warum sollte unser aller Mutter, die Natur, nicht die gleichen Rechte haben?
Neumann
Hält's aus hier
Beiträge: 3

WIN XP, Windows 7
Delphi XE
BeitragVerfasst: Sa 24.11.12 13:00 
Hallo,

denke mal ich hätte da etwas, was ich eigentlich für unser Kassenprogramm entwickelt habe um frei konfigurierbare Oberflächen für das Programm zu bauen.

Die Idee, es für die Prozessvisualisierung einzusetzen hatte ich auch schon, allerdings fehlt mir da die Aufgabe. Habe mal ein Demo des Designers mit einigen Beispielen angehängt.

Die Objekte die man in dem Designer sieht, kann man nach Doppelklick auf das jeweilige Objekt mit einer Art Objektinspektor bearbeiten. Damit kann man dann z.B. eine ID vergeben, Einen Basistyp und Aktion mit Numerischem oder Textparameter.

Zur Laufzeit bekommt man Events (Objectclick, ObjectDoubleClick usw) von den Objekten und kann dann je nach Typ, Aktion, ID usw etwas machen. Alle Eigenschaften der Objekte kann man dann auch zur Laufzeit des eigentlichen Programmes setzen (etwa ein anderes Bild anzeigen usw.).

Falls Interesse Vorhanden, bitte eine Nachricht an mich (rs att es-kassen dot de).

Gruß

Ralf
Einloggen, um Attachments anzusehen!