hilfe für objektorientierte programmierung im c++builder
-
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 :Svoid __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 allewarum 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 ô.Ound 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 ô.Ound 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 kommaund 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?