Overview
Examples
Screenshots
Comparisons
Applications
Download
Documentation
Tutorials
Bazaar
Status & Roadmap
FAQ
Authors & License
Forums
Funding Ultimate++
Search on this site
Search in forums












SourceForge.net Logo
Home » Developing U++ » UppHub » Ole Automation [FEATURE REQUEST?]
Re: Ole Automation [FEATURE REQUEST?] [message #40875 is a reply to message #40872] Fri, 27 September 2013 11:12 Go to previous messageGo to next message
iST1 is currently offline  iST1
Messages: 107
Registered: August 2013
Experienced Member
Installed: MS Office 2007 and Open Office 4.

In #if 1 code opened MS Doc + MS Excel
In #if 0 code (in sub thread) opened MS Doc + Open Calc

Why MS Excel inavaylable in thread and how to set the priority for Microsoft? Thread used to preinit costly loading.

class OfficeTest : public TopWindow {
public:
	typedef OfficeTest CLASSNAME;
	
	OfficeTest() {
#if 1
		Check();
#else
		Thread().Start(THISBACK(Check));
#endif
	}
	
	void Check() {
 		if (sheet.IsAvailable("Microsoft")) {
			sheet.Init("Microsoft");
			sheet.AddSheet(true);
		} else if (sheet.IsAvailable("Open"))  {
			sheet.Init("Open");
			sheet.AddSheet(true);
		} 
				
		if (doc.IsAvailable("Microsoft")) {
			doc.Init("Microsoft");
			doc.AddDoc(true);
		} else if (doc.IsAvailable("Open")) {
			doc.Init("Open");
			doc.AddDoc(true);
		} 
	}
	
private:
	OfficeSheet sheet;
	OfficeDoc doc;
};

GUI_APP_MAIN
{	
	OfficeTest().Run();
}

[Updated on: Fri, 27 September 2013 11:25]

Report message to a moderator

Re: Ole Automation [FEATURE REQUEST?] [message #40876 is a reply to message #40875] Fri, 27 September 2013 11:32 Go to previous messageGo to next message
iST1 is currently offline  iST1
Messages: 107
Registered: August 2013
Experienced Member
What is more, if we exchange the order of testing Excel
                if (sheet.IsAvailable("Open"))  {
			sheet.Init("Open");
			sheet.AddSheet(true);
		} else if (sheet.IsAvailable("Microsoft")) {
			sheet.Init("Microsoft");
			sheet.AddSheet(true);
		}

opened MS Excel instead Open Calc Shocked
Re: Ole Automation [FEATURE REQUEST?] [message #40884 is a reply to message #40872] Mon, 30 September 2013 08:17 Go to previous messageGo to next message
koldo is currently offline  koldo
Messages: 3355
Registered: August 2008
Senior Veteran
iST1 wrote on Thu, 26 September 2013 17:47

This is strange, because .net code here work perfectly with Word 2007 and use the analogue of the VBA above code + SetParent method.

Hello iST1

I have tried that code and it works well, although as I previously reported it does not remove the menus.

You can see the explanation here ( http://social.msdn.microsoft.com/Forums/office/en-US/c329f3e 5-0e25-44a2-8b07-1182d428de37/how-to-disable-menu-bar-in-wor d-2007-programmatically-in-c). In summary:

Word 2007 (and later versions) no longer use the CommandBars (Menu and toolbars) for the UI. This was changed, for various reasons, not least of which to explicitly prevent applications running out-of-process from interfering in the application's UI. Among other considerations, this is a security measure to prevent outside apps from leveraging the Office object models for "bad intentions".

So the short answer to your request is that there is no way for your app to affect an Office UI that implements the Ribbon (Office Fluent UI). The Ribbon can be defined only by RibbonXML embedded in an Office document, or that is part of a COM Add-in (implements the IDT2Exensibility interface).

Possibly, you could create a custom template that contains a RibbonXML with startFromScratch attribute set to True. That will reduce available Ribbon commands to a minimum. It's not possible, however, to remove all commands from the UI. Certain ones in Office 2007 are always enabled, in order to allow the user to have final control over the Office environment.




Best regards
Iñaki
Re: Ole Automation [FEATURE REQUEST?] [message #40885 is a reply to message #40876] Mon, 30 September 2013 08:24 Go to previous messageGo to next message
koldo is currently offline  koldo
Messages: 3355
Registered: August 2008
Senior Veteran
iST1 wrote on Fri, 27 September 2013 11:32

What is more, if we exchange the order of testing Excel
                if (sheet.IsAvailable("Open"))  {
			sheet.Init("Open");
			sheet.AddSheet(true);
		} else if (sheet.IsAvailable("Microsoft")) {
			sheet.Init("Microsoft");
			sheet.AddSheet(true);
		}

opened MS Excel instead Open Calc Shocked

Hello iST1

OfficeAutomation is not designed to be multithreaded.

If you really need that feature I will try to implement it.


Best regards
Iñaki
Re: Ole Automation [FEATURE REQUEST?] [message #40886 is a reply to message #40885] Mon, 30 September 2013 08:57 Go to previous messageGo to next message
iST1 is currently offline  iST1
Messages: 107
Registered: August 2013
Experienced Member
Since application works with collection of Word/Excel and IsAvailable method a costly by time, i don't call him in main GUI thread. I decided to open every files in single form (FilePreviewCmd in code). For this i calling:
	Single<FilePreviewCmd>().StartInit();

If there is an alternative way, I'll take it.
void
FilePreviewCmd::StartInit()
{
	//CheckOfficePlugins(false);//sync
	thread_.Run(THISBACK1(CheckOfficePlugins, true));//acync
}
	
void 
FilePreviewCmd::CheckOfficePlugins(bool preinit)
{
	isXlsOpen = sheet.IsAvailable("Open");
	isXlsMS = sheet.IsAvailable("Microsoft");
	if (!isXlsMS)
		isXlsOpen = sheet.IsAvailable("Open");
	
	isDocMS = doc.IsAvailable("Microsoft");
	if (!isDocMS)
		isDocOpen = doc.IsAvailable("Open");

	if (preinit)
		PostCallback(THISBACK(InitOfficePlugins));
	else 
		InitOfficePlugins();
}
	
void 
FilePreviewCmd::InitOfficePlugins()
{
 	if (isXlsMS) {
		sheet.Init("Microsoft");
	} else if (isXlsOpen)  {
		sheet.Init("Open");
	} 
	
	if (isDocMS) {
		doc.Init("Microsoft");
	} else if (isDocOpen) {
		doc.Init("Open");
	} 
	 		
	TopWindow::Open();
}
Re: Ole Automation [FEATURE REQUEST?] [message #40887 is a reply to message #40886] Mon, 30 September 2013 10:39 Go to previous messageGo to next message
koldo is currently offline  koldo
Messages: 3355
Registered: August 2008
Senior Veteran
Hello iST1

It seems that main thread calls a thread with CheckOfficePlugins() that calls another thread with InitOfficePlugins() that opens main window.

Am I right?


Best regards
Iñaki
Re: Ole Automation [FEATURE REQUEST?] [message #40888 is a reply to message #40887] Mon, 30 September 2013 10:55 Go to previous messageGo to next message
iST1 is currently offline  iST1
Messages: 107
Registered: August 2013
Experienced Member
Yes, except that FilePreviewCmd::InitOfficePlugins opens FilePreviewCmd child window. StartInit called from main window. InitOfficePlugins introduced as a main thread procedure, then otherwise crushes occur and i don't know why.
Re: Ole Automation [FEATURE REQUEST?] [message #40892 is a reply to message #40888] Tue, 01 October 2013 08:31 Go to previous messageGo to next message
koldo is currently offline  koldo
Messages: 3355
Registered: August 2008
Senior Veteran
Hello iST1

InitOfficePlugins() seems to be open in a thread so calling TopWindow::Open() will be dangerous.

I imagine that you would like to launch from the main thread a thread doing the inits and after that to run from the main thread the automation, without any additional thread.

Is not it?


Best regards
Iñaki
Re: Ole Automation [FEATURE REQUEST?] [message #40894 is a reply to message #40892] Tue, 01 October 2013 10:52 Go to previous messageGo to next message
iST1 is currently offline  iST1
Messages: 107
Registered: August 2013
Experienced Member
Oh, i have not noticed what InitOfficePlugins with Open can be used after thread_.Wait() in the main thread, but thread_.Run(THISBACK1(CheckOfficePlugins, true)) is needed for speedup.

[Updated on: Tue, 01 October 2013 11:07]

Report message to a moderator

Re: Ole Automation [FEATURE REQUEST?] [message #41080 is a reply to message #17864] Wed, 30 October 2013 08:52 Go to previous message
keltor is currently offline  keltor
Messages: 73
Registered: February 2012
Member
Hello,

sorry to hijack the thread, I just want to ask something that I think is most relevant here than anywhere else. Does anybody know how to create an ActiveX control with U++ so that it can be embedded, for instance, in a Word document? For instance, how to modify the Scatter control so that one can display, and possibly scroll around, graphs inside Word or PowerPoint or any other COM server.

Thanks,

Kel
Previous Topic: MAPIEx works with MinGW
Next Topic: [Controls4U] IE shows script errors
Goto Forum:
  


Current Time: Thu Mar 28 15:43:32 CET 2024

Total time taken to generate the page: 0.01325 seconds