Problem mit Objekt- Eigenschaften und Pointer



  • hallo,

    @Alexander Sulfrian: "Du weist der Text-Eigenschaft der Var einen Text zu!"

    wo wird bitte der text zugewiesen?

    also ich denke das ich weiß woran das liegt, erstens:

    void __fastcall TForm1::Button1Click(Sender)
      {
      TEdit Edit1 = new TEdit (this);  //Edit1 wird dynamisch erzeugt
      Edit1->Visible = false;
      }
    

    ist das falsch, denn es müsste so heissen: TEdit* Edit1 = new TEdit(this);
    da du es aber wohl dennoch kompilieren konntest und in Button2Click:

    void __fastcall TForm1::Button2Click(Sender)
      {
      delete Edit1;
      }
    

    auf das Object Edit1 zugreifen kannst, das eigentlich NUR in Button1Click sichtbar sein dürfte, vermute ich, das du in der Form-klasse nochmal eine deklaration der art TEdit* Edit1; vorgenommen hast. ansonsten würde sich das dingens gar nicht übersetzen lassen!!!

    was es mit der "methode" Test auf sich hat, sei mal dahingestellt, aber es werden garantiert keinerlei Zeiger verbogen, wenn du einfach eine der TEdit deklarationen entfernst (am besten die in Button1Click) dann sollte sich dein problem gelöst haben...

    mfg
    murph



  • Hallo zusammen,

    erstmal danke ich euch für eure Hilfen,
    Ich denke, dass ich mein Problem vielleicht etwas undeutlich formuliert habe.

    Das Edit- Objekt ist eine public deklarierte Variable TEdit *Edit1;

    Dieses Edit1 initialisiere ich mit dem Button1Click.

    Danach weise ich Edit1->Visible = true aus einer anderen Methode zu. (Methode eine selbstgeschriebene Klasse).

    Am Schluss entferne ich das Objekt mit delete in der Methode Button2Click.
    Und hier passiert dann die Zugriffsverletzung.



  • Hallo,

    Hast du im Debugger mal überprüft, ob Button2Click nicht vielleicht vorher schon mal aufgerufen wird und du somit dann später versuchst eine schon gelöschte Variable zu löschen ? Ich hab hier bei mir festgestellt, dass OnClick Funktionen nicht unbedingt immer nur durch ein Mausklick ausgelöst werden. Zur Not kannst du nach dem Löschen Edit1 ja mal auf NULL setzen.

    Ciao



  • Original erstellt von maam:
    Ich denke, dass ich mein Problem vielleicht etwas undeutlich formuliert habe.

    Allerdings! Wenn du schlicht und einfach falschen bzw. unvollständigen Quellcode lieferst ist es schwer dir zu helfen.

    Dieses Edit1 initialisiere ich mit dem Button1Click.
    Nein, so initialisierst du das richtig:

    void __fastcall TForm1::Button1Click(Sender)
    { Edit1 = new TEdit(this);  //Edit1 wird dynamisch erzeugt
      Edit1->Visible = false;
    }
    
    wobei im Headerfile z.b. im public-Bereich (wie du es ja wolltest) stehen muss:
    TEdit *Edit1;
    


  • Also mir kommt es etwas sinnlos vor...

    Wenn du das Edit-Feld dynamisch erzeugst, wieso legst du dann noch einen Zeiger im Header auf das Feld an???

    1.Schmeiss das TEdit* Edit1 aus deinem Header raus
    2.Leg das Feld mit TEdit* Edit1 = new TEdit(this); an

    Ops.... Flosko's Posting garnicht gesehen...

    vor allem geh ich jetzt erstmal nen Kaffee trinken... *in Tastatur beiss*
    Dat war nen Anfängerfehler :o

    -- obiges Posting ist sinnlos und vor allem falsch --

    [ Dieser Beitrag wurde am 17.06.2003 um 10:15 Uhr von MikeSPK editiert. ]



  • Original erstellt von MikeSPK:
    **
    2.Leg das Feld mit TEdit* Edit1 = new TEdit(this); an
    **

    und wie soll er's dann in einer anderen Methode löschen? (Sichtbarkeitsbereich)

    andere möglichkeit wäre, das Edit^1 lokal anzulegen und als Owner eine andere Komponente (z.b. Form1) zu übergeben. Dann wird auch Edit1 mit Form1 korrekt gelöscht,. nur ein Löschen zur laufzeit ist dann nicht mehr möglich...



  • Danke flosko für deine Hilfe,

    die Sache mit dem

    das Edit^1 lokal anzulegen und als Owner eine andere Komponente (z.b. Form1) zu übergeben

    habe ich probiert und funkioniert, aber leider möchte ich
    dieses Edit1 auch zur Laufzeit löschen können, und nicht erst, wenn das Form1 gelöscht wird.



  • zum dynamischen erstellen von Komponenten findest du auch was in der FAQ,...

    also als Beispiel: nimm ein leeres Form, knall 2 Buttons drauf, deklariere dir im Header in der (z.B.) public-Section einen Zeiger

    TEdit *Edit1;
    

    dann erzeigst du mit dem einen Button ein Edit und kannst es mit dem anderen wieder löschen:

    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
       Edit1 = new TEdit(Form1);
       Edit1->Parent = Form1;
       Edit1->Left = 100;           // Koordinaten am Form
       Edit1->Top = 10;
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::Button2Click(TObject *Sender)
    {
       delete Edit1;
    }
    

    falls du Edit1 nicht löscht, wird es automatisch bei zerstörung des Owners g(hier Form1) gelöscht.

    alles klar soweit?



  • hallo flosko,

    Soweit funktioniert es prima.
    Wenn ich nun die Eigenschaft Visible von Edit1 über diese Methode Test(von eigener Klasse)
    ändern möchte und dann versuche das Edit1 wieder zu löschen, !Fehler!!!!



  • warum machst du dann des TEdit nicht zum Member deiner eigenen klasse, wenn du darauf zugreifen willst?



  • kann ich so pauschal nicht nachvollziehen.

    Wie erzeugst du das Test-Objekt deiner eigenen Klasse Versuch? Welche Methoden hat sie sonst noch und wie/wo wird diese benutzt?
    poste einfach mal den kompletten Quellcode des Projekts (wqenns ned allzu viel ist)... (ich nehme mal an, du hast das problem in einem kleinen Testprojekt weitestgehen isoliert)


Anmelden zum Antworten