Zeiger auf Edit->Text



  • Hallo,

    Wiso funktioniert das hier nicht!?

    bool __fastcall TForm_Tastatur::ShowTastatur(String *Taste)
    {
         ShowModal();
    
    //    if(!Abbrechen)
         *Taste = E_Eingabe->Text; 
    
        return Abbrechen;
    }
    
    void __fastcall TForm_Main::E_StueckzahlDblClick(TObject *Sender)
    {
    
      Form_Tastatur->ShowTastatur(&(E_Stueckzahl->Text));  //<-- Da kommt nichts zurück
    
    }
    
    // So funktioniert es
    
    void __fastcall TForm_Main::E_StueckzahlDblClick(TObject *Sender)
    {
    
      String test;
      Form_Tastatur->ShowTastatur(&test);
      E_Stueckzahl->Text=test;
    
    }
    

    Was stimmt da mit meinen Zeiger nicht!?



  • Hallo,

    TCustomEdit->Text ist vom Typ AnsiString, du erstellst jedoch einen Zeiger auf String in der Show-Methode... Eventuell kommt es dabei zu Problemen in der nicht-funktionierenden Variante!? Du kannst es ja mal mit einem Zeiger auf AnsiString probieren.
    In der funktionierenden Variante weist du den Inhalt des String-Objekt direkt zu, ich könnte mir vorstellen, dass das automatisch in den richtigen Typ konvertiert wird.

    MfG



  • Ist es nicht einfacher, den String einfach zurückzugeben? Falls der Benutzer keine Eingabe gemacht hat oder das Tastaturformular mit ESC beendet kann ein leerer String zurückgegeben werden.
    Wenn das nicht geht solltest du eine Referenz auf einen String übergeben oder den übergebenen String Zeiger wenigstens gegen 0 prüfen, damit du immer ein gültiges Objekt hast.



  • Die Eigenschaft Text von TCustomEdit ist eine Property (siehe Hilfe falls nicht bekannt) und nicht einfach eine Membervariable. Du kannst weder eine Referenz noch einen Zeiger darauf bekommen, weil intern dort Zugriffsfunktionen aufgerufen werden.
    Wozu soll das Ganze überhaupt gut sein?



  • Braunstein schrieb:

    Die Eigenschaft Text von TCustomEdit ist eine Property [...]. Du kannst weder eine Referenz noch einen Zeiger darauf bekommen, weil intern dort Zugriffsfunktionen aufgerufen werden.

    Ach ja, ich wusste doch: es hat einen Grund, warum ich sowas

    AnsiString *pEdt->Text= &Edit1->Text;
    

    noch nicht gemacht habe... hätt ich mal noch 3 Minuten länger überlegt... 🙄

    @JBOpael:
    Wenn du das unbedingt so machen möchtest, kannst du einen Zeiger auf die Komponente erstellen:

    bool __fastcall TForm_Tastatur::ShowTastatur(TEdit *pEdt)
    {
        ShowModal();
    //  if(!Abbrechen)
        pEdt->Text= E_Eingabe->Text; 
        return Abbrechen;
    }
    
    void __fastcall TForm_Main::E_StueckzahlDblClick(TObject *Sender)
    {
        Form_Tastatur->ShowTastatur(&E_Stueckzahl);
    }
    

    Das müsste eigentlich funktionieren...

    Edit: Wegen der Frage, wozu das gut sein soll: Das frag' ich mich auch... Du kannst doch TForm_Main in TForm_Tastatur bekannt machen und dann aus einer Form_Tastatur-Methode heraus, per Form_Main->E_Stueckzahl->Text, direkt mit dem Edit arbeiten...!?

    MfG



  • Danke für eure Hinweise,

    Das ganze ist ein Num Feld für die Bedienung eines Touch panels ohne Tastatur.
    Ich wollte dieses Fenster so allgemein wie möglich halten damit ich diese Form auch in anderen Anwendungen nutzen kann.

    damit ich weiß ob auf Abbrechen oder OK gedrückt wurde, habe ich das als rückgabewert genutzt. Wenn auf Abbrechen gerdrückt wird soll sich auch der aktuelle String im Edit nicht ändern.

    Ich denk mal das es am einfachsten ist wie Kolumbus das geschrieben hat, indem ich TEdit übergebe.

    Nochmals danke für eure Hilfe.



  • JBOpael schrieb:

    [...]
    Ich wollte dieses Fenster so allgemein wie möglich halten damit ich diese Form auch in anderen Anwendungen nutzen kann.

    damit ich weiß ob auf Abbrechen oder OK gedrückt wurde, habe ich das als rückgabewert genutzt. Wenn auf Abbrechen gerdrückt wird soll sich auch der aktuelle String im Edit nicht ändern. [...]

    Unter diesen Umständen würde ich, mit meinem momentanen Kenntnisstand, eventuell das Formular Form_Tastatur dynamisch erstellen und als Member in Form_Tastatur einen Zeiger auf TEdit. Dann den Konstruktur von Form_Tastatur überladen und so beim Erstellen von Form_Tastatur den Zeiger initialisieren. Dann brauchst du aus einem beliebigen Main_Form nur Form_Tastatur instanziieren, dabei die Adresse vom Edit übergeben und mit ShowModal() die Tastatur einblenden. Alle Angaben ohne Gewähr!
    Nur so als Anregung...

    MfG



  • Wenn du das als universelle Komponente benutzen möchtest würde ich kein TEdit als Parameter übergeben, sondern die Eingabe als member des Formulars realisieren. Was ist denn, wenn du irgendwann ein Memo oder ein TListView Element beschriften willst? Mit einem AnsiString bist du da immer auf der sicheren Seite (bei CG2009 UnicodeString).

    Die beste Lösung imho ist folgende:

    class TFormVirtualKeyboard : public TForm
    {
      // den ganzen __published Kram lasse ich mal weg, Annahme ist, dass
      // das Formular ein eigenes TEdit besitzt, in dem der Text angezeigt wird
      TEdit* Edit;
    
    public:
      TFormVirtualKeyboard( TComponent* Owner );
    
      __property AnsiString Text = { read=get_text, write=set_text };
    
    private:
      AnsiString get_text() const
      {
         // aktuellen Text aus Edit zurückgeben
         return Edit->Text;
      }
    
      void set_text( const AnsiString& NewText )
      {
         // neuen Text setzen
         Edit->Text = NewText;
      }
    };
    
    // Benutzung
    void __fastcall TMainForm::OnClickBtnKeyboard
    {
       // Text für Keyboard setzen
       FormKeyboard->Text = Edit->Text;
       if( mrOk == FormKeyBoard->ShowModal() )
       {   
          // Text aus FormKeyboard übernehmen
          Edit->Text = FormKeyboard->Text:
       }
    }
    


  • _DocShoe_'s Variante ist natürlich viel universeller => Empfehlung! Hab' ich gleich auch noch was gelernt 👍



  • DocShoe schrieb:

    Mit einem AnsiString bist du da immer auf der sicheren Seite (bei CG2009 UnicodeString).

    Und wenn man einfach String benutzt, ist man in jedem Falle richtig 😉


Log in to reply