Zwei Komponente übereinander



  • Hallo.

    Ja, so wäre im Prinzip auch mein Ansatz: Verbindung schon vorher speichern. Bezogen auf das Beispiel Schaltplan-Editor: Im "Verbindung-Zeichnen-Modus" läuft es über Mausklicks. Dann könnte man so vorgehen: Bauteil-Anschluss A liegt auf der "Editorfläche" an Position X1/Y1 und Bauteil-Anschluss B liegt an Position X2/Y2 (bekannt, da Bauteile vorher platziert und deren Abmessungen / Anschlusslage bekannt). Klickt der Benutzer auf einen Anschluss von A und dann auf einen Anschluss von B, sind diese verbunden (natürlich mit Zeichnen der Linie zur Visualisierung). Das kann man ja über X/Y in einer Mausklick-Eventmethode prüfen. Daraufhin werden die Bauteile als "verbunden" gespeichert und evtl gleich das Memo aktualisiert. Zusätzlich könnte man bei speziellen Anschlüssen gleich prüfen, ob die Verbindung gültig ist. Wichtig wäre dafür einzig die Arbeit über die Anschlüsse. Das Bauteil im Editor ist dann nur eine Visualisierung für den Benutzer.

    MfG



  • ja das habe ich auch bisher so realiseirt! Ich dachte bloß vielleicht gibt es eine bessere Variante?

    Versuch war es Wert!

    Mal eine andere Frage. Ich muss ja die Komponente verbinden. Ich möchte die Komponente aber nur mit geraden Linien verbinden, entweder Horizontal oder vertikal Linien. Wie würdet Ihr das realisieren?

    Ich habe bisher alles so gelöst!

    void __fastcall TLogicWin::FormMouseMove(TObject *Sender, TShiftState Shift,
          int X, int Y)
    {
    MainForm->StatusBar->Panels->Items[0]->Text = IntToStr(X)+ "    " +IntToStr(Y);
    
      if (X >= gsX && Y >= gsY) {
    	if ( X-gsX > Y-gsY )
    	{
    	gaX = X;
    	gaY = gsY;
    	h = 10;
    	w = X-gsX;
    	}
    	if ( X-gsX < Y-gsY )
    	{
    	gaX = gsX;
    	gaY = Y;
    	h = Y-gsY;
    	w = 10;
    	}
      }
      if (X <= gsX && Y <= gsY) {
    	if ( gsX-X > gsY-Y )
    	{
    	gaX = X;
    	gaY = gsY;
    	h = 10;
    	w = gsX-X;
    	}
      	if ( gsX-X < gsY-Y )
    	{
    	gaX = gsX;
    	gaY = Y;
        h = gsY-Y;
    	w = 10;
    	}
      }
    
      if (Linestart == true && MainForm->btnWire->Down == true)
    	{
    				Refresh();
    				Canvas->MoveTo(gsX,gsY);
    				Canvas->LineTo(gaX, gaY);
    	}
    }
    
    void __fastcall TLogicWin::FormMouseDown(TObject *Sender, TMouseButton Button,
    	  TShiftState Shift, int X, int Y)
    {
    
    		if (MainForm->btnWire->Down == true)
    			{
    			TImage *Wire = new TImage(this);
    			Wire->Parent = this;
    
    			//Wire->Transparent = true;
    			Wire->Top = gsY;
    			Wire->Left = gsX;
    			Wire->Height = h;
    			Wire->Width = w;
    			Wire->Name = "Net_" + IntToStr(Net);
    			Wire->OnMouseDown = StartExtraWire;
    
    			//Graphik
    			Wire->Canvas->MoveTo(0,0);
    			if (h==10)
    			  Wire->Canvas->LineTo(w,h-10);
    			if (w==10)
    			  Wire->Canvas->LineTo(w-10,h);
    
    			Net++;
    			}
    }
    

    Ich finde diese Funktion aber schreklich, funktioniert auvch schlecht und nicht ganz. Wenn ich Raster realisieren könnte würde es viel leichter und besser gehen?
    Habt Ihr vielleicht einen besseren Vorschlag? Wie mann die Komponente verbinden kann?



  • swunder schrieb:

    Mal eine andere Frage. Ich muss ja die Komponente verbinden. Ich möchte die Komponente aber nur mit geraden Linien verbinden, entweder Horizontal oder vertikal Linien. Wie würdet Ihr das realisieren?

    Erst die X-Änderung zeichnen lassen, dann Y-Änderung zeichnen lassen?!

    lol - hast du dir deinen Code mal angeschaut? Da gibts ja Variablen....

    gaY
    

    🙄 😃

    swunder schrieb:

    Wenn ich Raster realisieren könnte würde es viel leichter und besser gehen

    Woran ist denn mein Vorschlag diesbezüglich gescheitert?



  • Hallo

    Ich würde auf die ganzen VCL-Komponenten verzichten und den Schaltplan selber zeichnen, basierend auf entsprechende Datenstrukturen im Hintergrund. Das ist vielleicht erstmal aufwändiger, aber dafür hast du dann volle Kontrolle und wesentlich mehr Möglichkeiten.
    Dann liese sich auch ein Raster einstellen, an denen sich Objekte und Linien auszurichten haben.

    bis bald
    akari



  • @Kolumbus
    Er ist deswegen gescheitert, weil ich nicht ganz dahinter gekommen bin!
    Den Vorschlag von DerChris habe ich auch usprobiert auch ohne Erfolg!
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-204669.html

    @akari
    wie meinst du das du würdest den Schaltplan selber zeichnen?
    Du must ja die dynamisch Komponente einfügen, um diese dann zu verbinden.
    So sieht zum beispiel bei mir die AND Komponente im Programm!

    void __fastcall TLogicWin::ElementAND (int X, int Y) 
    { 
    TImage *And = new TImage(this); 
    And->Parent = this; 
    
    And->Height = 50; 
    And->Width = 97; 
    And->Name = "AND_" + IntToStr(AndCounter+1); 
    
    //Graphik 
    And->Canvas->Pen->Color = clBlack; 
    And->Canvas->Brush->Color = clWhite; 
    And->Canvas->Rectangle(X, Y, X + 50, Y + 50); 
    
    //Eigenschaften 
    TLabel * newLabel1 = new TLabel(And); 
    newLabel1->Left = X - 30; 
    newLabel1->Top = Y - 10; 
    newLabel1->Caption = "In1"; 
    newLabel1->Name = "AND_In1_" + IntToStr(AndCounter+1); 
    newLabel1->Parent = this; 
    }
    


  • hw_sw alias swunder schrieb:

    Er ist deswegen gescheitert, weil ich nicht ganz dahinter gekommen bin!

    Wenn du nicht genauer sagen kannst, was dein Problem mit meinem Vorschlag ist, kann ich dir auch nicht helfen.

    Und ich glaube akari meint, du sollst nicht auf eine VCL-Komponente mit Canvas zeichnen, sondern eine eigene Komponente schreiben. Diese könntest du gleich mit einem Raster versehen. Wenn du das hinbekommst, wäre das in der Tat der eleganteste Weg.



  • Hallo

    Ich schlage vor das du ein TImage nimmst und dort ohne weitere VCL-Komponenten, nur mithilfe der Canvas-Operation den ganzen Schaltplan zeichnest und alle Operationen mittels der (Mouse-)Events auslöst.
    So kannst du viel besser eine dahinterliegende Datenstruktur aufbauen, die alle notwendigen Zusammenhänge verwalten und unabhängig von einem VCL-Form auch bearbeiten kann.

    bis bald
    akari



  • Oh, Sorry - dann hab ich das nicht ganz richtig verstanden, was akari geschrieben hat...



  • Ich persönlich würde auch rein intuitiv die Variante von akari wählen.

    Erstelle einfach TImage was so groß ist wie deine spätere Zeichenfläche. Nun
    kannst Du dir die Canvas des TImage wie ein "Paint" vorstellten.

    Dann legst Du dir für z.B. für jede "Komponente" eine Struktur an in der Du die
    Daten dieser speicherst. (Höhe,Breite, Füllfarbe, Symbol) Weiterhin zig Methoden die dir etwas anhand der Struktur die Du ihr übergibst auf deinem Zeichenbrett zeichnet. Das verbinden ebenso...

    Wenn Du das gut genug kapselst könntest Du das ganze später sogar 1A in z.B. SMFL übertragen. http://www.sfml-dev.org/

    Nur das verwenden der VCL Komponeten je als einzelne Komponente ist wirklich sehr umständlich,...

    so long
    sl



  • Ok verstanden habe ich es! Wie Ihr das meint. Wo Ihr alle auch recht habt.
    Bloß ich sitze jetzt momentan und übelege wie ich so was realisieren könnte? Sprich alle diese Parameter übergeben! Oder wie soll ich dann mein Bauelement bewegen? Das kann ich mir jetzt gar nicht vorstellen?

    Gruß swunder alias hw_sw



  • Back to the roots: du hast in einem anderen Thema von dir geschrieben, dass es ein Freizeitprojekt für dich ist und du damit C++ mit VCL üben willst, richtig?
    Warum hast du dann also so festgefahrene Vorstellungen von dem Ergebnis? Anscheinend bist du an einem Punkt, der deine Kenntnisse und Fertigkeiten übersteigt. Das geht mir auch (noch) sehr sehr oft so, vielleicht ist es in 2 Jahren anders... Damit man aber zu einem Ergebnis kommt, sollte man dann etwas versuchen, dass man realisieren kann. Oft lernt man auf dem Weg dahin genug dazu, das man hinterher doch schon fast seine Eingangsvorstellung umsetzen kann... Natürlich macht das mehr Arbeit. Aber mit dem Dazulernen von kleinen Häppchen hat sich meine Vorstellungskraft - was kann ich umsetzen, was nicht - immer weiter konkretisiert und erweitert... Die kleinen Schritte bringen es!
    Vorschlag: mach es so, wie akari meint, aber trenne dich (erstmal) von dem Anspruch die Bauteile auf dem Schaltplan verschieben zu können. Wenn ein Bauteil falsch platziert ist, muss es eben vom Nutzer gelöscht und neu platziert werden. Das ist nicht luxuriös, aber IMHO wesentlich einfacher umzusetzen.

    Natürlich kann ich mit meinen Gedanken komplett falsch liegen, dann sei mir nicht bös' - warum auch immer. Ich versuche nur zu helfen. 😉



  • Hallo Jungs,

    ich kann verstehen wie Ihr das meint, bloß ich kann mir ganr nicht vorstellen wie ich es realisieren soll! Allein die Strukturen bzw. Koordinaten anlegen kein Problem, aber wie Zeichen ich dann. Es sind ja nicht immer die gleichen Strukturen!

    Gruß Swunder



  • Das übersteigt auf gar keinen Fall deine Fähigkeiten. Du denkst nur zu viel
    vom Start zum Ziel. Warum müssen es verschiedene Strukturen sein?

    Zum start lass bei jeder Änderungen einfach das ganze Brett neu zeichnen. Du
    definierts einmal eine Struktur in der Du alle Merkmale einer Komponente hinterlegst. Breite des "Kästchens", Höhe, Das Symbol was darin enthalten sein soll. Bei Digitalschaltungen z.B. ein '&'.

    Dann legst Du dir z.B. eine 2 Struktur an in dem der Typ der Komponente und die
    X,Y Koordinate hinterlegt ist. Dann ein Array/Vektor von dieser Struktur wo du alle Komponenten hinterlegst die sich dann tatsächlich auf deinem Zeichenbrett befinden sollen.

    Beim Zeichnen sagen wir print()... raterst du das ganze Array durch und lässt jede Komponente Zeichnen. An der X,Y Koordinate und wie Hoch und Breit bla bla das gezeichnete sein soll weißt du ja auch.

    Denke einfach ins ganz ganz kleinen Schritten. Meiner Meinung nach hat das viel weniger mit programmier Skills... Du pakcts das schon. Geh da einfach mal Schritt für Schritt ran. Ganz kleine Schritte. Du hast ja den Luxus der Zeit und musst auch net gross Dokumentieren/Planen. 👍



  • Super Slashi, fast genau so meinte ich das mit den kleinen Schritten, die ich erwähnte.
    Ich finde jedoch mit der Programmiererfahrung, der Kenntnis weiterer Befehle / Methoden / Vorgehensweisen / Tricks usw kommt man auch immer dichter zu dem Punkt, an dem man sich, beim Betrachten der Aufgabe bereits, vorstellen kann wie man zum Ziel kommt. Die Kenntnisse und Fertigkeiten (zB. Befehle und Methoden die man aus dem Kopf benutzen kann) die man dazu braucht, fehlen hier eindeutig. Daher ist es nicht möglich den Weg zum Ziel abzuschätzen. Folglich sollte man das große Ziel wegpacken und sich viele kleine Ziele setzen, natürlich immer Eins nach dem Anderen. Das ist ja nicht bös gemeint, mir geht es selber so. Wenn man später mehr drauf hat kann man sich eher erlauben, mal vom Start zum Ziel zu denken.
    Ich wollte swunder nicht diskreditieren, falls es so rüberkam.


Anmelden zum Antworten