Announcement

Collapse
No announcement yet.

keine Anzeige der Form mit StringGrid

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • keine Anzeige der Form mit StringGrid

    Ich aheb ein Programm geschrieben, wo ich mit einer eigenen Klasse und einem StringGrid arbeite.
    Nun habe ich das Problem, dass der Compiler beim linken stehen bleibt, sobald ich die eigen Klasse aufrufe über einen zeiger.
    Nehme ich den Code aus der Startdatei in Zeilen 19+20 raus, zeigt der mir die Form mit dem StringGrid an.

    Woran liegt das?
    Er gibt nirgends Fehler aus, die Processliste bleibt nur irgendwann stehen mit dieser Meldung:

    Modul laden: msointl.dll. Ohne Debug-Infos. Basisadresse: $040A0000. Prozess projekt_Buchhaltung.exe (3604)
    Thread-Start: Thread-ID: 5064. Prozess projekt_Buchhaltung.exe (3604)
    Thread-Start: Thread-ID: 6040. Prozess projekt_Buchhaltung.exe (3604)
    Thread-Start: Thread-ID: 464. Prozess projekt_Buchhaltung.exe (3604)
    Modul laden: fx.dll. Ohne Debug-Infos. Basisadresse: $73F50000. Prozess projekt_Buchhaltung.exe (3604)
    Modul laden: UNKNOWN_MODULE_12. Ohne Debug-Infos. Basisadresse: $03B50000. Prozess projekt_Buchhaltung.exe (3604)

    Hier die Startdatei:
    Code:
    #include <vcl.h>
    #pragma hdrstop
    
    #include "buchhaltung.h"
    #include "gridtable.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm2 *Form2;
    //---------------------------------------------------------------------------
    __fastcall TForm2::TForm2(TComponent* Owner)
        : TForm(Owner)
    {
        StringGrid1->Cells[0][0]="Einnahmen";
        StringGrid1->Cells[1][0]="Betrag";
        StringGrid1->Cells[2][0]="Ausgaben";
        StringGrid1->Cells[3][0]="Betrag";
    
        gridtable *grid = new gridtable(StringGrid1, ADOQuery1);
        grid->filltable("select * from konto");
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm2::close(TObject *Sender)
    {
        ADOQuery1->Active=false;
        Close();   
    }
    Die Headerdatei dazu:
    Code:
    #ifndef buchhaltungH
    #define buchhaltungH
    //---------------------------------------------------------------------------
    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <StdCtrls.hpp>
    #include <Forms.hpp>
    #include <ExtCtrls.hpp>
    #include <Grids.hpp>
    #include <Menus.hpp>
    #include <ADODB.hpp>
    #include <DB.hpp>
    //---------------------------------------------------------------------------
    class TForm2 : public TForm
    {
    __published:    // IDE-verwaltete Komponenten
        TButton *btn_back;
        TButton *btn_next;
        TLabel *lab_showdat;
        TStringGrid *StringGrid1;
        TPanel *Panel1;
        TMainMenu *MainMenu1;
        TMenuItem *Programm1;
        TMenuItem *beenden1;
        TADOQuery *ADOQuery1;
        void __fastcall close(TObject *Sender);
    private:    // Benutzer Deklarationen
    public:        // Benutzer Deklarationen
        __fastcall TForm2(TComponent* Owner);
    };
    //---------------------------------------------------------------------------
    extern PACKAGE TForm2 *Form2;
    //---------------------------------------------------------------------------
    #endif
    UNd hier die Definition der eigenen Klasse:
    Code:
    #ifndef gridtableH
    #define gridtableH
    #include <Grids.hpp>
    #include <ADODB.hpp>
    #include <DB.hpp>
    
    class gridtable
    {
        private:
        TStringGrid* _table;
        TADOQuery* _query;
        public:
        __fastcall gridtable(TStringGrid *table, TADOQuery *query);
        __fastcall ~gridtable();
        private:
        void __fastcall getData(String sql);
        public:
        void __fastcall filltable(String sql);
        void __fastcall setData();
    };
    #endif
    Und die Funktionen innerhalb der Klasse:
    Code:
    #include "gridtable.h"
    
    __fastcall gridtable::gridtable(TStringGrid *table, TADOQuery *query)
    {
    _table = table;
    _query = query;
    }
    
    __fastcall gridtable::~gridtable()
    {
    //nothing
    
    }
    
    void __fastcall gridtable::getData(String sql)
    {
    _query->Close();
    _query->SQL->Clear();
    _query->SQL->Add(sql);
    _query->Open();
    _query->First();
    
    }
    
    void __fastcall gridtable::filltable(String sql)
    {
    int i=0;
    getData(sql);
    while(!_query->Eof)
    {
        _table->Cells[0][i]=_query->FieldByName("beschreibung")->AsString;
        _table->Cells[1][i]=_query->FieldByName("betrag")->AsFloat;
    }
    }
    
    void __fastcall gridtable::setData()
    {
        //nothing
    
    }
    Kann mir da jemand weiterhelfen woran das liegen könnte?

  • #2
    Da man nicht weiss welches Zeile 19+20 sind, und ich auch nicht abzählen will -> Vermutung

    ADOQuery1 -> Wo ist das erzeugte Objekt dazu?

    Des Weiteren ist das allerdings hinfällig, da es für das was du machen willst (Grid mit einer Abfrage verbinden) schon fertige Komponenten unter den DB Komponenten gibt
    Christian

    Comment


    • #3
      Zeilen 19 und 20 sind folgende:

      gridtable *grid = new gridtable(StringGrid1, ADOQuery1);
      grid->filltable("select * from konto");

      Und wenn es dafür fertige Funktionen gibt,w elche wären das? Dann könnte ich das umstellen und nochmal testen.

      Comment


      • #4
        Und wenn es dafür fertige Funktionen
        Komponenten......in der Kopmponentenpalette......


        Zeilen 19 und 20 sind folgende:

        gridtable *grid = new gridtable(StringGrid1, ADOQuery1);
        grid->filltable("select * from konto");
        Joo, ADOQuery1 ist nicht intitialisiert
        Christian

        Comment


        • #5
          also mit TADOQuery* ADOQuery1 = new TADOQuery initialisieren?

          Aber das müsste der Compiler doch normal vons elbst tun, wenn man im Objektinspektor schon die ganzen Eingaben tätigt oder?

          Comment


          • #6
            Aber das müsste der Compiler doch normal vons elbst tun, wenn man im Objektinspektor schon die ganzen Eingaben tätigt oder?
            Wozu den das im Objektinspektor, wenn du dann eine getData Funktion hast, in der du die Werte (SQL) übergibtst?

            Setzte dann im Objektinspektor Active auf false.

            Vielleicht hier eine Anregung (Verbindung einrichten & Datenzugriff)

            http://www.marquardtnet.info/cecke/t...tml#Verbindung einrichten
            Christian

            Comment


            • #7
              die GetData-Methode habe ich, um nicht jedes Mal die Verbindung extra schließen, SQL-Statement eingeben, Verbindung aufbauen, etc machen zu müssen.

              So brauche ich nur den SQL-String übergeben und das wars.
              Momentan könnte man das auch noch fest eingeben in der Klasse selbst als default, aber ich plane ja noch mehr Selektionsmöglichkeiten, wo dann andere Statements abgesetzt werden sollen.

              Den Objektinspektor haeb ich genommen, weil sich damit ja ruck zuck alles einstellen lässt mit wenig Aufwand.
              Benutze auch eine Access-Datenbank.

              Comment


              • #8
                Ändert nix daran, dass es TDBGrid u.a. (für Comboboxen)

                gibt die das alles kann
                Christian

                Comment


                • #9
                  das mag ja alles sein und wäre vielleicht auch praktikabler, dennoch würde ich das Programm gerne zum Laufen bekommen^^

                  Das hinterher auf ein DBgrid oder ähnliches umzustellen ist ja dnan nurnoch ein katzensprung.

                  Comment


                  • #10
                    Code:
                    #include "gridtable.h"
                    
                    __fastcall gridtable::gridtable(TStringGrid *table, TADOQuery *query)
                    {
                    _table = table;
                    _query = query;
                    }
                    
                    __fastcall gridtable::~gridtable()
                    {
                    //delete _table;
                    
                    }
                    
                    void __fastcall gridtable::getData(String sql)
                    {
                    _query->Close();
                    _query->SQL->Clear();
                    _query->SQL->Add(sql);
                    _query->ExecSQL();
                    _query->Open();
                    _query->First();
                    
                    }
                    
                    void __fastcall gridtable::filltable(String sql)
                    {
                    int i=1;
                    getData(sql);
                    int zeilen = _query->RecordCount;
                    while(i<=zeilen)
                    {
                        _table->Cells[0][i]=_query->FieldByName("beschreibung")->AsString;
                        _table->Cells[1][i]=_query->FieldByName("betrag")->AsFloat;
                        i++;
                        _query->Next();
                    }
                    }
                    
                    void __fastcall gridtable::setData()
                    {
                        //nothing
                    
                    }
                    So hab das problem lösen können udn hier ist der Code, der nun einwandfrei läuft und auch schon wieder erweitert wurde auf 4 Spalten

                    Comment

                    Working...
                    X