Dummi braucht Starthilfe



  • Hallo C++ Builder Gemeinde,

    ich bin der absolute Anfänger im Builder Geschäft und benötige ein bisschen Starthilfe von euch. Vielleicht bin ich hier auch falsch, dann bitte Bescheid sagen.

    Zu mir:
    - Ü40 Generation
    - Passable C-Programmierkenntnisse, aber kein Profi
    - Freizeitprogrammierer für PIC Microcontroller
    - Besessen lernfähig und wissbegierig
    - C++ Builder 5 Besitzer

    Ich habe mir ein privates Projekt vorgenommen, womit ich Daten aus einen PIC auslesen möchte und auch Daten in den PIC reinschreiben will. Beides soll über eine RS232 funktionieren.
    Ich stelle mir eine Maske mit Anzeigen (Analoginstrumente, Digitalanzeigen, etc.) vor, die bestimmte Werte anzeigen, sowie Schieberegler zum einstellen von Parametern.
    Ich weiß, das sind schon heere Ziele und ich werde die sicher nicht ad-hoc erreichen. 🙂 🙂 Aber Schritt-für-Schritt komme ich da hin, ganz sicher.

    Meine beiden Bücher über den C++ Builder 3 haben mich nicht wirklich weiter gebracht. Mir fehlt anscheinend noch das Grundverständnis dafür.

    In meiner Version 5 sind nur 1 Schieberegler drin, keine Analoganzeigen.
    Wo kann man sich sowas runterladen?

    Saluti

    Uwe



  • Hallo Uwe,

    ich werde nicht ganz schlau aus Deiner Schilderung, aber wenn das Hauptproblem das analoge Anzeigeinstrument ist, dann sollte dir folgender Code weiterhelfen. Habe ich eben schnell selbst zusammen geschreiben. Ist nicht das gelbe vom Ei (z.B. Code in Header-Datei, Schnittstelle, ...) aber ich denke es gibt Dir eine Anregung.

    //---------------------------------------------------------------------------
    
    #ifndef Unit2H
    #define Unit2H
    #include <vcl.h>
    #include <math.h>
    //---------------------------------------------------------------------------
    class CAnalog
    {
    public:
        float value;    // Anzeigewert 0 .. 1
    
        CAnalog() { value = 0; }
    
        Draw(TCanvas *C, int X, int Y)
        {
            //Durchmesser der Anzeige
            float D=100;
            //Hintergrund löschen
            C->Brush->Color = clWhite;
            C->FillRect(TRect(0+X,0+Y,X+D,D+Y));
    
            // 3/4 Kreis zeichnen
            C->Arc(D+X,D+Y,X,Y,3*D/4+X,3*D/4+Y,D/4+X,3*D/4+Y);
    
            // Zeigerwinkel berechnen
            // Verfügbarer Bereich: 6.0/4.0*M_PI   (3/4 Kreis)
            // Verschiebung zum Nullpunkt: 3.0/4.0*M_PI
            float w=6.0/4.0*M_PI*value + 3.0/4.0*M_PI;
    
            C->MoveTo(X+D/2,Y+D/2);
            // z=Zeigerlänge bei 0.5 liegt Zeiger auf Kreis
            float z = 0.45;
            C->LineTo(X+D/2+z*D*cos(w),Y+D/2+z*D*sin(w));
        }
    };
    #endif
    

    Gruß
    Markus







  • wow nicht schlecht...

    Ich der ja sowieso auf "hübsche" Anwendungen stehe begeistert dieser Link sehr 🙂

    @Topic
    Du kannst auch Fotos machen von z.B. Tachometern diese dann sauber in Photoshop (oder was zur Hand ist) bearbeiten und dann über diverse Zeichen-Funktionen (etwas msPaint im Kommandozeilenmodus) animieren. So wie Du es haben möchtest. Wenn Du z.B. altertümliche "Mess-Meter" haben möchtest glaube ich wird dir kaum was übrig bleiben.

    Aber vielleicht ist es ja gar nicht was Du möchtest... so good luck !



  • Hallo,

    ich habe mir das Ding runtergeladen und finde das richtig gut.

    Nun zu meinem Problem: Ich kann die Anzeigen etc. auf das Formular ziehen, aber der Compiler meckert rum, dass er keine entsprechende Headerdadtei findet.

    In dem entpacktem File war nichts drin.
    Was muss ich tun?

    Ansonsten habe ich mir eine "von-Adam-und-Eva Kurs verschrieben, d.h. ich werde wieder von vorn anfangen und das Buch nochmals durchackern.

    Viele meiner Probleme hängen mit dem Handling und der Bedienung des Builders zusammen. 😡 😡 😡

    Saluti

    Uwe



  • Unter Projekt-Optionen-Verzeichnisse/Bedingungen den Include Pfad und Bibliothekspfad der Komponente hinzufügen.



  • Hallo,

    das habe ich gemacht, aber ohne Erfolg.
    In dem Verzeichnis ist keine .h Datei drin 😡

    Einer ne Idee??

    Gruß

    Uwe



  • hat die datei evtl. die Endung .hpp statt .h? Wenn das der Fall sein sollte, einfach beim include ändern.



  • Braunstein schrieb:

    hat die datei evtl. die Endung .hpp statt .h? Wenn das der Fall sein sollte, einfach beim include ändern.

    😃 😃 😃 👍

    Jawoll,

    das war es!! Jetzt klappt es. Nun muss ich nur noch herausfinden, wie ich die Anzeigen ansteuern kann. Wollte zum Üben einen Zahlenwert oder einen Schieberegler bedienen, der dann die Anzeige verändert...

    Zu früh gefreut, jetzt klappt es wieder nicht mehr 😡 😡

    Geht wieder 🙂 🙂 🙂

    Das scheint mit dem Verzeichnis zu tun zu haben, wo die .hpp Dateien drin liegen. Dies habe ich unter Projekt\Optionen\Verzeichnisse.... angegeben, aber irgendwie findet das Ding es nicht immer.
    Aus mir unerfindlichen Gründen geht es jetzt aber wieder, wobei der Builder immer meckert, dass er die Datei xxx.h nicht finden kann. Wenn ich dann aber das Verzeichnis wieder zu Fuß angebe und die entsprechende .hpp Datei anwähle, ist alles wieder gut.
    Kann das sein, das die .hpp Dateien von Delphi sind, und man das dem Builder noch irgendwo mitteilen muss?

    Gruß

    Uwe



  • Normalerweise must du nur unter den Projektoptionen (ohne ein geöffnetes Projekt, also vorher alle schließen) die Pfade richtig setzen.



  • Hallo Pfadfinder,

    funktionieren tut es jetzt, aber wenn ich was kompiliere, muss ich den Pfad zu den Headern zu Fuß eingeben. Man fragt danach, vielleicht auch nur, weil es hpp Dateien sind und keine h Dateien.
    Schiebe ich die Pfadangaben für Bibliothek und Header in der Liste nach oben, bekomme ich beim Kompilieren eine Fehlermeldung 😕 😕 😕

    Sehr merkwürzig......

    Gruß

    Uwe



  • Hallo,
    wie hast du denn die Komponenten installiert ?
    Du nusst die Vcwb5.bpk öffnen und dann auf compilieren-installieren.



  • Jau,

    genau so habe ich das eigentlich gemacht. Die entpackten Dateien liegen nur nicht im "normalen" Verzeichnis, sondern auf einer anderen Platte.

    Ich kann den Vorgang aber heute Abend noch einmal komplett wiederholen.

    Saluti

    Uwe



  • Welche Endung die headerdateien haben ist egal. Bei C++Projekten und insbesondere beim Builder nimmt man meist .hpp.
    Wenn dein Builder meckert, dass eine .h Datei nicht gefunden wird, liegt es in deinem Fall wohl immer daran, dass die Dateien im Ordner die Endung .hpp haben. Also immer wenn du etwas von deiner Komponente in dein projekt einfügst überprüfe die includes und ändere bei Bedarf .h in .hpp
    Das problem hatte ich bei manchen Komponenten auch schon.
    Die hpp-Dateien werden aus den Pascal-Dateien erzeugt.



  • So,

    habe mal wieder ein bisschen rumprobiert und gelesen.
    Ich habe mir eine Oberfläche gebaut, die aus einen Menü zum Beenden der Anwendung dient, sowie einem Eingabefeld EDIT (TEdit).

    Wenn ich in das Feld etwas reinschreibe und auf Klick eines Speedbuttons einer Variablen zuordne, kann ich über START\AUSWERTEN\.... mir den Wert anzeigen lassen. Das funktioniert auch, aber nur 1 Mal nach dem Start der Anwendung 😕 Warum? Muss ich eine Endlosschleife programmieren? Ich denke, das macht der Compiler selbst, oder?
    Finde ich irgendwie umständlich, das Ganze.
    Bei meinem IDE zur PIC Programmierung kann ich mir alle Variablen in ein Fenster packen und immer fleissig anzeigen lassen.

    Wenn ich nun den Inhalt der Variablen wieder in einem Feld anzeigen lassen möchte, welchen Typ muss ich da wählen?
    EDIT: Das habe ich gerade selbst gelöst: Edit2 -> Text = Textvar;

    Als nächstes möchte ich einen Zahlenwert einer dieser Anzeigen aufdrücken, damit die was anzeigen. Wir die nächste Hürde werden 🕶 🕶

    Ich weiß, alles stinklangweiliges Zeug für euch, aber ich stehe auf dem Schlauch 🙂 🙂

    Gruß

    Uwe



  • Wenn du auf deinen Button klickst, dann löst du ein sogenanntes OnClick Event aus.
    Das wird genauso oft ausgeführt wie du den Button klickst. Wenn nur einmal, dann zeigt er dir den Wert auch nur einmal an.
    Wenn du auf Veränderungen des Editfeldes reagieren willst, dann hat dieses ebenfalls ein Event (OnChange).
    Wenn du unabhängig davon laufend irgendwelche Sachen berechnen willst, und die Werte dann anzeigen lassen willst, dann hast du wirklich nur die Möglichkeit entweder per Endlosschleife (nach z.B. dem OnClick) oder aber per Auslagerung in einen extra Thread das zu tun.
    Diese Komponenten bieten sogar eine in einer Komponente gekapselte Thread Klasse.
    Alternativ, wenn es nicht so ganz auf die Genauigkeit der abgefragten Werte ankommt, kannst du auch einen Timer benutzen.Dabei flutschen dir natürlich meist irgendwelche Werte durch und das währe somit nur eine "Schein Aktualisierung" und nicht zu empfehlen.

    Diese Anzeigen haben meist irgendeine Eigenschaft wie z.B. Value oder Position, mit denen du deíne Werte anzeigen lassen kannst.
    Wenn du das mit einer Endlosschleife löst, dann wirkt ein
    Application->ProcessMessages() der "Versteinerung" deines Programmes entgegen.
    Das heisst, dann reagiert dein Programm auch noch auf Klicks. 😉



  • Hallo Pfadfinder,

    vielen Dank für deine Erklärungen.
    Das mit dem Auslesen hatte ich auch so verstanden, aber wenn ich Werte eingegeben hatte und diese auf Knopfdruck übernommen hatte, wurde die angezeigte Variable nicht aktualisiert. Erst wenn ich das Programm angehalten hatte und wieder gestartet hatte, wurde wieder ein Wert angenommen.
    Werde das noch mal genauer untersuchen, evtl. liegt der Fehler auch nur in mangelhafter Bedienung 😃

    Das mit den Anzeigen schaue ich mir mal genauer an, ggf. poste ich mal den Code, wenn ich nicht weiterkomme.

    Salut

    Uwe



  • Soooo,

    habe mal wieder ein wenig rumprobiert. Um in ein Feld eine Zahl einzugeben (und nur eine Zahl), habe ich mir folgende Komponente runtergeladen und installiert. Leider finde ich keinen Weg, dieses Feld auszulesen und einer Variablen zu zuweisen. Die Variable habe ich "zahl" genannt und als "int" deklariert, da nur ganze Zahlen eingegeben werden.

    In der SpeedButton Funktion will ich auf Knopfdruck den Wert übernehmen. Dazu habe ich

    zahl = ZahlEdit1;
    

    eigegeben.
    Dies wird vom Compiler mit folgender Meldung abgelehnt:" Konvertierung von TZahlEdit nach int nicht möglich".

    Nehme ich "double": "Unzulässige Verwendung einer Flieskommazahl" (was ich ja noch verstehe).

    Wenn ich

    zahl = ZahlEdit1;
    

    eingebe, muss da noch was hinter? Wenn ich Text aus einem Edit Feld lade, muss da immer noch ein "-> Text" hinter ...

    Wer kann mir hier helfen?

    Gruß

    Uwe



  • Hallo

    ZahlEdit1 ist nur ein Pointer, den kannst du nicht direkt benutzen um die Zahl in dem Control auslesen. Dazu brauchst du einer der Eigenschaften des Controls, wie du schon selber am Beispiel von TEdit::Text feststellst. Wie die Eigenschaft von TZahlEdit heißt kannst du sicher in der Doku oder im Quellcode der Komponente nachlesen.

    bis bald
    akari


Anmelden zum Antworten