Ein eigenes Koordinatensystem



  • Hallo,
    vielen Dank für den Code, doch leider haben wir uns missverstanden. Nehmen wir an, dass DrawGraph erstmal nichts anderes macht, als eine Linie zu zeichnen:

    void __fastcall TGraph::DrawGraph()
    {
     Canvas->LineTo(200,200);
    }
    

    Nun soll aber DrawGraph nicht von "DoPaint" aufgerufen werden, da der Strich ja schon zu Beginn gezeichnet werden würde. Der Benutzer soll aber selbst bestimmen, wann diese Methode aufgerufen wird und erst z.B. bei Knopfklick den Graphen zeichnen lassen.

    Ich kann, wie ihr mir gesagt habt, nicht einfach DrawGraph() aufrufen, da sie nicht innerhalb von OnPaint zeichnet. Wenn ich das täte, dann würde mein Problem wieder, nämlich, dass nicht vom Ursprung aus gezeichnet wird (auch wenn ich diesen verschoben habe und dahin "gemoved" bin) erscheinen.

    Wie muss ich nun "DrawGraph" modifizieren, damit sie mit OnPaint in Verbindung steht, beziehungsweise, dass die Linie vom Ursprung aus gezeichnet wird?

    Ich hoffe, dass Du mich verstanden hast. Falls Du nicht mehr zum Antworten kommst, wünsche ich dir und auch allen anderen einen guten Rutsch mit vielen Böllern und Raketen :D.
    Vielen Dank für die Hilfe, die hoffentlich bald nicht mehr notwendig ist.
    lg, freakC++



  • Ersteinmal: Frohes Neues!

    Also, wenn es einen Titel hier zu verleihen gäbe, du würdest ihn von mir bekommen: der DAU des Jahres -)

    Du bist anscheinend nicht nur mit der VCL überfordert, sondern auch mit den Grundlagen der Programmierung.

    Für dein Anliegen gibt es zwei einfache Möglichkeiten:
    1. eine Funktion, welche das Ereignis 'OnPaint' aktiviert bzw. deaktiviert (falls du es auch nachträglich wieder nicht-angezeigt haben willst):

    void TMyPaintBox::ActivateGraph(bool bActivate)
    {
      if(bActivate)
         OnPaint = DoPaint;
      else
         OnPaint = 0;
    
      Invalidate(); // zeichnet sich bei Bedarf neu
    }
    

    2. eine boolsche Variable:

    bool bActivateGraph = false; // als Member der Klasse!!!
    
    void TMyPaintBox::ActivateGraph(bool bActivate)
    {
      bActivateGraph = bActivate;
    
      Invalidate();
    }
    
    void TMyPaintBox::OnPaint(...)
    {
      if(!bActivateGraph) return; // zeichne NICHTS!
    
      ...
    }
    

    Und jetzt schreib mir, daß das eine schwere Lösung ist -)

    Lies dir bitte auch nochmal die Hilfe zu Ereignissen (in der VCL) durch...



  • Die Lösung ist nicht zu schwer, doch ich raff' einfach nicht, was das mit meiner zu zeichnenden Linie zu tun hat, die einfach nur vom Nullpunkt ausgehen soll. Jede Linie wird gezeichnet, doch keine vom Ursprung. 😡

    Ich versuche euren ganzen Code anzuwenden, doch es klappt nicht. Egal, ob ich hier oder dort OnPaint schreibe oder den Nullpunkt verschiebe, nur das Koordinatenkreuz wird gezeichnet und jede Linie wird falsch gemalt. Die Methode "DrawLine" zeichnet trotz euer Hilfe immer an der falschen Stelle

    //---------------------------------------------------------------------------
    __fastcall TGraph::TGraph(TComponent* Owner)
            : TPaintBox(Owner)
    {
            OnPaint = DoPaint;
    }
    //---------------------------------------------------------------------------
    namespace Graph
    {
            void __fastcall PACKAGE Register()
            {
                     TComponentClass classes[1] = {__classid(TGraph)};
                     RegisterComponents("Beispiele", classes, 0);
            }
    }
    //---------------------------------------------------------------------------
    void __fastcall TGraph::DrawLine() //was bringt mir hier die boolschen Variable? Ich will doch nur, dass vom Ursprung aus gezeichnet wird? Ich verstehe deinen Code, doch verstehe den Sinn in diesem Problem nicht. Sorry!
    {
     SetViewportOrgEx(Canvas->Handle, Width/2, Height/2, NULL);
     Canvas->MoveTo(0,0);
     Canvas->LineTo(100,100);
    }
    //---------------------------------------------------------------------------
    void __fastcall TGraph::DoPaint(TObject *Sender)
    {
    
     SetViewportOrgEx(Canvas->Handle, Width/2, Height/2, NULL);
     Canvas->MoveTo(0, Height/2);
     Canvas->LineTo(0, -Height/2);
    
     Canvas->MoveTo(Width/2, 0);
     Canvas->LineTo(-Width/2, 0);
     //in diesem Versuch bin ich nicht auf den ursprünglichen Nullpunkt zurückgeganen (siehe VergissEs)
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
     Graph1->DrawLine(); //Linie an falscher Stelle
    }
    

    der DAU des Jahres

    Vielleicht hast Du recht, auch wenn das Jahr erst gerade angefangen hat. Trotzdem nicht sehr nett...

    Danke trotzdem
    lg, freakC++

    PS.: Wenn ich das heute nicht hinbekomme, dann gebe ich auf....



  • Hallo,
    so ich habe mich entschieden, dass ich mein Koordinatensystem nun einfach so wie Th69 mache, nämlich ich rechne alles um.

    Zwar finde ich es schade, dass ich es nicht gescahfft habe, den Nullpunkt zu verschieben, doch wie bereits gesagt, kriege ich es einfach nicht hin, eine Linie korrekt vom Nullpunkt aus zu zeichnen.

    Naja, wenn ihr wollt, könnt ihr diesen Thread einfach löschen und wir tun so, also ob nichts gewesen wäre.

    Ich danke euch allen.
    lg, freakC++



  • Hallo

    und ein Gesundes, erfolgreiches und friedliches 2010 allerseits.

    Hab hier noch etwas gefunden, das du lesen solltest,

    bevor du dir die Kugel gibst 😃 .

    bis dann
    kpeter



  • Hallo,
    schau dir mal den Link auf Seite 1 an 😃 ? Aber ich danke dir trotzdem. Bis jetzt gehts aber ganz gut, wenn ich einfach eine Transformation mache. Das Problem liegt einfach daran, dass ich mangelnde Kenntnisse vom Builder habe. Daher würde ich mich freuen, wenn ihr mir sagen könnt, woher ihr das wisst. Irgendwie gibt es keine ausführlichen Bücher darüber.

    Lernt man das an der Uni oder ist das Learning bei Doing? Wie habt ihr das gelenrnt?

    Vielen Dank
    lg, freakC++



  • NOCHMAL die Frage, wiso willst du von ausserhalb auf den Graph zeichnen?

    Wiso willst du überhaupt eine Komponente erstellen die nichts anderes macht als den 0-Punkt zu setzen? dann kann man diese eine Zeile auch direkt in einer PaintBox rein schreiben!

    Wiso erstellst du nicht in deiner Komponente Funktionen wie es normal üblich ist ala Graph1->Items->AddLine(.....) und verwaltest alle Zeichnungsdaten in der Komponente und lässt dann alles im OnPaint zeichnen der Komponente?

    Wir schreiben dir jetzt schon zum zig mal alles in OnPaint zeichnen lassen und dann kommt wieder ein

    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
     Graph1->DrawLine(); //Linie an falscher Stelle
    }
    

    von dir ... willst du uns was vortrollen? 😡



  • Halt, das ist ein Missverständnis. Ich weiß, dass das nicht stimmt, doch ich wollte auf die DrawLine Methode verweisen, die ich von einem Button aufrufen möchte. Ich wollte halt dass ich von einem Button diese Methode aufrufe und dass dann vom gewünschten Nullpunkt gezeichnet wird. Ich habe es nicht geschafft, euren Code zu anzuwenden, dass dies möglich ist.

    Natürlich soll mein Koordinatensystem noch viel mehr können, doch warum soll ich mir schon Gedanken über weitere Schritte machen, wenn ich es noch nicht mal schaffe, eine Linie zu zeichnen 🙄

    Bitte nicht böse sein! Das diente nur zur Verdeutlichung, dass ich halt diese Methode aufrufen möchte und dass dann vom Nullpunkt aus gezeichnet wird.

    edit: Ich will von außerhalb auf den Graphen zeichnen, weil ich wissen will, wie es geht. Ich bin jemand, der bei einem Problem eigentlich wissen will, warum so etwas ist. Genauso ist es hiert. Ich WILL verstehen, was ich falsch mache und ich WILL wissen, wie ich von außerhalb auf den Graphen zeichne. Auch wenn ich mich wohl doof anstelle!

    lg, freakC++



  • Vielleicht solltest du uns nunmal den bisherigen Code der Komponente posten,
    ich nehme mal an, die Mods haben nix dagegen und du auch nicht...



  • Hm... jetzt habe ich dir wieder Fragen gestellt und keine davon hast du beantwortet!



  • Hallo,
    ich hab' auf deine Fragen geantwortet. Ich will das machen, damit ich es verstehe. Die Komponente soll mehr als den 0 Nullpunkt setzen, aber warum soll ich mir über weitere Schritte Gedanken machen, wenn ich noch nichtmal eine Linie zeichn kann?

    Ich will dieses ungemütliche Thema jetzt abhaken. Ich glaube, dass wir alle die Nase voll haben und ich mich nicht weiter unbeliebt machen möchte.

    Ich probiere das mit der Transformation jetzt aus. Eine Frage habe ich aber noch. Ihr sagtet, dass ich mit "Invalidate()", die PaintBox leeren kann. Das funktioniert leider nicht. Auch Refresh bringt da nichts. Wie kann ich eine PaintBox neu übermalen, sodass das Alte nicht da bleibt. Ich dachte, einfach, das ich sie mit einem Rechteck übermale...also so:

    Canvas->Brush->Color=clBtnFace;
    Canvas->FillRect(Canvas->ClipRect);
    

    Wie muss die Farbe heißen, damit die Komponente wie standargemäß durchsichtig ist? clBtnFace ist da falsch.

    Vielen Dank euch
    lg, freakC++



  • Invalidate() ruft OnPaint auf und das ist mit deinen DoPaint verknüpft...



  • Möchte wirklich mal wissen, wie er verlangen kann, das wir seine überlangen Postings lesen sollen,
    wenn er auf unsere (kurzen) nicht antwortet/reagiert 😕



  • Ich weiß nicht was ihr habt. Ich habe eure Antworten gelesen und mich darauf bezogen, denn es liegt mir schon hier was zu lernen!

    Ich möchte jetzt diese Mega Thread beenden, danke euch allen und lobe euren Einsatz, Können und Durchhaltevermögen! Ihr seit echt toll.

    Bis bald und
    lg, freakC++


Anmelden zum Antworten