seltsamer Fehler beim Erstellen einer Klasse



  • also dieser Code steht in der Klassendatei(Header) von meiner eigenen klasse

    Im Originalcode, zu dem auch das Formular gehört steht dieser 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();	
    }
    //---------------------------------------------------------------------------
    


  • keine ahnung, wies der builder macht..

    aber binde die TADOQuery ein.



  • dann habe ich die doppelt drin und er nörgelt auch.

    Bei der ::close meckert der net rum wenn ich den Aurfruf des Grid-Pointer sraus nehme, das Active macht der ohne Probs



  • so, ich habs geschafft dass der keine Fehler mehr anzeigt.
    Nur leider zeigt der gar nix mehr an.

    Hier mal der komplette Code aus allen dateien:

    Startdatei(cpp):

    #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();	
    }
    

    Der Header dazu:

    #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
    

    meine eigene Klasse(Header):

    #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
    

    Die cpp-Datei dazu:

    #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->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
    
    }
    

    Mit diesem Code zeigt der mir nix an.
    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)



  • - das Stringgrid hast Du doch im TForm2 mit dem Designer angelegt (auf das Form gezogen)? Lösch' das nicht in ~gridtable(). Das Grid hat als owner das Form2-Objekt, beim Entfernen des Form2-Objektes wird das Stringgrid mit abgeräumt.
    - Deine eigenes gridtable-Objekt sollte dagegen von Dir auch wieder zerstört werden. Vllt *grid als Member des Forms machen und in TForm2::close entfernen.
    - wo wird dem ADOQuery1-objekt die Verbindungsinformation zugewiesen? Schau mit dem Debugger nach, ob das Objekt überhaupt offen ist.



  • die Verbindungsinformationen des Querys sind auch über den Objektinspektor eingetragen.

    Habe im Destruktor mal die delete-Zeile auskommentiert, es passiert jedoch weiterhin nichts.
    Erst wieder wenn ich die Zeilen 19 und 20 wieder auskommentiere.



  • Du hast vergessen, i in gridtable::filltable zu inkrementieren.



  • Es fehlt vorallem darin ein "query->Next()"...



  • ich habs geschafft, sowohl increment i als auch _query->next(); eingebaut.

    Aber daran lags nicht.
    Ich habe zusätzlich noch vor dem _query->open(); ein _query->ExecSQL(); eingefügt und dann gings problemlos.
    Ich vermute, dass er auf einen Datensatz zugreifen wollte, der nicht freigegeben war und daher eine AccessViolation bekommen hat.
    Die Fehlermeldung kam nämlich nach hinzufügen des Inkrementierens und des Weitersetzens des Datenbankcursors.

    Den funktionierenden Code poste ich nachher, wenn ich zu Hause bin, hier nochmal rein, falls noch jemand irgendwann das gleiche Problem hat.

    Trotzdem danke an alle, die geholfen haben 🙂



  • #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 da ist der Code, der funktioniert 🙂


Anmelden zum Antworten