imho.ws
IMHO.WS  

Вернуться   IMHO.WS > Компьютеры > Программирование
Опции темы
Старый 16.06.2004, 15:51     # 1
Anthony
Newbie
 
Регистрация: 05.04.2004
Сообщения: 39

Anthony Путь к славе только начался
Вивисекция таблиц в RichEdit

Уважаемые господа программисты!

Подскажите, плз, каким образом Дельфийский RichEdit расправляется с таблицами? На сколько я понял, он рисует строку таблицы (нормальной ширины, но высоты в 1 строчку), а содержимое ячеек вываливает подряд, разделяя их символом таб. Можно как-нибудь всунуть текст в ячейки?

И совсем уж кощунственный вопрос: картинки в RichEdit нарисовать низзя?
Anthony вне форума  
Старый 16.06.2004, 16:47     # 2
alexey_ma
Member
 
Регистрация: 10.03.2002
Адрес: Israel
Сообщения: 245

alexey_ma Нимб уже пробиваетсяalexey_ma Нимб уже пробивается
Картинки можно рисовать. Только гиморойно. И еще нажно будет проверять какая версия riched.dll стоит в системе. Если это riched20.dll -то все впорядке с картинками можно работать(это версия 2). Версия 1 -помоему картинки (да и таблицы) не поддерживает. Есть шанс нарватся на такие проблемы в Win95/98/NT.
По мне так лучше НТМL использовать для таких вещей. Он и таблицы и картинки и все что угодно показывает. И работать с ним через DOM достаточно просто.

Ну и чтоб жизнь медом не казалась вот пример функции которая вставляет bmp из файла в ричедит. Написано на VC 6
Код:
void CXXX::InsertFile(const CString& strFileName,CRichEditCtrl* pRichEdit)
{
	LPSTORAGE m_lpStorage = NULL;			// provides storage for m_lpObject
	LPLOCKBYTES m_lpLockBytes = NULL;		// part of implementation of m_lpStorage
	LPOLEOBJECT m_lpObject = NULL;			// in case you want direct access to the OLE object
	LPVIEWOBJECT2 m_lpViewObject = NULL;	// IViewObject for IOleObject above
	USES_CONVERSION;
	SCODE sc = ::CreateILockBytesOnHGlobal(NULL, TRUE, &m_lpLockBytes);
	if (sc != S_OK)
		AfxThrowOleException(sc);
	ASSERT(m_lpLockBytes != NULL);
	sc = ::StgCreateDocfileOnILockBytes(m_lpLockBytes,
		STGM_SHARE_EXCLUSIVE|STGM_CREATE|STGM_READWRITE, 0, &m_lpStorage);
	if (sc != S_OK)
	{
		if (m_lpStorage)
		{
			STATSTG pstatstg;
			HRESULT hR1 = m_lpStorage->Stat(&pstatstg,STATFLAG_DEFAULT);   //Values taken from the STATFLAG enumeration
			m_lpStorage->DestroyElement(pstatstg.pwcsName);
			m_lpStorage->Release();
			m_lpStorage = NULL;
		}
		if (m_lpLockBytes)
		{
			m_lpLockBytes->Release();
			m_lpLockBytes = NULL;
		}
		AfxThrowOleException(sc);
		return;
	}
    CString szFileName( strFileName );
	// attempt to create the object
	sc = ::OleCreateFromFile(CLSID_NULL, T2COLE(szFileName),
							 IID_IUnknown, OLERENDER_DRAW, NULL, NULL, 
							 m_lpStorage, (void **)&m_lpObject);

	if ( sc != S_OK )
	{
		TCHAR * lpMsgBuf;
		::FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | 
						 FORMAT_MESSAGE_FROM_SYSTEM, NULL, 
						 ::GetLastError(),
						 MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
						 (LPTSTR) &lpMsgBuf, 0, NULL );
		CString msg( lpMsgBuf );
		msg += _T("xxxxxxxxxxxxxxxxxxx" );
		msg += szFileName;
		AfxMessageBox( msg, MB_OK );
		::LocalFree( lpMsgBuf );

		if (m_lpObject != NULL)
		{
			OleFlushClipboard( );
			LPUNKNOWN lpUnk = m_lpObject;
			m_lpObject = QUERYINTERFACE(lpUnk, IOleObject);
			CoDisconnectObject(lpUnk,0);
			m_lpObject->Close(OLECLOSE_NOSAVE  );
			lpUnk->Release();
			m_lpObject->Release();
			m_lpObject = NULL;
			lpUnk = NULL;

		}
		if (m_lpStorage)
		{
			STATSTG pstatstg;
			HRESULT hR1 = m_lpStorage->Stat(&pstatstg,STATFLAG_DEFAULT);   //Values taken from the STATFLAG enumeration
			m_lpStorage->DestroyElement(pstatstg.pwcsName);
			m_lpStorage->Release();
			m_lpStorage = NULL;
		}
		if (m_lpLockBytes)
		{
			m_lpLockBytes->Release();
			m_lpLockBytes = NULL;
		}
    	AfxThrowOleException(E_OUTOFMEMORY);

	
		return;
	}//end if ( sc != S_OK )
	
	// m_lpObject is currently an IUnknown, convert to IOleObject
	if (m_lpObject != NULL)
	{
		LPUNKNOWN lpUnk = m_lpObject;
		m_lpObject = QUERYINTERFACE(lpUnk, IOleObject);
		lpUnk->Release();
		lpUnk = NULL;
		if (m_lpObject == NULL)
			AfxThrowOleException(E_OUTOFMEMORY);
	}

	// cache the IViewObject interface
	m_lpViewObject = QUERYINTERFACE(m_lpObject, IViewObject2);
	if (m_lpViewObject == NULL)
	{

		if (m_lpObject != NULL)
		{
			OleFlushClipboard( );
			LPUNKNOWN lpUnk = m_lpObject;
			m_lpObject = QUERYINTERFACE(lpUnk, IOleObject);
			CoDisconnectObject(lpUnk,0);
			m_lpObject->Close(OLECLOSE_NOSAVE  );
			lpUnk->Release();
			m_lpObject->Release();
			m_lpObject = NULL;
			lpUnk = NULL;

		}
		if (m_lpStorage)
		{
			STATSTG pstatstg;
			HRESULT hR1 = m_lpStorage->Stat(&pstatstg,STATFLAG_DEFAULT);   //Values taken from the STATFLAG enumeration
			m_lpStorage->DestroyElement(pstatstg.pwcsName);
			m_lpStorage->Release();
			m_lpStorage = NULL;
		}
		if (m_lpLockBytes)
		{
			m_lpLockBytes->Release();
			m_lpLockBytes = NULL;
		}
		
		return;
	}


	// setup for advises; we assume that OLE cleans them up properly
	LPADVISESINK lpAdviseSink =
		(LPADVISESINK)pRichEdit->GetInterface(&IID_IAdviseSink);

	// set up view advise
	VERIFY(m_lpViewObject->SetAdvise(DVASPECT_CONTENT, 0, lpAdviseSink)
		== S_OK);
	// the server shows these in its user-interface
	//  (as document title and in File Exit menu)
	m_lpObject->SetHostNames(T2COLE(AfxGetAppName()),
		T2COLE(_T("Test")));

	// all items are "contained" -- this makes our reference to this object
	//  weak -- which is needed for links to embedding silent update.
	OleSetContainedObject(m_lpObject, TRUE);
	CHARRANGE cr;
	pRichEdit->GetSel( cr );
	cr.cpMin = cr.cpMax -1;
	pRichEdit->SetSel( cr );
	REOBJECT reo;
	memset( &reo, 0, sizeof( reo ) );
	reo.cbStruct = sizeof( reo );
	CLSID classID;
	if ( m_lpObject->GetUserClassID( &classID ) != S_OK)
		classID = CLSID_NULL;
	reo.clsid = classID;
	reo.cp = REO_CP_SELECTION;
	reo.poleobj = m_lpObject;
	reo.pstg = m_lpStorage;
	LPOLECLIENTSITE lpClientSite = NULL;
	pRichEdit->GetIRichEditOle()->GetClientSite( &lpClientSite );
	reo.polesite = lpClientSite;
	SIZEL sizel;
	sizel.cx = sizel.cy = 0; // let richedit determine initial size
	reo.sizel = sizel;
	reo.dvaspect = DVASPECT_CONTENT;
	reo.dwFlags = REO_RESIZABLE;
	reo.dwUser = 0;
	HRESULT hr = pRichEdit->GetIRichEditOle()->InsertObject( &reo );

	if (m_lpObject != NULL)
	{
		OleFlushClipboard( );
		LPUNKNOWN lpUnk = m_lpObject;
		m_lpObject = QUERYINTERFACE(lpUnk, IOleObject);
		CoDisconnectObject(lpUnk,0);
		lpClientSite->OnShowWindow(FALSE);
		m_lpObject->Close(OLECLOSE_NOSAVE  );
		lpUnk->Release();
		m_lpObject->Release();
		m_lpObject = NULL;
		lpUnk = NULL;
	}
	else
		AfxThrowOleException(E_OUTOFMEMORY);
	if (m_lpStorage)
	{
		STATSTG pstatstg;
		HRESULT hR1 = m_lpStorage->Stat(&pstatstg,STATFLAG_DEFAULT);   //Values taken from the STATFLAG enumeration
		m_lpStorage->DestroyElement(pstatstg.pwcsName);
		m_lpStorage->Release();
		m_lpStorage = NULL;
	}
	if (m_lpLockBytes)
	{

		m_lpLockBytes->Release();
		m_lpLockBytes = NULL;
	}
	if (m_lpObject)
	{
		m_lpObject->Release();
		m_lpObject = NULL;
	}
	if (m_lpViewObject)
	{
		m_lpViewObject->Release();
		m_lpViewObject = NULL;
	}
	if (lpAdviseSink)
	{
		lpAdviseSink->Release();
		lpAdviseSink = NULL;
	}
	if (lpClientSite)
	{
		lpClientSite->Release();
		lpClientSite = NULL;

	}
	return;
}
Еще, как вариант, можно в принципе попробовать вставить в твою форму Word как ActiveX control и им рулить через его интерфейсы, с таблицами и картинками в Word проблем быть не должно.
__________________
Best Regards
alexey_ma вне форума  
Старый 17.06.2004, 10:36     # 3
Anthony
Newbie
 
Регистрация: 05.04.2004
Сообщения: 39

Anthony Путь к славе только начался
riched.dll я нашел и 20 и 32, но легче от этого как-то не стало. Word вставить я пытался, но чей-то у меня не выходит. Не могли бы Вы привести алгоритм действий по установке "Word как ActiveX control" для чайников и обладателей кривых конечностей? Буду безумно признателен.
Anthony вне форума  
Старый 17.06.2004, 10:57     # 4
alexey_ma
Member
 
Регистрация: 10.03.2002
Адрес: Israel
Сообщения: 245

alexey_ma Нимб уже пробиваетсяalexey_ma Нимб уже пробивается
Я дельфи не терплю( и C++ Builder тоже), поэтому вряд ли тебе смогу помочь. Есть замечательный пример как работать с Office на rsdn.ru (Все для VC++) :
http://rsdn.ru/article/com/xoffice.xml
Ну и конечно первоисточники почитать можно :
http://msdn.microsoft.com/library/de...sofficedev.asp
__________________
Best Regards
alexey_ma вне форума  
Старый 17.06.2004, 12:23     # 5
Anthony
Newbie
 
Регистрация: 05.04.2004
Сообщения: 39

Anthony Путь к славе только начался
Цитата:
Помочь я те, конечно, не могу, но так сочувствую, так сочувствую!..
Спасибо, конечно... А еще кто-нибудь этим занимался? (Delphi, в смысле, ну и Wordом)
Anthony вне форума  
Старый 17.06.2004, 21:57     # 6
alexey_ma
Member
 
Регистрация: 10.03.2002
Адрес: Israel
Сообщения: 245

alexey_ma Нимб уже пробиваетсяalexey_ma Нимб уже пробивается
Поищи или спроси на дельфийских форумах на rsdn.ru или sources.ru.
Точно найдешь ответ, задачка достаточно типичная.
__________________
Best Regards
alexey_ma вне форума  


Ваши права в разделе
Вы НЕ можете создавать новые темы
Вы не можете отвечать в темах.
Вы НЕ можете прикреплять вложения
Вы НЕ можете редактировать свои сообщения

BB код Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.

Быстрый переход


Часовой пояс GMT +4, время: 14:59.




Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.