Поиск:

Ответ в темуСоздание новой темы Создание опроса
> не фурычит дерево 
:(
    Опции темы
tonchitos
Дата 17.3.2008, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 447
Регистрация: 24.2.2007

Репутация: 1
Всего: 40



вот дерево
Код


#pragma once

#include <vector>

#include <string>
#include <fstream>


namespace GUI
{

    class Node 
    {public:
        std::vector<Node> childs;
        std::string Name;
        int pole1;
        int pole2;
        int level;
        
    public:

    Node();

    Node (const Node &obj)
    {
        childs = obj.childs;
        Name = obj.Name;
    }

    void LoadData(std::string str)
    {
        Name=str;
    }
    
    int GetNumChilds ()
    {
        return childs.size();
    }

    const Node & GetChild (int pos) const
    {
        return childs[pos];
    }

    Node & GetChild (int pos)
    {
        return childs[pos];
    }

    std::ostream& printFile(std::ostream& stream, unsigned int tab) const;
    std::istream& readFile (std::istream &stream);
    bool insertChild (int pos, Node & element );
    bool removeChild (int pos);    
    Node & operator = (const Node & from);

    ~Node();

    };
}

Код


#include "StdAfx.h"
#include "MeTreeStruct.h"




GUI::Node::~Node()
{

}

GUI::Node::Node()
{


}

std::ostream & GUI::Node::printFile(std::ostream &stream, unsigned tab = 0) const
{
    for(unsigned i = 0; i < tab; ++i)
        stream << ' ';

    stream << "Name = ["; 
    stream.write(Name.c_str(),Name.length());
    stream << "]\n";    
    stream << "pole1 = [" << pole1 << "]/n";
    stream << "pole2 = [" << pole2 << "]\n";
    stream << "level = [" << level << "]\n";
    for(std::vector<Node>::const_iterator i = childs.begin(), end = childs.end(); i != end; ++i)
       i->printFile(stream, tab + 1);
   
    return stream;
}





bool GUI::Node::insertChild(int pos, Node & element)
{    
    std::vector<GUI::Node>::iterator p = GUI::Node::childs.begin();
    p+=pos;
    GUI::Node::childs.insert(p,element);
    return true;
}



GUI::Node & GUI::Node::operator =(const GUI::Node &from)
{
    if (&from == this) return *this;
    childs = from.childs;
    Name = from.Name;
    return *this;
}


bool GUI::Node::removeChild(int pos)
{
    std::vector<GUI::Node>::iterator p = GUI::Node::childs.begin();
    p+=pos;
    childs.erase(p);
    return GUI::Node::childs.empty();
}

std::istream & GUI::Node::readFile(std::istream &stream)
{
    
    stream.ignore(8);
    stream >> Name;
    stream.ignore(9);
    stream >> pole1; 
    stream.ignore(9);
    stream >> pole2;
    stream.ignore(9);
    stream >> level; 

    Node cld;
    std::vector<Node>::iterator i;
    for(int j = 0; j < level; ++j)
    {
        insertChild(j, cld);
        i = childs.begin()+j;
        i->readFile(stream);
    }
    
    return stream;
}


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

Код

void CTreeApp::OnAppTree()
{
    TreeDlg TrDlg;
    TrDlg.DoModal();
    
    std::fstream inFile;
    inFile.open("Tree.txt",std::ios_base::in);
    if (!inFile)
    {
    
        MessageBox(0,TEXT("Err"),TEXT("Err"),MB_OK);
        return;
    }

    
    root.readFile(inFile);
    TrDlg.root = root;


    for(std::vector<GUI::Node>::iterator i = root.childs.begin(), end = root.childs.end(); i != end; ++i)
    {    

        TV_INSERTSTRUCT tvstruct;
        HTREEITEM pNode,pItm;

        pItm = NULL;
        tvstruct.hParent = pItm;
        tvstruct.item.mask = TVIF_TEXT ;

        tvstruct.item.pszText = LPWSTR(i->Name.c_str());
        pNode = TrDlg.m_tree.InsertItem(&tvstruct);
        TrDlg.m_tree.SetFocus();
    }
        
}


Добавлено через 3 минуты и 32 секунды
но не фурычит. не выводи, игнор. хотя ошибок нет.


--------------------
– Люди забыли эту истину, – сказал Лис, – но ты не забывай: ты навсегда в ответе за всех, кого приручил.
PM MAIL   Вверх
Earnest
Дата 17.3.2008, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 87
Всего: 183



Цитата

tvstruct.item.pszText = LPWSTR(i->Name.c_str());

Вот эта строчка вызывает сомнение.
У тебя что, проект UNICODE, а файл ANSI? Тогда нужно преобразование, тупой каст не прокатит. Вроде бы у CString есть нужный конструктор.


--------------------
...
PM   Вверх
tonchitos
Дата 17.3.2008, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 447
Регистрация: 24.2.2007

Репутация: 1
Всего: 40



да даж не знаю как лучше тут преобразовать.


--------------------
– Люди забыли эту истину, – сказал Лис, – но ты не забывай: ты навсегда в ответе за всех, кого приручил.
PM MAIL   Вверх
tonchitos
Дата 17.3.2008, 15:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 447
Регистрация: 24.2.2007

Репутация: 1
Всего: 40



Если я вместо этой строки буду выводить просто текст, то все равно не фурычит. Не рисует в этом моменте. А в классе диалога очень даже.


--------------------
– Люди забыли эту истину, – сказал Лис, – но ты не забывай: ты навсегда в ответе за всех, кого приручил.
PM MAIL   Вверх
tonchitos
Дата 17.3.2008, 16:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 447
Регистрация: 24.2.2007

Репутация: 1
Всего: 40



в общем по любому ошибка и эта строка не причем.


--------------------
– Люди забыли эту истину, – сказал Лис, – но ты не забывай: ты навсегда в ответе за всех, кого приручил.
PM MAIL   Вверх
Earnest
Дата 17.3.2008, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 87
Всего: 183



Цитата(tonchitos @  17.3.2008,  16:30 Найти цитируемый пост)
Если я вместо этой строки буду выводить просто текст

Что значит эта фраза? Если tvstruct.item.pszText = i->Name.c_str(); то это не должно компилироваться.
Попробуй так:
Код

CString str ( i->Name.c_str() );
tvstruct.item.pszText = str.GetBuffer(); 




--------------------
...
PM   Вверх
tonchitos
Дата 17.3.2008, 16:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 447
Регистрация: 24.2.2007

Репутация: 1
Всего: 40



спасибо.

Это исправила.

Код

void CTreeApp::OnAppTree()
{
    TreeDlg TrDlg;
    TrDlg.DoModal();
    
    std::fstream file;
    file.open("Tree.txt", std::ios::in);
    if (file.is_open()) 
    {
        root.readFile(file);
        file.close();
     // reading
    } 
    else 
    {
         file.close();
         file.open("Tree.txt", std::ios::out);
         file.close();
         // файл создан
    }
        
}


В инитдиалоге при обращении к переменной, связанной с триконтролом - ошибка.
Код


BOOL TreeDlg::OnInitDialog()
{    
    m_tree.ModifyStyle(LVS_TYPEMASK,TVS_LINESATROOT | TVS_HASLINES |
                        TVS_HASBUTTONS | TVS_EDITLABELS );

    TV_INSERTSTRUCT tvstruct;
    HTREEITEM pNode,pItm;

    pItm = m_tree.GetSelectedItem();
    tvstruct.hParent = pItm;
    tvstruct.item.mask = TVIF_TEXT ;
    tvstruct.item.pszText = TEXT("node");
    pNode = m_tree.InsertItem(&tvstruct);
    m_tree.SetFocus();
    return TRUE;
}


Выкидывает из программы.
Наверно потому что в ините контрол с переменной еще не связан. Так штоль? Что делать?

Это сообщение отредактировал(а) tonchitos - 17.3.2008, 20:04


--------------------
– Люди забыли эту истину, – сказал Лис, – но ты не забывай: ты навсегда в ответе за всех, кого приручил.
PM MAIL   Вверх
tonchitos
Дата 17.3.2008, 20:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 447
Регистрация: 24.2.2007

Репутация: 1
Всего: 40



Все, в инит диалоге поставила UpdateData(0);
заработало.

Добавлено через 12 минут и 26 секунд
мне надо из класса в диалог передать ссылку.

Не получаецо....

Код


void CTreeApp::OnAppTree()
{
        
    std::fstream file;
    file.open("Tree.txt", std::ios::in);
    if (file.is_open()) 
    {
        root.readFile(file);
        file.close();
     // reading
    } 
    else 
    {
         file.close();
         file.open("Tree.txt", std::ios::out);
         file.close();
         // файл создан
    }
    TreeDlg TrDlg;
    TrDlg.root = root;
    TrDlg.DoModal();
        
}



TreeDlg::root' : must be initialized in constructor base/member initializer list

че не так?


--------------------
– Люди забыли эту истину, – сказал Лис, – но ты не забывай: ты навсегда в ответе за всех, кого приручил.
PM MAIL   Вверх
dizzy1984
Дата 18.3.2008, 08:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 675
Регистрация: 15.2.2007

Репутация: 10
Всего: 25



У тебя есть константа, либо ссылка с именем root, ее нужно инициализировать в списке инициализации конструктора 
Код

TreeDlg::TreeDlg(...) : root (<инициализирующее_значение>) {;}


Код

class a
{
};

class b
{
a& a_ref;
public:
b(a & aref) : a_ref(aref) {;}
};


Код

a aobj;
b bobj(a);


Дело в том, что и константа и ссылка это такие понятия, которые должны быть созданы одновременно с объектом, их хранящим. Если бы они не определялись в списке инициализации, то могло бы получиться, что объект уже создан, а к этим данным обратиться еще нельзя, что не имело бы смысла.

Это сообщение отредактировал(а) dizzy1984 - 18.3.2008, 09:06
PM MAIL   Вверх
tonchitos
Дата 18.3.2008, 10:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 447
Регистрация: 24.2.2007

Репутация: 1
Всего: 40



dizzy1984, спасибо!


--------------------
– Люди забыли эту истину, – сказал Лис, – но ты не забывай: ты навсегда в ответе за всех, кого приручил.
PM MAIL   Вверх
Earnest
Дата 18.3.2008, 10:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 87
Всего: 183



Цитата(tonchitos @  17.3.2008,  21:10 Найти цитируемый пост)
Все, в инит диалоге поставила UpdateData(0);
заработало.

Более правильный вариант - вызвать OnInitDialog базового класса до обращения к три-контролу (там тоже будет вызвано UpdateData)


--------------------
...
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




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


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

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