Borland C++ VCL FAQ
Страница 12.



Ошибка при подключении к Access через ADO

При подключении к Access через ADO при запуске проекта под IDE возникает ошибка:
Project Project1.exe raised exception class EVariantTypeCastError with message
'Could not convert variant of type (Null) into type (String)'. Process
stopped. Use Step or Run to continue.
Это проблема в драйвере базы данных и есть два варианта решения данной проблемы:

1. Ничего не предпринимать, оставить как есть. Ошибка возникает только при запуске приложения под IDE - и при обычном запуске никакого сообщения об ошибке выдано не будет, приложение будет функционировать нормально.
2. Сменить драйвер доступа к БД: вместо ODBC надо использовать Jet 4.0.

Медленно работает TADODataSet->Open()

Симптомы: при открытии таблицы с несколькими десятками тысяч записей, находящейся в файле БД Access, с помощью TADODataSet->Open() перестают обрабатываться сообщения окна, все тормозит. Полностью операция открытия завершается через 10-20 секунд. Что можно сделать?

Решение: перед открытием таблицы необходимо отключить все вычисляемые поля, в TADODataSet->ExecuteOptions выставить eoAsyncExecute в true, и после завершения открытия таблицы в обработчике события AfterOpen TADODataSet перерисовать элементы управления для отображения данных (вызывать TDBGrid->Refresh(), например).


Перечисление принтеров

Код перечисляет все принтеры и выводит данные о них в Мемо:
PRINTER_INFO_2 *Pr; 
DWORD byteNeed = 0,prCount=0;//Кол-во необходимых байт, количество принтеров
//Делаем первый вызов с буфером NULL, чтоб узнать нужный размер буфера
EnumPrinters(PRINTER_ENUM_CONNECTIONS|PRINTER_ENUM_LOCAL,NULL,2,NULL,0,&byteNeed,&prCount);
//Создаем буфер
Pr = new PRINTER_INFO_2 [byteNeed];
//Делаем второй вызов уже с нужным буфером
if(EnumPrinters(PRINTER_ENUM_CONNECTIONS|PRINTER_ENUM_LOCAL,NULL,2,(LPBYTE)Pr,byteNeed,&byteNeed,&prCount))
{
for(int i = 0; i < prCount; ++i)
{
Memo1->Lines->Add("Printer*************");
Memo1->Lines->Add("Имя: " + AnsiString(Pr[i].pPrinterName));
Memo1->Lines->Add("Порт: " + AnsiString(Pr[i].pPortName));
Memo1->Lines->Add("Драйвер: " + AnsiString(Pr[i].pDriverName));
Memo1->Lines->Add("");
}
}
delete Pr;


Как импортировать данные из текстового файла в Excel?

Для импорта данных в Excel из текстового файла разместите компонент TExcelApplication (ExcelApplication1) на форме и воспользуйтесь следующим кодом:
ExcelApplication1->Connect(); 
ExcelApplication1->Visible[0]=true;
ExcelApplication1->Workbooks->_OpenText(StringToOleStr("c:\\1.txt"),
xlWindows,
1,
xlDelimited,
xlDoubleQuote,
false,
false,
false,
true,
false,
false,
false,
TNoParam(),
TNoParam(),
TDefLCID());
Данный код импортирует данные из файла 1.txt, расположенного на диске С.

Как получить список активных процессов?

Для получения списка активных процессов воспользуйтесь следующей функцией:
//--------------------------------------------------------------------------- 
// Получить список активных просессов
// возврат: заполняет список информацией вида
// Win2k
// [SYSTEM PROCESS]
// SYSTEM
// SERVICES.EXE
// MIRANDA32.EXE
// BCB.EXE
//
// Win98
// C:\WINDOWS\SYSTEM\KERNEL32.DLL
// C:\WINDOWS\SYSTEM\MSGSRV32.EXE
// C:\WINDOWS\SYSTEM\SPOOL32.EXE
//
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
#include <tlhelp32.hpp>

PACKAGE void __fastcall GetActiveAppList (TStringList *slist)
{
if (!slist) return;

slist->Clear();

TProcessEntry32 prj;
prj.dwSize = sizeof(PROCESSENTRY32);

HANDLE hss = CreateToolhelp32Snapshot(TH32CS_SNAPALL, 0);
if (((int)(hss)) == (-1)) return;

AnsiString fname;
try {
for (bool loop = Process32First(hss, &prj); loop; loop = Process32Next(hss, &prj))
{ fname = AnsiString(prj.szExeFile).Trim().UpperCase();
if (fname.IsEmpty()) continue;
slist->Add(fname);
}
} // try
catch (...) { slist->Clear(); }

CloseHandle(hss);
}

//---------------------------------------------------------------------------

void __fastcall TF_Main::BitBtn1Click(TObject *Sender)
{
TStringList *slist = new TStringList();
try { GetActiveAppList(slist); Mem_Info->Lines->Text = slist->Text; }
__finally { delete slist; }
}
//---------------------------------------------------------------------------
 
« Предыдущая статья   Следующая статья »