Borland C++ 6 + DirectX & OpenGL



  • Ändere mal den Code in TForm1::FormShow in folgenden ab:

    backpic = new Graphics::TBitmap;
            backpic->Width = 1280;
            backpic->Height = 400;
            backpic->LoadFromFile(ExtractFilePath(ParamStr(0))+"berge.bmp");
            links = 0;
            oben = 0;
            picmove *sub = new picmove(false);
    

    Mit "ExtractFilePath(ParamStr(0))" ermittelst du den Path zum Ordner des
    Programms, bzw. Projekt in dieser sollte auch berge.bmp liegen.

    Wenn kein Bild geladen werden kann, sollte BCB darauf eine Fehlermeldung
    ausgeben, erscheint diese Fehlermeldung?
    Wenn nicht ist eigentlich der Path ok, aber der Fehler liegt wo anders,
    welche BCB Version hast du?

    gruß Micha

    PS: Ich habe dieses Beispiel unter BCB6 pro erstellt.

    EDIT Zusatz:
    Wenn du einen Absoluten Phat angiebts, wie z.B.:
    "c:\Programme\Borland\CBuilder6\Projects\test1\berge.bmp"
    dann mußt du es folgender massen schreiben, fals es nicht Bekannt ist,
    "c:\\Programme\\Borland\ßCBuilder6\\Projects\\test1\\berge.bmp"

    das "\" (Backslash) ist ein Sonderzeichen um wiederum dieses darzustellen müßen
    2 Backslashes angegeben werden.



  • Ich hab auch BCB 6 pro 🙂

    Nur ehm ich glaube ich hab nicht alle Dateien im Projekt hinzugefügt.

    Bei mir steht beim Quellcode Editor bei den unteren reitern nur 3 reiter:

    1-> Unit1.cpp
    2-> Unit1.h
    3-> Diagramm

    Aber in deinem Programm hast du ja noch 2 andere *.cpp Dateien dabei. Vielleicht muß ich diese erst manuell einbinden? Wie gesagt bin BCB Newbie in der IDE im momment 😞



  • gehe oben im Menu auf "Projekt" -> "Dem Projekt hinzufügen" und wähle die
    Testscroll.cpp aus, das ist der Threadcode, die Scroll.cpp brauchst du nicht
    zu öffnen oder zufügen.

    Normalerweise ist das in der Projektdatei mit gespeichert, und muß nicht
    Manuel geschehen, hast du denn Fehlermeldungen, wenn ja welche?

    gruß Micha



  • Also ich hab die Datei Testscroll.cpp eingefügt.

    Leider klappt es immer noch nicht nun wird aber auch gleich 2 quellcode Fenster angezeigt, also hats geklappt.

    Er meldet mir folgende Warnung:
    [C++ Warnung] Unit1.cpp(35): W8004 'sub' wurde ein Wert zugewiesen, der nie verwendet wird.

    Er startet nur die Form und ich kann per PopUp Menü das Fenster schließen.



  • ...bei einem Freund sein C++ von Borland gesehen und da flog ich von den Socken erlich.

    AMEN. Ich wollt mich nur mal zu Wort melden 😃
    FInd den VC++ auch viel schlehter als den BCB



  • Ist doch so erlich 🙂



  • Die Fehlermeldung ist nicht schlimm, in dieser Zeile wird der Thread
    gestartet, da aber sub sonst nicht verwendet wird im Quellcode kommt
    diese Warnung.

    Vermutlich wird der Thread nicht gestartet, den der zeichnet das Bild.
    Starte mal das Programm und gehe dann in der IDE auf "Ansicht"->"Debug-Fenster"->"Threads"
    In diesem Fenster müßte dann einmal Scroll.exe stehen und darunter picmove..
    oder eine HexZahl.

    Du kannst mal folgendes unter "picmove *sub = new picmove(false);" schreiben:

    sub->Resume();
    

    gruß Micha



  • klappt leider immer noch nicht ich habs wie folgt geändert:

    Hier nochmal der komplette Code:

    Unit1.cpp

    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #pragma hdrstop
    
    #include "Unit1.h"
    #include "Testscroll.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::Beenden1Click(TObject *Sender)
    {
            Close();
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::FormShow(TObject *Sender)
    {
            backpic = new Graphics::TBitmap; 
            backpic->Width = 1280;
            backpic->Height = 400; 
            backpic->LoadFromFile(ExtractFilePath(ParamStr(0))+"berge.bmp"); 
            links = 0; 
            oben = 0; 
            picmove *sub = new picmove(false);
            sub->Resume();
    
    }
    //---------------------------------------------------------------------------
    

    Testscroll.cpp

    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #pragma hdrstop
    
    #include "Testscroll.h"
    #include "Unit1.h"
    #pragma package(smart_init)
    //---------------------------------------------------------------------------
    
    //   Wichtig: Methoden und Eigenschaften von Objekten der VCL können nur
    //   in Methoden verwendet werden, die Synchronize aufrufen, z.B.:
    //
    //      Synchronize(UpdateCaption);
    //
    //   wobei UpdateCaption so aussehen könnte:
    //
    //      void __fastcall picmove::UpdateCaption()
    //      {
    //        Form1->Caption = "In Thread aktualisiert";
    //      }
    //---------------------------------------------------------------------------
    
    __fastcall picmove::picmove(bool CreateSuspended)
            : TThread(CreateSuspended)
    {
    }
    //---------------------------------------------------------------------------
    void picmove::SetName()
    {
            THREADNAME_INFO info;
            info.dwType = 0x1000;
            info.szName = "picmove";
            info.dwThreadID = -1;
            info.dwFlags = 0;
    
            __try
            {
                     RaiseException( 0x406D1388, 0, sizeof(info)/sizeof(DWORD),(DWORD*)&info );
            }
            __except (EXCEPTION_CONTINUE_EXECUTION)
            {
            }
    }
    //---------------------------------------------------------------------------
    void __fastcall picmove::Execute()
    {
            SetName();
            while (!Terminated) {
                    // neue Bildposition setzten
                    Form1->links = Form1->links + 1;
                    if (Form1->links == 780) {   //1280 - 500 bild ende
                            Form1->links = 0; // von vorne Anfangen
                    }
                    // Auf Vsync warten (Elektronenstrahl am Bildende)
                    asm mov dx, 3dah
                    loop1:
                    asm in al, dx
                    asm test al, 8
                    asm jz loop1
                    //Bild neu Zeichnen
                    Form1->Canvas->CopyRect(Rect(0,0,500,400),Form1->backpic->Canvas,Rect(Form1->links,Form1->oben,Form1->links+500,Form1->oben+400));
    
            }
    
    }
    //---------------------------------------------------------------------------
    


  • Ja jetzt brat mir einer nen Storch 😡

    Was zeigt das Debug-Fenster an???
    Steht der Thread mit drinn??

    Wenn nicht so wird er, aus welchem Grund auch immer, nicht gestartet!

    gruß Micha



  • Ich glaub ich weiß warum es bei dir nicht geht!

    Normalerweise muß Synchornize() aufgerufen werden,
    wenn ein Thread auf ein VCL Objekt zugreifen will,
    so ist die Regel, aber ich mache es bei Versuchs-
    Programme fast nie und bei mir klappt es auch.

    Nun gut, dann wollen wir es mal Richtig machen,
    ändere den Code von Testscroll.cpp in folgenden ab:

    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #pragma hdrstop
    
    #include "Testscroll.h"
    #include "Unit1.h"
    #pragma package(smart_init)
    //---------------------------------------------------------------------------
    
    //   Wichtig: Methoden und Eigenschaften von Objekten der VCL können nur
    //   in Methoden verwendet werden, die Synchronize aufrufen, z.B.:
    //
    //      Synchronize(UpdateCaption);
    //
    //   wobei UpdateCaption so aussehen könnte:
    //
    //      void __fastcall picmove::UpdateCaption()
    //      {
    //        Form1->Caption = "In Thread aktualisiert";
    //      }
    //---------------------------------------------------------------------------
    
    __fastcall picmove::picmove(bool CreateSuspended)
            : TThread(CreateSuspended)
    {
    }
    //---------------------------------------------------------------------------
    void picmove::SetName()
    {
            THREADNAME_INFO info;
            info.dwType = 0x1000;
            info.szName = "picmove";
            info.dwThreadID = -1;
            info.dwFlags = 0;
    
            __try
            {
                     RaiseException( 0x406D1388, 0, sizeof(info)/sizeof(DWORD),(DWORD*)&info );
            }
            __except (EXCEPTION_CONTINUE_EXECUTION)
            {
            }
    }
    //---------------------------------------------------------------------------
    void __fastcall picmove::Execute()
    {
            SetName();
            while (!Terminated) {
                    Synchronize(bewege);
            }
    
    }
    //---------------------------------------------------------------------------
    void __fastcall picmove::bewege()
    {
            // neue Bildposition setzten
            Form1->links = Form1->links + 1;
            if (Form1->links == 780) {   //1280 - 500 bild ende
                    Form1->links = 0; // von vorne Anfangen
            }
            // Auf Vsync warten (Elektronenstrahl am Bildende)
            asm mov dx, 3dah
            loop1:
            asm in al, dx
            asm test al, 8
            asm jz loop1
            //Bild neu Zeichnen
            Form1->Canvas->CopyRect(Rect(0,0,500,400),Form1->backpic->Canvas,Rect(Form1->links,Form1->oben,Form1->links+500,Form1->oben+400));
    
    }
    

    und in der Headerdatei Testscroll.h füge diese ein:

    //---------------------------------------------------------------------------
    
    #ifndef TestscrollH
    #define TestscrollH
    //---------------------------------------------------------------------------
    #include <Classes.hpp>
    //---------------------------------------------------------------------------
    class picmove : public TThread
    {
      typedef struct tagTHREADNAME_INFO
      {
        DWORD dwType;     // muß 0x1000 sein
        LPCSTR szName;    // Zeiger auf Name (in user addr space)
        DWORD dwThreadID; // Thread-ID (-1=caller thread)
        DWORD dwFlags;    // Reserviert für spätere Verwendung, muß 0 sein
      } THREADNAME_INFO;
    private:
      void __fastcall bewege();  //Hier wurde geändert, bzw. zugefügt
      void SetName();
    protected:
            void __fastcall Execute();
    public:
            __fastcall picmove(bool CreateSuspended);
    };
    //---------------------------------------------------------------------------
    #endif
    

    Jetzt sollte es funktionieren!

    gruß Micha



  • Ich hab folgenden Post gefunden:
    http://www.c-plusplus.net/forum/topic,39436.html

    Ich denke mal das reicht für das Thema zu beginn...

    Aber ich teste mal deinen Code.


Anmelden zum Antworten