|
This article[^] may help.
/ravi
Let's put "civil" back into "civilization"
http://www.ravib.com
ravib@ravib.com
|
|
|
|
|
Thank you. It's exactly what I needed.
|
|
|
|
|
How do I set the height of the dropdown list in a CComboBox so that I can see more than one entry from the CComboBox ?
I also committed the crime of posting a programming question in the Lounge.
|
|
|
|
|
In the resource designer click on the drop-down arrow of the combobox; then drag the bottom down as if you want to enlarge it: that size is the actual extent of the portion of the list box associated to the combobox.
Alberto
Alberto Giannetto
|
|
|
|
|
Thanks a million
I also committed the crime of posting a programming question in the Lounge.
|
|
|
|
|
Hi all,
is there a way to display multiline tooltip on an icon in the system tray box under Win9x? The same multiline tooltip on W2K appears correctly on two lines; on W9x it has the obnoxious black 'squarelets' meaning no translation of carriage returns...
The only way I could find to manage system tray icons is via the Shell_NotifyIcon, which doesn't allow full control over the notification messages, except normal mouse and keyboard activity...
Thanks,
Alberto Giannetto
|
|
|
|
|
Perhaps this article[^] will help?
/ravi
Let's put "civil" back into "civilization"
http://www.ravib.com
ravib@ravib.com
|
|
|
|
|
Interesting code surely, but I'm not sure it can help: how do I get full control over the ToolTip when, through Shell_NotifyIcon, all I have to do is just fill a NOTIFYICONDATA structure?
Albi
|
|
|
|
|
I am trying to put a blob into an access database into a field of type OLE OBJECT (hope its the right one, tried text as well just in case). I get the crash at AppendChunk:
void BlobToVariant(VARIANT &varArray)
{
BYTE *pByte;
FILE* pFile ;
long size;
pFile = fopen("C:\\Windows\\rhododendron.bmp", "rb");
if(pFile == 0)
{
size = 0;
return;
}
fseek(pFile, 0, SEEK_END);
int fileSize = ftell(pFile);
fseek(pFile, 0, SEEK_SET);
if (size < fileSize)
{
size = fileSize;
fclose(pFile);
return;
}
size = fileSize;
char *pImage;
fread(pImage, size, 1, pFile);
pImage[size] = 0;
fclose(pFile);
CString CImage(pImage);
SAFEARRAY FAR* psa;
SAFEARRAYBOUND rgsabound[1];
rgsabound[0].lLbound = 0;
rgsabound[0].cElements = CImage.GetLength() * sizeof(TCHAR) + sizeof(TCHAR);
psa = SafeArrayCreate(VT_I1, 1, rgsabound);
if(SafeArrayAccessData(psa,(void **)&pByte) == NOERROR)
memcpy((LPVOID)pByte,(LPVOID)CImage.GetBuffer(CImage.GetLength()),CImage.GetLength()+1);
SafeArrayUnaccessData(psa);
varArray.vt = VT_ARRAY | VT_UI1;
varArray.parray = psa;
}
void DbClass::AddNewRecord(char* key1, char* value1)
{
VARIANT varBLOB;
BlobToVariant(varBLOB);
m_pRecordset->AddNew();
m_pRecordset->Fields->Item[0L]->AppendChunk(varBLOB);
m_pRecordset->Update();
VariantClear(&varBLOB);
m_pRecordset->MoveLast();
Any ideas why?
Thanks,
ns
|
|
|
|
|
Does m_pRecordset->Fields->Item[0L] have a valid value? (You can test it with an ASSERT).
Caveat: I'm ADO ignorant.
/ravi
Let's put "civil" back into "civilization"
http://www.ravib.com
ravib@ravib.com
|
|
|
|
|
yes its a valid column in the database. Its cousin GetChunk is working happpily on it to retreive data. Now I'm trying to put data into the table. This seemed the most understandable way..
Thanks for the reply. I was wondering where you were!;P
|
|
|
|
|
I'm around...
Been working on a hack[^] for my sister-in-law who (bless her heart!) has EBay-itis, but uses a humble 28.8 modem. Now other people have started using it and have been sending me feature requests. I love it!
/ravi
Let's put "civil" back into "civilization"
http://www.ravib.com
ravib@ravib.com
|
|
|
|
|
The link to the hack is invalid.
I'm sort of having fun too....ADO is doable.
|
|
|
|
|
Glad you're having fun, and it's not much ADO about nothing. Sorry, sometimes I think I'm a punny guy. Damn.
The link is fixed. You can see it here[^].
/ravi
Let's put "civil" back into "civilization"
http://www.ravib.com
ravib@ravib.com
|
|
|
|
|
A couple of things: 1) A CString can't hold binary data from a bitmap. Bitmaps have NULL characters which CString uses to find the end of the string. Don't use the CString at all, it's not needed.
2). You use pImage with initializing it. char *pImage = new char[ size ]; also don't forget to delete [] pImage;
3). no need to put a zero at the end, NULL terminating binary data really doesn't do or mean anything.
There are other things that are not needed and the code could be greatly simplified but your basic assumptions are a tad off.
Joel Lucsy (jjlucsy@ameritech.net)
|
|
|
|
|
In this line:
memcpy((LPVOID)pByte,(LPVOID)CImage.GetBuffer(CImage.GetLength()),CImage.GetLength()+1);
if my data is stored in pImage, what shall I use inplace of CString CImage?
I have this to fill:
SAFEARRAYBOUND rgsabound[1];
rgsabound[0].cElements = CImage.GetLength() * sizeof(TCHAR) + sizeof(TCHAR)
so I dont know how to perform these operations on a char* instead of a CString. I cant do strlen on the pImage because its got lots of embedded nulls. What to do to get the length of the image char* buffer?
Thanks,
ns
|
|
|
|
|
I made some modifications (didnt use cString) and it never gets into the if to do the memcpy:
if(SafeArrayAccessData(psa,(void **)&pByte) == NOERROR)
memcpy((LPVOID)pByte,(LPVOID)pImage,size+1);
SafeArrayUnaccessData(psa);
The changes I made are:
size = fileSize;
char *pImage;
pImage = new char[size+1];
fread(pImage, size, 1, pFile);
fclose(pFile);
SAFEARRAY FAR* psa;
SAFEARRAYBOUND rgsabound[1];
rgsabound[0].lLbound = 0;
rgsabound[0].cElements = size * sizeof(TCHAR) + sizeof(TCHAR);
psa = SafeArrayCreate(VT_I1, 1, rgsabound);
if(SafeArrayAccessData(psa,(void **)&pByte) == NOERROR)
memcpy((LPVOID)pByte,(LPVOID)pImage,size+1);
SafeArrayUnaccessData(psa);
varArray.vt = VT_ARRAY | VT_UI1;
varArray.parray = psa;
WHat can I do to get to the memcpy statement?
Thanks,
ns
|
|
|
|
|
Ok, let's try a different tact:
void BlobToVariant( COleVariant &varArray )
{
CFile file;
COleSafeArray safeArray;
void *data;
if (!file.Open( "c:\\windows\\rhododendron.bmp", CFile::modeRead ))
{
return;
}
safeArray.CreateOneDim( VT_UI1, file.GetLength() );
safeArray.AccessData( (void*)&data );
file.Read( data, file.GetLength() );
file.Close();
safeArray.UnaccessData();
varArray = safeArray;
}
void DbClass::AddNewRecord( char *key1, char *value1 )
{
COleVariant varArray;
BlobToVariant( varArray );
m_pRecordset->AddNew();
m_pRecordset->Fields->Item[ 0L ]->AppendChunk( varArray );
m_pRecordset->Update();
m_pRecordset->MoveLast();
}
Joel Lucsy (jjlucsy@ameritech.net)
|
|
|
|
|
It didnt crash. It told me that the recordcount was increasing. But when i looked in the db, no new entries! Aaargh!
My recordset is opened as:
m_pRecordset->CursorLocation = adUseClient;
m_pRecordset->Open ((IDispatch *) m_pCommand, vtMissing, adOpenStatic,
adLockBatchOptimistic, adCmdText);
I really do appreciate your efforts. Thanks very much,
ns
|
|
|
|
|
I've got an array class with 2 GetAt members:
__forceinline CString CFStrArray::GetAt(int nIndex) const
{
CString str =
return str;
}
__forceinline void CFStrArray::GetAt(int nIndex, LPSTR sz) const
{
CString str = GetAt(nIndex);
sz = str.GetBuffer(1);
str.ReleaseBuffer();
} The first works fine, but the second one fails to return the value in the LPSTR. I need to have both the CString return version and an LPSTR return version, how can I achieve this?
Dylan Kenneally
London, UK
|
|
|
|
|
Dylan,
The GetBuffer() member function of the CString class returns the pointer to the actual character data used by the class. This can be used to directly modify the CString object data (though I think this is very dangerous).
This means the the moment you call ReleaseBuffer(), the address returned may very well be invalid.
try:
CString str = GetAt(nIndex);
LPTSTR czBuffer = str.GetBuffer(1);
strcpy(sz, czBuffer);
str.ReleaseBuffer();
Richard Chin
|
|
|
|
|
Why do you need 'char *' (LPSTR)? 'const char *' wouldn't be appropriate?
Tomasz Sowinski -- http://www.shooltz.com
What is "scratch" and why can everything be made from it?
|
|
|
|
|
Dylan Kenneally wrote:
__forceinline void CFStrArray::GetAt(int nIndex, LPSTR sz) const{ CString str = GetAt(nIndex); sz = str.GetBuffer(1); str.ReleaseBuffer();}
This releases the buffer before you return it
you should use something like
__forceinline void CFStrArray::GetAt(int nIndex, LPSTR sz,int nCount) const<br />
{<br />
CString str = GetAt(nIndex);<br />
if (str.GetLength() < nCount)<br />
strcpy(sz,str);<br />
else<br />
{<br />
strncpy(sz,str,nCount-1);<br />
sz[nCount-1]="\0";<br />
}<br />
}
Ofcource it is now the responsibility of the calling function to reserve space for sz
|
|
|
|