Event Mode, an implmentation @ vs2005

Hello mates, Long time no see. Sorry for the delay, too many stuffs have to deal with.

But, dont wanna talk about 3D at the moment, how about the Event Mode?? 

While I was developing softs with vs2005/c++,  I found that the event mode was very very diffecult to use.

So, I tried to implement an Event class which similar the C# language.

Finially, I did it. Pasted the codes as following:

#pragma once
#ifndef B2EE0847_5BD6_488b_A920_CAA0518A7227_EVENT_H_
#define B2EE0847_5BD6_488b_A920_CAA0518A7227_EVENT_H_

#include <vector>
#include <list>

namespace COMPANYNAME
{
    namespace PLATFORM
    {
        template <typename EventSource, typename EventArgsPtr, bool MultiCast = true>
        class Event
        {
        public:
            typedef void(EventSource::*EventHandler)(EventSource*, EventArgsPtr);
        private:
            std::list<EventHandler> m_arrObserver;
        public:
            Event& operator += (EventHandler FuncPtr)
            {
                WriteLog("NEW EVENT TRY TO ADD IN, EVENT COUNT:[%d -->  ", m_arrObserver.size());
                if(std::find(m_arrObserver.begin(), m_arrObserver.end(), FuncPtr) == m_arrObserver.end())// if already exist, will not add this in.
                {
                    if(MultiCast == true)
                    {
                        m_arrObserver.push_back(FuncPtr);
                    }
                    else
                    {
                        if(m_arrObserver.empty() == true)
                        {
                            m_arrObserver.push_back(FuncPtr);
                        }
                    }
                }     
                WriteLog("%d]/n", m_arrObserver.size());
                return *this;
            }
            Event& operator -= (EventHandler FuncPtr)
            {
                WriteLog("EVENT TRY TO ERASE, EVENT COUNT:[%d --> ", m_arrObserver.size());
                m_arrObserver.erase(std::find(m_arrObserver.begin(), m_arrObserver.end(), FuncPtr));
                WriteLog("%d]/n", m_arrObserver.size());
                return *this;
            }
            void operator () (EventSource *source, EventArgsPtr args)
            {
                for(std::list<EventHandler>::iterator itc=m_arrObserver.begin();
                    itc!=m_arrObserver.end();
                    itc++)
                {
                    EventHandler pHandler = const_cast<EventHandler>(*itc);
                    (source->*pHandler)(source, args);
                }
            }
            void Clear()
            {
                m_arrObserver.clear();
            }
        };
    }
}

 

Here, you must care two points, which are caused by vs2005's new security features.

1 The function pointer, we have to write as:  NOTE:if do not write like following, an error C2440 must occur.

class XXX {public: void func(){}};   

typedef void(XXX::*PFunc)();

class YYY

{

public:

PFunc pf = &XXX::func;

void FunctionCall()

{

XXX xxx;

(xxx.*pf)(); //call the function

}

};

see the calling to function pointer, it's looks strange, but , it's work :)

2 Avoid multi-inherit.

class XXX:public AAA, public BBB

{

void func(){}

}; 

typedef void(XXX::*PFunc)();

class YYY

{

public:

PFunc pf = &XXX::func; // Error C2440, it's illegal, not security cast, different signature.

};

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您好!对于使用POI库以event mode方式读取Excel文件,可以按照以下步骤进行: 1. 创建一个XSSFReader对象,该对象将Excel文件解析为XML格式。 2. 获取SharedStringsTable和StylesTable,这些表将在后面的步骤中用到。 3. 创建一个SheetContentsHandler对象,该对象将处理每个Sheet的内容。 4. 遍历所有的Sheet,将Sheet的InputStream传递给XSSFReader对象,并使用SheetContentsHandler处理Sheet的内容。 5. 关闭InputStream和XSSFReader对象。 下面是一个示例代码,用于演示如何使用event mode方式读取Excel文件: ```java import java.io.InputStream; import java.util.Iterator; import org.apache.poi.openxml4j.opc.OPCPackage; import org.apache.poi.openxml4j.opc.PackageAccess; import org.apache.poi.xssf.eventusermodel.XSSFReader; import org.apache.poi.xssf.eventusermodel.XSSFSheetXMLHandler; import org.apache.poi.xssf.model.SharedStringsTable; import org.apache.poi.xssf.model.StylesTable; import org.xml.sax.ContentHandler; import org.xml.sax.InputSource; import org.xml.sax.XMLReader; import org.xml.sax.helpers.XMLReaderFactory; public class ExcelReader { public static void main(String[] args) throws Exception { String filename = "example.xlsx"; OPCPackage pkg = OPCPackage.open(filename, PackageAccess.READ); XSSFReader reader = new XSSFReader(pkg); SharedStringsTable sst = reader.getSharedStringsTable(); StylesTable styles = reader.getStylesTable(); SheetContentsHandler sheetHandler = new SheetContentsHandler(); XMLReader parser = XMLReaderFactory.createXMLReader(); parser.setContentHandler(new XSSFSheetXMLHandler(styles, sst, sheetHandler, false)); Iterator<InputStream> sheets = reader.getSheetsData(); while (sheets.hasNext()) { InputStream sheet = sheets.next(); InputSource sheetSource = new InputSource(sheet); parser.parse(sheetSource); sheet.close(); } pkg.close(); } } class SheetContentsHandler implements XSSFSheetXMLHandler.SheetContentsHandler { @Override public void startRow(int rowNum) { // TODO: 处理行的开始 } @Override public void endRow(int rowNum) { // TODO: 处理行的结束 } @Override public void cell(String cellReference, String formattedValue, XSSFComment comment) { // TODO: 处理单元格 } @Override public void headerFooter(String text, boolean isHeader, String tagName) { // TODO: 处理页眉、页脚 } } ``` 在上面的示例代码中,SheetContentsHandler是一个自定义的类,用于处理Sheet的内容。您可以根据自己的需求来实现SheetContentsHandler中的方法。另外,需要注意的是,event mode方式读取Excel文件是比较底层的操作,相对而言比较复杂,但是在读取大型Excel文件时,性能比基于DOM或SAX的方式更高效。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值