Problem mit Rectangle und Variabeln
-
Hallo zusammen,
ich habe folgendes Problem: Ich versuche ein mit Rectangle gezeichnetes Rechteck über den Bildschirm laufen zu lassen. Dabei gibt es leider ein paar Probleme mit Variabeln. Ich habe insgesamt zwei Units. In der zweiten (ich habe sie Methodendeklaration genannt)habe ich folgende Methoden vereinbart:Methodendeklaration.cpp
void __fastcall TAmpel::SetForm () { ... Form1->Canvas->Rectangle(x,y,x+Dicke,y+Dicke);// x=10 y=250 Dicke = 80 // Hier wird das Rechteckt gezeichnet. Die Werte für x,y,Dicke sollen aus der Klasseninitialisierung in FormCreate genommen werden. } //--------------------------------------------------------------------------- void __fastcall TAmpel::Car (int velocity) { TRect Quelle, Ziel; for (int i=x-1; i<Form1->ClientWidth; i++) //Hier wird das Viereck über das Formular bewegt. { Quelle = Rect(i,y-1,i+Dicke+1,y+Dicke+1); Ziel = Rect(i+1,y-1,i+Dicke+2,y+Dicke+1); Form1->Canvas->CopyRect(Ziel, Form1->Canvas, Quelle); Sleep (velocity); //Mit velocity beschreibe ich die Geschwindigkeit des Vierecks } }
In Unit1.cpp steht folgendes:
/--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- __fastcall TAmpel::TAmpel (int xx, int yy, int dicke) : TObject () { x=xx; y=yy= Dicke=dicke; } //--------------------------------------------------------------------------- __fastcall TAmpel::~TAmpel (void) { } //--------------------------------------------------------------------------- void __fastcall TForm1::FormCreate(TObject *Sender) { Ampel1 = new TAmpel(10,250,80); //Hier werden die nötigen Werte für x,y,Dicke definiert Ampel1->SetForm(); } //--------------------------------------------------------------------------- void __fastcall TForm1::Button2Click(TObject *Sender) { Ampel1->Car(10); }
1.) Nun ist das erste Problem, dass das Rechteck nicht gezeichnet wird. Dies sollte ja in mit der FormCreate - Methode passieren (--> SetForm). Nur wenn ich beispielsweise einen Button einfüge und in die ButtonClick-Methode SetForm einfüge, dann wird das Dreieck gezeichnet.
2.) Außerdem gibt bei den Variabeln x,y, Dicke Probleme. Das Rechteck wird nämlich irgendwie an einer anderen Position gezeichnet. Wenn ich nämlich einfach direkt die Werte einsetze, dann funktioniert, aber
das ist ja nicht gerade die beste Lösung.Kann mir jemand sagen, warum das rechteck nicht mit der FormCreate - Methode gezeichnet wird, und warum es Probleme mit den Variabeln x,y und Dicke gibt?
Vielen Dank für eure Hilfe
lg, freakC++
-
Zeichne das ganze im OnShow() Event der Form. Oder du zeichnest alles in ein TImage welches du auf der Form hast, dann kannst du es auch weiterhin im OnCreate() machen. Es ist deswegen nix zu sehen, da die Form sich beim anzeigen neu zeichnet und deine Canvasdinge einfach übermalt.
MfG
-
Hallo,
zu deiner 1. Frage: ich vermute das Problem ist einfach, dass FormCreate nicht die richtige Stelle für deinen Code ist... wenn FormCreate ausgeführt wird, ist das entsprechende Formular noch garnicht auf dem Bildschirm zu sehen, möchte ich meinen...
BCB-Hilfe schrieb:
[...]
Wenn ein Formular erzeugt wird und seine Eigenschaft Visible auf true gesetzt ist, werden die folgenden Ereignisse in der angegebenen Reihenfolge ausgelöst:1. OnCreate
2. OnShow
3. OnActivate
4. OnPaintVielleicht SetForm() mal im Paint() oder Show() ausführen!?! (kannst ja ein bisschen experimentieren)
zu deiner 2. Frage: rechne x, y und Dicke mal für deine Schleife Schritt für Schritt per Hand durch, vielleicht siehst du dann das Problem... Oder schau dir die Schleife im Debugger an...
MfG
Edit: war auch schonma schneller...
-
ist vielleicht ein Rechtschreibfehler, aber
__fastcall TAmpel::TAmpel (int xx, int yy, int dicke) : TObject () { x=xx; y=yy= Dicke=dicke; } //---------------------------------------------------------------------------
soll sicherlich
__fastcall TAmpel::TAmpel (int xx, int yy, int dicke) : TObject () { x=xx; y=yy; Dicke=dicke; } //---------------------------------------------------------------------------
sein, oder?
Bei der oberen Version wäre y = dicke...greetz KN4CK3R
-
Manchmal glaube ich, er will uns testen...
-
hallo zuasmmen,
ich glaube ich habe hiermit einen ziemlich sinnlosen Thread eröffnet (Selbsterkenntnis ist die beste Erkenntnis), da das Problem wirklich im KOnstruktor von TAmpel lag.....oh man!Naja, das Problem war einfach das der Compiler nicht herumgemekcert hat und ich daher ich auch keinerlei Fehlermeldungen erhalten habe. Deswegen habe ich es nciht gesehen....
@Kolumbus: Ich euch testen....ich denke, dass ich genau meinen Wissenstand einschätzen könnt...also ich nun wirklich (noch) kein Profi...daher wage ich es nicht euch zu testen....
Aber ich arbeite an mir
Vielen Dank trotzdem
lg, freakC++
-
freakC++ schrieb:
Naja, das Problem war einfach das der Compiler nicht herumgemekcert hat und ich daher ich auch keinerlei Fehlermeldungen erhalten habe. Deswegen habe ich es nciht gesehen....
Nein, eher das du dir bestimmte Sachen vielleicht gar nicht angewöhnen solltes (sowas wie mehrere Anweisungen in eine Zeile schreiben), zudem solltest du auch mal an deinem Einrückstil etc. arbeiten... (Von Verwendung der Initialisierungslisten ganz abgesehen).
-
ich verwende diesen "Einrückstil", damit es übersichtlicher bleibt....was ist daran negativ? Ich habe diesen Stil aus einem Lehrbuch übernommen, was natürlich nicht heißt, dass dieser gut ist....
Vielen Dank
lg, freakC++
-
Wenn du nur ein Zeichen einrückst sieht das für meine Begriffe nicht sonderlich übersichtlich aus.
Außerdem schreibst du mehrere befehle in eine Zeile. Auch das fördert nicht gerade die Übersichtlichkeit.
-
freakC++ schrieb:
@Kolumbus: Ich euch testen....ich denke, dass ich genau meinen Wissenstand einschätzen könnt...also ich nun wirklich (noch) kein Profi...daher wage ich es nicht euch zu testen....
Auch wenn du noch kein Profi bist weisst du meiner Ansicht nach schon länger dass es einen Debugger gibt und man einen Programmabschnitt damit mal im Schrittbetrieb durchgehen kann... Meiner Meinung nach hättest du den Fehler so selbst gefunden! Ich weiß aber auch, dass die Realität manchmal anders aussieht und man den Wald vor Bäumen nicht sieht (nicht weiß wo man anfangen soll zu suchen). Deshalb habe ich dir spaßeshalber mal Absicht unterstellt...