Autor Beitrag
Andy77
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 17



BeitragVerfasst: Fr 01.09.06 07:54 
Ich möchte eine Eingabemaske für ein thermodynamisches System erstellen, also Behälter, Ventil, Rohr usw.

Meine Idee ist, dafür Buttons abzuwandelen und ihnen ein neues Aussehen zu verpassen.
Für die Verknüpfungen zwischen den "Buttons" reicht es dann aber nicht, nur ein Bitmap einzufügen. Wie kann ich das denn grafisch lösen ? Hat jemand eine Idee ?

Gruß,
Andreas
oldmax
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 380


D3 Prof, D4 Prof
BeitragVerfasst: Fr 01.09.06 08:35 
Hi
Ich hab mich mit einem ähnlichen Thema befaßt, und ich könnt mir vorstellen, ein Button zu nehmen, in welchem Bitmaps abgelegt sein können, wie BitBtn oder Speedbutton. Diese aneinandergereiht und ohne Text nur mit Bitmap-Symbol versehen. Etwas ähnliches benutze ich z. B. für eine SPS, ein Programm, um mit Logiksymbolen eine Steuerung per PC zu realisieren. Brauch ich für meine Eisenbahn und ähnliche Anwendung. Interessant wird's, wenn du zur Laufzeit deine Elemente einfügen willst und diese dann auch noch mit einer Funktionalität versiehst. Anzeigen, wenn deine Pumpen nicht nur die Rohre fluten, :shock: da kommt so richtig Freude auf. Elektrik bleibt wenigstens auf den Linien.... :wink:
Viel Spass, Gruß oldmax

_________________
Zier dich nich so, ich krieg dich schon....
Andy77 Threadstarter
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 17



BeitragVerfasst: So 03.09.06 22:35 
Die Grafik mit BitBtn einfügen habe ich ja schon hingekriegt. Funktioniert soweit auch ohne Prob.

Ich würde den Dingern nur gerne Eigenschaften verpassen, so daß die Verbindungsleitungen korrekt gezeichnet werden.
Zur Zeit hab' ich das so gelöst, daß ich die Verbindungen einfach auf der Canvas von der überlagertern Form male. Aber je mehr verschiedene Buttons ich habe, desto mehr Sonderfälle gibt es - und der Code ist jetzt schon unübersichtlich. Sollte eigentlich auch nur eine provisorische Lösung sein...
oldmax
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 380


D3 Prof, D4 Prof
BeitragVerfasst: Mo 04.09.06 07:15 
Hi Andy77
Du solltest folgendes versuchen:
Setze linke Seite eine Bibliothek, aus welcher du dir Elemente ziehen kannst. Damit diese wissen wohin, mußt du dir gültige xy-Koordinaten setzen.
Ich hab’s über onMouseDown gelöst. Nun, vielleicht nicht so effektiv und schnell wie ein Record, aber einfach.

ausblenden Delphi-Quelltext
1:
Var MousePoint : String;					

Initialisieren mit

ausblenden Delphi-Quelltext
1:
Mousepoint:=‘x‘  //  MousePointist ungültig....					


Im OnMousedown

MousePoint:=IntToStr(x)+‘;‘+IntToStr(y);

Im Programm gibst du deine Bibliothek nur frei, wenn ein gültiger MousePoint vorliegt...

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
If MousePoint<>‘x‘ then 
Begin
   X:=StrToInt(Copy(MousePoint, 1, Pos(‚;‘,MousePoint)-1));
   Y:= StrToInt(Copy(MousePoint, Pos(‚;‘,MousePoint)+1,Length(MousePoint)- Pos(‚;‘,MousePoint)));
   .....
   Deine Platzberechnung und das weitere Programm...
   ....
end;


In deine Bibliothek baust du dir die BitBTn ein, die du brauchst:
Rohrstück
T-Stück
Bogen 1-4
Ventil
Pumpe
Kesselzulauf
Kesselablauf
etc.
Im OnClick dieser Bibliotheks-Buttons fragst du die Gültigkeit der Variable Mousepoint ab und generierst zur Laufzeit ein BitBtn unter Zuhilfenahme der Biblotheks –Objekte. Lediglich die Ereignisprozeduren sind anders. Damit du diese benutzen kannst, mußt du sie im Vorfeld deklarieren. Ich nehme immer ein Object, und erzeuge die Ereignisprozeduren aus dem Objektinspektor. Dann geb ich den Procedures meinen Namen. Zur Laufzeit wird diese Procedure dann dem Ereignis zugeordnet. Das Hilfs-Object wird wieder entfernt. Es hat seinen Job gemacht. Hier ein Beispiel

ausblenden Delphi-Quelltext
1:
MyRohrBtn : TBitBtn;					


ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
MyRohrBtn:=TBitBtn.Create( Self);
MyRohrBtn.Name:=Rohr+IntToStr(Rohrzaehler); // Evtl. mit  ‚Pg_‘+IntToStr(Nr) erweitern für mehrere Seiten
MyRohrBtn.Left:=x+(Offsetx); // Offsetx ist aus der MousePoint berechnet (Vorgänger Left+Width ist rechts)
MyRohrBtn.Top:=y+Offsety);  // Offsety ist aus der MousePoint berechnet (Vorgänger Top ist oben)
MyRohrBtn.Glyph:= Bib_Rohr.Glyph; // das Bild aus dem Bibliotheksobjekt
MyRohrBtn.OnClick:=myProcedure; // hier wird die von dir definierte Funktionalität eingebunden
MyRohrBtn.Parent:=myForm1 // Besser ist eine Panel zu erzeugen, evtl auch zur Laufzeit 
Mousepoint:=‘x‘;  // und zum Schluß MousePoint ungültig machen.


Wenn du Panel erzeugst, kannst du sogar x-beliebige Seiten verwalten. Du mußt nur deinen erzeugten Objecten einen Namensanteil der Seite verpassen. Und wenn du diese Namen speicherst, kannst du aus der Namensstruktur deine Objekte wieder erzeugen. Wenn du da Hilfe brauchst kann ich dir ein paar Tipps geben. Wie gesagt, ähnliches mache ich mit Logikelementen.
Übrigends, wenn du MousePoint aus einer Recordvariablen, oder TPoint nehmen willst, kannst du auch eine der beiden Werte auf eine negative Zahl setzen, um die Ungültigkeit zu erklären.
Gruß oldmax

_________________
Zier dich nich so, ich krieg dich schon....
Andy77 Threadstarter
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 17



BeitragVerfasst: Di 05.09.06 21:15 
Super vielen Dank, oldmax!

Den wichtigsten Schritt habe ich schonmal geschafft. Ich hatte vorher schon eine record-Struktur verwendet, die ich auch etwas entschlackt übernehme. Der Trick mit der -1 ist auch gut, dann kann ich ein paar Statusflags rausschmeißen.

Gibt es eigentlich die Möglichkeit, beim Onclick auch die Clickposition zu identifizieren, um zu unterscheiden, ob man Verbindungen zieht oder das Objekt schiebt ?

Gruß,
Andreas
Andy77 Threadstarter
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 17



BeitragVerfasst: Di 05.09.06 22:26 
letzteres hab' ich schon selbst hinbekommen : Koordinaten mit onmousedown gespeichert.
Dann werd' ich das Ganze jetzt mal mit Sinn füllen ;-)