Еще раз про Clipboard
От: Imbecile Россия  
Дата: 17.10.04 15:20
Оценка:
Так вот, как загрузить в Clipboard свой класс,
производный от CObject или коллекцию из них же (CObArray)?
Желательно с примером, вот.
Re: Еще раз про Clipboard
От: korzhik Россия  
Дата: 17.10.04 15:40
Оценка:
Здравствуйте, Imbecile, Вы писали:

I>Так вот, как загрузить в Clipboard свой класс,

I>производный от CObject или коллекцию из них же (CObArray)?
I>Желательно с примером, вот.

ну пример мне лень тебе писать, ты уж извини
укажу лишь направление:

1. RegisterClipboardFormat
2. OpenClipboard
3. EmptyClipboard
4. GlobalAlloc
5. GlobalLock
6. CMemFile file;
7. CArchive arch(file);
8. arch.WriteObject()
9. GlobalUnlock
10. SetClipboardData
11. CloseClipboard

ну в общем, думается мне, что примерно так.
Re[2]: Еще раз про Clipboard
От: Imbecile Россия  
Дата: 17.10.04 15:48
Оценка:
K>ну пример мне лень тебе писать, ты уж извини
K>укажу лишь направление:

K>1. RegisterClipboardFormat

..

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

Тогда еще вопрос: А форматы CObArray и производного класса от CObject
будут разными или и одного хватить?
Re[3]: Еще раз про Clipboard
От: korzhik Россия  
Дата: 17.10.04 15:57
Оценка:
Здравствуйте, Imbecile, Вы писали:

I>Тогда еще вопрос: А форматы CObArray и производного класса от CObject

I>будут разными или и одного хватить?

одного хватит
CObArray можно сохранять так:
  CArchive arch;
  CObArray obArr;
  
  INT_PTR size = obArr.GetSize();

  for (INT_PTR i = 0; i < size; ++i)
  {
    arch.WriteObject(obArr.ElementAt(i));
  }
Re[4]: Еще раз про Clipboard
От: Imbecile Россия  
Дата: 29.10.04 12:12
Оценка:
Здравствуйте, korzhik,
Извини что долго не мог ответить RSDN что-то не открывался

Вы писали:

K>одного хватит

K>CObArray можно сохранять так:
....

Ну вроде вставляется, а как при получении инфы из Clipboard узнать
размер. Там потом надо ReadObject(..) прогнать, а скока раз не знаю

И еще в ReadObject(..) надо CRuntimeClass передавать, а это откуда брать
Re[5]: Еще раз про Clipboard
От: MicVit  
Дата: 29.10.04 12:25
Оценка:
Здравствуйте, Imbecile, Вы писали:

I>Здравствуйте, korzhik,

I>Извини что долго не мог ответить RSDN что-то не открывался

I>Вы писали:


K>>одного хватит

K>>CObArray можно сохранять так:
I>....

I>Ну вроде вставляется, а как при получении инфы из Clipboard узнать

I>размер. Там потом надо ReadObject(..) прогнать, а скока раз не знаю

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

I>И еще в ReadObject(..) надо CRuntimeClass передавать, а это откуда брать


RUNTIME_CLASS(class_name )
Re[2]: Еще раз про Clipboard
От: Imbecile Россия  
Дата: 02.11.04 08:23
Оценка:
Здравствуйте, korzhik, Вы писали:

В итоге получилось что-то следующее

#pragma once

// CClipBoard command target

class CClipBoard : public CObject
{
public:
    CClipBoard();
    virtual ~CClipBoard();

    void Insert(CObArray *data);
    CObArray *Get();

protected:
    unsigned int RecFormat;
};


// ClipBoard.cpp : implementation file
//

#include "stdafx.h"
#include "CDM.h"
#include "ClipBoard.h"
#include <afxole.h>

// CClipBoard

CClipBoard::CClipBoard()
{
    RecFormat = RegisterClipboardFormat("Record");
}

CClipBoard::~CClipBoard()
{
}

// CClipBoard member functions

void CClipBoard::Insert(CObArray *data)
{
    if(!AfxGetMainWnd()->OpenClipboard()) return;
    if(!EmptyClipboard()) return;

    HGLOBAL hGlobal = GlobalAlloc(GMEM_SHARE | GMEM_MOVEABLE, sizeof(int) + data->GetSize()*sizeof(CObject));
    unsigned char *lpBuffer = (unsigned char *)GlobalLock(hGlobal);

    int *size; *size = data->GetSize();
    memcpy(lpBuffer, size, sizeof(int)) ;
    // Записываем размер (НЕ ФУРЫЧИТ)

    CMemFile file(lpBuffer+sizeof(int), data->GetSize()*sizeof(CObject));
    // Вроде из-за арифметики с указателями должно сработать

    CArchive arch(&(CFile)file, CArchive::store);
  
    for (INT_PTR i = 0; i < data->GetSize(); ++i)
        arch.WriteObject(data->ElementAt(i));

    GlobalUnlock(hGlobal);
    SetClipboardData(RecFormat, hGlobal);

    CloseClipboard();
}

CObArray *CClipBoard::Get()
{
    if(!AfxGetMainWnd()->OpenClipboard()) return 0;
    
    CObArray *data = new CObArray;

    HGLOBAL hGlobal = GetClipboardData(RecFormat);
    unsigned char *lpBuffer = (unsigned char *)hGlobal;

    int *size;
    memcpy(size, lpBuffer, sizeof(int));

    CMemFile file(lpBuffer+sizeof(int), sizeof(int) + (*size)*sizeof(CObject)); 
    CArchive arch(&(CFile)file, CArchive::store);
  
    for (INT_PTR i = 0; i < *size; ++i)
        data->Add(arch.ReadObject(RUNTIME_CLASS(CObject)));
    
    EmptyClipboard();
    CloseClipboard();

    return data;
}


Тока не работает, не могёшь ли подсказать что именно?
Re[3]: Еще раз про Clipboard
От: korzhik Россия  
Дата: 02.11.04 14:45
Оценка: 3 (1)
Здравствуйте, Imbecile, Вы писали:

I>В итоге получилось что-то следующее

  [skip]

I>Тока не работает, не могёшь ли подсказать что именно?

лень перечислять ошибки, лучше сразу дам работаюший вариант:
void save_array(UINT clipFormat, const CObArray& array)
{
    AfxGetMainWnd()->OpenClipboard();
    EmptyClipboard();
    
    CSharedFile file;
    CArchive ar(&file, CArchive::store);
    ar.WriteObject(&array);
    ar.Close();
    ::SetClipboardData(clipFormat, file.Detach());
    CloseClipboard();
}

void load_array(UINT clipFormat, CObArray& array)
{
    COleDataObject dataClipboard;
    dataClipboard.AttachClipboard();

    if (!dataClipboard.IsDataAvailable(clipFormat)) 
        return;

    if (CFile* pFile = dataClipboard.GetFileData(clipFormat))
    {
        CArchive ar(pFile, CArchive::load);

        CObject* pObj = static_cast<CObArray*>(ar.ReadObject(RUNTIME_CLASS(CObArray))); 

        if (pObj->IsKindOf(RUNTIME_CLASS(CObArray)))
        {
            std::auto_ptr<CObArray> pArray(static_cast<CObArray*>(pObj));
            array.Copy(*pArray);
        }

        ar.Close();
        delete pFile;
    }
}
Re[4]: Еще раз про Clipboard
От: Imbecile Россия  
Дата: 03.11.04 09:36
Оценка:
Спасибааааааа
Наконец-то

P.s: А чё настолько много ошибок
Re[5]: Еще раз про Clipboard
От: korzhik Россия  
Дата: 03.11.04 09:45
Оценка:
Здравствуйте, Imbecile, Вы писали:

I>P.s: А чё настолько много ошибок

да не особо много, но не работает
Re[4]: Еще раз про Clipboard
От: korzhik Россия  
Дата: 03.11.04 10:38
Оценка:
Здравствуйте, korzhik, Вы писали:

Исправление:
K>
K>void load_array(UINT clipFormat, CObArray& array)
K>{
K>    COleDataObject dataClipboard;
K>    dataClipboard.AttachClipboard();

K>    if (!dataClipboard.IsDataAvailable(clipFormat)) 
K>        return;

K>    if (CFile* pFile = dataClipboard.GetFileData(clipFormat))
K>    {
K>        CArchive ar(pFile, CArchive::load);

K>        //CObject* pObj = static_cast<CObArray*>(ar.ReadObject(RUNTIME_CLASS(CObArray))); 
K>        CObject* pObj = ar.ReadObject(RUNTIME_CLASS(CObArray));
      // .. .
K>}
K>
Re[3]: Уже про ATL
От: Imbecile Россия  
Дата: 06.11.04 23:41
Оценка:
А как поддержку ATL в проект вставить??
который без етого в визарде создавался??
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.