Fehler?!?



  • HI @ ALL

    ich hab mal wieda ein anliegen .. undzwar programmier ich grad an etwas eigenartigem ^^.. also fragt bitte nicht was des werden soll aba für die dies intressiert: einfach posten dann könnt ihrs haben wenns fertig is ^^.. aba mein problem: angenommen hab ich ein bild .. das kann ich per Button (also 4 für jede richtung) mit den befehlen

    //also des sin di everschiedenen button
    void __fastcall TForm1::RunterClick(TObject *Sender)
            bild->Top=bild->Top+10;
    void __fastcall TForm1::HochClick(TObject *Sender)
            bild->Top=bild->Top-10;
    void __fastcall TForm1::LinksClick(TObject *Sender)
            bild->Left=bild->Left-10;
    void __fastcall TForm1::RechtsClick(TObject *Sender)
            bild->Left=bild->Left+10;
    

    bewegen.. funktioniert

    nun will ich das aber per tastendruck machen .. ich weiß ich bin noch anfänger aba kann mir einer meinen fehler raus machen oda erklären wies funktioniern könnte? ich hab itz folgendes:

    //---------------------------------------------------------------------------
    
    // plz nr auf den andren scheiß achten ^^
    
    #include <vcl.h>
    #include <conio.h>
    #include <stdio.h>
    
    #pragma hdrstop
    
    #include "Unit1.h"
    #include "Unit2.h"
    #include "Unit3.h"
    #include "Unit4.h"
    #include "Unit5.h"
    
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    int huehnchenbild=4;
    bool gebissen;
    char c ;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    fliege1->Left=Image4->Left;
    fliege1->Top=Image4->Top-8;
    fliege1->Visible=false;
    
    // und hier komm ich ne weiter .. wieso funktioniert des ne?!?
    
    c=getch();
    while(c=='s'||c=='S')
    {
            bild->Top=bild->Top+10;
    }
    while(c=='w'||c=='W')
    {
            bild->Top=bild->Top-10;
    }
    while(c=='a'||c=='A')
    {
            bild->Left=bild->Left-10;
    }
    while(c=='d'||c=='D')
    {
            bild->Left=bild->Left+10;
    }
    
    }
    //---------------------------------------------------------------------------
    

    a wenn ich am ende der while noch n getchar rein mach gehts net .. wie soll ich des nu anstelln? oda noch bessa wär per pfeiltasten..

    mfg heiden



  • Wenn du die Funktion getchar() in der bb Hilfe nachschlägst wirst du darin folgendes finden "Note: Do not use this function in Win32 GUI applications.". Die Funktion ist für deine Zwecke also ungeeignet.
    Weil du keine genauen Angaben zu deinem Projekt gemacht hast kann ich nur raten was du sonst noch auf deiner Form hast.
    Solltest du nur das Bild darauf haben könntest du diesen code benutzen:

    void __fastcall TForm1::FormKeyDown(TObject *Sender, WORD &Key,
          TShiftState Shift)
    {
     if(Key == VK_LEFT)
        bild->Left -= 10;
     if(Key == VK_RIGHT)
        bild->Left += 10;
     if(Key == VK_UP)
        bild->Top -= 10;
     if(Key == VK_DOWN)
        bild->Top += 10;
    }
    

    Solltest du aber z.B. auch ein Edit feld benutzen würde dieser code nichts funktionieren weil die Form dafür den Fokus haben muss.
    Wenn das der Fall ist könnten dir z.B. Hooks weiterhelfen. Es gibt bestimmt auch noch andere Wege an dein Ziel zu kommen aber ich bin selbst noch ein Anfänger und mehr fällt mir im Moment leider nicht ein.

    mfg

    Tsurai



  • jo des könnte klappen ^^.. nur in welcher header stehtn "KEY"?

    wenn ich das kompilier kommt:
    [C++ Error] Unit1.cpp(29): E2451 Undefined symbol 'Key'

    klingt nach ner fehlender header ^^ .. ich hab grad gegooglet .. nur leider find ich unter:

    "key" + "msdn" und key msdn nur illegale seiten die mir alles mögliche an serials andrehn wolln ^^..



  • Key ist ein Parameter der automatisch an die Funktion übergeben wird wie du in Zeile #1 des codes sehen kannst. Du solltest schon das Event OnKeyPress der Form benutzen dann bekommst du Key auch ganz normal als Parameter geliefert.



  • hä? ^^.. sry aba wie gesaht ich bin anfänger ^^.. kannst du des ma erklärn? ^^



  • aahhh ^^.. itz kann ich mich a endlich mal einlogen ^^.. naja ega .. also kannst du mir des ma erklärn bzw. des glei ma einbinden?



  • Die Form hat verschiedene Events auf die sie reagieren kann wie z.B. onClick, onShow, onClose usw. Immer wenn das entsprechende Event passiert wird die dazugehörige Funktion ausgelöst.
    Bei einem Tastendruck auf der Form wird dann z.B. das Event onKeyPress ausgelöst und damit die Funktion

    void __fastcall TForm1::FormKeyPress(TObject *Sender, char &Key)
    {
     //Alles was hier steht wird bei einem Tastendruck auf der Form ausgeführt
    }
    

    Hinter dem :: steht auf welches Event sich die Funktion bezieht, gefolgt von den Parametern die dieser übergeben werden. Wie du sehen kannst ist einer dieser Parameter Key. Aus dem kannst du dann wie vorher gezeigt auslesen welche Taste denn nun eigentlich gedrückt wurde und dementsprechend darauf reagieren.

    Welche Events ein Objekt alle hat kannst du im Object Inspector sehen wenn du den Reiter "Events" wählst. Dort kannst du auch mit einem doppelklick auf ein Event dir automatisch die Grundstruktur der Funktion (siehe code) automatisch generieren lassen.

    Dein code müsste also dann so aussehen:

    #include <vcl.h>
    #include <conio.h>
    #include <stdio.h>
    
    #pragma hdrstop
    
    #include "Unit1.h"
    #include "Unit2.h"
    #include "Unit3.h"
    #include "Unit4.h"
    #include "Unit5.h"
    
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    int huehnchenbild=4;
    bool gebissen;
    char c ;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    fliege1->Left=Image4->Left;
    fliege1->Top=Image4->Top-8;
    fliege1->Visible=false;
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::FormKeyDown(TObject *Sender, WORD &Key,
          TShiftState Shift)
    {
     if(Key == VK_LEFT)
        bild->Left -= 10;
     if(Key == VK_RIGHT)
        bild->Left += 10;
     if(Key == VK_UP)
        bild->Top -= 10;
     if(Key == VK_DOWN)
        bild->Top += 10;
    }
    //---------------------------------------------------------------------------
    

    Ich hoffe das ich dir alles einigermaßen gut erklären konnte.

    mfg

    Tsurai



  • jo also sry wenn ich nerv aba ich hab des itz so (wobei "bild" zu "huehnchen" geworden is ^^):

    //---------------------------------------------------------------------------
    #include <vcl.h>
    #include <conio.h>
    #include <stdio.h>
    
    #pragma hdrstop
    
    #include "Unit1.h"
    #include "Unit2.h"
    #include "Unit3.h"
    #include "Unit4.h"
    #include "Unit5.h"
    
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    int huehnchenbild=4;
    bool gebissen;
    char c ;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    fliege1->Left=Image4->Left;
    fliege1->Top=Image4->Top-8;
    fliege1->Visible=false;
    }
    
    //---------------------------------------------------------------------------
    void __fastcall TForm1::FormKeyDown(TObject *Sender, WORD &Key,TShiftState Shift)
    {
     if(Key == VK_LEFT)
    huehnchen->Left=huehnchen->Left-10;
     if(Key == VK_RIGHT)
    huehnchen->Left=huehnchen->Left+10;
     if(Key == VK_UP)
    huehnchen->Top=huehnchen->Top-10;
     if(Key == VK_DOWN)
    huehnchen->Top=huehnchen->Top+10;
    }
    //---------------------------------------------------------------------------
    

    nur wenn ich das kompiliern will kommt:

    [C++ Error] Unit1.cpp(33): E2316 '_fastcall TForm1::FormKeyDown(TObject *,unsigned short &,TShiftState)' is not a member of 'TForm1'

    wo liegt itz mei fehler? ich schötz mal da fehlt itz ne definirung oda ne einbindung oda sowas.. also wie wenn ich ne 2. form einbinden will des "<Unit2.h>" oda so ... also nochma: ich bin noch der ziemliche anfänger ^^.. und ma so btw: wo lernst du programmiern? weil wenn du sahst du bist noch "anfänger" dann gehst du schu ziemlich ab ^^.. also per buch oda wie? wenn jo welche(s)?



  • aso .. also wie gesaht ich denk mal das muss mit in die form oda in die header .. die form haste ja und hier is die header:

    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <StdCtrls.hpp>
    #include <Forms.hpp>
    #include <ExtCtrls.hpp>
    #include <Graphics.hpp>
    #include <Menus.hpp>
    //---------------------------------------------------------------------------
    class TForm1 : public TForm
    {
    __published:	// Von der IDE verwaltete Komponenten
            TImage *Image1;
            TButton *Hoch;
            TButton *Runter;
            TButton *Links;
            TButton *Rechts;
            TImage *huehnchen;
            TMainMenu *MainMenu1;
            TMenuItem *sas1;
            TMenuItem *gauf;
            TMenuItem *Beenden1;
            TLabel *Laune;
            TImage *Image3;
            TLabel *Label1;
            TLabel *Label2;
            TLabel *Label3;
            TMenuItem *Optionen1;
            TMenuItem *Hilfe1;
            TMenuItem *Hilfe2;
            TMenuItem *Version1;
            TMenuItem *Updates1;
            TImage *Image2;
            TButton *biss;
            TButton *Button1;
            TImage *Image4;
            TTimer *Timer3;
            TTimer *Timer1;
            TImage *fliege1;
            void __fastcall HochClick(TObject *Sender);
            void __fastcall RunterClick(TObject *Sender);
            void __fastcall RechtsClick(TObject *Sender);
            void __fastcall LinksClick(TObject *Sender);
            void __fastcall Beenden1Click(TObject *Sender);
            void __fastcall gaufClick(TObject *Sender);
            void __fastcall Hilfe2Click(TObject *Sender);
            void __fastcall Version1Click(TObject *Sender);
            void __fastcall Optionen1Click(TObject *Sender);
            void __fastcall bissClick(TObject *Sender);
            void __fastcall Button1Click(TObject *Sender);
            void __fastcall Timer3Timer(TObject *Sender);
            void __fastcall Timer1Timer(TObject *Sender);
    
    private:	// Anwenderdeklarationen
    public:		// Anwenderdeklarationen
            __fastcall TForm1(TComponent* Owner);
    };
    //---------------------------------------------------------------------------
    extern PACKAGE TForm1 *Form1;
    //---------------------------------------------------------------------------
    


  • das stimmt das muß auch in den Header, allerdings macht das der BCB selbst, zumindest wenn mans richtig macht:

    klick auf dein Formular, dann im Objektinspektor auf Ereignisse (also das Tab neben Eigenschaften) und dort Doppelklick auf das leere Feld neben OnKeyDown, schon legt der BCB im Header und in der Cpp einen entsprechenden Funktionskopf an



  • Tut mir leid, ich hatte den Header ganz vergessen weil ich daran gewöhnt bin das der bcb das selbst macht wenn man halt die von Linnea und mir beschriebenen Schritte folgt.
    In deinem Fall müsste der header dann so aussehen:

    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <StdCtrls.hpp>
    #include <Forms.hpp>
    #include <ExtCtrls.hpp>
    #include <Graphics.hpp>
    #include <Menus.hpp>
    //---------------------------------------------------------------------------
    class TForm1 : public TForm
    {
    __published:    // Von der IDE verwaltete Komponenten
            TImage *Image1;
            TButton *Hoch;
            TButton *Runter;
            TButton *Links;
            TButton *Rechts;
            TImage *huehnchen;
            TMainMenu *MainMenu1;
            TMenuItem *sas1;
            TMenuItem *gauf;
            TMenuItem *Beenden1;
            TLabel *Laune;
            TImage *Image3;
            TLabel *Label1;
            TLabel *Label2;
            TLabel *Label3;
            TMenuItem *Optionen1;
            TMenuItem *Hilfe1;
            TMenuItem *Hilfe2;
            TMenuItem *Version1;
            TMenuItem *Updates1;
            TImage *Image2;
            TButton *biss;
            TButton *Button1;
            TImage *Image4;
            TTimer *Timer3;
            TTimer *Timer1;
            TImage *fliege1;
            void __fastcall HochClick(TObject *Sender);
            void __fastcall RunterClick(TObject *Sender);
            void __fastcall RechtsClick(TObject *Sender);
            void __fastcall LinksClick(TObject *Sender);
            void __fastcall Beenden1Click(TObject *Sender);
            void __fastcall gaufClick(TObject *Sender);
            void __fastcall Hilfe2Click(TObject *Sender);
            void __fastcall Version1Click(TObject *Sender);
            void __fastcall Optionen1Click(TObject *Sender);
            void __fastcall bissClick(TObject *Sender);
            void __fastcall Button1Click(TObject *Sender);
            void __fastcall Timer3Timer(TObject *Sender);
            void __fastcall Timer1Timer(TObject *Sender);
            void __fastcall FormKeyPress(TObject *Sender, char &Key);
    
    private:    // Anwenderdeklarationen
    public:        // Anwenderdeklarationen
            __fastcall TForm1(TComponent* Owner);
    };
    //---------------------------------------------------------------------------
    extern PACKAGE TForm1 *Form1;
    //---------------------------------------------------------------------------
    


  • Sieht so aus, als bräuchtest du auch Hilfe bezüglich deutscher Rechtschreibung...



  • @_DocShoe_

    weil?

    @Tsurai

    k alles kla danke .. nur nu nochma: wie lernst du des? also ich hab noch keine richtig geile methode gefunden (außer in foren weil de da viel erklärt kriegst) wo de mal richtig geil lern kannst .. zumal du meinst du bist anfänger ^^ ..
    naja aba ich hab des itz so drin:

    //---------------------------------------------------------------------------
    #include <vcl.h>
    #include <conio.h>
    #include <stdio.h>
    
    #pragma hdrstop
    
    #include "Unit1.h"
    #include "Unit2.h"
    #include "Unit3.h"
    #include "Unit4.h"
    #include "Unit5.h"
    
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    int huehnchenbild=4;
    bool gebissen;
    char c ;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    fliege1->Left=Image4->Left;
    fliege1->Top=Image4->Top-8;
    fliege1->Visible=false;
    }
    
    //--------------------------------------------------------------------------
    
    void __fastcall TForm1::FormKeyDown(TObject *Sender, WORD &Key,
          TShiftState Shift)
    {
    if(Key == VK_LEFT)
    huehnchen->Left=huehnchen->Left-10;
     if(Key == VK_RIGHT)
    huehnchen->Left=huehnchen->Left+10;
     if(Key == VK_UP)
    huehnchen->Top=huehnchen->Top-10;
     if(Key == VK_DOWN)
    huehnchen->Top=huehnchen->Top+10;
    }
    //---------------------------------------------------------------------------
    

    und so in der header:

    //---------------------------------------------------------------------------
    #ifndef Unit1H
    #define Unit1H
    //---------------------------------------------------------------------------
    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <StdCtrls.hpp>
    #include <Forms.hpp>
    #include <ExtCtrls.hpp>
    #include <Graphics.hpp>
    #include <Menus.hpp>
    //---------------------------------------------------------------------------
    class TForm1 : public TForm
    {
    __published:	// Von der IDE verwaltete Komponenten
            TImage *Image1;
            TButton *Hoch;
            TButton *Runter;
            TButton *Links;
            TButton *Rechts;
            TImage *huehnchen;
            TMainMenu *MainMenu1;
            TMenuItem *sas1;
            TMenuItem *gauf;
            TMenuItem *Beenden1;
            TLabel *Laune;
            TImage *Image3;
            TLabel *Label1;
            TLabel *Label2;
            TLabel *Label3;
            TMenuItem *Optionen1;
            TMenuItem *Hilfe1;
            TMenuItem *Hilfe2;
            TMenuItem *Version1;
            TMenuItem *Updates1;
            TImage *Image2;
            TButton *biss;
            TButton *Button1;
            TImage *Image4;
            TTimer *Timer3;
            TTimer *Timer1;
            TImage *fliege1;
            void __fastcall HochClick(TObject *Sender);
            void __fastcall RunterClick(TObject *Sender);
            void __fastcall RechtsClick(TObject *Sender);
            void __fastcall LinksClick(TObject *Sender);
            void __fastcall Beenden1Click(TObject *Sender);
            void __fastcall gaufClick(TObject *Sender);
            void __fastcall Hilfe2Click(TObject *Sender);
            void __fastcall Version1Click(TObject *Sender);
            void __fastcall Optionen1Click(TObject *Sender);
            void __fastcall bissClick(TObject *Sender);
            void __fastcall Button1Click(TObject *Sender);
            void __fastcall Timer3Timer(TObject *Sender);
            void __fastcall Timer1Timer(TObject *Sender);
            void __fastcall FormKeyDown(TObject *Sender, WORD &Key,
              TShiftState Shift);
    
    private:	// Anwenderdeklarationen
    public:		// Anwenderdeklarationen
            __fastcall TForm1(TComponent* Owner);
    };
    //---------------------------------------------------------------------------
    extern PACKAGE TForm1 *Form1;
    //---------------------------------------------------------------------------
    #endif
    

    nur wenn ich das kompilier (fehlerfrei), das aufgeht und ich die pfeiltasten drück wechselt der imma nur die markierung von den button die ich drin hab .. also wie wenn ich auf [TAB] drücken würde .. ich habs mit onkeypress und onkeydown versucht .. klappt ne.. dann hab ich spaßeshalber ma die buttons raus genomm.. nur leider bewegt sich das bild immanoch ne hoch und runna .. 😞



  • heiden schrieb:

    k alles kla danke .. nur nu nochma: wie lernst du des? also ich hab noch keine richtig geile methode gefunden (außer in foren weil de da viel erklärt kriegst) wo de mal richtig geil lern kannst .. zumal du meinst du bist anfänger ^^ ..

    Programmieren habe ich in der 8. Klasse im Informatik Kurs angefangen zu lernen. Damals aber mit VB und der Lehrer war ziehmlich schlecht. Erst vor 3 Jahre habe ich auf der Berufsschule auf der ich mein Fachabitur und eine Ausbildung zum Informationstechnischen Assistenten gemacht habe mit C/C++ angefangen. Wobei ich sagen muss das ich Zuhause in meiner Freizeit sehr viel aus Spaß programmiert habe.
    Eine sehr große Hilfe war das Buch "Borland C++ Builder 5 Grundlagen (ISBN: 3-9806738-4-7)". Solltest du dir mal angucken, besonders weil es sich auch direkt auf den Borland Builder bezieht. Außerdem bietet dieses Forum auch sehr gute Tutorials an:
    http://www.c-plusplus.net/cms/modules.php?op=modload&name=Downloads&file=index

    Ich bezeichne mich als Anfänger weil ich im Vergleich zu den meisten in diesem Forum ein wirklich kleines Wissen über Programmierung habe. Außerdem ist C/C++ so umfangreich das man nie alles perfekt können kann.

    Und nun zurück zu deinem Problem. Wie ich bereits vorher gesagt habe wird dieser Weg nur funktionieren wenn auf der Form nichts anderes als das Bild ist, bzw nichts was der Form in direkten Fokus nehmen könnte.
    Als Alternative könntest du Hooks benutzen mit denen du Tastendrücke systemweit abfangen kannst. Also auch wenn du mehrere Forms hast usw. Das ist wiederum etwas kompliziert. Wie das genau geht kannst du in diesem Thread lesen:
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-39145.html



  • aso jo ok .. naja des wird aba grad bissl kompliziert ^^.. naja ich gucks mir mal an und versuchs das ma .. wenn ichs ma getestet hab meld ich mich auf jeden fall nochma!! aba auf jeden fall danke erstma für alles !!!


Anmelden zum Antworten