Progressbar in Klasse verursacht Laufzeitfehler



  • Servus, hab ein Problem.
    Wenn ich folgenden Code (unterstrichen) in eine Klasse einbinde, produziert er mir einen Laufzeitfehler, binde ich diesen Source direkt "in einen" Button ein funktionierts tadellos. Jemand ne Ahnung woran es liegen könnte, thx!

    void CLogik::berechne()
    {
     //zahlen[16] - sind die vorhandenen Zahlen eingegeben
     //moeglich - Anzahl der entstandene Möglichkeiten
     //zahl - Anzahl der eingegebenen Zahlen
     char zeichen[4] = {'+','-','*','/'};
     int i,j,k,l;
     double ergebnis,pie;
     // aktuell[15] enthält alle die aktuelle Zeichenfolge von +,-,*,/
     // Alle möglichen Kombinationen von + - etc an den entsprechenden Stellen
      [u]Form1->ProgressBar1->StepBy(1);[/u]
      [u]Form1->ProgressBar1->Position=0;[/u]
      [u]Form1->ProgressBar1->Max=moeglich;[/u]
     for (i=0;i<moeglich;i++){
       [u]Form1->ProgressBar1->StepIt();[/u]
    
     }
      aktuell[0]='+';aktuell[1]='*'; aktuell[2]='*';
     ergebnis=rechnen();
     ergebniss=ergebniss+'='+FloatToStr(ergebnis);
    }
    


  • Hallo

    binde ich diesen Source direkt "in einen" Button ein

    Damit meinst du wohl, das du den Code in einer automatisch erstellte Eventmethode eines Buttons stehen hast.

    Wenn ich folgenden Code (unterstrichen) in eine Klasse einbinde

    Auch TForm ist eine Klasse, die Button-Eventmethode eine Klassenmethode.

    Vermutlitlich greifst du mit Form1 auf ungültigen Speicher, weil dem Zeiger den du in der Klasse CLogik verwendest, keine gültige Instanz von TForm zugewiesen wurde.

    bis bald
    akari



  • ok, klingt ganz gut!

    kannst du das auch für mich übersetzen... 🙂 hier noch meine Klasse und thx
    stehe nämlich noch an den anfängen von c++

    class CLogik
    {
     public:
      CLogik(){ergebniss="";};
      ~CLogik(){};
      long int sollwert,moeglich,zahl;
      AnsiString eingabe;
      AnsiString ergebniss;
      void const ausfuehren(){vorbereitung();};
     private:
      double zahlen[16];
      char aktuell[15];
      void berechne();
      void vorbereitung();
      long int moeglichkeiten();
      double rechnen();
      double addiere(double x, double y){return (x+y);};
      double subtrahiere(double x, double y){return (x-y);};
      double multipliziere(double x, double y){return (x*y);};
      double dividiere(double x, double y){return (x/y);};
     // long mod(long a, long b){};
    };
    


  • Hallo

    was soll ich noch dazu sagen? Lerne erstmal die Grundlagen von C++, insbesondere OOP komplett, und arbeite mit dem Debugger um Ort und Grund des Zugriffsfehler herauszufinden.

    bis bald
    akari



  • ist es jetzt sehr komplex einen text zu schreiben, der mir das benutzen der progressbar ermöglicht?

    nebenbei, ich les grad an zwei büchern, aber so schnell geht es alles nicht und ich würde mich um hilfe freuen.

    Die dauernden sprüche "finds selbst raus"... sind unterstes niveau. ich persönlich versuche immer eine verwertbare antwort zu geben wenn ich mich besser auskenne, d.h. auch mal eine Lösung angeben, damit der jenige weiss wo er falsch angesetzt hat.

    schließlich lernt man nur ein programmiersprache, wenn man diese auch anwendet. das sollte sogar einem profi klar sein



  • Hallo

    ist es jetzt sehr komplex einen text zu schreiben, der mir das benutzen der progressbar ermöglicht?

    Nein, denn rein syntaktisch ist dein geposteter Code schon richtig und ausreichend.

    Die dauernden sprüche "finds selbst raus"... sind unterstes niveau. ich persönlich versuche immer eine verwertbare antwort zu geben wenn ich mich besser auskenne, d.h. auch mal eine Lösung angeben, damit der jenige weiss wo er falsch angesetzt hat.

    Du hast meinen letzen Post falsch verstanden. Ich meinte, das ich aufgrund dem von dir geposteten Code keinen Fehler finden kann, und habe dich deshlab auf Möglichkeiten hingewiesen, den Fehler im restlichen Dode selbst zu finden (Debugger).

    schließlich lernt man nur ein programmiersprache, wenn man diese auch anwendet. das sollte sogar einem profi klar sein

    Vollkommen richtig. Und wenn man dabei immer mal wieder in die Doku schaut und Fachstoff liest, wird man auch immer besser. Auch wenns manchmal viel Zeit kostet, bis ein Problem geklärt ist.

    bis bald
    akari



  • k, wens interessiert. um aus eine klasse heraus auf die komponenten der form1 zuzugreifen einfach ausserhalb der klasse folgende Ziele einfügen

    extern TForm1 *Form1;
    


  • Ja, wenn Du gleich gesagt hättest, dass sich die Klasse in einer eigenen Unit befindet... akari hatte es wohl vermutet, deshalb der Hinweis auf die Form1.

    Prinzipiell funktioniert das so, da Form1 bereits eine globale Variable ist.

    Allerdings wäre es vermutlich sinnvoller, der Klasseninstanz einen Zeiger auf die ProgressBar zu spendieren und diesen z.B. im Konstruktor der Klasse, als Parameter übergeben und setzen. Dies hätte den Vorteil, dass das ganze nicht nur mit Form1 funktioniert, sondern mit jedem beliebigen Formular, auf der sich eine oder auch mehrere ProgressBar befinden. Jeder Klasseninstanz ließe sich dann eine eigene ProgressBar zuweisen.



  • könntest du ein Beispiel geben? thx



  • Hallo

    class CLogik
    {
     public:
      CLogik(){ergebniss="";};
      ~CLogik(){};
      long int sollwert,moeglich,zahl;
      AnsiString eingabe;
      AnsiString ergebniss;
      void const ausfuehren(){vorbereitung();};
      TProgressBar* progress; // kannst du auch als private machen, mit Getter und Setter
     private:
      double zahlen[16];
      char aktuell[15];
      void berechne();
      void vorbereitung();
      long int moeglichkeiten();
      double rechnen();
      double addiere(double x, double y){return (x+y);};
      double subtrahiere(double x, double y){return (x-y);};
      double multipliziere(double x, double y){return (x*y);};
      double dividiere(double x, double y){return (x/y);};
     // long mod(long a, long b){};
    };
    
    //innerhalb des aufrufenden Forms, mit der ProgressBar
    CLogik logik = ...;
    logik.progress = ProgressBar1; // Konkrete Instanz zuweisen
    
    // Verwenden innerhalb der Klasse
    void CLogik::berechne()
    {
      ...
      progress->StepBy(1);
      ...
    }
    

    Das ist nur ein Minimalbeispiel. Wichtig wäre noch, im Konstruktor progress zu initialisieren. Entweder gleich mit einer gültigen Instanz via Parameter, oder mit NULL.

    bis bald
    akari



  • klasse thx, werds mal probieren***

    works great..... kann ich jedem nur empfehlen... erspart nach den definitionen jede menge schreibarbeit 🙂



  • Nun ja, mehr oder weniger Tipparbeit ist da gar nicht der große Vorteil, sondern eher die Wiederverwendbarkeit und einfachere Pflege.

    Das wäre eben ein Problem deiner ersten Version gewesen. Ein einfaches umbenennen des Hauptformulars hätte dazu geführt, dass Du in der Klasse CLogik Anpassungen hättest durchführen müssen.


Anmelden zum Antworten