От:
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
Здравствуйте, 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>
От:
Imbecile
Дата: 06.11.04 23:41
Оценка:
А как поддержку ATL в проект вставить??
который без етого в визарде создавался??
Пока на собственное сообщение не было ответов, его можно удалить.
Удалить