Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [wx] странный глюк, программа компилируется, но не бежит 
V
    Опции темы
bilbobagginz
  Дата 27.8.2008, 15:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Naughtius Maximus
****


Профиль
Группа: Экс. модератор
Сообщений: 8813
Регистрация: 2.3.2004
Где: Israel

Репутация: нет
Всего: 317



привет, странное со мной опять произошло.
Наверное напорол, но никак заметить не могу.
О проблеме:
есть программа, которая до некоторого времени бежала под вин,лин, и мак.
потом решили дяди подточить ее на PDA, масштабировали весь интерфейс на PDA 320х240.
делалось всё это на винде.

методом:
Код

#ifndef _SMALL_DISPLAY
// тут код для маленького "дисплейчика"
#else
// тут предыдущий код
#endif


но получилось так, что часть переменных иногда были не нужны для одной из конфигураций, а другая часть была релевантной только для второй.

Короче под винду, программа собралась, запустилась, отладилась, и всё работает.

Теперь проверяем ан линукс, и программа скомпилилась, но не запускается.
Точнее при запуске выходит несколько похожих ошибок, которые представлены тут:
http://rafb.net/p/XU9uMe73.html

пробовал дебажить, но программа вылетает до моих классов.
Я не знаю даже в чем может быть проблема...

может один из моих define-ов как-то перехлестнуслся с wxWidgets:
Код

_SMALL_DISPLAY


помогите врубиться в чем дело!



--------------------
Я ещё не демон. Я только учусь.
PM WWW   Вверх
bsa
Дата 27.8.2008, 15:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 24
Всего: 196



А случаем нет статических объектов? Я бы посмотрел бэктрейс и копал уже оттуда.
PM   Вверх
bilbobagginz
Дата 27.8.2008, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Naughtius Maximus
****


Профиль
Группа: Экс. модератор
Сообщений: 8813
Регистрация: 2.3.2004
Где: Israel

Репутация: нет
Всего: 317



Цитата(bsa @  27.8.2008,  15:16 Найти цитируемый пост)
А случаем нет статических объектов?

возможно...
я линкую Си-шную библиотеку, и оборачиваю ее Си++снутым классом-wrapper-ом.
есть несколько функций, которые я определяю в C++ файле, и объявляю их как статическими. но внутри класса никакой статики вроде бы нет.
И еще момент - структура программы не изменилась относительно той версии, в которой проблем нет.

Добавлено @ 16:08
Цитата(bsa @  27.8.2008,  15:16 Найти цитируемый пост)
Я бы посмотрел бэктрейс и копал уже оттуда.

бэктрейс чего ?
я даже не дохожу до своего кода. Запускаю gdb, "выбираю" брейкпойнт:
Код

break main

запускаю:
Код

run

получаю зависание.
жму Ctl+C, имею:
Код

[New Thread 0xb7399720 (LWP 13180)]

Program received signal SIGINT, Interrupt.
[Switching to Thread 0xb7399720 (LWP 13180)]
0xb7a55982 in g_once_init_enter_impl () from /usr/lib/libglib-2.0.so.0





--------------------
Я ещё не демон. Я только учусь.
PM WWW   Вверх
bsa
Дата 27.8.2008, 17:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 24
Всего: 196



вот к чему приводит использование статических переменных. smile
bilbobagginz, запускай gdb и сразу иди шагами. Скорее всего, проблема в статических объектах.
PM   Вверх
bilbobagginz
Дата 27.8.2008, 18:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Naughtius Maximus
****


Профиль
Группа: Экс. модератор
Сообщений: 8813
Регистрация: 2.3.2004
Где: Israel

Репутация: нет
Всего: 317



Цитата(bsa @  27.8.2008,  17:43 Найти цитируемый пост)
bilbobagginz, запускай gdb и сразу иди шагами. Скорее всего, проблема в статических объектах.


я пробовал!
не дошел до main()-а





--------------------
Я ещё не демон. Я только учусь.
PM WWW   Вверх
t_rex
Дата 27.8.2008, 22:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 143
Регистрация: 11.10.2006
Где: Украина, г. Запор ожье

Репутация: 2
Всего: 7



В общем, возможно что у тебя где-то есть статические битмапы (или любое другое чудо, у которого у wxWidgets предусмотрены хэндлеры, например объект файловой системы) и у тебя они пытаются проинициализироваться ДО вызова OnInit. Поэтому лучше всего глобальные переменные статические перекинуть в класс приложения и сделать так чтобы они там не вызывали конструкторов с параметрами при инициализации, а всю инициализацию этих объектов делать в OnInit вручную, а потом уже их юзать.
--------------------
Жизнь не MultiEdit. Undo не сделаешьКросс-платформенное программирование с wxWidgetsБлог о программировании для мобильных устройтсвGoogle Android для программистов и пользователей
PM MAIL WWW ICQ Skype GTalk   Вверх
bilbobagginz
Дата 28.8.2008, 00:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Naughtius Maximus
****


Профиль
Группа: Экс. модератор
Сообщений: 8813
Регистрация: 2.3.2004
Где: Israel

Репутация: нет
Всего: 317



Цитата(t_rex @  27.8.2008,  22:33 Найти цитируемый пост)
и у тебя они пытаются проинициализироваться ДО вызова OnInit. Поэтому лучше всего глобальные переменные статические перекинуть в класс приложения и сделать так чтобы они там не вызывали конструкторов с параметрами при инициализации, а всю инициализацию этих объектов делать в OnInit вручную, а потом уже их юзать.

хороший hint! но:
Код

MyDlg::MyDlg( 
                    wxWindow* parent, 
                    wxWindowID id, 
                    const wxString& caption, 
                    const wxPoint& pos, 
                    const wxSize& size, 
                    long style )
{
    wxImage::AddHandler(new wxPNGHandler); // PNG support
    wxImage::AddHandler(new wxJPEGHandler);// JPEG support
    SetDlgMinSize(wxSize(::wxGetDisplaySize())); // Make sure the size of the dialog is visible!
    InitXmlResource();
    Init();
    SetExtraStyle(wxWS_EX_BLOCK_EVENTS|wxWS_EX_TRANSIENT);
#ifdef _GUI_RESIZEABLE
    Create(parent, id, caption, pos, m_sDlgSize, style|wxWANTS_CHARS|wxSHAPED);
#else
    Create(parent, id, caption, pos, size, style|wxWANTS_CHARS);
#endif
    Connect(ID_CMD_QUIT,wxID_CLOSE,wxCommandEventHandler(QalculatorDlg::OnQuit));
}

только я вроде бы их инциализирую в InitXmlResource();
лучше делать это в каком-то другом порядке ?

Кстати.
Проблемы начались параллельно с увеличением бит-мапов. Возможно что происходит какое-то переполнение чего-то, и поэтому просто во время инитиализации данные переписывают программу, и просиходит такой глюк ?
(ну, и да, у меня таки да эти переменные - static-и., я об их существовании забыл, они как бы инклюдятся себе и вот только сейчас видимо созрела проблема)





--------------------
Я ещё не демон. Я только учусь.
PM WWW   Вверх
t_rex
Дата 28.8.2008, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 143
Регистрация: 11.10.2006
Где: Украина, г. Запор ожье

Репутация: 2
Всего: 7



Вобще все хэндлеры надо в wxApp::OnInit инициализировать т.к. например главное окно ты можешь пересоздать и они проинициализируются заново, поэтому лучше там в OnInit, там же файловые системы, InitXmlResources вроде тоже в OnInit надо, хотя надо глянуть, это ж вроде глобальная функция, так? или ты там сам ее написал?
--------------------
Жизнь не MultiEdit. Undo не сделаешьКросс-платформенное программирование с wxWidgetsБлог о программировании для мобильных устройтсвGoogle Android для программистов и пользователей
PM MAIL WWW ICQ Skype GTalk   Вверх
JackYF
Дата 28.8.2008, 13:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 7
Всего: 162



Цитата(bilbobagginz @  27.8.2008,  14:01 Найти цитируемый пост)
_SMALL_DISPLAY

Советую сменить схему именования. Переменные и дефайны, первый символ символ которых - подчёркивание, а второй - большая латинская буква, зарезервированы стандартом С++. Не факт, что проблема в этом, но тем не менее.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
bilbobagginz
Дата 28.8.2008, 15:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Naughtius Maximus
****


Профиль
Группа: Экс. модератор
Сообщений: 8813
Регистрация: 2.3.2004
Где: Israel

Репутация: нет
Всего: 317



Цитата(t_rex @  28.8.2008,  13:14 Найти цитируемый пост)
Вобще все хэндлеры надо в wxApp::OnInit инициализировать т.к. например главное окно ты можешь пересоздать и они проинициализируются заново, поэтому лучше там в OnInit, там же файловые системы, InitXmlResources вроде тоже в OnInit надо, хотя надо глянуть, это ж вроде глобальная функция, так? или ты там сам ее написал?

это самописная функция, написал одной левой:
Код

void InitXmlResource()
{
    resources[ICON_PNG].byteseq     = icon_png;
    resources[ICON_PNG].size        = icon_png_size;
    resources[LOGO_PNG].byteseq     = logo_png;
    resources[LOGO_PNG].size        = logo_png_size;
    resources[BTN00_PNG].byteseq    = button00_png;
    resources[BTN00_PNG].size       = button00_png_size;
    //... и т.д.
    //... и т.п.
    resources[BTN32_PNG].byteseq    = button32_png;
    resources[BTN32_PNG].size       = button32_png_size;
    resources[ICON_PNG_BIG].byteseq = icon_big_png;
    resources[ICON_PNG_BIG].size    = icon_big_png_size;
}

Далее, значиццо так:
программу (без изменений) собирал на маке, всё запустилось.
собирал на винде - всё запустилось.


думаем вместе : в чём могет быть трабла ?!?!?!?! СЦОБАКА... 





--------------------
Я ещё не демон. Я только учусь.
PM WWW   Вверх
t_rex
Дата 28.8.2008, 22:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 143
Регистрация: 11.10.2006
Где: Украина, г. Запор ожье

Репутация: 2
Всего: 7



icon_png и остальные если у тебя статические, то они инициализируются до вызова конструктора формы и вызывают коллапс сознания ошибки в работе приложения. Говорю ж, все статические битмапы должны загружаться из файлов ПОСЛЕ добавления хэндлеров.
--------------------
Жизнь не MultiEdit. Undo не сделаешьКросс-платформенное программирование с wxWidgetsБлог о программировании для мобильных устройтсвGoogle Android для программистов и пользователей
PM MAIL WWW ICQ Skype GTalk   Вверх
bilbobagginz
Дата 29.8.2008, 05:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Naughtius Maximus
****


Профиль
Группа: Экс. модератор
Сообщений: 8813
Регистрация: 2.3.2004
Где: Israel

Репутация: нет
Всего: 317



Цитата(t_rex @  28.8.2008,  22:39 Найти цитируемый пост)
Говорю ж, все статические битмапы должны загружаться из файлов ПОСЛЕ добавления хэндлеров. 

Для легкости переноса и установки моё приложение должно быть 1-м экзешником, статически слинкованном, ни от чего нестандартного не зависящим, который просто - скопировал, и запустил. всё.
(т.е. с моей т.з. wxWidgets - не предустановлен на стандартныe linux версии для PDA, ерго надо к wx-ам линковать статически)
Поэтому используется такой метод - чтобы не было какого-то каталога, в котором есть настройки программы, иконки, и т.д.
Насколько я понимаю ситуацию - до того, как я начинаю пользоваться данными, они не изображения, а просто набор беспорядочных данных, массивы байтов, не обрабатываемых никакими хэндлерами.  
изображениями они становятся после инициализации, т.е. после загрузки InitXmlResource(), внутри Init()
вызывается CreateControls(), внутри которого есть примерно такой код:
Код

wxMemoryInputStream *istr = NULL;
// тут макароны, спагетти и др. паста
istr = new wxMemoryInputStream(resources[LOGO_PNG].byteseq, resources[LOGO_PNG].size);
wxImage tmp_img(*istr,wxBITMAP_TYPE_PNG);
tmp_img=tmp_img.Scale(
            SYMBOL_LOGO_SIZE.x,
            SYMBOL_LOGO_SIZE.y,
            wxIMAGE_QUALITY_HIGH);
delete istr;
wxBitmap bm(tmp_img);

И уже после этого загружается битмап в какую-то wxStaticBitmap, и прорисовывается.
т.е. я не вижу противоречия между твоими словами, и моим кодом.

Где-то я ошибаюсь ?
Если я ошибаюсь, как можно  моим подходом отложить загрузку данных, т.е. до "после"  ?

Огромное Спасибо за помощь, кстати!



--------------------
Я ещё не демон. Я только учусь.
PM WWW   Вверх
t_rex
Дата 29.8.2008, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 143
Регистрация: 11.10.2006
Где: Украина, г. Запор ожье

Репутация: 2
Всего: 7



Ладно, показываю как правильно
App.h
Код

/////////////////////////////////////////////////////////////////////////////
// Name:        wxTestApp.h
// Purpose:     
// Author:      Volodymir (T-Rex) Tryapichko
// Modified by: 
// Created:     23/01/2008 19:24:59
// RCS-ID:      
// Copyright:   Volodymir (T-Rex) Tryapichko, 2008
// Licence:     
/////////////////////////////////////////////////////////////////////////////

#ifndef _WXTESTAPP_H_
#define _WXTESTAPP_H_


/*!
 * Includes
 */

////@begin includes
#include "wx/image.h"
#include "wxTestMainFrame.h"
////@end includes

/*!
 * Forward declarations
 */

////@begin forward declarations
////@end forward declarations
#include <wx/imaglist.h>

/*!
 * Control identifiers
 */

////@begin control identifiers
////@end control identifiers

/*!
 * wxTestApp class declaration
 */

class wxTestApp: public wxApp
{    
    DECLARE_CLASS( wxTestApp )
    DECLARE_EVENT_TABLE()

    wxImageList m_AppImageList;

    void LoadAppImages();
public:
    /// Constructor
    wxTestApp();

    void Init();

    /// Initialises the application
    virtual bool OnInit();


////@begin wxTestApp event handler declarations

////@end wxTestApp event handler declarations

////@begin wxTestApp member function declarations

////@end wxTestApp member function declarations
    wxImageList & GetImageList();

////@begin wxTestApp member variables
////@end wxTestApp member variables
};

/*!
 * Application instance declaration 
 */

////@begin declare app
DECLARE_APP(wxTestApp)
////@end declare app

#endif
    // _WXTESTAPP_H_


App.cpp
Код

/////////////////////////////////////////////////////////////////////////////
// Name:        wxTestApp.cpp
// Purpose:     
// Author:      Volodymir (T-Rex) Tryapichko
// Modified by: 
// Created:     23/01/2008 19:24:59
// RCS-ID:      
// Copyright:   Volodymir (T-Rex) Tryapichko, 2008
// Licence:     
/////////////////////////////////////////////////////////////////////////////

// For compilers that support precompilation, includes "wx/wx.h".
#include "wx/wxprec.h"

#ifdef __BORLANDC__
#pragma hdrstop
#endif

#ifndef WX_PRECOMP
#include "wx/wx.h"
#endif

////@begin includes
////@end includes

#include "wxTestApp.h"

////@begin XPM images
////@end XPM images


/*!
 * Application instance implementation
 */

////@begin implement app
IMPLEMENT_APP( wxTestApp )
////@end implement app


/*!
 * wxTestApp type definition
 */

IMPLEMENT_CLASS( wxTestApp, wxApp )


/*!
 * wxTestApp event table definition
 */

BEGIN_EVENT_TABLE( wxTestApp, wxApp )

////@begin wxTestApp event table entries
////@end wxTestApp event table entries

END_EVENT_TABLE()


/*!
 * Constructor for wxTestApp
 */

wxTestApp::wxTestApp()
{
    Init();
}


/*!
 * Member initialisation
 */

void wxTestApp::Init()
{
////@begin wxTestApp member initialisation
////@end wxTestApp member initialisation
}

/*!
 * Initialisation for wxTestApp
 */

bool wxTestApp::OnInit()
{
    
#if wxUSE_XPM
    wxImage::AddHandler(new wxXPMHandler);
#endif
#if wxUSE_LIBPNG
    wxImage::AddHandler(new wxPNGHandler);
#endif
#if wxUSE_LIBJPEG
    wxImage::AddHandler(new wxJPEGHandler);
#endif
#if wxUSE_GIF
    wxImage::AddHandler(new wxGIFHandler);
#endif
    LoadAppImages();

    wxTestMainFrame* mainWindow = new wxTestMainFrame( NULL, ID_WXTESTMAINFRAME );
    SetTopWindow(mainWindow);
    mainWindow->Show(true);
    return true;
}

void wxTestApp::LoadAppImages()
{
    m_AppImageList.Create(16, 15);
    wxString prefix = wxPathOnly(argv[0]) + wxFILE_SEP_PATH + wxT("art") + wxFILE_SEP_PATH;
    m_AppImageList.Add(wxBitmap(prefix + wxT("new.xpm"), wxBITMAP_TYPE_XPM));
    m_AppImageList.Add(wxBitmap(prefix + wxT("test.png"), wxBITMAP_TYPE_PNG));
}

wxImageList & wxTestApp::GetImageList()
{
    return m_AppImageList;
}


Frame.h
Код

/////////////////////////////////////////////////////////////////////////////
// Name:        wxTestMainFrame.h
// Purpose:     
// Author:      Volodymir (T-Rex) Tryapichko
// Modified by: 
// Created:     23/01/2008 19:25:24
// RCS-ID:      
// Copyright:   Volodymir (T-Rex) Tryapichko, 2008
// Licence:     
/////////////////////////////////////////////////////////////////////////////

#ifndef _WXTESTMAINFRAME_H_
#define _WXTESTMAINFRAME_H_


/*!
 * Includes
 */

////@begin includes
#include "wx/frame.h"
#include "wx/statusbr.h"
#include "wx/listctrl.h"
////@end includes

/*!
 * Forward declarations
 */

////@begin forward declarations
class wxListCtrl;
////@end forward declarations

/*!
 * Control identifiers
 */

////@begin control identifiers
#define ID_WXTESTMAINFRAME 10000
#define ID_MAIN_STATUSBAR 10002
#define ID_PANEL1 10001
#define ID_TEXTCTRL1 10004
#define ID_DO 10005
#define ID_LISTCTRL 10003
#define SYMBOL_WXTESTMAINFRAME_STYLE wxCAPTION|wxRESIZE_BORDER|wxSYSTEM_MENU|wxMINIMIZE|wxCLOSE_BOX
#define SYMBOL_WXTESTMAINFRAME_TITLE _("wxTestMainFrame")
#define SYMBOL_WXTESTMAINFRAME_IDNAME ID_WXTESTMAINFRAME
#define SYMBOL_WXTESTMAINFRAME_SIZE wxSize(400, 300)
#define SYMBOL_WXTESTMAINFRAME_POSITION wxDefaultPosition
////@end control identifiers


/*!
 * wxTestMainFrame class declaration
 */

class wxTestMainFrame: public wxFrame
{    
    DECLARE_CLASS( wxTestMainFrame )
    DECLARE_EVENT_TABLE()

public:
    /// Constructors
    wxTestMainFrame();
    wxTestMainFrame( wxWindow* parent, wxWindowID id = SYMBOL_WXTESTMAINFRAME_IDNAME, const wxString& caption = SYMBOL_WXTESTMAINFRAME_TITLE, const wxPoint& pos = SYMBOL_WXTESTMAINFRAME_POSITION, const wxSize& size = SYMBOL_WXTESTMAINFRAME_SIZE, long style = SYMBOL_WXTESTMAINFRAME_STYLE );

    bool Create( wxWindow* parent, wxWindowID id = SYMBOL_WXTESTMAINFRAME_IDNAME, const wxString& caption = SYMBOL_WXTESTMAINFRAME_TITLE, const wxPoint& pos = SYMBOL_WXTESTMAINFRAME_POSITION, const wxSize& size = SYMBOL_WXTESTMAINFRAME_SIZE, long style = SYMBOL_WXTESTMAINFRAME_STYLE );

    /// Destructor
    ~wxTestMainFrame();

    /// Initialises member variables
    void Init();

    /// Creates the controls and sizers
    void CreateControls();

////@begin wxTestMainFrame event handler declarations

    /// wxEVT_COMMAND_MENU_SELECTED event handler for wxID_EXIT
    void OnExitClick( wxCommandEvent& event );

////@end wxTestMainFrame event handler declarations

////@begin wxTestMainFrame member function declarations

    /// Retrieves bitmap resources
    wxBitmap GetBitmapResource( const wxString& name );

    /// Retrieves icon resources
    wxIcon GetIconResource( const wxString& name );
////@end wxTestMainFrame member function declarations

    /// Should we show tooltips?
    static bool ShowToolTips();

////@begin wxTestMainFrame member variables
    wxTextCtrl* m_MyTextCtrl;
    wxListCtrl* m_ListCtrl;
////@end wxTestMainFrame member variables
};

#endif
    // _WXTESTMAINFRAME_H_


Frame.cpp
Код

/////////////////////////////////////////////////////////////////////////////
// Name:        wxTestMainFrame.cpp
// Purpose:     
// Author:      Volodymir (T-Rex) Tryapichko
// Modified by: 
// Created:     23/01/2008 19:25:24
// RCS-ID:      
// Copyright:   Volodymir (T-Rex) Tryapichko, 2008
// Licence:     
/////////////////////////////////////////////////////////////////////////////

// For compilers that support precompilation, includes "wx/wx.h".
#include "wx/wxprec.h"

#ifdef __BORLANDC__
#pragma hdrstop
#endif

#ifndef WX_PRECOMP
#include "wx/wx.h"
#endif

////@begin includes
////@end includes

#include "wxTestMainFrame.h"
#include "wxTestApp.h"
#include "DatabaseLayer.h"
#include "FirebirdDatabaseLayer.h"
#include "DatabaseLayerException.h"
#include <wx/fileconf.h>
#include <wx/wfstream.h>
#include <wx/filename.h>

////@begin XPM images
////@end XPM images


/*!
 * wxTestMainFrame type definition
 */

IMPLEMENT_CLASS( wxTestMainFrame, wxFrame )


/*!
 * wxTestMainFrame event table definition
 */

BEGIN_EVENT_TABLE( wxTestMainFrame, wxFrame )

////@begin wxTestMainFrame event table entries
    EVT_MENU( wxID_EXIT, wxTestMainFrame::OnExitClick )

////@end wxTestMainFrame event table entries
    EVT_TOOL_RCLICKED(wxID_ANY, wxTestMainFrame::OnToolRightClicked)

END_EVENT_TABLE()


/*!
 * wxTestMainFrame constructors
 */

wxTestMainFrame::wxTestMainFrame()
{
    Init();
}

wxTestMainFrame::wxTestMainFrame( wxWindow* parent, wxWindowID id, const wxString& caption, const wxPoint& pos, const wxSize& size, long style )
{
    Init();
    Create( parent, id, caption, pos, size, style );
}


/*!
 * wxTestMainFrame creator
 */

bool wxTestMainFrame::Create( wxWindow* parent, wxWindowID id, const wxString& caption, const wxPoint& pos, const wxSize& size, long style )
{
////@begin wxTestMainFrame creation
    wxFrame::Create( parent, id, caption, pos, size, style );

    CreateControls();
    Centre();
////@end wxTestMainFrame creation
    return true;
}


/*!
 * wxTestMainFrame destructor
 */

wxTestMainFrame::~wxTestMainFrame()
{
////@begin wxTestMainFrame destruction
////@end wxTestMainFrame destruction
}


/*!
 * Member initialisation
 */

void wxTestMainFrame::Init()
{
////@begin wxTestMainFrame member initialisation
    m_MyTextCtrl = NULL;
    m_ListCtrl = NULL;
////@end wxTestMainFrame member initialisation
}


/*!
 * Control creation for wxTestMainFrame
 */

void wxTestMainFrame::CreateControls()
{    
////@begin wxTestMainFrame content construction
    wxTestMainFrame* itemFrame1 = this;

    wxMenuBar* menuBar = new wxMenuBar;
    wxMenu* itemMenu3 = new wxMenu;
    itemMenu3->Append(wxID_EXIT, _("Exit\tAlt+F4"), _T(""), wxITEM_NORMAL);
    menuBar->Append(itemMenu3, _("File"));
    itemFrame1->SetMenuBar(menuBar);

    wxStatusBar* itemStatusBar5 = new wxStatusBar( itemFrame1, ID_MAIN_STATUSBAR, wxST_SIZEGRIP|wxNO_BORDER );
    itemStatusBar5->SetFieldsCount(2);
    itemFrame1->SetStatusBar(itemStatusBar5);

    wxBoxSizer* itemBoxSizer6 = new wxBoxSizer(wxVERTICAL);
    itemFrame1->SetSizer(itemBoxSizer6);

    wxPanel* itemPanel7 = new wxPanel( itemFrame1, ID_PANEL1, wxDefaultPosition, wxDefaultSize, wxNO_BORDER|wxTAB_TRAVERSAL );
    itemBoxSizer6->Add(itemPanel7, 1, wxGROW, 0);

    wxBoxSizer* itemBoxSizer8 = new wxBoxSizer(wxVERTICAL);
    itemPanel7->SetSizer(itemBoxSizer8);

    m_MyTextCtrl = new wxTextCtrl( itemPanel7, ID_TEXTCTRL1, _T(""), wxDefaultPosition, wxDefaultSize, 0 );
    itemBoxSizer8->Add(m_MyTextCtrl, 0, wxGROW|wxALL, 5);

    wxButton* itemButton10 = new wxButton( itemPanel7, ID_DO, _("&DO"), wxDefaultPosition, wxDefaultSize, 0 );
    itemBoxSizer8->Add(itemButton10, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5);

    m_ListCtrl = new wxListCtrl( itemPanel7, ID_LISTCTRL, wxDefaultPosition, wxSize(100, 100), wxLC_REPORT|wxLC_SINGLE_SEL|wxLC_HRULES|wxLC_VRULES );
    itemBoxSizer8->Add(m_ListCtrl, 1, wxGROW|wxALL, 5);

////@end wxTestMainFrame content construction
    m_ListCtrl->InsertColumn(0, _("Test 1"), 100);
    m_ListCtrl->InsertColumn(1, _("Test 2"), 100);
    m_ListCtrl->InsertColumn(2, _("Test 3"), 100);
    m_ListCtrl->SetImageList(&wxGetApp().GetImageList(), wxIMAGE_LIST_SMALL);
    
    long item(-1);
    srand(time(NULL));

    item = m_ListCtrl->InsertItem(0, _("Item1"));
    m_ListCtrl->SetItemImage(item, 
        rand() % m_ListCtrl->GetImageList(wxIMAGE_LIST_SMALL)->GetImageCount());
    m_ListCtrl->SetItem(item, 1, _("SubItem1"));
    m_ListCtrl->SetItem(item, 2, _("SubItem1"));
    
    item = m_ListCtrl->InsertItem(0, _("Item1"));
    m_ListCtrl->SetItemImage(item, 
        rand() % m_ListCtrl->GetImageList(wxIMAGE_LIST_SMALL)->GetImageCount());
    m_ListCtrl->SetItem(item, 1, _("SubItem1"));
    m_ListCtrl->SetItem(item, 2, _("SubItem1"));

    item = m_ListCtrl->InsertItem(0, _("Item1"));
    m_ListCtrl->SetItemImage(item, 
        rand() % m_ListCtrl->GetImageList(wxIMAGE_LIST_SMALL)->GetImageCount());
    m_ListCtrl->SetItem(item, 1, _("SubItem1"));
    m_ListCtrl->SetItem(item, 2, _("SubItem1"));
    
}


/*!
 * Should we show tooltips?
 */

bool wxTestMainFrame::ShowToolTips()
{
    return true;
}

/*!
 * Get bitmap resources
 */

wxBitmap wxTestMainFrame::GetBitmapResource( const wxString& name )
{
    // Bitmap retrieval
////@begin wxTestMainFrame bitmap retrieval
    wxUnusedVar(name);
    return wxNullBitmap;
////@end wxTestMainFrame bitmap retrieval
}

/*!
 * Get icon resources
 */

wxIcon wxTestMainFrame::GetIconResource( const wxString& name )
{
    // Icon retrieval
////@begin wxTestMainFrame icon retrieval
    wxUnusedVar(name);
    return wxNullIcon;
////@end wxTestMainFrame icon retrieval
}


/*!
 * wxEVT_COMMAND_MENU_SELECTED event handler for wxID_EXIT
 */

void wxTestMainFrame::OnExitClick( wxCommandEvent& event )
{
////@begin wxEVT_COMMAND_MENU_SELECTED event handler for wxID_EXIT in wxTestMainFrame.
    // Before editing this code, remove the block markers.
    event.Skip();
////@end wxEVT_COMMAND_MENU_SELECTED event handler for wxID_EXIT in wxTestMainFrame. 
}


Т.е. Делаем список битмапов члоеном клааса приложения.
Потом в OnInit() добавляем все нужныэ хэндлеры
После этого загружаем все битмапы
И уже затем создаем форму, в коротой эти битмапы можно юзать как хочется.

Но основная идея в том чтобы не было такого

Код

wxBitmap mySuperGlobalImage(wxT("ya_krevedko.png"), wxBITMAP_TYPE_PNG);

bool wxTestApp::OnInit()
{
...
#if wxUSE_LIBPNG
    wxImage::AddHandler(new wxPNGHandler);
#endif
...
}


потому что если битмапа mySuperGlobalImage статическая то она будет пытаться подгрузиться до вызова OnInit после чего в линухе все покрэшится.

Добавлено через 13 минут и 49 секунд
ЗЫ: по поводу единого экзешника.. если ты хочешь грузить все картинки из памяти, то надо сначала:
Подобавлять в wxImage все хэндлеры
Дрбавить к FileSystem ZIP-хэндлер (я чото не очень уверен что wxrc там в InitXmlResources его добавляет, хотя надо смотреть). В общем хэндлер для XRC добавлять после хэндлеров битмапов
А уже потом грузить все что надо из XRC или из памяти как там тебе удобней
--------------------
Жизнь не MultiEdit. Undo не сделаешьКросс-платформенное программирование с wxWidgetsБлог о программировании для мобильных устройтсвGoogle Android для программистов и пользователей
PM MAIL WWW ICQ Skype GTalk   Вверх
bilbobagginz
Дата 29.8.2008, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Naughtius Maximus
****


Профиль
Группа: Экс. модератор
Сообщений: 8813
Регистрация: 2.3.2004
Где: Israel

Репутация: нет
Всего: 317



Цитата(t_rex @  29.8.2008,  14:19 Найти цитируемый пост)
Ладно, показываю как правильно

ты сказал, что нужно, чтобы до использования битмапов хэндлеры были загружены.
у меня подгрузка хэндлеров происходит в конструкторе класса (наследника от wxDialog). но она происходит тоже ДО создания битмапов.
Ведь изначально эти переменные  не битмапы, а static unsigned char массивы.

Я привел код, показывающий, что именно так и происходит в моей программе.
Мои битмапы я переводил из png в 
Код

size_t button01_png_size = 2227;
static const unsigned char button01_png[] = {
  0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 
// . . .  до фига карактеров 
  0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 
  0x42, 0x60, 0x82
};

т.е. механизм wxWidget-овской VFS тут не работает до использования wxMemoryStream.
Нaсколько я понял главное - это чтобы хэндлер был инициализован ДО использования его функционала.
на 1 строчку раньше или на 100 - не важно. 
т.е. Какая на фиг разница где будет инициализирован хэндлер на PNG до создания объектов из классов wxImage, wxBitmap 
внутри wxApp или как я сделал: в самом пользовательском классе MyDlg, вызываемом из wxApp?



либо ответь на мой вопрос, либо переспроси... 
ну я имею ввиду, что закидывать меня неактуальным кодом не получится ;-]

и еще один момент, повторяюсь.
если дано:
  • под Маком всё компилится + бежит
  • под виндой всё компилится + бежит
только под линухой - компилится но не бежит.
то я сомневаюсь, что проблема в программе.
Возможно я проапгрейдил какую-то системную библиотеку, на которую полагалась моя родная wxWidgets, и теперь ее нет, и программы накрываются медными тазиками.

Сейчас устанавливаю систему OpenSUSE для тестировки.
Соберу с ее штатной wxWidgets.
Если запустится - ясный пень какие-то системные изменения/проблемы.




--------------------
Я ещё не демон. Я только учусь.
PM WWW   Вверх
t_rex
Дата 29.8.2008, 16:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 143
Регистрация: 11.10.2006
Где: Украина, г. Запор ожье

Репутация: 2
Всего: 7



Ээ.. тогда ок, раз не используется VFS тогда да, можно и в конструкторе диалога все сделать.
А по поводу того что в винде все воркает, а в Линухе нет, ну.. так бывает %) сам помню подобные танцы с бубном.
Так.. ладно.. ты отлаживать в линухе пробовал? Минимально, если влом ковыряться с GDB, то с помощью wxLogTrace надо бы локализовать строку, на которой падает.. ну а потом все равно лезть внутрь wx'ов и там смотреть пошагово где валится.
Если там у тебя только заглушка и не жалко в публичный доступ отдавать, дай мне сорцы, я под Убунтой пересоберу, посмотрим что там и как.
--------------------
Жизнь не MultiEdit. Undo не сделаешьКросс-платформенное программирование с wxWidgetsБлог о программировании для мобильных устройтсвGoogle Android для программистов и пользователей
PM MAIL WWW ICQ Skype GTalk   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0653 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.