Graphics::TPicture über verschiedene Headerdateien global def. möglich?



  • hallo,

    ich stehe vor einem großen Problem, für mich, für euch dürfte es jedoch leicht sein, undzwar zeichne ich in einen Image per draw(x,y,Graphics) mehre Bilder.
    Die Graphics habe ich in der Headerdatei von FormSpiel gespeichert.

    kleiner Auszug

    public:		// Anwender-Deklarationen
            __fastcall TFormSpiel(TComponent* Owner);
     Graphics::TPicture *Bild[2];
     Graphics::TPicture *FigurW[8];
     Graphics::TPicture *FigurWB[2];
     Graphics::TPicture *FigurB[8];
     Graphics::TPicture *FigurBB[2];
    

    in der .cpp von FormSpiel greife ich hierbei auf die Graphics Bild, FigurW etc. zu bzw. verweise Bilder zu diesen und zeichne sie nachher wie gesagt im FormSpiel.

    Kleiner Auszug:

    if (FileExists("img\\b.BMP") && FileExists ("img\\w.BMP"))
      {
       Bild[0] = new Graphics::TPicture();
       Bild[0]->LoadFromFile("img\\b.BMP");
       Bild[1] = new Graphics::TPicture();
       Bild[1]->LoadFromFile("img\\w.BMP");
       zeichneSchachBrett();
      }
    

    Hier könnt ihr sehen, dass ich die Funktion "zeichneSchachBrett()" aufrufe.
    Diese befindet sich aber aus Gründen der Anschaulichkeit in einer Headerdatei Namens "Funktionen.h".

    Kleiner Auszug:

    void zeichneSchachBrett()
    {
     spaltex = RandImage;
     zeiley = RandImage;
    
     for( int zeile = 1 ; zeile < 9 ; zeile++)
       {
        for( int spalte = 1 ; spalte < 9 ; spalte++)
        {
         if ( spalte % 2 == 1)
         {
          if( zeile % 2 == 1)
           FormSpiel->Image1->Canvas->Draw(spaltex,zeiley,FormSpiel->Bild[0]->Graphic);
          else
           FormSpiel->Image1->Canvas->Draw(spaltex,zeiley,FormSpiel->Bild[1]->Graphic);
         }
         else if( spalte % 2 == 0)
         {
          if( zeile % 2 == 1)
           FormSpiel->Image1->Canvas->Draw(spaltex,zeiley,FormSpiel->Bild[1]->Graphic);
          else
           FormSpiel->Image1->Canvas->Draw(spaltex,zeiley,FormSpiel->Bild[0]->Graphic);
         }
         spaltex = spaltex + FeldBreite;
        }
        zeiley = zeiley + FeldHoehe;
        spaltex = RandImage;
       }
    }
    

    Ich habe diese Headerdatei in die .cpp includiert.
    Jedoch kommt beim Starten die Fehlermeldung:

    Im Projekt1.exe ist eine Exception der Klasse EAccessViolation aufgetreten. Meldung: 'Zugriffsverletzung bei Adresse 00406EEF in Modul... etc.

    Ich habe schon paar andere Varianten Probiert, jedoch kam ich noch nicht zu den gewünschten Erfolg.
    Ich würde mich sehr freuen, wenn ihr mir sagen könntet wie ich das Problem am besten lösen könnte.

    Besten Dank im voraus 🙂



  • 1. keine public-Variablen (Zugriffsfunktionen dafür benutzen)
    2. warum nimmst du nicht TBitmap für Bilder?
    3. keine funktionen in header (es sei denn es sind template-funktionen)
    4. warum ist zeichneSchachbrett nicht member von FormSpiel?



  • 1. weiß ich nicht recht wie ich dass mit Graphics anstellen soll, wäre nett wenn du mir ein beispiel geben könntest.

    2. Weil ich mich in c++ noch nicht so gut auskenne und die funktion TBitmap mir unbekannt war. Ich schau mir diese funktion nochmals an. Sollte man lieber TBitmap benutzen anstatt Graphic, warum?

    3. Ok wusste ich auch nicht 😉 Ich habe hier im Forum einiges über Graphics etc. durchgelesen und dort wurde einem geraten die Graphic in die header zu schreiben.
    Warum sollte man dies auch nicht machen?

    4. Member? Der Ausdruck Member ist mir unbekannt. Vielleicht meinst du, warum ich zeichneSchachbrett nicht in die .cpp von FormSpiel reingeschrieben habe. Dies wollte ich aber aus Gründen der Übersicht etc. nicht machen.

    Vielen dank für deine antwort!



  • 1. ein beispiel fuer Setter/Getter (kann natürlich sein, dass du noch mehr zu tun hast (z.b. speicher reservieren/freigeben, usw.))

    protected:
    
      Graphics::TBitmap *Bild;
    
    public:
    
      void               SetBitmap(Graphics::TBitmap *NeuesBild) { Bild = NeuesBild; }
      Graphics::TBitmap* GetBitmap()                             { return Bild; }
    

    wenn du allerdings ne eigene klasse für den grafikteil machst, dann kannste dir die getter/setter auch sparen und nur ne funktion anbieten die die bilder lädt. der rest ist das protected oder private in der klasse, da von aussen eh keiner zugreifen brauch, ausser deiner klasse.

    ist nur ein beispiel und beansprucht kein recht auf korrektheit. ein richtiges klassendesign muss gründlich überlegt sein.

    // im header
    class Spielbrett
    {
      protected:
    
        Graphics::TBitmap *BoardImage;
    
      public:
    
        // Konstruktor/Destruktor
                 Spielbrett(AnsiString FileName);
        virtual ~Spielbrett();
    
        // Zeiger auf Bild zurueckgeben
        Graphics::TBitmap* GetBoard() { return BoardImage; }
    };
    
    // in die cpp
    Spielbrett::Spielbrett(AnsiString FileName) : BoardImage(0)
    {
      if (!FileExists(FileName))
        return;
    
      // Brett-Bild laden
      BoardImage = new Graphics::TBitmap();
      BoardImage->LoadFromFile(FileName);
    }
    
    Spielbrett::~Spielbrett()
    {
      delete BoardImage;
    }
    
    // in deinem programm dann
    // neues brett erzeugen
    Spielbrett *Brett = new Spielbrett("img\\brett.bmp");
    

    2. TBitmap ist keine Funktion sondern eine Klasse. Durch die Eigenschaften Canvas und Scanline kannst du relativ flexibel und einfach auf die Zeichenfläche zugreifen und diese manipulieren. Die meisten Zeichenfunktionen erwarten (glaub ich) ja eine Canvas zum draufzeichnen.

    3. gegenfrage: warum sollte die graphic in den header? was soll denn das für vorteile bringen?

    4. member = mitglied, d.h. die funktion sollte ein mitglied deine klasse sein (z.b. FormSpiel). besser ist natürlich du erstellt dir ne eigene klasse die sich z.b. um alle graphischen ausgabe kümmert (spielbrett zeichnen, spielfiguren zeichnen, etc.) und lässt in deinem hauptformular nur das grundgerüst des programms. wenn es um übersichtlichkeit geht, dann packe das doch in eine extra unit.



  • ok vielen dank für deine Bemühungen.

    Ich werd es mit deinen Beispiel versuchen, wenn ich zu blöd komm ich wieder ^^.


Anmelden zum Antworten