hilfe für objektorientierte programmierung im c++builder



  • hallo

    folgendes:
    für die schule machen wir ein projekt, indem wir einen roboter basteln und den über ein einfaches anwenderprogramm ansteuern.
    vorerst ist da ein bildschirm vorhanden, in dem sich der roboter bewegt, wie
    er sich dann auch nach der signalübertragung bewegen soll.
    (mit einem panel und einem shape dargestellt)
    dazu muss ich beim shape noch eingeben, dass es am ende des panels wieder zum anfang springt usw.
    andererseits wollte ich noch bei den buttons einstellen, dass sie auch über die
    pfeiltasten zu erreichen sind.
    bei den buttons konnte ich noch nicht einstellen, dass sie beim anklickt-lassen den befehl immernoch ausführen..

    problem:
    ich dachte erst, ist doch ganz einfach, machste n'paar schleifen rein..
    doch irgendwie funktioniert das nicht so richtig..
    ich hoffe ihr erkennt mein problem und könnt mir dabei helfen 😉

    mfg
    wolfshuendchen



  • Dieser Thread wurde von Moderator/in rapso aus dem Forum Spiele-/Grafikprogrammierung in das Forum VCL (C++ Builder) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Hallo

    Ich hab jetzt deinen Post dreimal gelesen und noch immer nicht verstanden was du von uns wissen willst.
    Bitte erklär das nochmal, und zwar so das auch Leute das verstehen die dein Projekt nicht kennen. "Funktioniert nicht" ist dabei immer eine ganz schlechte Fehlerbeschreibung. Am besten ist immer ein Minimalbeispiel mit Code, das für uns hier in der eigenen Entwicklungsumgebung nachzuvollziehen ist.

    Und wenn du schon dabei bist denk dir bitte auch noch einen aussagekräftigen Titel für deinen Post aus (Beitrag editieren). "Hilfe im Builder" ist hier im Forum nicht sehr eindeutig!

    bis bald
    akari



  • ich schaff es nicht, schleifen in die button fastcalls einzutragen und weiss nicht wieso..

    also im sinne von:
    [code]
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    while(Button1Click==1)
    Shape1->Left++;
    }



  • Hallo

    Weil dein Code keinen Sinn ergibt. Und so einfach wie du dir das vorstellst wird das auch nicht klappen, der Click/MouseDown-Event werden jeweils nur einmal aufgerufen. Du müßtest in dem Event einen Timer oder gar Thread verwenden um zwischen MouseDown und MouseUp mehrere Positionsverschiebungen zu erlauben.

    Das dürfte den Aufwand aber nicht wert sein.

    bis bald
    akari



  • wie kann ich denn solche sachen definieren?
    ich kann ja die schleifen auch nicht im Form1 definieren?!
    wie soll ich denn am shape sagen, es soll am ende vom panel wieder an den anfang vom pannel?

    (das mit dem button, da scheint sich der aufwand wirklich nicht zu lohnen, das wäre dann einfach optimal gewesen ^^)

    aber könnt ich zum beispiel auf ein unterprogramm verweisen im fastcall bereich?



  • Hallo

    wolfshuendchen schrieb:

    wie kann ich denn solche sachen definieren?
    ich kann ja die schleifen auch nicht im Form1 definieren?!

    Du kannst Schleifen nur in Funktion definieren, nicht in "Form1".

    wie soll ich denn am shape sagen, es soll am ende vom panel wieder an den anfang vom pannel?

    Du must vor jeder Verschiebung nach rechts überprüfen ob Shape->Left + Shape->Width > Panel->Width. Wenn ja dann wird nicht nach rechts verschoben, sondern Left auf 0 gesetzt. Andere Richtung analog.

    aber könnt ich zum beispiel auf ein unterprogramm verweisen im fastcall bereich?

    Kommt drauf an was du mit Unterprogramm meinst. Du kannst aber natürlich aus jeder Button-Methode andere Funktionen aufrufen.

    bis bald
    akari



  • kein wunder hast du meine frage nicht verstanden am anfang, wenn man die schleifen einsetzen kann in den fastcall funktionen und in meinem fall.. die variablen falsch waren ô.O

    mit unterprogramm meinte ich so wie in c programmierung
    und nicht auf andere objekte des programms zuzugreifen ^^

    das mit dem rüberbeamen hat geklappt ^^

    übrigens vielen dank für die antwort,
    die eigentliche hauptfrage hat sich über umwege erledigt *breit grins*
    ist eben auch schwierig das ganze manchmal in text zu verfassen ^^'

    mfg wolfshuendchen



  • hallo zum zweiten 😉

    jetzt bin ich auf ein neues problem gestossen, und bin natürlich schon eine weile am suchen (auch durch das forum) aber bin leider nicht fündig geworden..

    kann man in der form einen button als z.B. pfeiltaste definieren?
    oder einen fastcall mit der pfeiltaste erstellen?
    wenn ja, wie?

    vielen dank schon im voraus ^^

    mfg
    wolfshuendchen

    folgendes hab ich ausprobiert (ihr seht 2 formen):

    ich hab diesen code am ende des programmes eingefügt, welches ich dann während
    ablauf einiger schleifen immerwieder wiederholen werden kann...
    nur leider findet mir das Programm Image1 nicht mehr, sonst würde das ganze eventuell funktionieren... sonst weiss ich eben auch keinen rat, bin aber offen für neues 😉
    das bild ist in einem panel, ob das wohl einen einfluss hat? 😕

    void testkbhit()
    {
       char c;
       if(kbhit())
       {
          c = getch(); // Muss auf keine Eingabe warten, Taste ist bereits gedrückt
          if(c==80)        //Cursor down
             Form1->Image1->Left=Image1->Left+Image1->Width;
          else if(c==75)   //Cursor left
             Image1->Left=Image1->Left+Image1->Width;
          else if(c==77)   //Cursor right
             Image1->Left=Image1->Left+Image1->Width;
          else if(c==72)   //Cursor up
             Image1->Left=Image1->Left+Image1->Width;
       }
    }
    


  • Hallo,

    dafür gibt es den OnKeyPress (OnKeyDown) - Event des Forms. Du kannst deinen Code fast genauso übernehmen. Nur solltest du anstelle der "Zahlen" die Virtual-Key Codes (hier) verwenden und "c" muss nicht mehr deklariert werden, dafür ist der Parameter "key" gegeben.

    Ist es Absicht dass das Image bei jeder Taste das gleiche macht?

    LG, Micha



  • toll ^^
    nur funktionierts immernoch nicht :S

    void __fastcall TForm1::kbhit(TObject *Sender, char &Key)
    {
          if(Key==VK_DOWN)        //Cursor down
             Image1->Left=Image1->Left+Image1->Width;
          else if(Key==VK_LEFT)   //Cursor left
             Image1->Left=Image1->Left+Image1->Width;
          else if(Key==VK_RIGHT)  //Cursor right
             Image1->Left=Image1->Left+Image1->Width;
          else if(Key==VK_UP)    //Cursor up
             Image1->Left=Image1->Left+Image1->Width;
    }
    

    und zwar ist das problem hier, dass zwischen den einzelnen buttons gewechselt wird, wenn ich auf eine pfeiltaste drücke :S
    kann ich irgendwo diese einstellung ändern?
    dann müsste das meiner meinung nach auch funktionieren ^^

    (und ne, die gehn dann alle in ne andere richtung, aber vorerst gehts hier ums
    prinzip ^^ )

    mfg
    wolfshuendchen



  • Setzte TabStop der Buttons auf false.
    Ohne es probiert zu haben... OnKeyPress? nicht eher OnKeyUp?



  • boah genial..
    das funktioniert ^^
    dankeschön an alle

    warum key up?
    finde das praktisch, wenn ich die taste gedrückt lassen kann und der
    roboter dann weiterfährt ^^



  • Also, wie befürchte, weil das ja immer der Fall ist mit den Schnittstellen, kann ich keine Verbindung mit der RS232 Schnittstelle herstellen...

    Ich hoffe darauf, dass sich einer von euch diesem Problem hier annimmt 😉
    also der Fehler, der im C-Builder angezeigt wird, sowie Änderungen, welche noch
    Folgen, stehen am Programmende als Kommentar.

    Vorerst wäre ich auch froh, wenn mir nur jemand sagen könnte, was in der Fehlerzeile nicht okay ist, bzw. wie es da richtig wäre 😉

    Aktueller Code (Stand 27.11.2008)
    
    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #pragma hdrstop
    
    #include "einfacheRoboteransteuerung.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    
    void ShowLastError(AnsiString where)
    {
       MessageBox(NULL, SysErrorMessage(GetLastError()).c_str(), where.c_str(), MB_OK|MB_ICONERROR);
    }
    
    HANDLE OpenComm (char* Port)    	     // Port öffnen
    {
       HANDLE hCom=CreateFile("COM1", GENERIC_READ|GENERIC_WRITE ,0,0,OPEN_EXISTING,0,0);  
          if (hCom == INVALID_HANDLE_VALUE)
             ShowLastError("CreateFile: "+AnsiString(Port));
          return(hCom);
    }
    
    void SetDCB(HANDLE hCom)
    {
       DCB dcb;                                  //Device Control Block
                                                 //(DCB ist ein Datebtyp)
       BOOL fSuccess = GetCommState(hCom &dcb);//DCB lesen
       if(!fSuccess)
          ShowLastError("GetCommState");
       dcb.BaudRate = 2400;                      //Baudrate=2400
    
    // (RS232 unter 2000Baud, in Praxis auch bei höherer Rate eine
    //  sichere Übertragung)
    
       dcb.ByteSize = 8;                         //8 Datenbits
       dcb.Parity = NOPARITY;                    //keine Parity (dient zur
                                                 //Übertragungsfehler-Überprüfung)
       dcb.StopBits = ONESTOPBIT;	        // 1Stopbit
    
    // SetCommState konfiguriert die serielle Schnittstelle
       fSuccess = SetCommState(hCom, &dcb);
       if(!fSuccess)
          ShowLastError("SetCommState");
    }
    
    int SendData(char Data[], int n)
    {
       DWORD NumberOfBytesWritten;               //Anzahl der gesendeten
                                                 //Bytes
       bool b=WriteFile ("COM1", Data, n, &NumberOfBytesWritten,0);
    
       if (!b)
          ShowLastError("WriteFile");
       return NumberOfBytesWritten;
    }
    
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::BbeendenClick(TObject *Sender)
    {
       Form1->Close();        
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::keyboard(TObject *Sender, WORD &Key,
          TShiftState Shift)
    {
          OpenComm("COM1");
    
          if(Key==VK_DOWN)                       //Cursor down
          {
             SendData("B",1);
             if(Image1->Top+Image1->Height > Panel1->Height-Image1->Height)
                Image1->Top=0;
             else
                Image1->Top=Image1->Top+Image1->Height;
          }
          else if(Key==VK_LEFT)                  //Cursor left
          {
             SendData("L",1);
             if(Image1->Left < Image1->Width)
                Image1->Left=768-Image1->Width;
             else
                Image1->Left=Image1->Left-Image1->Width;
          }
          else if(Key==VK_RIGHT)                 //Cursor right
          {
             SendData("R",1);
             if(Image1->Left+Image1->Width > Panel1->Width-Image1->Width)
                Image1->Left=0;
             else
                Image1->Left=Image1->Left+Image1->Width;
          }
          else if(Key==VK_UP)                    //Cursor up
          {
             SendData("F",1);
             if(Image1->Top < Image1->Height)
                Image1->Top=784-Image1->Height;
             else
                Image1->Top=Image1->Top-Image1->Height;
          }
    
          CloseHandle("COM1");
    }
    //---------------------------------------------------------------------------
    
    //Fehlermeldung:
    //Zeile 29: illegal use of pointer
    
    //Änderungen:
    // nur einmal klicken und der Roboter läuft
    // Roboter stoppen mit z.B Space...
    // SendData(S,1);
    

    ahja.. wir übertragen auch kein Stopbit...
    aber weder NULSTOPBIT, noch NULLSTOPBIT, noch ZEROSTOPBIT, NOSTOPBIT oder NONESTOPBIT wird akzeptiert ô.O

    und ich denke einige von euch werden noch mehr fehler finden..
    sitze schon den ganzen tag daran und weiss, dass da sogar einige variablen
    fehlen können, wobei nicht mehr fehlermeldungen kamen ô.O

    und bin wirklich froh um jede hilfe, projektabgabetermin rückt immer näher ^^

    mfg
    wolfshuendchen



  • also gut...
    in der zeile 29 fehlte glücklicherweise nur ein komma

    und man muss mind. 1 stopbit haben, könnte aber auch zwei...

    danke 😉

    aber mal im ernst.. vielleicht könnt ihr mir beim nächsten problem helfen..

    jetzt kann ich das programm compilieren und es zeigt mir alles an und egal auf welche pfeiltaste ich drücke kommt folgendes Fehlermeldung:
    (Writefile)
    Das Handle ist ungültig.

    und verweist mir dabei auf die allerletzte Zeile, wo nur die Klammer ist }

    was da wer, was da falsch ist? ^^



  • Vllt solltest Du Dir das Handle merken was Du in OpenComm() erhälst und dieses zum Schließen in CloseHandle verwenden, nicht den String.



  • ergibt sinn...
    das programm liefert ja auch einen wert zurück, der nirgens gespeichert wird..!

    danke versuch ich mal ^^



  • das handle ist weiterhin ungültig :S
    aber immerhin stürzt das programm nicht gleich ab, sondern das roboterlein im bildschirm bewegt sich dann noch, wenn ich "ok" bestätigt habe ô.O



  • so, folgendes hab ich heute herausgefunden...
    dank dem hyper-terminal weiss ich, dass
    das programm den COM 1 öffnet.
    mit dem Oszilloskop ausgemessen ergab sich, dass das programm leider noch nichts sendet!
    Die Fehlermeldung, dass das Handle ungültig ist, erscheint aber auch, bevor sich das Bild auf dem Bildschirm bewegt, was mich etwas verwirrt...
    das heisst dann auch, dass die Fehlermeldung vor dem Senden der Daten auftaucht
    (aber das Programm läuft danach weiter ^^ )

    kann mir wirklich niemand helfen? 😉


Anmelden zum Antworten