TEdit-Arrays und OnChange()



  • Hallo,
    ich lege zwei gleichgroße TEdit-Arrays zur Laufzeit an.
    Nun möchte ich, wenn in ein Edit "edSatz[i]" des ersten Arrays etwas eingetippt wird, dass in dem Edit mit dem gleichen Index "edUmsatz[i]" des zweiten Arrays etwas ausgerechnet wird, z.B.: edUmsatz[i].Text = edSatz[i].Text * 70 (ohne Typumwandlungen).
    Wie kann ich ein OnChange-Ereignis schreiben, in dem beide miteinander kommunizieren können?

    Danke,

    Thomas



  • Im OnChange des "edSatz[i]"

    edUmsatz[i].Text = edSatz[i].Text * 70 mit Typenumwandlung -> mit Text (String) kann man nicht rechnen

    Wie kann ich ein OnChange-Ereignis schreiben, in dem beide miteinander kommunizieren können?

    Sehe jetzt nicht, dass beide kommunizieren müsssen.

    Sollten sie das doch müssen (beide OnChange zugleich aktiv) dann musst du in den jeweiligen OnChange Ereignissen das andere solange tot legen (auf Null setzen) sonst gibt's ärger



  • Ja, ich weiß, dass man Typumwandlung braucht, habe sie aber weggelassen, um es kurz zu fassen.
    Mein Problem ist jetzt, dass immer wenn "i = TEdit(Sender).Tag" ausgeführt wird, i=0 rauskommt. Ich benutze das hier als OnChange()-Ereignis:

    void __fastcall TfrmControl::Edit1Change(TObject *Sender)
    {
         float fSatz;
         int i = TEdit(Sender).Tag;
         AnsiString sEdit = edSatz[i]->Text;
    
         if (sEdit != "")
         {
              try
              {
    
                  fSatz = StrToFloat(sEdit);
                  if (fSatz > 0)
                  {
                     float fHours = StrToFloat(lblTime[TEdit(Sender).Tag]->Caption);
                     AnsiString sUmsatz = FloatToStr(fHours * fSatz);
                     edSum[TEdit(Sender).Tag]->Text = sUmsatz;
                  }
              }
              catch (Exception &E)
              {
              }
         }
    }
    

    Definiert und erzeugt werden die TEdit und TLabel Arrays so:

    DynamicArray<TLabel*>lblProj;
    DynamicArray<TLabel*>lblTime;
    DynamicArray<TEdit*>edSatz;
    DynamicArray<TEdit*>edSum;
    
    void __fastcall TfrmControl::FormShow(TObject *Sender)
    {
        TADODataSet * ds = DB->dsRepProjects;
        AnsiString sql = TIMEENTRIES_SELECT_REP_PROJ_EMPLOYEE;
    
        // Zuerst Daten aus der Datenbank laden
        try
        {
            int i = 0;
            ds->Active=false;
            ds->CommandText = sql;
            ds->Parameters->Items[i++]->Value = pDT->TruncDay( DateFrom );
            ds->Parameters->Items[i++]->Value = pDT->TruncDay( DateTo ) + TDateTime(1);
            ds->Parameters->Items[i++]->Value = PersonalNumber;
            ds->Active = true;
        }
        catch ( Exception &E )
        {
            ShowMessage( E.Message );
        }
    
        // ==>HIER WERDEN DIE ARRAYS GEFÜLLT!!!<==
        int iLength = ds->RecordCount;
        try
        {
            int i = 0;
            if (iLength > 0)
            {
                lblProj.Length = iLength;
                lblTime.Length = iLength;
                edSatz.Length = iLength;
                edSum.Length = iLength;
            }
            while (!ds->Eof)
            {
                lblProj[i] = new TLabel(this);
                lblProj[i]->Parent = this;
                lblProj[i]->Caption = ds->FieldByName("ProjectNumber")->AsString;
                lblProj[i]->Top = 32 * i + 56;
                lblProj[i]->Left = 8;
                lblProj[i]->Tag = i;
                lblProj[i]->Show();
    
                lblTime[i] = new TLabel(this);
                lblTime[i]->Parent = this;
                lblTime[i]->Caption = ds->FieldByName("Expr1002")->AsString;
                lblTime[i]->Top = 32 * i + 56;
                lblTime[i]->Left = 120;
                lblTime[i]->Tag = i;
                lblTime[i]->Show();
    
                edSatz[i] = new TEdit(this);
                edSatz[i]->Parent = this;
                edSatz[i]->Text = "";
                edSatz[i]->Top = 32 * i + 48;
                edSatz[i]->Left = 240;
                edSatz[i]->Width = 73;
                edSatz[i]->Tag = i;
                edSatz[i]->Show();
                edSatz[i]->OnChange = Edit1Change;
    
                edSum[i] = new TEdit(this);
                edSum[i]->Parent = this;
                edSum[i]->Text = "";
                edSum[i]->Top = 32 * i + 48;
                edSum[i]->Left = 360;
                edSum[i]->Width = 81;
                edSum[i]->Tag = i;
                edSum[i]->Show();
    
                i++;
                ds->Next();
            }
        }
        catch ( Exception &E )
        {
            ShowMessage( E.Message );
        }
    }
    

    Die Tags werden in FormShow() erfolgreich aus gefüllt, dennoch gibt es den Fehler im OnChange()-Ereignis.
    Sieht jemand meinen Fehler? Wieso ist das Tag jedes Edits, das OnChange() auslöst gleich 0? Ich vermute das liegt an "TEdit(Sender).Tag".

    Danke, Thomas 🙂



  • Hallo

    int x = TEdit(Sender).Tag // falsch
    int y = static_cast<TEdit*>(Sender)->Tag // richtig
    

    bis bald
    akari



  • Viel Dank, Akari. 🙂


Anmelden zum Antworten