Zeichnen



  • Hallo miteinander,

    ich kenne mich mit dem Zeichnen unter Borland Builder sehr schlecht aus, soll aber eine grafische Auswertung von Koordinaten machen. Es ist ein Kreis gegeben (Rot) und ich bekomme verschiedene x- und y-Koordinaten. Nun sollen diese weil sie sehr klein sind mit einer Überhöhung am roten Kreis dargestellt werden. Entweder ich mache dies mit Punkten oder mit einem "zickzackmuster". Jetzt meine Frage kann ich dies überhaupt darstellen und wie? Oder hat jemand eine andere Idee wie ich dies gut darstellen kann? Die Auswertung der Koordinaten und alles hab ich, mir fehlt nur wie ich dies darstellen kann.

    noch 2 Beispiele wie ich es mir vorgestellt habe:

    http://img121.imageshack.us/img121/9918/bsp1s.jpg
    http://img14.imageshack.us/img14/7843/bsp2r.jpg

    grüße seven



  • Am besten alles selber Zeichnen mit den Funktionen von TCanvas
    http://docwiki.embarcadero.com/VCL/de/Graphics.TCanvas

    Als Zeichenkomponente würde ich ein TImage nehmen um flickern
    bzw. neuzeichnen der Komponente der Komponente zu überlassen.



  • alles klar dann versuch ich dass mal hinzubekommen!
    Danke für die Antwort

    grüße



  • Ich hab nun mal versucht dies mit Canvas zu lösen. Aber jetzt bekomm ich aber eine Fehlermeldung dich ich nicht wegbekomme 😡

    #include <Graphics.hpp>
    
    do
    {
      x = (int)koordinate_x + 347;
      y = 322 - (int)koordinate_y;
    
      if(i==0)
      {
        Form2->Image1->Canvas->MoveTo(x, y);
      }
      else
      {
        Form2->Image1->Canvas->LineTo(x, y);
      }
    
      i++;
    
     }while(i<Form1->Memo1->Lines->Count);
    

    Fehler:
    http://img268.imageshack.us/img268/3879/fehleriz.jpg

    grüße seven



  • Am besten du ziehst eine TPaintBox in dein Formular, registrierst den Event Handler für das OnPaint Ereignis und führst deine Zeichenoperationen in diesem Ereignishandler aus.
    Von "aussen" in irgendwelchen Formularen rumzumalen ist selten eine gute Idee.



  • ok, dankeschön... nur das mit dem Event Handler ist mir neu. Kannst du mir vllt ein Beispiel geben?



  • Hallo,

    Hier ist eine kleine Anleitung
    http://www.utd.hs-rm.de/infobuch/Borland_Graf_hq.pdf



  • danke für die Hilfe, ich muss noch etwas dazufügen die Koordinaten die der Benutzer eingibt sind auf Form1 und dort befindet sich auch der Button zum Zeichnen des Kreises. Die Zeichnung selber ist aber auf Form2. Ich habe nun versucht mit einer Paintbox und Funktionen dies zu realisieren nur liegt dies leider ein wenig zurück kann mir jemand sagen wo ich den Fehler gemacht hab?

    Gerade_Kreis_TOOL.cpp

    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #include <stdio.h>
    #include <conio.h>
    #include <stdlib.h>
    #include <math.h>
    #pragma hdrstop
    
    #define PI 3.14159265
    
    #include "Gerade_Kreis_TOOL.h"
    #include "Gerade_Kreis_TOOL2.h"
    #include "Gerade_Kreis_TOOL3.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button2Click(TObject *Sender)
    {
    
    ……………. 
    
    x_koor = (int)koordinate_x + 347;
     y_koor = 322 - (int)koordinate_y;
    
     if(i==0)
     {
       Form2.Paintbox_pos_setzen(x_koor, y_koor);
     }
     else
     {
       Form2.Paintbox_zeichnen(x_koor, y_koor);
     }
    }
    

    Gerade_Kreis_TOOL2.cpp

    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #include <stdio.h>
    #include <conio.h>
    #include <stdlib.h>
    #include <math.h>
    #pragma hdrstop
    
    #include "Gerade_Kreis_TOOL.h"
    #include "Gerade_Kreis_TOOL2.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma link "PERFGRAP"
    #pragma resource "*.dfm"
    TForm2 *Form2;
    //---------------------------------------------------------------------------
    __fastcall TForm2::TForm2(TComponent* Owner)
            : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    void TForm2::Paintbox_pos_setzen (int x, int y)
    {
     Form2->PaintBox1->Canvas->MoveTo(x, y);
    }
    //---------------------------------------------------------------------------
    void TForm2::Paintbox_zeichnen (int x, int y)
    {
     Form2->PaintBox1->Canvas->LineTo(x ,y);
    }
    

    Gerade_Kreis_TOOL2.h

    //---------------------------------------------------------------------------
    
    #ifndef Gerade_Kreis_TOOL2H
    #define Gerade_Kreis_TOOL2H
    //---------------------------------------------------------------------------
    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <StdCtrls.hpp>
    #include <Forms.hpp>
    #include <ExtCtrls.hpp>
    #include "PERFGRAP.h"
    #include <jpeg.hpp>
    #include <Graphics.hpp>
    //---------------------------------------------------------------------------
    class TForm2 : public TForm
    {
    __published:	// Von der IDE verwaltete Komponenten
            TLabel *Label1;
            TImage *Image1;
            TLabel *Label5;
            TLabel *Label2;
            TLabel *Label3;
            TLabel *Label8;
            TLabel *Label9;
            TShape *Shape303;
            TLabel *Label4;
            TLabel *Label6;
            TLabel *Label7;
            TLabel *Label10;
            TShape *Shape514;
            TShape *Shape515;
            TShape *Shape516;
            TShape *Shape517;
            TShape *Shape518;
            TShape *Shape519;
            TShape *Shape520;
            TShape *Shape521;
            TPaintBox *PaintBox1;
            void __fastcall PaintBox1Click(TObject *Sender);
            void __fastcall PaintBox1Paint(TObject *Sender);
            void __fastcall FormCreate(TObject *Sender);
    private:	// Anwender-Deklarationen
    public:		// Anwender-Deklarationen
            __fastcall TForm2(TComponent* Owner);
            void Paintbox_pos_setzen(int x, int y);
            void Paintbox_zeichnen(int x, int y);
    };
    //---------------------------------------------------------------------------
    extern PACKAGE TForm2 *Form2;
    //---------------------------------------------------------------------------
    #endif
    


  • siehe FAQ -> "Variablenübergabe an andere Form" geht auch für Funktionen



  • Also du nimmst nun eine PaintBox.

    Wenn du von der Form1 auf die Form2 zeichnen willst ist die Verwendung
    einer PaintBox schlecht gewählt.

    Schieb mal deine Form2 ausserhalb des Bildschirms und zieh Sie wieder rein
    bzw. zieh mal ein anders Fenster über das Form2 Fenster und schau was mit deiner
    Zeichnung passiert.



  • ich versuche nur dies umzusetzen was man mir hier rät, wie gesagt mit dem zeichnen hab ich mich beim borland builder oder allgemein mit c++ noch nicht auseinandergesetzt. Deswegen weiß ich auch nicht was am besten wäre oder wie ich vorzugehen habe.



  • Hast du dir die pdf durchgelesen (bzw. durchgearbeitet) die ich dir verlinkt habe?
    Da steht doch beschrieben das du das Zeichnen im OnPaint der Paintbox machen sollst, was du laut deinem Quelltext aber nicht machst.



  • um es nochmal zu verdeutlichen ich habe auf meim ersten Formular dieses hier:

    erstes Formular:
    http://img684.imageshack.us/img684/1770/eingaber.jpg

    koordinaten x und y die ich auf meinem zweiten Formular in Form von Punkten oder die Punkte verbunden durch eine Linie darstellen möchte.

    zweites Formular:
    http://img197.imageshack.us/img197/1496/kreisj.jpg

    Die Koordinaten sind Abweichungen von einem Kreis die ich mit einer Überhöhung (damit es erkenntlich wird) darstellen möchte. Ich habe bereits alles programmiert ich habe auch schon die Koordinaten nachher für meine Darstellung auf dem 2ten Formular mir fehlt nur die Methode wie ich dies zeichnerisch Darstellen kann.



  • hallo braunstein, ja habe ich durchgelesen eventuell auch nicht ganz verstanden... zumindest habe ich es so versucht wie dort beschrieben nur leider hat dies auch nicht funktioniert 😞



  • In dem von dir geposteten Teil des Quelltextes sehe ich keine OnPaint-Funktion deiner Paintbox.
    Wer ruft denn Paintbox_zeichnen auf?



  • ich selber im hauptprogramm ich dachte dies geht, weil wie starte ich dies denn sonst ich hab ja keine Funktion onClick oder irgendwas wie ich diese starten könnte. Dies soll ja alles gestartet werden wenn ich im Form1 auf den Kreis button klicke



  • wie kann ich denn vom "Hauptprogramm" mein OnPaint aufrufen?



  • Du ruftst OnPaint gar nicht auf. Das ist eine Eventfunktion die automatisch immer dann aufgerufen wird wenn ein Neuzeichnen des Fensters nötig ist. Z. Bsp. wenn sich die Größe ändert, wenn das Fenster verdeckt war etc.
    Du kannst das auch veranlassen indem du die Methode Repaint deiner Form aufrufst.



  • also ich habe halt eine Schleife und in jedem Schleifendurchgang soll es mir die OnPaint aufrufen, geht dies dann durch die Repaint???



  • Was ist das denn für eine Schleife? Warum soll bei jedem Schleifendurchgang neu gezeichnet werden?
    Wenn das wirklich so erforderlich ist dann erfüllt repaint den Zweck.
    Es müssen natürlich immer alle notwendigen Zeichenoperationen in OnPaint durchgeführt werden. Welche das sind musst du dir dann schon selber merken.


Log in to reply