Problem z elementem wxListCtrl w statycznej funkcji

0

Witam.

Mam problem taki że statycznej funckji muszę wstawić składnik wxListCtrl. Przykładowy kod.

class nazwa
{
public:
wxListCtrl *nazwa_wskaznika;
static int(int jeden,int dwa,int trzy)
{
wxListCtlr->InsertItem(0,"Cos"); //Tu mi wywala błąd że po lewej "->InsertItem" musi wskazywać class/struct/union/generic
}
};

Więc bym prosił o jakieś porady lub rozwiązania tego problemu.

Dziękuje za każdą odpowiedź i życzę miłego dnia.

0

Funkcja musi być statyczna bo korzystam z sqlite i tam funkcja tak jest zapisana.

//To jest kod pliku.h
class okno_ksiazki :public wxFrame
{
public:
	okno_ksiazki(const wxString &title, const wxPoint & po, const wxSize &si, long style = wxCAPTION | wxSYSTEM_MENU | wxMINIMIZE_BOX | wxCLOSE_BOX);
	//Deklaracja zmiennych i funkcji  do ksiazek 
	wxTextCtrl *dodawanie_ksiazek[4];
	wxStaticText *napisy_do_dodawania_ksiazek[4];
	wxTextCtrl *wyporzyczanie_ksiazek[6];
	wxStaticText *napis_do_wyporzyczania_ksiazek[6];
	wxTextCtrl *oddawanie_ksiazek[6];
	wxStaticText *napis_do_oddawania_ksiazek[6];
    wxListCtrl *wyswietlacz;
	void wykonanie_polecenie_sql_dodaj_ksiazke(wxCommandEvent &event);
	void wykonanie_polecenia_sql_wyporzycz_ksiazke(wxCommandEvent &event);
	void wykonanie_polecenia_sql_oddaj_ksiazke(wxCommandEvent &event);
	void wykonanie_polecenia_sql_ususwanie_ksiazki(wxCommandEvent &event);
	void czas_systemowy(wxCommandEvent &event);
	static int callback(void *NotUsed, int argc, char **argv, char **azColName);
	//Koniec deklaracji zmiennych i funckji  do ksiazek
private:
	wxCheckBox *pobieranie_czasu_systemowego;
	DECLARE_EVENT_TABLE()
};

w pliku.cpp są tylko definicje w tym funkcja callback która w ciele nie przyjmie wskaźnika wyswietlacz.

0
pestka12 napisał(a):

Funkcja musi być statyczna bo korzystam z sqlite i tam funkcja tak jest zapisana.

Z tego zdania nic nie wynika. Na szczęście sytuację ratuje kod, bo dzięki nazwie callback można się domyśleć o co chodzi.

Jednak to nadal za mało kontekstu, żeby pomóc.
Jaką funkcję sqlite wywołujesz, która przyjmuje jako argument ten callback? najlepiej podaj linka do dokumentacji tej funkcji.
Coś mi się wydaje, że coś źle zrozumiałeś jak ją używać, bo takie funkcje callback mają pewne standardy, których tu nie dostrzegam.

Najlepiej daj więcej kodu, a nie same deklaracje metod.

0
MarekR22 napisał(a):
pestka12 napisał(a):

Coś mi się wydaje, że coś źle zrozumiałeś jak ją używać, bo takie funkcje callback mają pewne standardy, których tu nie dostrzegam.

Trochę calbacków widziałem, jeszcze więcej nie widziałem

static int callback(void *NotUsed, int argc, char **argv, char **azColName);

ten

void * notused

mi pachnie jak void gwiazdka userdata czyli np opakowanie / równoważnik this. Ale to tylko mgliste mniemanie przy herbacie

Najlepiej daj więcej kodu, a nie same deklaracje metod.

Popieram oburącz

0

@MarekR22: @AnyKtokolwiek Proszę cały kod z pliku.cpp. Linia 192-196, właśnie w tych liniach ma działać wxListCtrl. Przepraszam że tak długo nie odpowiadałem ale miałem krucho z czasem.

#include"deklaracja.h"
baza user;
//definicja okno
BEGIN_EVENT_TABLE(okno, wxFrame)
EVT_BUTTON(2, okno::generowanie_ksiazki)
EVT_BUTTON(3, okno::generowanie_uczniowie)
END_EVENT_TABLE()
//koniec definicja okno

//definicja okno_ksiazki
BEGIN_EVENT_TABLE(okno_ksiazki, wxFrame)
EVT_BUTTON(15, okno_ksiazki::wykonanie_polecenie_sql_dodaj_ksiazke)
EVT_BUTTON(28, okno_ksiazki::wykonanie_polecenia_sql_wyporzycz_ksiazke)
EVT_BUTTON(41, okno_ksiazki::wykonanie_polecenia_sql_oddaj_ksiazke)
EVT_CHECKBOX(4, okno_ksiazki::czas_systemowy)
EVT_BUTTON(43, okno_ksiazki::wykonanie_polecenia_sql_ususwanie_ksiazki)
END_EVENT_TABLE()
//koniec definicja okno_ksiazki

//definicja okno_uczniowie
BEGIN_EVENT_TABLE(okno_uczniowie, wxFrame)
END_EVENT_TABLE()
//koniec definicja okno_uczniowie

//kostruktory
okno::okno(const wxString &title, const wxPoint & po, const wxSize &si, long style) :wxFrame(NULL, -1, title, po, si, style)
{
	wxPanel *tlo = new wxPanel(this, 1, wxPoint(50, 50), wxSize(240, 340));
	wxButton *przycisk_do_generowania_panelu_ksiazki = new wxButton(tlo, 2, _T("Ksiazki"), wxPoint(60, 50), wxSize(100, 50));
	wxButton *przycisk_do_generowania_panelu_uczniowie = new wxButton(tlo, 3, _T("Uczniowie"), wxPoint(60, 140), wxSize(100, 50));

}
okno_ksiazki::okno_ksiazki(const wxString &title, const wxPoint & po, const wxSize &si, long style) :wxFrame(NULL, -1, title, po, si, style)
{
	wxPanel *tlo_ksiazki = new wxPanel(this, 1, wxPoint(50, 50), wxSize(648, 486));
	wxStaticLine *x = new wxStaticLine(tlo_ksiazki, 2, wxPoint(0, 243), wxSize(648, 1));
	wxStaticLine *x1 = new wxStaticLine(tlo_ksiazki, 0, wxPoint(324, 125), wxSize(325, 1));
	wxStaticLine *y = new wxStaticLine(tlo_ksiazki, 3, wxPoint(324, 0), wxSize(1, 560));
	wxStaticLine *y1 = new wxStaticLine(tlo_ksiazki, 5, wxPoint(647, 0), wxSize(1, 560));
	wxStaticText *Napis = new wxStaticText(tlo_ksiazki, 6, "Dodawanie ksiazki", wxPoint(95, 5), wxSize(100, 16));
	wxStaticText *Napis4 = new wxStaticText(tlo_ksiazki, 6, "Konfiguracja:", wxPoint(440, 134), wxSize(80, 16));
	pobieranie_czasu_systemowego = new wxCheckBox(tlo_ksiazki, 4, "Pobieranie daty z systemu", wxPoint(430, 180), wxSize(180, 50));

	//Dane do dodawania książek 

	dodawanie_ksiazek[0] = new wxTextCtrl(tlo_ksiazki, 7, wxEmptyString, wxPoint(110, 45), wxSize(160, 20));
	napisy_do_dodawania_ksiazek[0] = new wxStaticText(tlo_ksiazki, 8, "Podaj Tytul ksiazki: ", wxPoint(5, 46), wxSize(100, 16));
	dodawanie_ksiazek[1] = new wxTextCtrl(tlo_ksiazki, 9, wxEmptyString, wxPoint(120, 80), wxSize(160, 20));
	napisy_do_dodawania_ksiazek[1] = new wxStaticText(tlo_ksiazki, 10, "Podaj Autora ksiazki: ", wxPoint(5, 81), wxSize(115, 16));
	dodawanie_ksiazek[2] = new wxTextCtrl(tlo_ksiazki, 11, wxEmptyString, wxPoint(150, 115), wxSize(160, 20));
	napisy_do_dodawania_ksiazek[2] = new wxStaticText(tlo_ksiazki, 12, "Podaj Rok Wydania ksiazki: ", wxPoint(5, 116), wxSize(145, 16));
	dodawanie_ksiazek[3] = new wxTextCtrl(tlo_ksiazki, 13, wxEmptyString, wxPoint(170, 150), wxSize(140, 20));
	napisy_do_dodawania_ksiazek[3] = new wxStaticText(tlo_ksiazki, 14, "Podaj Nr inwentarzowy ksiazki: ", wxPoint(5, 151), wxSize(162, 16));
	wxButton *Wykonaj = new wxButton(tlo_ksiazki, 15, "Wykonaj", wxPoint(105, 180), wxSize(100, 50));

	//Koniec danych do dodawania książek 

	//Dane do wyporzyczania ksiazek 

	wyporzyczanie_ksiazek[0] = new wxTextCtrl(tlo_ksiazki, 16, wxEmptyString, wxPoint(110, 275), wxSize(160, 20));
	napis_do_wyporzyczania_ksiazek[0] = new wxStaticText(tlo_ksiazki, 17, "Podaj Imie ucznia: ", wxPoint(5, 275), wxSize(96, 16));
	wyporzyczanie_ksiazek[1] = new wxTextCtrl(tlo_ksiazki, 18, wxEmptyString, wxPoint(132, 308), wxSize(160, 20));
	napis_do_wyporzyczania_ksiazek[1] = new wxStaticText(tlo_ksiazki, 19, "Podaj Nazwisko ucznia: ", wxPoint(5, 308), wxSize(123, 16));
	wyporzyczanie_ksiazek[2] = new wxTextCtrl(tlo_ksiazki, 20, wxEmptyString, wxPoint(110, 341), wxSize(160, 20));
	napis_do_wyporzyczania_ksiazek[2] = new wxStaticText(tlo_ksiazki, 21, "Podaj Klase ucznia: ", wxPoint(5, 341), wxSize(100, 16));
	wyporzyczanie_ksiazek[3] = new wxTextCtrl(tlo_ksiazki, 22, wxEmptyString, wxPoint(110, 374), wxSize(160, 20));
	napis_do_wyporzyczania_ksiazek[3] = new wxStaticText(tlo_ksiazki, 23, "Podaj Tytul ksiazki: ", wxPoint(5, 374), wxSize(100, 16));
	wyporzyczanie_ksiazek[4] = new wxTextCtrl(tlo_ksiazki, 24, wxEmptyString, wxPoint(170, 407), wxSize(130, 20));
	napis_do_wyporzyczania_ksiazek[4] = new wxStaticText(tlo_ksiazki, 25, "Podaj Nr inwentarzowy ksiazki: ", wxPoint(5, 407), wxSize(162, 16));
	wyporzyczanie_ksiazek[5] = new wxTextCtrl(tlo_ksiazki, 26, wxEmptyString, wxPoint(190, 440), wxSize(100, 20));
	napis_do_wyporzyczania_ksiazek[5] = new wxStaticText(tlo_ksiazki, 27, "Podaj Date wyporzyczenia ksiazki: ", wxPoint(5, 440), wxSize(180, 16));
	wxButton *Wykonajv1 = new wxButton(tlo_ksiazki, 28, "Wykonaj", wxPoint(105, 473), wxSize(100, 50));

	//Koniec do wyporzyczania ksiazek

	//Dane do oddawania ksiazki

	oddawanie_ksiazek[0] = new wxTextCtrl(tlo_ksiazki, 29, wxEmptyString, wxPoint(435, 275), wxSize(160, 20));
	napis_do_oddawania_ksiazek[0] = new wxStaticText(tlo_ksiazki, 30, "Podaj Imie ucznia: ", wxPoint(335, 275), wxSize(96, 16));
	oddawanie_ksiazek[1] = new wxTextCtrl(tlo_ksiazki, 31, wxEmptyString, wxPoint(461, 308), wxSize(160, 20));
	napis_do_oddawania_ksiazek[1] = new wxStaticText(tlo_ksiazki, 32, "Podaj Nazwisko ucznia: ", wxPoint(335, 308), wxSize(123, 16));
	oddawanie_ksiazek[2] = new wxTextCtrl(tlo_ksiazki, 33, wxEmptyString, wxPoint(438, 341), wxSize(160, 20));
	napis_do_oddawania_ksiazek[2] = new wxStaticText(tlo_ksiazki, 34, "Podaj Klase ucznia: ", wxPoint(335, 341), wxSize(100, 16));
	oddawanie_ksiazek[3] = new wxTextCtrl(tlo_ksiazki, 35, wxEmptyString, wxPoint(438, 374), wxSize(160, 20));
	napis_do_oddawania_ksiazek[3] = new wxStaticText(tlo_ksiazki, 36, "Podaj Tytul ksiazki: ", wxPoint(335, 374), wxSize(100, 16));
	oddawanie_ksiazek[4] = new wxTextCtrl(tlo_ksiazki, 37, wxEmptyString, wxPoint(500, 407), wxSize(100, 20));
	napis_do_oddawania_ksiazek[4] = new wxStaticText(tlo_ksiazki, 38, "Podaj Nr inwentarzowy ksiazki: ", wxPoint(335, 407), wxSize(162, 16));
	oddawanie_ksiazek[5] = new wxTextCtrl(tlo_ksiazki, 39, wxEmptyString, wxPoint(485, 440), wxSize(100, 20));
	napis_do_oddawania_ksiazek[5] = new wxStaticText(tlo_ksiazki, 40, "Podaj Date oddania ksiazki: ", wxPoint(335, 440), wxSize(150, 16));
	wxButton *Wykonajv2 = new wxButton(tlo_ksiazki, 41, "Wykonaj", wxPoint(435, 473), wxSize(100, 50));

	//Koniec do oddawania ksiazki

	//Dane do usuwania ksiazki
	wxTextCtrl *usuwanie_ksiazki = new wxTextCtrl(tlo_ksiazki, 46, wxEmptyString, wxPoint(492, 33), wxSize(100, 20));
	wxStaticText *napis_do_usuwania_ksiazki = new wxStaticText(tlo_ksiazki, 47, "Podaj id ksiazki do usuniecia:", wxPoint(335, 33), wxSize(155, 16));

	//Koniec do usuwania ksiazki
	wxStaticText *Napis1 = new wxStaticText(tlo_ksiazki, 42, "Usuwanie ksiazki", wxPoint(440, 5), wxSize(100, 16));
	wxButton *Wykonajv3 = new wxButton(tlo_ksiazki, 43, "Wykonaj", wxPoint(435, 70), wxSize(100, 50));
	wxStaticText *Napis2 = new wxStaticText(tlo_ksiazki, 44, "Wyporzyczanie ksiazki", wxPoint(95, 250), wxSize(120, 16));
	wxStaticText *Napis3 = new wxStaticText(tlo_ksiazki, 45, "Odawanie ksiazki", wxPoint(440, 250), wxSize(100, 16));
	wyswietlacz = new wxListCtrl(tlo_ksiazki, 48, wxPoint(660, 10), wxSize(398, 510), wxHSCROLL | wxLC_REPORT | wxLC_VRULES | wxLC_HRULES, wxDefaultValidator, _("wyswietlacz"));
	wyswietlacz->InsertColumn(0, _("Id"), wxLIST_FORMAT_LEFT, 30);
	wyswietlacz->InsertColumn(1, _("Tytul"), wxLIST_FORMAT_LEFT, 40);
	wyswietlacz->InsertColumn(2, _("Autor"), wxLIST_FORMAT_LEFT, 45);
	wyswietlacz->InsertColumn(3, _("Rok Wydania"), wxLIST_FORMAT_LEFT, 90);
	wyswietlacz->InsertColumn(4, _("Nr Inwentarzowy"), wxLIST_FORMAT_LEFT, 103);
	wyswietlacz->InsertColumn(5, _("Jest"), wxLIST_FORMAT_LEFT, 35);
	wyswietlacz->InsertItem(0, "Test");  //do skasowania 
	wyswietlacz->SetItem(0, 1, "Test");
}
okno_uczniowie::okno_uczniowie(const wxString &title, const wxPoint & po, const wxSize &si, long style) :wxFrame(NULL, -1, title, po, si, style)
{
	wxPanel*tlo_uczniowie = new wxPanel(this, 1, wxPoint(50, 50), wxSize(648, 486));
	wxStaticLine *x = new wxStaticLine(tlo_uczniowie, 2, wxPoint(0, 243), wxSize(648, 1));
	wxStaticLine *y = new wxStaticLine(tlo_uczniowie, 3, wxPoint(324, 0), wxSize(1, 486));
	wxStaticLine *y1 = new wxStaticLine(tlo_uczniowie, 4, wxPoint(647, 0), wxSize(1, 486));
	wxListCtrl *wyswietlacz = new wxListCtrl(tlo_uczniowie, 5, wxPoint(660, 10), wxSize(280, 440));

}
//koniec konstruktory

//definicja funkcji
void okno::generowanie_ksiazki(wxCommandEvent &event)
{
	sqlite3_exec(user.db, "SELECT * from ksiazki",okno_ksiazki::callback, 0, NULL);
	okno_ksiazki *frame_ksiazki = new okno_ksiazki(_T("Ksiazki"), wxPoint(50, 50), wxSize(1080, 570));
	frame_ksiazki->Show(true);
}
void okno::generowanie_uczniowie(wxCommandEvent &event)
{
	okno_uczniowie *frame_uczniowie = new okno_uczniowie(_T("Uczniowie"), wxPoint(50, 50), wxSize(960, 486));
	frame_uczniowie->Show(true);

}
void okno_ksiazki::wykonanie_polecenie_sql_dodaj_ksiazke(wxCommandEvent &event)
{
	wxMessageBox(wxT("Kod do napisania 1"));

}
void okno_ksiazki::wykonanie_polecenia_sql_wyporzycz_ksiazke(wxCommandEvent &event)
{
	wxMessageBox(wxT("Kod do napisania 2"));
}
void okno_ksiazki::wykonanie_polecenia_sql_oddaj_ksiazke(wxCommandEvent &event)
{
	wxMessageBox(wxT("Kod do napisania 3"));
}
void okno_ksiazki::czas_systemowy(wxCommandEvent &event)
{
	if (pobieranie_czasu_systemowego->GetValue() == true)
	{
		wyporzyczanie_ksiazek[5]->Enable(false);
		oddawanie_ksiazek[5]->Enable(false);
	}
	else
	{
		wyporzyczanie_ksiazek[5]->Enable(true);
		oddawanie_ksiazek[5]->Enable(true);
	}
}
void okno_ksiazki::wykonanie_polecenia_sql_ususwanie_ksiazki(wxCommandEvent &event)
{
	wxMessageBox(wxT("Kod do napisania 4"));
}
//koniec definicji funkcji

IMPLEMENT_APP(menu);
bool menu::OnInit()
{ 
	user.odp = sqlite3_open("bibloteka.db", &user.db);
	if (user.odp)
	{
		wxMessageBox("Błąd z bazą danych");
	}
	else
	{
		user.zapytanie = "CREATE TABLE ksiazki ( \
			id          INTEGER PRIMARY KEY AUTOINCREMENT, \
			Tytul       TEXT,\
			autor       TEXT,\
			rok_wydania DATE,\
			nr_inwentor TEXT,\
			Jest        TEXT);";
		sqlite3_exec(user.db,user.zapytanie.c_str(), NULL, NULL, NULL);
		okno *frame = new okno(_T("Bibloteka"), wxPoint(50, 50), wxSize(240, 340));
		frame->Show(true);
		return true;
	}
}
int okno_ksiazki::callback(void *NotUsed, int argc, char **argv, char **azColName)
{


	return 0;
}
2

I trzeba było tak bronić tajemnicy?

Pachniało mi dobrze. Tak się łączy dane przez ten callback (i większość callbacków w stylu C)
https://www.sqlite.org/c3ref/exec.html


sqlite3_exec(user.db, "SELECT * from ksiazki",okno_ksiazki::callback, this, NULL);  //127 this jest typu okno*

int okno_ksiazki::callback(void *self, int argc, char **argv, char **azColName) //192
{
  okno* thisCopy = (okno*) self;

   thisCopy->zrób_co_chesz(arg ...)
    return 0;
}

Przy okazji sugeruje przeproś się z piątym argumentem (tym NULL) bo tam masz informację o możliwych błedach

To tylko demo jak tego ugryźć, nie gwarantuję bezbłędności, nie kompilowałem ani nie uruchamiałem

0

Sprawdziłem ten sposób ale wywala mi takie błędy:
Ważność Kod Opis Projekt Plik Wiersz Stan pominięcia
Błąd C2065 "self": niezadeklarowany identyfikator Bibloteka d:\programowanie\bibloteka graficzna wersja\bibloteka\bibloteka\definicja.cpp 196
Błąd C2039 „InsertItem”: Nie jest składową „okno_ksiazki” Bibloteka d:\programowanie\bibloteka graficzna wersja\bibloteka\bibloteka\definicja.cpp 197
Błąd (aktywny) E0020 identyfikator "self" jest niezdefiniowany Bibloteka D:\Programowanie\Bibloteka Graficzna wersja\Bibloteka\Bibloteka\Definicja.cpp 196
Błąd (aktywny) E0135 element class "okno_ksiazki" nie ma składowej "InsertItem" Bibloteka D:\Programowanie\Bibloteka Graficzna wersja\Bibloteka\Bibloteka\Definicja.cpp 197

Kod jaki napisałem w metodzie callback:

okno_ksiazki *thiscopy = (okno_ksiazki*) self;
	thiscopy->InsertItem(0, "test");

	return 0;

@AnyKtokolwiek

0
pestka12 napisał(a):

Sprawdziłem ten sposób ale wywala mi takie błędy:
Ważność Kod Opis Projekt Plik Wiersz Stan pominięcia
Błąd C2065 "self": niezadeklarowany identyfikator Bibloteka d:\programowanie\bibloteka graficzna wersja\bibloteka\bibloteka\definicja.cpp 196
Błąd C2039 „InsertItem”: Nie jest składową „okno_ksiazki” Bibloteka d:\programowanie\bibloteka graficzna wersja\bibloteka\bibloteka\definicja.cpp 197
Błąd (aktywny) E0020 identyfikator "self" jest niezdefiniowany Bibloteka D:\Programowanie\Bibloteka Graficzna wersja\Bibloteka\Bibloteka\Definicja.cpp 196
Błąd (aktywny) E0135 element class "okno_ksiazki" nie ma składowej "InsertItem" Bibloteka D:\Programowanie\Bibloteka Graficzna wersja\Bibloteka\Bibloteka\Definicja.cpp 197

Kod jaki napisałem w metodzie callback:

okno_ksiazki *thiscopy = (okno_ksiazki*) self;
	thiscopy->InsertItem(0, "test");

	return 0;

@AnyKtokolwiek

Nawet nie umiesz dobrze skopiować. U mnie self jest zdefiniowany, bo jest parametrem.

rzutowanie nie może być 'takie se', to programista musi kontrolować co podał jako czwarty parametr. Nie jest type safe. Ja ci nie narzucam co tam jest, tylko dałem przykład.
Być może w okno* musisz wyłuskać składową. (dodam, nie mam przekonania czy klasy są dobrze zaprojektowane, np nawzajem grzebią w swoich wnętrznościach

Mam delikatną radę, jak kompilację trudno przejść, to błędy na wykonaniu będą kaplicą

0

Boże czasami człowiek nie myśli :D.

Już poprawiłem kod i się skompilował lecz mam taki problem ponieważ gdy wykona się coś takiego. (kojarzy mi się to z zapisem kaskadowym )

thiscopy->wyswietlacz->InsertItem(0, "test");

Czyli się skompiluje lecz zawiesza się program gdy wywołuję ten zapis u góry. (Przepraszam że tak męczę ale jestem amator-programista na razie i dopiero nabieram tej dobrej praktyki ).

Jak coś zapis:

thiscopy->InsertItem(0, "test");

To wywala mi takie błędy kompilacyjne:
Ważność Kod Opis Projekt Plik Wiersz Stan pominięcia
Błąd (aktywny) E0135 element class "okno_ksiazki" nie ma składowej "InsertItem" Bibloteka D:\Programowanie\Bibloteka Graficzna wersja\Bibloteka\Bibloteka\Definicja.cpp 198
Błąd C2039 „InsertItem”: Nie jest składową „okno_ksiazki” Bibloteka d:\programowanie\bibloteka graficzna wersja\bibloteka\bibloteka\definicja.cpp 198

@AnyKtokolwiek

1

https://www.sqlite.org/c3ref/exec.html

If the callback function of the 3rd argument to sqlite3_exec() is not NULL, then it is invoked for each result row coming out of the evaluated SQL statements. The 4th argument to sqlite3_exec() is relayed through to the 1st argument of each callback invocation.

Czyli to ma wyglądać tak:

void okno::generowanie_ksiazki(wxCommandEvent &event)
{
    sqlite3_exec(user.db, "SELECT * from ksiazki",okno_ksiazki::callback, this, nullptr);
    ....
}

int okno_ksiazki::callback(void *self, int argc, char **argv, char **azColName)
{
    auto p = static_cast<okno_ksiazki *>(self);
    return p->handleResponseRow(argc, argv, azColName);
}

int okno::handleResponseRow(int argc, char **argv, char **azColName)
{
    // rob to co ci potrzebne
}

Teraz inna wersja to:

void okno::generowanie_ksiazki(wxCommandEvent &event)
{
    sqlite3_exec(user.db, "SELECT * from ksiazki",
        static_cast<int (*)(void*,int,char**,char**)>(&okno::handleResponseRow), 
        this, 
        nullptr);
    ....
}

W tej wersji metoda okno::handleResponseRow(int argc, char **argv, char **azColName) jest równoważna metodzie statycznej: okno::handleResponseRow(okno* self, int argc, char **argv, char **azColName), bo tak naprawdę w metodach this (self) jest niejawnym pierwszym argumentem funkcji.

0

@MarekR22:

Przetestowałem oby dwie wersje lecz są w tym dziwne błędy składniowe np:

int okno::handleResponseRow(int argc, char **argv, char **azColName)//Ja to mam wykonać na okno_ksiazki ?

Więc mój kod wygląda tak który się kompiluje lecz program się zawiesza w momencie kliknięcia przycisku książki czyli wykonanie metody generowanie_ksiazki.

void okno::generowanie_ksiazki(wxCommandEvent &event)
{
	sqlite3_exec(user.db, "SELECT * from ksiazki", okno_ksiazki::callback,this, nullptr);
	okno_ksiazki *frame_ksiazki = new okno_ksiazki(_T("Ksiazki"), wxPoint(50, 50), wxSize(1080, 570));
	frame_ksiazki->Show(true);
}

int okno_ksiazki::callback(void *NotUsed, int argc, char **argv, char **azColName)
{
	auto p = static_cast<okno_ksiazki*>(NotUsed);
	return p->handleResponseRow(argc, argv, azColName);
}

int okno_ksiazki::handleResponseRow(int argc, char **argv, char **azColName)
{
	wyswietlacz->InsertItem(2,"test"); //To wywala program ?
	return 0;
}
0

Wywołując sqlite3_exec przekazujesz wskaźnik do instacji okno, który w callback rzutujesz do okno_ksiazki, więc program jak najbardziej ma prawo się wykrzaczyć.

0
-daniel- napisał(a):

Wywołując sqlite3_exec przekazujesz wskaźnik do instacji okno, który w callback rzutujesz do okno_ksiazki, więc program jak najbardziej ma prawo się wykrzaczyć.

Moja wina.
Po prostu nie zauważyłem, że w jego kodzie obok siebie są definicje metod dla rożnych klas. Po prostu widzę tak jak powinno być a nie jak jest.
Copy paste i wyszedł taki kwiatek :).
@pestka12 upewnij się, że to się wszystko odbywa na jednej klasie i na pewno zadziała.

0

@MarekR22:

Witam.

Przetestowałem tą wersje:

void okno::generowanie_ksiazki(wxCommandEvent &event)
{
    sqlite3_exec(user.db, "SELECT * from ksiazki",
        static_cast<int (*)(void*,int,char**,char**)>(&okno::handleResponseRow), 
        this, 
        nullptr);
    ....
}

U mnie ta wersja wygląda tak:

void okno::generowanie_ksiazki(wxCommandEvent &event)
{
	sqlite3_exec(user.db, "SELECT *FROM ksiazki", static_cast<int(*)(void*, int, char**, char**)>(&okno::handleResponseRow), this, nullptr);
	okno_ksiazki *frame_ksiazki = new okno_ksiazki(_T("Ksiazki"), wxPoint(50, 50), wxSize(1080, 570));
	frame_ksiazki->Show(true);
}

A deklaracja tej metody w klasie okno wygląda tak:

class okno : public wxFrame
{
public:
	okno(const wxString &title, const wxPoint & po, const wxSize &si, long style = wxCAPTION | wxSYSTEM_MENU | wxMINIMIZE_BOX | wxCLOSE_BOX);
	void generowanie_ksiazki(wxCommandEvent &event);
	void generowanie_uczniowie(wxCommandEvent &event);
	int handleResponseRow(int argc, char **argv, char **azColName)  //To ta funkcja ;
private:
	DECLARE_EVENT_TABLE()
};

I gdy to zacząłem kompilować to wyskakują takie błędy:

Ważność Kod Opis Projekt Plik Wiersz Stan pominięcia
Błąd (aktywny) E0171 nieprawidłowa konwersja typu Bibloteka D:\Programowanie\Bibloteka Graficzna wersja\Bibloteka\Bibloteka\Definicja.cpp 127
Błąd C2440 "static_cast": nie można konwertować z "int (__thiscall okno::* )(int,char **,char **)" na "int (__cdecl *)(void *,int,char **,char **)" Bibloteka d:\programowanie\bibloteka graficzna wersja\bibloteka\bibloteka\definicja.cpp 127
Błąd C2660 "sqlite3_exec": funkcja nie przyjmuje 4 argumentów Bibloteka d:\programowanie\bibloteka graficzna wersja\bibloteka\bibloteka\definicja.cpp 127

0
 Ważność	Kod	Opis	Projekt	Plik	Wiersz	Stan pominięcia
 Błąd (aktywny)	E0171	nieprawidłowa konwersja typu	Bibloteka	D:\Programowanie\Bibloteka Graficzna wersja\Bibloteka\Bibloteka\Definicja.cpp	127	
 Błąd	C2440	"static_cast": nie można konwertować z "int (__thiscall okno::* )(int,char **,char **)" na "int (__cdecl *)(void *,int,char **,char **)"	Bibloteka	d:\programowanie\bibloteka graficzna wersja\bibloteka\bibloteka\definicja.cpp	127	
 Błąd	C2660	"sqlite3_exec": funkcja nie przyjmuje 4 argumentów	Bibloteka	d:\programowanie\bibloteka graficzna wersja\bibloteka\bibloteka\definicja.cpp	127

Ok obie funkcje mają inne ABI. Tu masz opis o co chodzi.
Z powodu różnego ABI kompilator słusznie nie przepuszcza tej konwersji.
W związku z tym trzeba wymusić właściwe ABI na okno::handleResponseRow.

Z tego co pamiętam to musisz po prostu dopisać __cdecl przed handleResponseRow.

class okno : public wxFrame
{
public:
   ....
   int __cdecl handleResponseRow(int argc, char **argv, char **azColName);
}

PS: Daruję zrzędzenie nad architekturą twojego kodu (groch z kapustą).

1 użytkowników online, w tym zalogowanych: 0, gości: 1