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 helfenmfg
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
wolfshuendchenfolgendes 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 :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?