Übergabe Variable an Anzeige



  • Hallo ihr,

    kleiner Fortschritt zu vermelden: Ich kann die Eingabe jetzt einlesen, und einer Variablen zuordnen. Im Objektinspektor hatte ich den Value gefunden und habe

    zahl = ZahlEdit -> Value;
    

    eingegeben. Jetzt konnte ich zahl auch als int deklarieren, vorher nur als bool 😮 😮

    Über das Auswertefenster kann ich mir "zahl" jetzt auch ansehen, scheint also zu funktionieren 🙂 🙂

    Nun die nächste Hürde: Wie bekomme ich "zahl" als Wert in meine Anzeige rein?

    void__fastcall TTest_Anzeige::VrAngularMeter1Change (TObject *Sender)
    {
    .......
    }
    

    TTest_Anzeige ist mein Dateiname, VrAngularMeter1 meine Anzeige. Soweit ist mir das klar. Aus der Headerdatei der Anzeige werde ich nicht wirklich schlau. Die Eingangsvariabe heißt scheinbar "Vrangularmeter1" und kann z.B. als INT oder DOUBLE deklariert werden. Wenn ich dieser einen festen Wert zuordne, wird alles brav kompiliert, aber die Anzeige bleibt auf 0.

    Ideen?

    Schon mal vielen Dank für eure Hilfe. Ich finde es toll, dass es so ein tolles Forum gibt. Ohne euch hätte ich die Brocken schon wieder in die Ecke geschmissen 🤡 🤡

    Gruß

    Uwe



  • Vrangularmeter1 ist dein Objekt.Value ist die Eigenschaft.
    Meinst du das ?

    Vrangularmeter1->Value = zahl;
    


  • Ich sehe gerade das du das wohl im OnChange des "VrAngularMeter" hast.
    Das Event wird aber wie der Name schon sagt, nur aufgerufen, wenn sich die Anzeige verändert(Also an anderer Stelle mit Werten gefüttert wird).

    Also meinetwegen beim auslösen eines Clicks auf einen TButton

    void__fastcall TTest_Anzeige::Button1OnClick (TObject *Sender)
    {
       Vrangularmeter1->Value = zahl;
    }
    


  • Pfadfinder schrieb:

    Vrangularmeter1 ist dein Objekt.Value ist die Eigenschaft.
    Meinst du das ?

    Vrangularmeter1->Value = zahl;
    

    Ja, das meine ich, aber der Compiler bricht mit Meldung
    "Zeiger auf Struktur auf linker Seite von -> oder von ->* erforderlich".

    void__fastcall TTest_Anzeige::VrAngularMeter1Change (TObject *Sender)
    {
    int Vrangularmeter1;
    Vrangularmeter1 -> Value = zahl;
    }
    

    Was ist daran noch falsch?

    Gruß

    Uwe



  • Was soll denn die Deklaration

    int Vrangularmeter1;
    

    Vrangularmeter1 ist doch schon dein Objekt.
    Das ist auch deiner TForm bekannt.
    Also den Teil einfach weglassen.



  • void__fastcall TTest_Anzeige::VrAngularMeter1Change (TObject *Sender)
    

    Und das ist das falsche Event.



  • Hallo,

    ich habe es jetzt zwischen 2 Funktionen gesetzt und die Deklaration weggelassen.

    Die vorherige Meldung ist verschwunden, dafür kommt jetzt:
    "Fehler in der Deklarationssystax"

    😕 😕

    Uwe



  • Ich habe jetzt mal ein minimal Beispiel:

    Du brauchst:
    1 TEdit
    1 TLabel
    2 TButton
    und 1 TVrAngularMeter
    alles auf die Form ziehen.
    Den beiden Buttons weist du folgende OnClick Events zu :

    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
       VrAngularMeter1->Position = StrToIntDef(Edit1->Text,0);
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button2Click(TObject *Sender)
    {
       Label1->Caption = IntToStr(VrAngularMeter1->Position);
    }
    

    Beim Klick auf Button1 kommt dann der Wert der Eingabe in das VrAngularMeter und beim Klick auf Button2 kommt der Wert von VrAngularMeter in das Label.

    Normalerweise verwendet man aber so eine Anzeige auch nur dazu wofür sie eigentlich gedacht ist: Zur Anzeige.
    Die Werte speicherst du dir z.B. in deiner Klasse mit der du z.B. auf deinen RS232 zugreifst.



  • Ach sehe gerade TVrAngularMeter Position erwartet einen double.
    Also StrToFloatDef() und FloatToStr().



  • Hallo Pfadfinder,

    Danke für deine unendliche Geduld 👍 👍

    Dieses Beispiel hat fast funktioniert 🙂
    Es gab noch Stress mit StrToFloatDef(). Das hat bei mir nicht hin gehauen.

    Folgender Code tut seinen Dienst:

    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
       VrAngularMeter1->Position = StrToIntDef(Edit1->Text,0);
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button2Click(TObject *Sender)
    {
       Label1->Caption = FloatToStr(VrAngularMeter1->Position);
    }
    

    Wenn ich das jetzt richtig verstehe:
    - Der Anzeige muss "Position" übergeben werden
    - Der String aus dem Edit1 wird in eine INT gewandelt (Was bedeutet die 0 in der KKlammer??)
    - Dem Label wird die Position übergeben, vorher aber wieder in einen String gewandelt.

    Korrekt verstanden?

    Warum meckert der Compiler rum, wenn ich StrToFloat und FloatToStr verwende?

    Gruß

    Uwe



  • Hallo,

    die ,0 ist der default-Wert ->deswegen StrToIntDef, dieser Wert wird übergeben wenn sich der eigentliche Wert nicht in einen Integer konvertieren läßt.
    Mit StrToInt hast Du halt nur Ganzzahlen zur Verfügung, ich weiß ja nicht ob das reicht oder Du genauere Werte anzeigen willst.
    Was heißt Compiler meckert, nach Ziege wird er nicht klingen :-), poste doch mal sein Gemecker als Text.

    Gruß myerscola



  • 😃
    Nix Ziege, nur "plong". 🕶
    Meldung:
    "Aufruf einer undefinierten Funktion StrToFloatDef"

    Das mit der 0 ist mir jetzt klar. Danke.

    Gruß
    Uwe



  • Hallo

    StrToFloatDef gibt es im Gegensatz zu StrToFloat erst ab BCB6.

    bis bald
    akari



  • akari schrieb:

    Hallo

    StrToFloatDef gibt es im Gegensatz zu StrToFloat erst ab BCB6.

    bis bald
    akari

    Dann macht das "Gemeckere ja auch Sinn 😉 😉

    Ich habe da noch was anderes gefunden, um Text in Zahlen umzuwandeln.

    Wert = Edit1 -> Text->ToInt();
    

    Scheint genau so zu funktionieren und ist für mich in der Syntax besser zu begreifen 😃 Gibt es da wichtige Unterschiede? Erklärungen habe ich keine gefunden.
    Gruß
    Uwe



  • Hallo

    Dann lies doch mal in der BCB-Hilfe nach was die Namensteile Float und Int der jeweiligen Funktionen bedeuten. Dann weist du was der Unterschied ist.

    bis bald
    akari



  • akari schrieb:

    Hallo

    Dann lies doch mal in der BCB-Hilfe nach was die Namensteile Float und Int der jeweiligen Funktionen bedeuten. Dann weist du was der Unterschied ist.

    bis bald
    akari

    Wenn man blöd fragt, kriegt man auch eine blöde Antwort. Sorry, hatte mich wohl falsch ausgedrückt. DER Unterschied ist mir schon klar 😉

    Meine Frage zielte in folgende Richtung:
    Was ist der Unterschied zwischen

    Wert = Edit1 -> Text.ToInt();
    

    und

    Wert = StrToInt (Edit1->Text);
    

    Ersteres scheint mir als Anfänger logischer......

    Nachdem ich heute wieder einiges gelernt habe, wollte ich wieder ein paar der runtergeladenen Komponenten testen. Dies ist mir leider wieder nur zum Teil gelungen. Wie kriege ich raus, wie Werte übergeben werden und wie die Variable heißt?
    Ich habe da z.B. eine Ampel-Anzeige, Rot, Gelb Grün. Diese möchte ich ansteuern, sagen wir mal mit 3 Buttons.
    Im Headerfile finde ich "IsRed", "IsYellow", "IsGreen". Diese Namen fine ich auch im Objektinspektor, wenn ich die Ampel auf der Form platziere. "IsRed" z.B. kann ich über den Inspektor durch Setzen auf TRUE einschalten und die Lampe ist an.
    Wie mache ich das dann im Programm? Wie kriege ich raus,
    a) welche Variablen notwendig sind
    b) wie die entsprechende Sysntax aussieht?

    Gruß

    Uwe



  • Hallo,

    nun müsst ihr mir aber wirklich noch mal helfen.
    Mittlerweile habe ich so einige Sachen herausgefunden, z.B. das nach der Eingabe des Komponentenname und nachfolgenden -> meistens ein Popup aufgeht, wo die möglichen Befehle drinstehen. 🕶 🕶 So weit so gut.
    Mein Problem besteht jetzt darin, z.B. eine Komponente aus 3 LEDs anzusteuern. Da ist nix mit Position oder Value.
    Die Komponente heißt VrLights1 auf meinem Formular. Im Inspektor kann ich über LEDState per BOOL IsRed, IsGreen und IsYelloy setzen oder löschen.
    Wenn ich also eingebe

    VrLights1->
    

    dann kommt die Auswahl, z.B.

    LedState: TVrLightStates
    

    😕
    mit Spacetaste wird LedState übernommen. Wieder -> getippt, kommt nix.
    Tippe ich einen . kommt neues Fenster, zum Beispiel

    operator = TVrLightStates &(constTVrLightStates)
    

    Wie habe ich das zu deuten?
    Gruß
    Uwe



  • Hallo

    Das beste ist du schaust in die Dokumentation oder den Quellcode der externen Komponente. Wir können dich nicht alle existierenden Fremdkomponenten kennen...

    Ich vermute das der Datentyp TVrLightStates ein Set ist, da lohnt sich ein Blick in der FAQ hier im Forum, in den Thread "Umgang mit Set"

    bis bald
    akari



  • Hallo akari,

    vielen Dank.
    Das war genau der Tipp, den ich brauchte 🙂

    Es funktioniert 😃 😃 😃

    War zwar noch viel Probiererei, aber ich habe es hinbekommen. Hatte was mit Set zu tun.

    In der Headerdatei steht

    void__fastcall SetLedState(TVrLightsStates Value);
    

    Mein Code im Builder:

    VrLights1->LedState = TVrLightsStates () << lsRed;
    

    Nun sollte ich ähnliche Sachen auch hinbekommen da ich jetzt weiß, wonach ich suchen muss.
    Nochmals Tausend Dank an euch alle.

    Ich werde euch bei Gelegenheit noch mal wieder quälen, versprochen 🙂 🙂 🙂

    Gruß

    Uwe


Anmelden zum Antworten