Borland C++ 6 + DirectX & OpenGL



  • Hallo Ihr Lieben.

    Ich bin totaler Einsteiger in der Borland Welt. Aber ich komme von Visual C++ 🙂 Ich sag euch das Ding ist komplizierter als alles mögliche was ich jemand zum Theme programmierung gesehen hab. Ich hab mir 3 Bücher gekauft und bin trotzdem Einsteiger in der Visual C++ Welt von Microsoft. Ich dachte mir naja les nochmal Buch 4 durch dann klappts auch bestimmt. Nachdem ich den ganzen kwatsch der WinMain() kapiert habe sowie das hWnd Teil habe ich bei einem Freund sein C++ von Borland gesehen und da flog ich von den Socken erlich.

    Ich hab dann daraufhin folgendes gemacht. Wir haben uns das Ziel gesetzt ein einfaches Adressbuch zu programmieren in C++. Er in Borland c++ und ich halt in MVC++ und siehe da er war nach schlappen 9 Minuten fertig 😞 Und ich war noch beim Programmieren wie ein Irrer. Nun hab ich mir also auch Borland C++ 6 gekauft. Und ich kann es jeden nur weiterempfehlen. Naja soviel zu meinem Statement über die Entwicklungswerkzeuge. Aber eine Frage dazu hab ich noch die mich ein bischen beschäftigt. Wieso nennt Microsoft es Visual C++. Wo kann man es denn überhaupt per Visuellen Buttons benutzen? Hab bislang nur über MFC die Button gesehen bei blöden Diablo Boxen. Ist eigentlich egal wäre aber schön wenn ihr es mir mal erklären könntet.

    Kommen wir aber lieber zu meinem Grund für diesen Thread. Also ich möchte schon seit langer Zeit ein Spiel wie Westwoods Command & Conquer - Red Alert programmieren. Ich habe mit QBasic angefangen, dann hab ich PHP/Perl erlernt. Dann Delphi und dann bin ich zu Turbo C++ gekommen. Dann MVC++ und endlich hab ich zum Glück Borland C++ kennengelernt. Ich möchte einfach nur ein Command & Conquer programmieren. Daher häng ich Tag und fast auch n8 immer am PC am Tutorial lesen. Leider muß ich euch gestehen dass ich im momment null Ahnung von OpenGL sowie DirectX hab. Ich hab zum Glück auf ner Site die Komponennte für BC6 gefunden damit man OpenGL einbinden kann. Aber bislang hab ich keine Erfolge damit erzielen können. Ich verstehe nicht wiso er alles nur in der OnPaint Funktion zeigt. Aber wenn ich über OpenGL1->Onclick was machen will dann zeigt er das wieder nicht an 😞 Echt kompliziert. Vielleicht könnt ihr es mir ja so im groben mal erklären. Ich würde mich wirklich freuen. Naja erlich gesagt bin ich hier langsam am verzweifeln. Ich will doch nur ein Spiel programmieren. Wenn ich eine Engine (SDL z.B.) nehmen ist ja alles schön und toll aber eingebunden hab ich sie auch nicht bekommen. Wie gesagt bin BCB Anfänger im momment.

    Ihr kennt euch doch sicherlich aus. Was wäre in meinem Fall das beste. Soll ich lieber OpenGL oder doch DirectX lernen. Was ist einfacher zu erlernen. Und vielleicht habt ihr ja nen schönes Deutsches Tutorial für mich. Ich möchte euch schonmal 1000x Danken fürs durchlesen und bitte Antwortet. 😃



  • Hallo,

    hier ist ein schöner FAQ-Beitrag, der die dabei helfen kann einen Einstieg zu finden und dich für eine 3D-Api zu entscheiden.

    Mfg
    tuküe



  • Ich hab selbst schon DirectX9 auf BCB6 programmiert, doch egal ob du jetzt mit DirectX oder OpenGL arbeitest, das größte Problem ist immer die Optimierung. Du brauchst schon sehr gute Kenntnisse in C++, um ein Spiel zu programmieren, dass nicht sofort ruckelt. Außerdem bin ich der festen Überzeugung, dass man aus DirectX in der Version 9 viel mehr und bessere Effekte rausholen kann, als aus OpenGL. Dafür ist allein die Initialisierung bei DirectX schon so kompliziert, dass mir beim ersten mal auch der Spaß fast wieder vergangen wäre. Aber nach ein wenig Einarbeitungszeit kommt auch die Erfahrung, dann fällt vieles leichter.

    Doch dein Vorhaben ein Spiel wie C&C zu programmieren, würd ich lieber mal ganz schnell wieder vergessen. Ich glaube du hast absolut keine Ahnung wie viel Arbeit das ist. Ich hab sowas auch mal versucht und bin kläglich gescheitert, denn an so einem Spiel arbeiten mehrere 100 Leute.



  • Erst einmal ein großes Dankeschön für die Antworten.

    Also die FAQ hab ich mir durchgelesen.

    Zum Thema @El Barto kannst du mir vielleicht erklären wie ich solche DirectX Geschichten einbinden kann. (Wäre schön wenn es eine Kostenlose Komponennte dafür gäbe).

    Du hast wirklich recht El Barto. Bei C&C haben wirklich viele Mitarbeiten programmiert. Aber ich will ja nicht direkt C&C programmieren ich will einfach ein ganz simples C&C programmieren. Nur so zum erlernen :). Im momment programmier ich ein doofen Clone: Eine Mischung aus Space Invaders und einem Spiel wo man ein Raumschiff lenkt und durch zufall kommende Gegner abknallt. Naja nichts großes. Aufjedenfall würde mich das brennend interesieren El Barto wenn du mir ein bischen Tipps auf den Weg geben kannst oder wie schon gesagt DirectX komponnenten geben könntest.

    Vielleicht hab ich noch eine Frage für euch. Wie kann man Landschaften so wie in Diablo oder C&C mit der Maus sehen? Weil im momment ist es ja so. So groß wie mein Fenster ist ist auch meine Landschaft. Wie krieg ich es hin das man halt ein größeres Bild für die Landschaft erstellt und dann über die X-Y Achse Scrollen kann? 👍



  • Hi,

    wenn du ein Hintergrundbild, bzw. das Spielfeld scrollen möchtest, würde
    ich vorschlagen das diese Aufgabe von einem eigenen Thread erledigt wird.
    Ob dies nun per DX oder OpenGL geschieht oder nur per Canvas->CopyRec,
    ist das meines Erachtens eine gute Lösung.

    Um dir mal zu Zeigen wie in etwa sowas Aussehen kann, habe ich mal ein kleines
    Beispiel gemacht, versuch zu Verstehen was dort Passiert und progge dazu
    dein eigenen Bewegungsablauf.

    Hier kannst du es runterladen (und andere):
    Scroll.zip

    gruß Micha

    PS: Es ist nur auf der Schnelle Programmiert, daher Public-Variablen und
    keine Sicherheitsabfragen, es soll nur zur Veranschaulichung und Anregung
    dienen.



  • Ag3nt schrieb:

    Hallo Ihr Lieben.

    Ich bin totaler Einsteiger in der Borland Welt. .....

    Ich hab dann daraufhin folgendes gemacht. Wir haben uns das Ziel gesetzt ein einfaches Adressbuch zu programmieren in C++. Er in Borland c++ und ich halt in MVC++ und siehe da er war nach schlappen 9 Minuten fertig 😞 Und ich war noch beim Programmieren wie ein Irrer.

    Du bist also zum BCB umgestiegen, weil dein Kollege das Adressbuch schneller fertig hatte. Das ist ja schonmal kein Wunder, da der BCB ja eine RAD- Entwicklungsumgebung ist und damit snd solche kleinen Sachen eben einfach ruckzuck zusammengeklickt - das kannstdu aber nicht damit vergleichen, wenn du ein Spiel programmieren möchtest.

    Ich bin eigentlich der Überzeugung das du für diese Aufgabe mit VC++ von MS besser bedient wärst, nicht weil es mit dem BCB nicht geht, aber bevor du es als Anfänger geschaft hast DirectX bzw. OpenGL/SDL etc. entsprechend zum laufen zu bekommen hast du ganz schnell die Lust wieder verloren. Leider ist es nunmal so, das sich die meisten Tutorials auf VC++ beziehen.

    Da du nun aber schonmal bei BCB bist, versuche ich dir damit mal den Einstieg zu geben. Für den Anfang würde ich dir zur SDL raten, da die nunmal sehr simple ist und für deine Zwecke ausreichend.

    Dazu musst du dir erstmal auf libsdl.org (soweit ich mich entsinne) die DLL/Libs und Header Dateien downloaden.

    Dann eröffnest du eine Win32 Anwendung, in dieser fügst du die lib's zum Projekt hinzu und bindest die Headerdatei ein.
    Dann musst du noch in die Projektoptionen gehen und die Option: enum als int behandeln aktivieren.

    Falls dann noch Fehlermeldungen auftreten, was nicht unwahrscheinlich ist nochmal melden, da gibts noch ein paar besonderheiten wenn man die mit dem BCB verwendet über die ich am Anfang auch gestolpert bin.

    Wenn die SDL dann eingebunden ist gehst du am besten nach www.spieleentwickler-board.de , da gibts ein gutes Tutorial zum Einstieg.



  • Ich muß schon sagen ihr seid echt Klasse!

    Ich möchte mich ganz Herzlich bei euch beiden @promicha @Bigwill bedanken.

    @promicha:
    Vielen Dank für den Code. Ich werd mir den gleich mal ansehen und schauen wie du es gelöst hast. Ich freu mich wirklich über jede Hilfe die ich von euch bekommen kann.

    @Bigwill:
    Danke für den Tipp mit SDL. Ich hab in der Tat jede Menge Tutorials gefunden zum Thema SDL. Vielleicht finde ich ja noch eine Klasse für den CBuilder 6 damit ich es per Click einbinden kann 🙂

    Zum Thema Visual C++ kann ich dir folgendes Berichten. Also ich habe mir von der Bücherhalle früher 1 Buch ausgeliehen. Visual C++ 6 für Dumies. Ich hab das Buch bestimmt 2x durchgelesen. Dann hab ich gleichzeitig alle Tutorial 2x durchgearbeitet. Aber weißt du was ich an dem Visual C++ vermisse? Ganz einfach. Bei Borland läuft es ja so ab. Ich starte Borland C++ 6. Dann erstell ich ne neue Anwendung z.B. dann klick ich mir mein Fenster zusammen und proge dann mit C++ den Code zusammen. Und fertig ist das Programm (in windeseile :)). Vielleicht habt ihr ja den Anschein dass ich Visual c++ gleich schlecht geredet habe. Kann ja sein aber dem ist nicht so. Ich habe großen Respekt vor Visual C++ programmierern. Ich denke mal Borland ist für den Einstieg ideal. Visual C++ ist ebend für die C++ Gurus gedacht. Weil dort sieht es ja gleich wieder ganz anders aus. Wenn ich dort eine Anwendung programmieren möchte klick ich auf Neu -> Neue Win32 Anwendung -> Titel eingeben -> Verzeichnis eingeben und dann gibts nur nen Quellcode mit dem ich alles machen kann was ich will. Ich meine das ist mit sicherheit super für alle Profies in C++. Weil so können sie genau das Programmieren was sie wollen. Ich denke für Spieleprogrammierung eignet sich Visual C++ natürlich besser dazu. Weil wer klickt sich den Ein Spiel zusammen? Ne Anwendung ok aber kein Spiel. Deshalb mein ich ja Visual C++ ist schon ein Profi Werkzeug denn mit MFC kannste keine wirklich schnellen Spiele programmieren soweit ich gehört habe. Soviel zum Thema Visual C++ und BCB. Ich hoffe ihr versteht nun mein Feedback zu den beiden mächtigen IDEs 🙂 Schaut mal für Visual C++ gibts unmengen gute Tutorials -> siehe http://nehe.gamedev.net/ von GameDev.net. usw 🙂 Für Borland C++ hab ich bislang nur eine Site kennengelernt. Und dort wird leider nichts erklärt. Leider. Hier der Link: http://www.hellix.com/People/AGarny/OpenGL/ und hier bekommt ihr die Klasse bzw. Komponennte her: http://www.hellix.com/Products/TOpenGL.asp Vielleicht könnt ihr mir die Beispiele ein bischen näher erklären. Weil was bringen denn nur die Quellcodes wenn ich den Sinn nicht kapiere. Schaut mal ich hab es soweit gekriegt das Borland bei OpenGL::OnPaint ein Quadrat gepinselt hat 🙂 Mein erster Erfolg. Aber dann hab ich den selben code in ein OpenGl::OnClick ereigniss kopiert und dann die Farbe geändert von dem Quadrat aber er zeigte mir leider nichts an sobald man draufklickt. Vielleicht könnt ihr mir genau erklären wie das geht. Ich hab was von PipeLines gehört in OpenGL was hat es damit auf sich?

    PS: Nochmals 1000x Danke für alle Antworten und jede Hilfe 🙂



  • OnPaint() wird aufgerufen, wenn neugezeichnet werden soll, deshalb gehört deine Zeichenoperation dorthinein. Wenn du jetzt möchtest, das er bei Click zeichnet, packst du bei onClick nur einen Aufruf zum neuzeichnen rein.

    z.Bsp.:
    Code ist ausm Kopf, kann also sein, das irgendwas leicht anders geschrieben ist.

    void __fastcall Komponente::OnClick(TObjekt* Sender)
    {
      Komponente->Repaint();
    }
    

    Jetzt bringts das alleine natürlich nicht, weil dadurch das zeichnen ja immer in der gleichen Farbe wäre, also musst du im OnPaint() noch die Farbe durch eine Variable ersetzen un diese Variable je nach gewünschter Farbe z. Bsp. vorm Repaint() setzen/ändern.

    P.S.
    Die richtige Spieleentwicklung läuft unter BCB eigentlich genau wie unter VC++, nämlich im Endeffekt als reine Win32 Anwendung (wenns für Win ist) unter Ausschluss von VCL bzw. MFC. Was du das jetzt machst ist so ne Art zwischending, ist aber ganz in Ordnung so, habs auch so gemacht. 🙂



  • na dann bin ich ja beruhigt.

    Ich werde es gleich mal versuchen. Danke nochmals für die Hilfe. 🕶

    Habt ihr ein paar Tips zum Thema SDL für mich ???

    Gibt es vielleicht ein paar Komponennten dafür oder so ???



  • promicha schrieb:

    Hi,

    wenn du ein Hintergrundbild, bzw. das Spielfeld scrollen möchtest, würde
    ich vorschlagen das diese Aufgabe von einem eigenen Thread erledigt wird.
    Ob dies nun per DX oder OpenGL geschieht oder nur per Canvas->CopyRec,
    ist das meines Erachtens eine gute Lösung.

    Um dir mal zu Zeigen wie in etwa sowas Aussehen kann, habe ich mal ein kleines
    Beispiel gemacht, versuch zu Verstehen was dort Passiert und progge dazu
    dein eigenen Bewegungsablauf.

    Hier kannst du es runterladen (und andere):
    Scroll.zip

    gruß Micha

    PS: Es ist nur auf der Schnelle Programmiert, daher Public-Variablen und
    keine Sicherheitsabfragen, es soll nur zur Veranschaulichung und Anregung
    dienen.

    So habs mal getestet. Es macht leider nur ein Problem bei mir. Er zeigt kein Bild an. Ich habs auch schon mit dem Absoluten Pfad versucht klappt leider auch nicht. Hab ich was Falsch in den Optionen? Weil normalerweise muss ich immer den Absoluten Pfad eingeben. Hast du einen Tipp für mich.



  • Ä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


Log in to reply