Отправляет email-рассылки с помощью сервиса Sendsay

Программирование. Форум !!!

За 2006-02-11

Re: Не могу программно создать таблицу DBF

В сообщении от Вторник 7 Февраль 2006 19:50 Шматко А.А. написал(a):

> >> Помимо уже отвеченного. Мож тебе надо не DBase-формат, а FoxPro?
> >
> > Да нет, нужен именно DBase III (впрочем, IV тоже подходит - проверено).
>
> Дело хозяйское, но за FoxPro я не зря упомянул. Формат таблиц у него
> такой же, но нет расширенного заголовка, который как раз и содержит db866ru
> итп. Я и подумал, что простейший способ от него избавиться - это задать
> драйвер как FOXPRO.
Попробую.

   2006-02-11 10:52:09 (#513682)

Re: SQL в BDE

Большое спасибо за ответ! Я уже и забыл, что тут вопрос задавал :)

> В комплект поставки Delphi 5 входит LocalSQL Guide. Почему его нет в
> Delphi 7, понятия не имею. Хорошая справка. Правда, в HLP.
Спасибо за наводку, нашел ... в Common Files\Borland Shred\BDE. Я в справке

к Delphi нашел, что, мол, "...read the local SQL help...", но не додумался,
где это найти :)

> Имеются: строковые - ||, LOWER, UPPER, SUBSTRING, TRIM; агрегатные -
> AVG, COUNT, MAX, MIN, SUM; фиг знает, как категорию назвать - CAST,
> EXTRACT.
Еще раз спасибо! :) Особенно про SUBSTRING - именно оно-то мне и нужно было.

Просто подбирал синтаксис функций методом научного тыка и до SUBSTRING(...
FROM ... FOR ...) не догадался.

> ADO. Соответственно TADOQuery, TADOTable (нежелательно), TADOCommand.
> Если найдёшь (могу выслать, но лучше сам скачай с MSного сайта) драйвер к
> Microsoft Visual FoxPro OLEDB Provider, то получишь почти то, что хочешь -
> он понимает (за очень малым исключением) все фичи Fox-а, включая индексные
> теги с выражениями, использующие пользовательские функции, и фразы INTO
> TABLE в SELECT-ах. Но он в ряде мест медленнее (что очень странно - в
> основном он наоборот быстрее) BDE Local SQL, да и завязываться на specific
> фичи ADO провайдера плохо - фиг потом перейдёшь на что-нибудь другое.
Пробовал ADO, но так как-то странно работают внешние связи, так и не
разобрался... Для примера, мне позарез нужно, чтоб работал такой (или
подобный) запрос:

SELECT S5.NNASP, S17.NKOD, COUNT(*)
FROM
( F2 LEFT JOIN F8 ON ( F2.PY = F8.PY AND F2.NKAR = F8.NKAR )
LEFT JOIN S17 ON ( F8.KOD = S17.KOD ))
LEFT JOIN F3 ON ( F2.PY = F3.PY AND F3.NKAR = LEFT(F2.NKAR FOR 7) + '00' )
LEFT JOIN S5 ON ( F3.KNASP = S5.KNASP )
WHERE
( F8.DATOP BETWEEN '01.01.2006' AND '31.01.2006' )
GROUP BY S5.NNASP, S17.NKOD
ORDER BY S5.NNASP, S17.NKOD
;

Пока такое работает только в BDE и DBISAM. В DBISAM только очень долго: в F8

примерно 40 тыс. записей, в F2 - около 3 тыс., в S17 и S5 - примерно по
сотне. Через BDE вышеприведенный запрос выполняется примерно 3 мин (без
индексов), в DBISAM - 15 мин (!), с индексами - 12 мин.
Каждый месяц F8 увеличивается примерно на 3-4 тыс. записей. В общем, довольно

скромно все, вроде и локальная БД должна нормально работать...
Почему пробовал DBISAM: там есть средства импорта DBF-файлов с минимальным
ручным вмешательством.

>
> > 2. Или какие-нибудь более-менее готовые инструменты для импорта имеющейся
> > БД в формате DBase в нормальный SQL-сервер (Firebird/Interbase, MySQL,
> > PostgreSQL). БД в формате DBF используется другими программам, импорт
> > нужен только для удобства работы с полноценным SQL. Соответственно, такой
> > импорт надо выполнять регулярно. Конечно, можно и самому написать, но
> > ведь лень
> >
> > :)
>
> А чё там писать-то?
>
> INSERT INTO sqlTable (fieldList) SELECT fieldList FROM dbfTable
>
> или даже
>
> INSERT INTO sqlTable SELECT * FROM dbfTable
>
> если структура sqlTable та же самая, что и dbfTable. Самому такого делать
> не приходилось, но какие могут быть проблемы? Разве что типы данных
>чуть-чуть подправить.
>
А таблицы при таком способе создадутся автоматически? Я просто никогда даже

не пробовал работать с SQL-серверами, сейчас вот читаю про использование
Interbase в Delphi...
Всего имеется примерно 200 таблиц, с которыми нужно работать. Примерно,
потому что время от времени присылают обновления - могут убрать одни таблицы,

добавить другие, меняется структура третьих... В придачу к этому в нужных
DBF-файлах используются нестандартные индексы, приходится их отключать (без
отключения индексов с этими файлами работают только Halcyon и Apollo).
Сейчас у меня просто в bat-файле все таблицы копируются в один каталог, потом

отключаются индексы и с полученной БД уже можно рабоать (через BDE).

   2006-02-11 10:51:40 (#513681)

Re[7]: Вывод окна приложения на передний план.

Здравствуйте !

> Хмм... Параметр это Хэндл окна. И функция срабатывает, только не
> корректно. Приложение становится активным, только мигает в панели
> задач, а на экран не выводится.

Попробуйте это (пояснения здесь
http://softmaker.com.ru/sources/functions/arts/bringwindowtoforeground.htm):

BOOL BringWindowToForeground(CWnd *pWnd)
{
if (pWnd == NULL)
return FALSE;

if(!::IsWindow(pWnd->GetSafeHwnd()))
return FALSE;

DWORD dwUserInputTimeout;

::SystemParametersInfo( SPI_GETFOREGROUNDLOCKTIMEOUT, 0,
&dwUserInputTimeout, 0);
::SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, 0, 0);

::SetWindowPos( pWnd->GetSafeHwnd(), HWND_TOPMOST, 0, 0, 0, 0,
SWP_NOMOVE | SWP_NOSIZE);

HWND hCurWnd;

while((hCurWnd = ::GetForegroundWindow()) != pWnd->GetSafeHwnd())
{
HWND hWndActive = ::GetForegroundWindow();

DWORD dwThreadID = ::GetCurrentThreadId();
DWORD dwCurThreadID = ::GetWindowThreadProcessId(hWndActive,
0);

AttachThreadInput(dwThreadID, dwCurThreadID, TRUE);

pWnd->SetForegroundWindow();

AttachThreadInput(dwThreadID, dwCurThreadID, FALSE);

Sleep(20);
}

::SetWindowPos( pWnd->GetSafeHwnd(), HWND_NOTOPMOST, 0, 0, 0, 0,
SWP_NOMOVE | SWP_NOSIZE);

::SystemParametersInfo( SPI_SETFOREGROUNDLOCKTIMEOUT, 0,
(LPVOID) dwUserInputTimeout, 0);

return TRUE;
}

Это старая версия функции.
Тут еще надо запоминать TOPMOST-состояние выкидываемого на передний план
окна,
и если оно уже было TOPMOST, то не убирать его. Тут MFC используется -
просто
мне так удобно было. Если что, надо просто вместо pWnd->GetSafeHwnd()
подставлять
дескриптор целевого окна (то, которое на передний план должно вылетать).

   2006-02-11 02:08:37 (#513582)

Re[2]: Найти иконку в трее

Здравствуйте, Шматко.

Friday, February 10, 2006, 8:20:24 PM, you wrote:

>> Поставить указатель в трей с помощью SetCursorPos в конец трея
>> Задавая приращения по горизонтали, обойти указателем иконки в
>> трее. При этом будут появляться ярлычки подсказок к иконкам...

ШАА> А у меня панель задач вдвое выше и автоскрывается. Мало того, что её
ШАА> показать надо, прыгнув мышью в самый низ экрана и подождав, так ещё и иконки

ШАА> в трее в три ряда выстраиваются. Каким образом ты собрался все их обойти
по
ШАА> горизонтали? И это ещё при том, что XPя по умолчанию скрывает некоторые
ШАА> "неактивные" достаточно долгое время иконки за эдакой стрелочкой, и чтобы
их

ШАА> увидеть, на неё тоже нажать надо. И при этом не забыть, что панель задач
ШАА> может быть не только внизу, но и справа, слева или вверху, где юзеру
ШАА> удобнее. А если она автоскрывается, то при "автопоказе" оно не обязательно
ШАА> будет на переднем плане, а вполне может оказаться под какими-то другими
ШАА> окнами, даже если выставлена опция "Отображать панель задач поверх остальных

ШАА> окон" - как меня нервирует, кстати.
ШАА> Ну и чтобы добить. Ждать над каждой иконкой, нужно неопределённое время,

ШАА> так как частенько обработчик рабочего стола неизвестно чем занимается вместо

ШАА> того, чтобы побыстрому обработать событие, ему направленное. У меня иногда
ШАА> бывает, что рабочий стол и панель задач не откликаются на воздействия извне,

ШАА> хотя остальная винда работает как ни в чём не бывало, и все мышиные и
ШАА> клавиатурные пинки не возымевают никакого действия. По прошествии
ШАА> полутора-двух минут, они друг приходят в себя и побыстрому обрабатывают
всё
ШАА> то, что им быто понапнуто за это время. Весело бывает понаблюдать...
ШАА> Напрягает не меньше. Если кто знает лекарство или хотя бы причину такого
ШАА> поведения, буду рад любой информации.
ШАА> Так что ИМХО избранный тобою подход в корне неверен. Я в принципе
ШАА> недолюбливаю всё то, что делается потём эмуляции действий пользователя,
так
ШАА> как программно всей изощрённости человеческого разума не проэмулируешь.
ШАА> Особенно его экстраваннтности и индивидуальности. Посему начисто отвергаю
ШАА> решения, основанные на mouse_event() и keybd_event() Да и в MSDN чётко
ШАА> говорится, что они заменены (superseded). Ищи другие пути, не то запаришся
ШАА> поддерживать свою программу - пользователи задолбают.
Все это правильно, конечно. Только пишу это все для своего домашнего
компа - надоело вставать в час ночи, чтобы поставить на закачку. Так
что, "пользователи" не задалбают, особенно если я их пивом
угощу.-)))))))))

ШАА> Вот начало. Окно панели задач относится к классу Shell_TrayWnd. Одно
из
ШАА> его дочерних окон имеет класс TrayNotifyWnd, а у него в свою очередь одно
из
ШАА> дочерних - класс SysPager, которое в свою очередь одним из дочерних окно
ШАА> класса ToolbarWindow32 и с заголовком (в русской редакции XP!) "Область
ШАА> уведомлений", в котором уже и прорисовываются иконки. Кнопка, которая
ШАА> открывает скрытые "неактивные" иконки, имеет класс Button и является
ШАА> дочерним окном непосредственно от панели задач. Хватит информации для
ШАА> начала? Всю её я получил простым разглядыванием Spy++ из комплекта MS
ШАА> DevStudio. Но её понятное дело можно получить и программно - EnumWindows(),
ШАА> EnumChildWindows(), GetWindow(), GetWindowInfo(), GetClassName() итп Скорее
ШАА> всего некоторые неопределённости останутся, но ИМХО значительно меньше и
ШАА> более легко обходимые, чем я привёл вначале по твоему методу.
Я это тоже рассматривал, только чё-то не получил тех хэндлов, на
которые ты намекаешь. Порассматриваю, значит, более внимательно.

ШАА> P.S. Чуть не забыл: mouse_event() и keybd_event() заменены на
ШАА> SendInput()
ОК! Спасибо за инфу! Буду переваривать.-))))

   Вадим Шешунов 2006-02-11 00:16:50 (#513554)