Zwei Werte aus Buttons entnehmen



  • //Elektronegativitätswerte (nach Pauling)-----------------------------------
    double EN[7][7]={2.2,0,0,0,0,0,0,
    0.98,1.57,2.04,2.55,3.04,3.44,3.98,
    0.93,1.31,1.61,1.9,2.19,2.58,3.16,
    0.82,1,1.81,2.01,2.18,2.55,2.96,
    0.82,0.95,1.78,1.96,2.05,2.1,2.66,
    0.79,0.89,1.8,1.8,1.9,2,2.2,
    0.7,0.9,0,0,0,0,0};
    

    Du erstellst ein mehrdimensionales Array,füllst das zweite aber nciht mit werten.Du hast außerdem nur Platz für 7 Doubles in deinem Array und nicht mehr.



  • Hallo

    Zum eigentlichen Problem : Du must dir eben mit einer Membervariable merken in welchem Status du grade bist. Beispiel

    // Headerdatei des Forms :
    class TForm1 :
    {
      ...
      private :
        int Status; // Variable für Status
        float Wert1; // Speichert den Wert der zuletzt ausgewählt wurde
    };
    
    // Implementationsdatei des Forms
    
    // Konstruktor des Forms
    __fastcall TForm1::TForm1(...)
    {  
      Status = 0; // Anfangsstatus
    }
    
    // Methode für alle Buttons
    void __fastcall TForm1::ButtonClick(...)
    {
      float Wert2; // Der zweite Wert, hier reicht lokal
    
      // Wenn Ausgangsstatus oder vorher der zweite Button gedrückt, 
      // Wert in das erste Label schreiben und auf ersten Status setzen
      if (Status == 0 || Status == 2)
      {
        Status = 1;
        Label1->Caption = ...;
        Wert1 = ...;
        Label2->Caption = "";
        LabelErgebnis->Caption = "";
        return;
      }
    
      // Wenn vorher der erste Button gedrückt, ... und Ergebnis
      // berechnen und anzeigen
      if (Status == 1)
      {
        Status = 2;
        Label2->Caption = ...;
        Wert2 = ...;
    
        float Ergebnis = Berechne(Wert1, Wert2);
        LabelErgebnis->Caption = Ergebnis;
      }
    
    }
    

    /Edit : Fehler korrigiert

    bis bald
    akari



  • storage schrieb:

    //Elektronegativitätswerte (nach Pauling)-----------------------------------
    double EN[7][7]={2.2,0,0,0,0,0,0,
    0.98,1.57,2.04,2.55,3.04,3.44,3.98,
    0.93,1.31,1.61,1.9,2.19,2.58,3.16,
    0.82,1,1.81,2.01,2.18,2.55,2.96,
    0.82,0.95,1.78,1.96,2.05,2.1,2.66,
    0.79,0.89,1.8,1.8,1.9,2,2.2,
    0.7,0.9,0,0,0,0,0};
    

    Du erstellst ein mehrdimensionales Array,füllst das zweite aber nciht mit werten.Du hast außerdem nur Platz für 7 Doubles in deinem Array und nicht mehr.

    sollte eigentl. stimmen? wenn ich z.b. einen wert noch mehr einfüge, dann kommt, dass es zuviele Werte sind. Wie sol ich sonst zweidimensionale Arrays mit Werten füllen?

    @akari: erstmal VIELEN dank, manche sachen versteh ich aber nicht ganz..

    headerdatei hab ich och nie gmacht, also hab ich einfach mal die Variablen Status und Wert1 global deklariert.

    Konstruktor hatte ich auch nie, also ebenfalls global auf 0 gesetzt (bereits in der deklaration)

    eine frage hab ich noch: kann ich die speicherung der werte auch in eine extra funktion machen? weil wenn ich die 2 bedingungen jeweils pro button schreibe, wird das extrem unübersichtlich für 38 buttons ^^



  • so isses besser:

    //Elektronegativitätswerte (nach Pauling)----------------------------------- 
    double EN[7][7]={
    {2.2,0,0,0,0,0,0}, 
    {0.98,1.57,2.04,2.55,3.04,3.44,3.98}, 
    {0.93,1.31,1.61,1.9,2.19,2.58,3.16}, 
    {0.82,1,1.81,2.01,2.18,2.55,2.96}, 
    {0.82,0.95,1.78,1.96,2.05,2.1,2.66}, 
    {0.79,0.89,1.8,1.8,1.9,2,2.2}, 
    {0.7,0.9,0,0,0,0,0}
    };
    


  • Hallo

    headerdatei hab ich och nie gmacht, also hab ich einfach mal die Variablen Status und Wert1 global deklariert.

    Konstruktor hatte ich auch nie, also ebenfalls global auf 0 gesetzt (bereits in der deklaration)

    Damit solltest du dich aber bald beschäftigen, den ohne die Grundlagen von OOP kommst du im Builder nicht weit.

    eine frage hab ich noch: kann ich die speicherung der werte auch in eine extra funktion machen? weil wenn ich die 2 bedingungen jeweils pro button schreibe, wird das extrem unübersichtlich für 38 buttons ^^

    Mein Beispielcode ist bereits darauf ausgelegt, das nur genau eine OnClick-Methode für alle Buttons verwendet wird. Alles was du noch tun must ist in der OnClick-methode den Button zu identizifizeren und dementsprechend den Wert aus dem Array EN auswählen. Dazu kannst du am einfachsten die Tag-Eigenschaft der Buttons verwenden. Wie das genau geht steht in der FAQ, Abschnitt Komponenten benutzen.

    bis bald
    akari



  • naja ich hatte es in der Schule noch nicht, also muss ich es nicht können 😃

    ich versteh es immernoch nicht trotz FAQ, geht das nicht mit einer funktion, die ich bei jedem button reinschreibe, dass die ausführt werden soll und jeweils den ENwert übergibt?



  • Mach Dir eine Klasse die bei ButtonClick ausgelöst wird und eine Kennung des Button bekommt:

    void __fastcall TForm1::ButtonIndex(int row,int col)
    {
       DeineSpeicherVariable=EN[row][col];
       //was hier sonst noch passieren soll..
    }
    

    Im Header mußt Du die Klasse angeben:

    __published:	// Von der IDE verwaltete Komponenten
            void __fastcall ButtonIndex(int row,int col);
    

    und dann jedem Button den Index row und column mitgeben:
    z.B.

    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    ButtonIndex(2,3);
    }
    

    Gruß myerscola



  • ButtonIndex ist keine Klasse, sondern nur eine Memberfunktion deiner Formklasse.



  • ok die Verwirrung ist nun perfekt ^^

    gibt es nichts einfacher mit der form, dass ich bei jedem button OnClick z.b. enspeicherung(EN[..][..]);
    schreibe und dann die speicherung in ne extra funktion?
    wie gesagt hatte bis jetzt nur einfache funktionen wie berechnungen, eingaben,ausgaben,arrays, if und schleifen



  • Hallo

    @ myerscola : Das ist Quatsch, dann braucht man ja wieder für jeden Button eine Methode.

    @dragon1990 : Das Prinzip Viele Buttons - Eine Eventmethode habe ich doch schon im meinem letzten Post erklärt. "Versteh ich nicht" ist aber nicht hilfreich für uns.

    bis bald
    akari



  • ich geh mal davon aus du meinst diesen Thread:

    http://www.c-plusplus.net/forum/viewtopic-var-t-is-39210.html

    da steht folgender Befehl:

    dynamic_cast<TButton*>(Sender)->Name

    Problem: ich weiss weder was mit Sender, noch mit Name gemeint ist, und ob der rest so bleibt oder auch inviduell angepasst werden muss



  • Hallo

    ich weiss weder was mit Sender

    Dann schau dir mal die Parameter des OnClick-Events an

    noch mit Name gemeint ist

    Schau dir mal die Eigenschaften eines TButton an.

    oder auch inviduell angepasst werden muss

    Ja du must das anpassen. Denn du willst nicht den Namen sondern den Tag des Buttons

    bis bald
    akari



  • wie gesagt wie sind noch nicht sehr in die tiefe gegangen.. OnClick-Events nicht wirklich besprochen sondern nur benutzt

    Eigenschaften hat ein Button ja viele

    Tag steht bei jedem Button irgendwie 0..



  • Hallo

    Du sollst ja auch die Tag-Eigenschaft der Buttons zur Entwurfszeit auf einen entsprechenden, eindeutigen Wert setzen so das du zur Laufzeit mit dem Auslesen der Tag-Eigenschaft herausfinden kannst welcher Button den OnClick-Event ausgelöst hat.

    Nimms mir nicht übel aber du hast einen schlechten Lehrer. Einen Anfanger gleich mit OOP-GUIs arbeiten zu lassen ist ungefähr so wie einen Nichtschwimmer bei Sturm ins Meer zu werfen.

    bis bald
    akari



  • habs jetzt doch geschafft selbst zu lösen, 2 Fragen hab ich noch
    1. Frage:

    ich lese einige Werte aus Labels aus mit StrToFloat(Edit1->Text);
    ich kenn den befehl noch StrToInt(Edit1->Text,0);
    so dass, falls ein buchstabe eingegeben wird (was ja kein gültiger Integer wert ist), das Programm automatisch 0 einsetzt und es nicht abstürzt. Laut Hilfe gibt es das bei Float aber nicht mit ,0 .. gibt es das garnicht oder nur in einer anderen Form?

    2. Frage:

    Kann ich die Anzahl von Dezimalen beschränken?



  • Hallo

    dragon1990 schrieb:

    habs jetzt doch geschafft selbst zu lösen, 2 Fragen hab ich noch
    1. Frage:

    ich lese einige Werte aus Labels aus mit StrToFloat(Edit1->Text);
    ich kenn den befehl noch StrToInt(Edit1->Text,0);
    so dass, falls ein buchstabe eingegeben wird (was ja kein gültiger Integer wert ist), das Programm automatisch 0 einsetzt und es nicht abstürzt. Laut Hilfe gibt es das bei Float aber nicht mit ,0 .. gibt es das garnicht oder nur in einer anderen Form?

    Du meinst wohl StrToIntDef.
    StrToFloatDef gibts ab dem BCB 6. In vorherigen Version must du mit StrToFloat und try-catch arbeiten

    2. Frage:

    Kann ich die Anzahl von Dezimalen beschränken?

    Mit float nicht. Das geht nur und ist auch nur bei Eingabe/Ausgabe sinnvoll.
    Bei der Eingabe könntest du vor StrToFloat mit den passenden AnsiString-Methoden überprüfen wieviele Zeichen nach dem ',' kommen und entsprechend reagieren.
    Bei der Ausgabe kannst du ein spezielles Ausgabeformat mit FloatToStrF und Konsorten angeben.

    /Edit : Da das allerdings mit dem ursprünglichem Thema nichts mehr zu tun hat schließe ich hier. Wenn du nach dem sorgfältigem Lesen der BCB-Hilfe noch Fragen hast dann mach bitte einen neuen Thread auf.

    bis bald
    akari


Anmelden zum Antworten