|
Using C++ MS Word Automation (Word 2002 / MSWORD.OLB )
Trying to programatically - and silently - implement "ConvertToPDFandEmail" macro. Need to supply "SaveAs" file name and suppress SaveAs file dialog - to eliminate user response requirement.
Is there a way to pass a target File name and, if necessary, other parms to the macro?
I've been unable to find any information about this macro anywhere (including Adobe site).
Can anyone point me to docs?
Thanks
|
|
|
|
|
After two days of banging my head against the wall with coding attempts - I found the answer. .. as usual - something simple that I overlooked.
An Adobe menu option setting in the Windows installation - "Change Conversion Settings" - unchecked "Prompt for Adobe PDF Name".
|
|
|
|
|
I have to create a class called controller. I do not know what I need to include in this class: attributes and methods/getters/setters/operations?????? I understand the other classes involved in hangman, but not this one?????
Demonstrate the use of a class. It is strongly recommended that you choose a class to implement from the Hangman Tutorial, such as the Controller class.
Class must have a constructor.
Class must have two class member variables of different data types and getters and setters to access these variables.
Program must have 3 files, one header file, one .cpp file for that class and one Main.cpp.
#ifndef CONTROLLER_H
#define CONTROLLER _H
#include <string>
using namespace std;
class Controller
{
private:
string filename; // stores name of file where words are stored
// Add other member variables here
public:
Controller();
void start();
// Add accessor and mutator methods here for your member values
};
#endif // CONTROLLER_H
Now add the source file (Controller.cpp) & code the constructor.
#include "Controller.h"
Controller::Controller(string filename)
{
cout << "Inside the Controller Default Constructor << endl;
}
// Finish implementing methods here
First compile and execute the project to make sure you have typed everything correctly. Then modify your main() function to access your Controller class and use all methods.
Here is an example main() function*:
int main(int argc, char *argv[])
{
Controller controller;
// Call accessor and mutator methods for setting filename
// Start the game
return 0;
}
The Menu is not part of the actual hangman game itself, but rather allows us to add words to the game, play the game, and exit so it is a good candidate for its own class. The game itself can be a separate class so that we are not writing all of the code in main(). As a matter of a fact, let's plan on having very little code in main(), and let a separate class manage the interactions between the menu, game and the dictionary. We will call this class "Controller".
|
|
|
|
|
djrasa wrote: Class must have two class member variables of different data types and getters and setters to access these variables.
For example:
class Controller
{
public:
void setFilename( const char *s ) { filename = s; }
string getFilename( void ) { return filename; }
};
"Normal is getting dressed in clothes that you buy for work and driving through traffic in a car that you are still paying for, in order to get to the job you need to pay for the clothes and the car and the house you leave vacant all day so you can afford to live in it." - Ellen Goodman
"To have a respect for ourselves guides our morals; to have deference for others governs our manners." - Laurence Sterne
|
|
|
|
|
I do not see how this will control the menu, dictionary, and game/ and no attributes (I am trying to understand, not trying to imply that it is incorrect{you would know before me : ) }). I thought that I needed two attributes (eg. int, char) and two functions for each to manipulate them. Sorry I am pretty new to this (retorical). Thank you for the fast response, much abliged.
|
|
|
|
|
djrasa wrote: I do not see how this will control the menu, dictionary, and game...
It won't. I was just providing you an example of how to add "getters and setters" to your existing class.
djrasa wrote: I thought that I needed two attributes (eg. int, char) and two functions for each to manipulate them.
Which is what I showed you, only using the single member variable you already had.
"Normal is getting dressed in clothes that you buy for work and driving through traffic in a car that you are still paying for, in order to get to the job you need to pay for the clothes and the car and the house you leave vacant all day so you can afford to live in it." - Ellen Goodman
"To have a respect for ourselves guides our morals; to have deference for others governs our manners." - Laurence Sterne
|
|
|
|
|
I guess my real question is what is the point of the controller class (what has to be in it)?? What actions of the menu, dictionary, and game will it(controller class) control (won't these classes control there own actions???) It seems to me that you would not need this class (if not for assignment). Sorry, thanks for the response, I am just having a hard time understanding this class (for the most part I understand the menu, game, and dictionary classes).
Thanks again for being patient with me, and answering my questions.
|
|
|
|
|
You are given a clue about the controller class in main: "Start the game"
If you are the game controller and I tell you "Start the game" what do you need to do?
|
|
|
|
|
call the function/method to display game board/word.
This is what I have come up with so far, need to add variables to methods still.
Is this close?????
<code></code>
class Controller //Class for Controller.
{
public:
void getgame();
void setgame ();
Controller();
void getmenuinput();
void setmenuinput ();
};
#endif //CONTROLLER_H
<code></code>
|
|
|
|
|
Normally I would say "Stop trying to write code until you understand what you are trying to accomplish." However, here that is the only way you can demonstrate effort. When you know what you are tying to do it will be easier to see how the various classes/objects function.
Maybe I'd like to start a new game.
Maybe I'd like to quit the program.
Maybe I'd like to save the game I'm in.
Maybe...
Who displays these to the user? When?
Who gets the user selection? When?
So, controller says,
While not quit
Display menu
Get menu selection
Where are all these menu things located?
|
|
|
|
|
in the controller class? something like this?
<code></code>
class Controller
{
private:
string filename; //Store filename.
int Menu; //Store Menu.
public:
void setFilename(const char *s); //Method to set filename.
string getFilename(void); //Method to get filename.
int getmenu(int choice); //Method to get menu.
void setmenu(const int m); //Method to set menu.
Controller(); //Default constructor.
};
#endif
<code></code>
|
|
|
|
|
Controller.cpp file
<code></code>
#include "Controller.h"
Controller::Controller()
{
Menu = 0;
}
int Controller::getmenu(int choice)
{
return Menu;
}
void Controller::setmenu(const int m)
{
Menu = m;
}
string Controller::getFilename()
{
return filename;
}
void Controller::setFilename(const char *s)
{
filename = s;
}
<code></code>
|
|
|
|
|
Main.cpp
<code></code>
#include <iostream>
#include "Controller.h" //include controller header file
using namespace std;
int main()
{
int choice; //To hold screen to display message, until menu class is added.
int menu = 0;
const char *word = "Hangman";
Controller controller;
Controller display;
display.setmenu(menu); //Method to set the menu.
display.getmenu(menu); //Method to get the menu.
controller.setFilename(word); //Set filename to Hangman.
cout << "Coming soon - " << controller.getFilename() << endl; //Display temporary message.
cout << "To be continued......" << endl;
cout << endl;
cout << "Please click X in top right corner to exit." << endl;
cin >> choice; //Hold screen to display message.
return 0;
}
<code></code>
|
|
|
|
|
Thank you for posting your course assignment. We enjoy keeping abreast of the current CIS curriculum.
led mike
|
|
|
|
|
I am catching an exception that is thrown when a char* is assigned to a CString. {The line - m_strResponse += CString(_T(pszOutBuffer));} I can print the char * pszOutBuffer to the screen, and it looks fine. Any ideas on how to get past this or how to further debug? The exception is caught in the second catch (...), and GetLastError() returns 0.
Thanks.
Code segments
from .h file:
public CString m_strResponse;
from .c file:
BOOL CMessage::HandleResponse(HINTERNET hRequest)<br />
{ <br />
CString strError = "";<br />
DWORD dwSize, dwDownloaded;<br />
char *pszOutBuffer;<br />
<br />
try<br />
{<br />
TRY<br />
{<br />
do <br />
{<br />
dwSize = 0;<br />
if (!WinHttpQueryDataAvailable( hRequest, &dwSize))<br />
{<br />
strError.Format("Error %u in WinHttpQueryDataAvailable.",GetLastError() );<br />
RecordError( strError, NULL ,"", "" );<br />
}<br />
<br />
pszOutBuffer = new char[dwSize+1];<br />
<br />
if (!pszOutBuffer)<br />
{<br />
strError.Format("Error allocating buffer for HandleResponse()\n");<br />
RecordError( strError, NULL ,"", "" );<br />
return false;<br />
}<br />
else<br />
{<br />
ZeroMemory(pszOutBuffer, dwSize+1);<br />
<br />
if (!WinHttpReadData( hRequest, (LPVOID)pszOutBuffer, dwSize, &dwDownloaded))<br />
{<br />
strError.Format ("Error %u in WinHttpReadData.", GetLastError() );<br />
RecordError( strError, NULL ,"", "" );<br />
}<br />
else<br />
{<br />
strError.Format("Try 1 - outbuffer:%s, downloaded%u", pszOutBuffer, dwDownloaded);<br />
AfxMessageBox(strError);<br />
<br />
pszOutBuffer[dwSize] = '\0';<br />
m_strResponse += CString(_T(pszOutBuffer));<br />
<br />
strError.Format("response:%s", m_strResponse);<br />
AfxMessageBox( strError ) ;<br />
}<br />
<br />
delete [] pszOutBuffer;<br />
pszOutBuffer = NULL;<br />
<br />
}<br />
<br />
} while (dwSize>0);<br />
<br />
<br />
CDBAccess::Instance()->RecordTransaction( m_strXMLMessage, m_strResponse);<br />
<br />
}<br />
CATCH_ALL(pEx)<br />
{<br />
RecordError( "Error occured while processing HTTP response", NULL ,"", (pEx->ReportError()) );<br />
<br />
if( pszOutBuffer != NULL )<br />
delete[] pszOutBuffer;<br />
<br />
return false;<br />
}<br />
END_CATCH_ALL <br />
<br />
}<br />
<br />
catch (...)<br />
{<br />
strError.Format ("Caught GetLastError: %u.",GetLastError());
AfxMessageBox(strError);<br />
return false;<br />
}<br />
<br />
return true;<br />
}
|
|
|
|
|
holly.sherman wrote: m_strResponse += CString(_T(pszOutBuffer));
I can't readily see the cause of the exception, but using _T() in that fashion is incorrect.
You're reading data synchronously, right?
Mark
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
Mark Salsbery wrote: but using _T() in that fashion is incorrect.
I can't believe you got that far, I stopped looking after seeing this bowl of worms:
try<br />
{<br />
TRY<br />
{<br />
do <br />
{
led mike
|
|
|
|
|
Come on, Mike, it's the old adage, "If at first you don't succeed, try and try again."
"Normal is getting dressed in clothes that you buy for work and driving through traffic in a car that you are still paying for, in order to get to the job you need to pay for the clothes and the car and the house you leave vacant all day so you can afford to live in it." - Ellen Goodman
"To have a respect for ourselves guides our morals; to have deference for others governs our manners." - Laurence Sterne
|
|
|
|
|
LMAO
It must be the Texas version: "try and try and do, can't be fooled again".
led mike
|
|
|
|
|
You should post that code to the Coding Horrors one.
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong.
-- Iain Clarke
|
|
|
|
|
ROTFL. I am just wondering why people like Mark, David, etc., are making fun of the OP. Crazy guys. Your reply is the only one which makes sense. 5 for that.
Nobody can give you wiser advice than yourself. - Cicero
.·´¯`·->Rajesh<-·´¯`·.
Codeproject.com: Visual C++ MVP
|
|
|
|
|
I get the same results when I remove _T().
Yes, I'm reading data synchronously.
I tried writing to the CString character by character too, but it threw the exception at the first character.
for(nTestIndex = 0; nTestIndex <= dwSize; nTestIndex++)
{
m_strResponse += pszOutBuffer[nTestIndex];
}
|
|
|
|
|
m_strResponse should really be a CStringA, not a CString.
Then, maybe try stepping into the CStringA += operator code to see why an exception
is being thrown.
Mark
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
Why CStringA? MSDN doc says CString does both ANSI and Unicode, while CStringA does just ANSI. Why would that make a difference?
Stepping through code not exactly an option... Long story, but this is old code (5 yrs) that mysteriously broke at that point when I made a change to the request xml. In other words, this code worked before, but doesn't anymore. I suppose I could write a small test for that one line, but http connection won't work from my testing environment.
|
|
|
|
|
habs wrote: Why CStringA?
To match your incoming data. If the data is coming in Unicode, then use CStringW.
Any other case requires potential conversion of the data, depending on your build configuration.
Is the debugger no help? There's not all that many reasons the CString += operator
should fail.
Mark
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|