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

Delphi - проблемы и решения

  Все выпуски  

Проблемы и решения в Delphi #33


Служба Рассылок Subscribe.Ru

Проблемы и решения в Delphi - выпуск 33 от 18.10.2001.


На совесть город сделали - старинные Delphисты
колонну как поставили... она так и стоит:-)


ВСЕ ВОПРОСЫ СПРОСИТЬ ПРЕДЛОЖИТЬ АРХИВЫ СКОЛЬКО НАС


Доброго Вам времени суток уважаемый читатель.


Сегодня в выпуске :
~~~~~~~~~~~~~~~~~~~
1. Очередные вопросы.
2. Отвеченные вопросы.
~~~~~~~~~~~~~~~~~~~




1. Очередные вопросы.
---------------------


Вопрос 519:

От: ДВ

Подскажите как в DBGrid, используя список PickList поля для
выборки заготовленных значений, запретить пользователю
вводить значения вручную(т.е. чтобы можно было только из
заготовленного списка)? Если это возможно.
Или, может другой Grid какой это умеет?


Ответить.

Ответ 1:


Вопрос 520:

От: Sergey Smirnow

Мне надо чтобы при нажатии на Button1 на моей форме, в консольном
приложении(сеанс "мс-дос") зная его handle был нажат enter(то есть
осуществлен переход на следующую строку). Знаю что это делается через
виртуальные коды, но не знаю как. икто исходник не подкинет?


Ответить.

Ответ 1:


Вопрос 521:

От: Алекперов Ровшан

Господа не подскажете адреса сайтов с компонентами для Delphi с
лицензией типа freeware for commercial use.


Ответить.

Ответ 1:


Вопрос 522:

От: Tsatur

Как мне перехватить обращение какой-либо программы к CD и
переслать на винт.
Например, я запускаю прогу, она обращается к файлу на CD ( напрмер,
E:\games\x.exe). Как мне перехватить обращение и переслать к файлу на
винте(c:\games\x.exe)?


Ответить.

Ответ 1:


Вопрос 523:

От: Boris G. Bark

Такой вопрос: как при свернутом приложении на панели задач что-либо
вписать в кнопку (например как в FARе проценты при копировании).


Ответить.

Ответ 1:


Вопрос 524:

От: Игорь Маринин

Возможо ли читать, писать голос в модем используя TAPI ?
Если да, то где можно найти русское описание.


Ответить.

Ответ 1:


Вопрос 525:

От: Yashkin Denis

Как работать с СОМ портом (открыть, закрыть, настроить,
записать, считать). Понятно, что программно это выглядит
как специфичное открытие текстового файла. Однако хотелось
бы прочитать конкрктный элементарный пример. Спасибо.


Ответить.

Ответ 1:


Вопрос 526:

От: Для отправки


Очень хочу прочитать предыдущие сессии CDROM. Подскажите чем можете.


Ответить.

Ответ 1:


Вопрос 527:

От: Vampir

Не подскажите как запретить изменения размера окна формы (например по
горизонтали)?


Ответить.

Ответ 1:


Вопрос 528:

От: Кабанов Артур Александрович


Как при выводе MDIChild окна запретить кнопку закрытия основного окна
программы.


Ответить.

Ответ 1:


Вопрос 529:

От: Артем Колодяжный


1) Подскажите как в Делфи вызвать Outlook Express, так чтобы при его
открытии создавалось сообщение с вписанными : адресами(кому и от кого) и
темой, а также текстом сообщения (считываемом с заданного текстового
файла).
2) И подскожите как в Делфи сделать, чтобы вызвался Outlook Express и
при
его
открытии доставлялась почта, причем копии полученных сообщений, если
сообщения есть, записывались в заданные текстовые файлы.


Ответить.

Ответ 1:


Вопрос 530:

От: Den Timets


не работает ф. regconnectregistry (подключение к реестру на удал. комп.)
пробовал с разрешением удаленного управления- тот же рез.
не хочет подключаться к компу

Делфи 5, сеть аркнет(ipx) вин98
//////////////////////////
var name:pchar;
key1,key2:hkey;
begin
name:=pchar(edit1.text);
key1:=HKEY_LOCAL_MACHINE;
if (regconnectregistry(name,key1,key2)<>ERROR_SUCCESS) then ...
//////////////////////////



Ответить.

Ответ 1:


Вопрос 531:

От: Astrov Alseos

Известно, что, например, в FoxPro существует понятие
макроподстановки. Т.е., когда стоковая паременная содержит в себе
фрагмент
"понятного" транслятору (ну не компелятор он...) FoxPro текта. В таком
случае
транслятор заменяет эту переменную ее "содержимым"...
А теперь внимание, вопрос... А как, собственно, что-то подобное
утворить в
Delphi?


Ответить.

Ответ 1:


Вопрос 532:

От: Кабанов Артур Александрович


Как скрыть заголовок в MDIChild окне.



Ответить.

Ответ 1:


Вопрос 533:

От: В.А.Крашенинников


Думаю, не только мне будет интересно :
Чтобы CD-юк открыл\закрыл варежку, я использую команды (спасибо вашей
рассылке) :
mciSendString('Set cdaudio door open wait', nil, 0, handle);
mciSendString('Set cdaudio door closed wait', nil, 0, handle);
- Но, как оказалось, этого недостаточно - в некоторых случаях (
WinCommander
и еще что-то ) происходит обращение к драйву, и получаем синий экран -
не
фатально, но приятного мало. Есть, наверное сигнал, которым надо
задобрить
систему - ШАМАНЫ, помогите !!!


P.S.
Когда щелкаю ( MsOE.5 ) адрес
'Спросить -mailto:DTarasov@kms.dvgd.ru?subject=delphiVamp&body=Вопрос:',
появляется готовая форма со странной строчкой в теле письма "чПРТПУ" -
полагаю соответствует "Вопрос"
Так вот, такой чПРТПУ - если моя писанина приходит к вам в таком
неудобочитаемом виде, то что я (не я) делаю неправильно |:?)



Ответить.

Ответ 1:


2. Отвеченные вопросы.
----------------------



Вопрос 431:

От: Andrey

У меня несколько вопросов:
1) Как вывести окно которое всегда будет поверх других окон. (желательно
с
помощью WinAPI)
2) Как помешать Windows закрыть окно и продолжить выполнение программы.


Ответить.

Ответ 1:
1) Как вывести окно которое всегда будет поверх других окон. (желательно с помощью WinAPI);

Зачем вам WinApi? Раз у Вас есть форма, то и установите свойство FormStyle равным fsStayOnTop.
Ответ 2:
Установив свойству TForm.FormStyle значение fsStayOnTop Вы получите
окно поверх всех других окон. Чтобы помешать Windows закрыть окно
создайте обработчик события OnCloseQuery, в нем анализируйте
возможность закрытия окна и присваивайте соответствующее значение
переменной CanClose (True - можно, False - нельзя).
Но это не помешает снять задачу при помощи Меню задач Windows.
Ответ 3:
1) SetWindowPos (,, HWND_TOPMOST);
2) Отслеживай закрытие и повторяй CreateProcess();


Вопрос 432:

От: Алексей Малиновский

Сделал программу с использованием Interbase, но теперь не знаю как
установить программу на компьютеры... А именно имеется база данных
"sklad.gdb", имеется три компьтера соединённые между собой в сеть,
необходимо поставить программы на каждый компьютер, а база данных должна
быьт на каком-нибудь одном из них. Так вот что необходимо запустить
(Interbase server, client или что-то ещё) на компьютерах кроме
клиентской программы??? Или подскажите где инф-ию по данной теме.


Ответить.

Ответ 1:
Interbase Server надо запустить на сервере, т.е. на той машине где лежит база,
а на остальных поставить Interbase Client.
Ответ 2:
С гарантией могу ответить( тестировал специально (IB 6) ):
- ставишь IB сервер на одну из машин, регестрируешь свою базу как Remote Server,
а на клиентских местах нечего ставить не надо (кроме твоей программы).
Все работает.
- IB клиент надо только для некоторых случаев (я думаю, они тебе не к чему).
Ответ 3:
В общем есть разница если для работы с БД Interbase в Дельфях используются BDE или
прямой доступ через компоненты IBX или FIB.
Учитывая, что использование BDE при работе с Interbase можно воспринимать как
анахронизм :) то ->

Для установки программы необходимо

а) Выбрать компьютер, на котором будет находиться файл БД slad.gdb, установить на
этот компьютер Interbase server. Если на этом компьютере будет
запускаться программа, установить на нём Interbase client (это один из пунктов
выбора устанавливаемых компонент при установке Interbase servera).

б)Установить на остальные компьютеры Intebase client (условие обязательное).

в)Допустим, что БД находится на компьютере, имеющем сетевое имя HOST,
в дирестории C:\BASE\SKLAD.GDB, тогда в при разработке программы в
компоненте TIBDatabase property DatabaseName='HOST:C:\BASE\SKLAD.GDB'
для удалённых ПК и DatabaseName='C:\BASE\SKLAD.GDB' для сервера.
Я к примеру пишу отдельную програмулину или пункт меню опций для определения
нахождения БД(удалённая, локальная) и записи этих данных в INI или
реестр и использую эти данные при загрузке программы и приконнекчивании к базе.

г)При помощи IBConsole (для IB V 6.0x) Нужно определить пользователей,
раздать им права и свободы, или запреты ну и дальше арбайтать....
Ответ 4:
1 комп - InterBase Server + ghost.gdb При установке сразу скажи, чтоб грузился в автомате
На другие ставишь Interbase Client - и из него нужен только драйвер InterBase для ODBC
Настраиваешь DNS - укажи имя сервера и путь к базе (путь на сервере, локальный),
ну, протокол ...
Вроде никаких проблем никогда не было...
Ответ 5:

Вопрос 433:

От: Stanislav Kireev

Вопрос такой, слышал что есть для DELPHI библиотеки или компоненты,
которые
позволяют работать с базой данных не через BDE, а напрямую, аналогично
Microsoft Visual C++. Подскажите где можно отыскать эти компоненты и
библиотеки.


Ответить.

Ответ 1:
Смотря что за база.
Мы с успехом пользуемся Direct Oracle Access.
Разработчик - www.allroundautomations.nl
Про варезные сайты не спрашивайте.
Что есть для других баз, не знаю

Ответ 2:
С какой базой данных? Если со многими то выбор не
велик - ADO, RDO, ODBC, BDE, DAO, может еще пара
-тройка, если с конкретной, то какой? Если что то
типа dbf то видел на www.torry.net несколько
компонент, а другие пока в пролете. Вообще вопрос не
корректный - тебе не компонент нужен а драйвер базы
самопальный в виде компонента... потому как сам TTable
или TQuery ничего с таблицами не делают - только
передают и возвращают запросы к драйверам BDE а уже
драйвер BDE и делает все операции с базой данных.


Вопрос 434:

От: Дмитрий

Написал небольшую СУБД для работы с базой данных в формате Paradox 7.0.
В программе используются следующие компоненты для работы с базами
данных:
Table1: TTable;
DataSource1: TDataSource;
DBGrid1: TDBGrid;
DBNavigator1: TDBNavigator;
DBMemo1: TDBMemo;
После компиляции создался один .ехе файл на 700 кБ. Этот экзешник
работает на моем компьютере без проблем, но при запуске программы на
других компьютерах появляется ошибка, связанная с BDE Admenistrator'ом и
программа не запускается (3 файла базы данных помещаю в те же папки, как
и у себя). Насколько я понимаю эта ошибка может возникнуть, если на
компьютере нет программы BDE Admenistrator или его библиотек. Скажите,
пожалуйста, как откомпилировать проект, чтобы все нужные библиотеки
попали в проект или какие dll-ки необходимо копировать на 'чужие'
компьютеры ?


Ответить.

Ответ 1:
Воспользуйся Install Shield Express'ом. С помощью него создай
интаслляцию своей программы, а в инсталляцию включи установку BDE:'
Ответ 2:
Откомпилировать - никак.
Можно только включить инсталляцию BDE в твой дистрибутив.
Т.е. с установкой твоей программы, на машину будет устанавливаться BDE
(около 5М)


Вопрос 435:

От: Vladimir Vladikin

Ищу программу такова типа.
Во время того, пока комп свободен
она перебираен разные номера по принципу
8 гудок 805 пауза 10секунд переход
на тональный режим #########(9 цыфр, выбранных случайно)
и в конце знак #.
Если при этом через 10 секунд не появится сигнал зането, то
запомнить #########(9 цыфр).


Ответить.

Ответ 1:


Вопрос 436:

От: Васильев Сергей

Как правильно использовать компонент NMSMTP c вкладки FastNet. Нужно
отправить письма с вложенными файлами в кодировке UUEncode.
Проблемы:
1. Установливаю EncodeType в UUCode, но письма уходят в MIME кодировке.
2. Как установить CharSet для содержимого письма в KOI-8r, а то в
Инспекторе только us-ansii. Просто установка в кои не помогает.
Может я что не правильно делаю. Так молодой, неопытный.
Помогите или киньте ссылку на другой компонент, решающий проблему
(только
бесплатный :) ), с компонентом TmsSMTPClient из Internet Mail Suite 2.0
проблема решилась. Но он платный, и бесплатно без оболочки Дельфи не
хочет запускаться.


Ответить.

Ответ 1:


Вопрос 437:

От: Константин Борейша


Подскажите пожалуйста, Delphi не реагирует на двойной щелчёк по
объекту ( кнопке и т.д)


Ответить.

Ответ 1:
Для этого нужен еще один компонент - таймер ...
Таймер установить на нужное время задержки (то время когда ожидается второй
щелчек.) например 1 сек.
дальше обрабатывать нажатие кнопки и при нажатии если таймер включен, то это
второй счелчек, если выключен то включить таймер .
.
На таймер повесить выключение таймера и все будет работать ...


Вопрос 438:

От: Dima

Help, please! При попытке выполнения следующего запроса:
"update T1 set C1=NULL where Key1 in
(select Key1 from T2 where C2=10)" на двух машинах из трех BDE выдает
сообщение "Data structure corruption". Delphi 4, BDE 5.0... База Paradox
7.


Ответить.

Ответ 1:
А индексы проверял? Обычно фигня с парадоксом бывает когда индексы
рушатся, а такое случается, когда отлаживаешь программу и обрываешь
отладку по Ctrl+F2


Вопрос 439:

От: Alexander Prishchepa

У меня один вопрос, даже не совсем по
Delphi, а
скорее по Windows. Суть в следующем, я написал 2 разные программы, в
которых
используются ловушки на клавиатуру. И вот когда запускаешь их вместе, то
работает только 2-я программа. Это глюк форточек, или мой. И если можно,
то
подскажите как этого можно избежать. Можно ли устраивать многоуровневые
ловушки от разных программ, не связанных между собой так, чтобы они не
мешали друг другу.


Ответить.

Ответ 1:
Ваша функция-ловушка должна возвращать что то типа этого:
Result := CallNextHookEx(HookHandle, Code, wParam, lParam);
тогда по и дее всё должно работать.


Вопрос 440:

От: Чижов Александр

После установки репликации сведением на MS SQL2000 из приложений
дельфи выполняются только Select запросы. Запросы модификации и удаления
вызывают ошибку General SQL Error. ODBC SQL server driver. invalid
character value for cast specification.


Ответить.

Ответ 1:
Возможно проблема в следующем:
При запуске репликации в каждой реплицируемой таблице создается колонка,
содержащая уникальный идентификатор строки в таблице. Необходимо проверить
чтобы в запросах на модификацию данных эти колонки не участвовали.


Вопрос 441:

От: Ivan

Добрый день. Помогите пожалуйста, а то я уже опух...
Как мне проделать такую штуку: есть элемент в windows(окно у которого я
не
знаю handle, например), я изменяю в нем что-нибудь(текст, например), всё
это
происходит OnTimer( в котором, в свою очередь, есть цикл( НЕ
непрерывный, в
нём перебираются все хэндлы винды и находится нужный, по классу):
for i:=1 to 4069 //здесь перебираются хэндлы
for j:=0 to 30). Тут окошко возьмёт да и подмигнет, какое плохое
окошко! Я
чего только с ним не делал:
SendMessage(i,wm_setfont,GetStockObject(DEFAULT_GUI_FONT),1);
SetWindowText(i,buf);

SetWindowPos(i,HWND_TOP,0,0,rect.Right-rect.Left,rect.Bottom-rect.Top,SW
P_NO
MOVE);
RedrawWindow(i,0,0,RDW_UPDATENOW);
Все это я или комбинировал или использовал по- отдельности.
Может ещё есть какие комбинации Api- фунуций... Но надо опять же с
перерисовочным флагом.
Кстати, когда я использовал непрерывный цикл:
for i:=1 to 4069
for j:=0 to 30, в конце которого происходил переход наверх( на for i:=1
to
4069),
то меня спасло вот что:
SendMessage(i,wm_setfont,GetStockObject(DEFAULT_GUI_FONT),1);
SetWindowText(i,buf);
goto lab1,
где lab1(метка) была вначале алгоритма и в ней тоже происходила
перерисовка.
Так вот: неужели такой непрерывный цикл медленнее чем OnTimer(0,5
секунд,
500 ms).
Или может действительно он не успевает пройти... Дело вот ещё в чём:
если
ставить OnTimer более 600 ms, то окно прерисовывается только через
некоторое
время, значит цикл быстрее 600 ms.
Я где- то( не помню) читал как избавиться от мигания при перерисовке
формы.
Но у окон винды нет canvas, или я неправ? Мне хотя бы это, я бы
состряпал
может чего.
Если кто знает, как избавиться от такого мигания, буду очень
признателен.


Ответить.

Ответ 1:
Здается мне что легче найти родительское окно по его заголовку -
FindWindow, а затем по класу и/или заголовку дочернее - FindWindowEx.

А твой цикл тормозит из-за того, что ему требуется (в худшем случае)
около 120000 итераций, теперь возьми любой профилировщик и посмотри на
количество процессорных циклов (clocks) требуемых для твоего цикла,
затем перемнож эти два значения и подели на кол-во целочисельных
нструкций обрабатываемых твоим процессором - в результате время
необходимое на выполнение твоего цикла.

От мигания можно избавиться методом рисования на внеэкранном буфере
(он не зависит от того есть у компонента канва или нет) и затем
переброса его на компонент функцией WinAPI BitBlt.


Вопрос 442:

От: Денис

Привет, у меня проблема необходимо добраться до Winampа, в смысле
сказать ему проиграй этот файл, это лист, уменьши громкость, перейди
на такую-то секунду и т.д. Как это сделать не представляю. Надо
позарез.

Ответить.

Ответ 1:
Все просто до безобразия. У WinAmp
есть т.н. Message API, т.е ищешь окошко WinAmp и посылаешь ему
сообщения с соотвествтующими параметрами. Например:

SendMessage(hwnd_winamp,WM_WA_IPC,0,IPC_STARTPLAY);

Описание этого API (название и смысл констант) можно, наверно, найти
на http://www.winamp.com (честно говоря непомню, откуда я его взял). У
меня есть несколько устаревшая версия, и, если не найдешь, то могу
выслать. Пришли мне запрос на mailto:dgoltsov@au.ru. Правда учти, что
на С, но это не принципиально, т.к. там одни константы.
Ответ 2:
Скачай EasyAmp.pas отсюда:
http://www.stnd.de/programming/tutorials/tutorials/files/EasyAmp.zip
Там описан интерфейс доступа к Винампу, можешь юзать этот юнит, можешь
подглядеть туда и работать самостоятельно.
Также посмотри WinAmp SDK на www.winamp.com - там еще более полная
информация.

Пара примеров:
Берешь хэндл Винампа:
...
var WH: HWND
...
WH := findWindow('Winamp v1.x',nil);
...
Нажимаешь кнопку Play:
...
Sendmessage(WH, wm_command, 40045, 0);
...
Включаешь/выключаешь эквалайзер
...
Sendmessage(WH, wm_command, 40036, 0);
...
Повысить/понизить громкость - то же со значениями 40058 и 40059
и т.д. и т.п.
Ответ 3:
Вот где-то подцепил:

procedure TForm1.Button1Click(Sender: TObject);
var wnd:HWND;
i:integer;
begin
{ =========== Команды ================
Более подробный список на winamp.com
'40047' - Стоп
'40046' - Пауза
'40044' - Трек назад
'40048' - Трек вперед
'40061' - Назад на 5 сек
'40060' - Вперед на 5 сек
'40058' - Громкость прибавить
'40059' - Громкость убавить
}

// Ищем окошко WinAmp по заголовку. Заголовок у него "Winamp v1.x"
Wnd:=FindWindow('Winamp v1.x',nil);
// Выбираем какую команду нам нужно ему послать
i:= 40046; //Команда из списка. В данном случае "Пауза"
// Передаем окошку с винампом данную команду
if wnd<>0 then SendMessage(Wnd,WM_COMMAND, i,0)else ShowMessage('Winamp не найден');
// Если окошка нету, выводим сообщение об ентом
end;
Ответ 4:
Здесь все на английском, но я разобрался, думаю ты тоже сможешь.

общий принцип таков:
1. находишь хендлу winamp'a.
2. через sendmessage отсылаешь номер функции и аттрибуты.
3. получаешь результат.
#define _WAFE_H_
/*
** Winamp frontend/plug-in control API documentation v1.0.
** By Justin Frankel.
** Copyright (C) 1997-1999, Nullsoft Inc.
** Last updated: OCT.5.1999.
**
** Introduction

** This file describes a means to easily communicate to Winamp
** via the classic Win32 Message API.
**
** These definitions/code assume C/C++. Porting to VB/Delphi shouldn't
** be too hard.
**
** First, you find the HWND of the Winamp main window. From a plug-in
** you can easily extract this from the plug-in structure (hMainWindow,
** hwndParent, whatever). for external apps, use:
**
** HWND hwnd_winamp = FindWindow("Winamp v1.x",NULL);
**
** (note: I know, we're in Winamp 2.x, but it's 1.x for compatibility)
**
** Once you have the hwnd_winamp, it's a good idea to check the version
** number. to do this, you send a WM_WA_IPC message to hwnd_winamp.
** Note that WM_WA_IPC is defined as Win32's WM_USER.
**
** Note that sometimes you might want to use PostMessage instead of
** SendMessage.
*/
#define WM_WA_IPC WM_USER

Вопрос 443:

/*
** int version = SendMessage(hwnd_winamp,WM_WA_IPC,0,IPC_GETVERSION);
**
** Version will be 0x20yx for winamp 2.yx. versions previous to Winamp 2.0
** typically (but not always) use 0x1zyx for 1.zx versions. Weird, I know.
**
** The basic format for sending messages to Winamp is:
** int result=SendMessage(hwnd_winamp,WM_WA_IPC,command_data,command);
** (for the version check, command_data is 0).
*/

#define IPC_DELETE 101/*
** SendMessage(hwnd_winamp,WM_WA_IPC,0,IPC_DELETE);
**
** You can use IPC_DELETE to clear Winamp's internal playlist.
*/
#define IPC_STARTPLAY 102/*
** SendMessage(hwnd_winamp,WM_WA_IPC,0,IPC_STARTPLAY);
**
** Using IPC_STARTPLAY is like hitting 'Play' in Winamp, mostly.
*/
#define IPC_ISPLAYING 104/*
** int res = SendMessage(hwnd_winamp,WM_WA_IPC,0,IPC_ISPLAYING);
**
** IPC_ISPLAYING returns the status of playback.
** if it returns 1, it is playing. if it returns 3, it is paused,
** if it returns 0, it is not playing.
*/
#define IPC_GETOUTPUTTIME 105/*
** int res = SendMessage(hwnd_winamp,WM_WA_IPC,mode,IPC_GETOUTPUTTIME);
**
** IPC_GETOUTPUTTIME returns the position in milliseconds of the
** current song (mode = 0), or the song length, in seconds (mode = 1).
** Returns -1 if not playing or error.
*/
#define IPC_JUMPTOTIME 106/* (requires Winamp 1.60+)
** SendMessage(hwnd_winamp,WM_WA_IPC,ms,IPC_JUMPTOTIME);
** IPC_JUMPTOTIME sets the position in milliseconds of the
** current song (approximately).
** Returns -1 if not playing, 1 on eof, or 0 if successful
*/
#define IPC_WRITEPLAYLIST 120/* (requires Winamp 1.666+)
** SendMessage(hwnd_winamp,WM_WA_IPC,0,IPC_WRITEPLAYLIST);
**
** IPC_WRITEPLAYLIST writes the current playlist to <winampdir>\\Winamp.m3u,
** and returns the current playlist position.
** Kinda obsoleted by some of the 2.x new stuff, but still good for when
** using a front-end (instead of a plug-in)
*/
#define IPC_SETPLAYLISTPOS 121/* (requires Winamp 2.0+)
** SendMessage(hwnd_winamp,WM_WA_IPC,position,IPC_SETPLAYLISTPOS)
**
** IPC_SETPLAYLISTPOS sets the playlsit position to 'position'.
*/
#define IPC_SETVOLUME 122/* (requires Winamp 2.0+)
** SendMessage(hwnd_winamp,WM_WA_IPC,volume,IPC_SETVOLUME);
**
** IPC_SETVOLUME sets the volume of Winamp (from 0-255).
*/
#define IPC_SETPANNING 123/* (requires Winamp 2.0+)
** SendMessage(hwnd_winamp,WM_WA_IPC,panning,IPC_SETPANNING);
**
** IPC_SETPANNING sets the panning of Winamp (from 0 (left) to 255 (right)).
*/
#define IPC_GETLISTLENGTH 124/* (requires Winamp 2.0+)
** int length = SendMessage(hwnd_winamp,WM_WA_IPC,0,IPC_GETLISTLENGTH);
**
** IPC_GETLISTLENGTH returns the length of the current playlist, in
** tracks.
*/
#define IPC_SETSKIN 200/* (requires Winamp 2.04+, only usable from plug-ins (not external apps))
** SendMessage(hwnd_winamp,WM_WA_IPC,(WPARAM)"skinname",IPC_SETSKIN);
**
** IPC_SETSKIN sets the current skin to "skinname". Note that skinname
** can be the name of a skin, a skin .zip file, with or without path.
** if path isn't specified, the default search path is the winamp skins
** directory.
*/
#define IPC_GETSKIN 201/* (requires Winamp 2.04+, only usable from plug-ins (not external apps))
** SendMessage(hwnd_winamp,WM_WA_IPC,(WPARAM)skinname_buffer,IPC_GETSKIN);
**
** IPC_GETSKIN puts the directory where skin bitmaps can be found
** into skinname_buffer.
** skinname_buffer must be MAX_PATH characters in length.
** When using a .zip'd skin file, it'll return a temporary directory
** where the ZIP was decompressed.
*/
#define IPC_EXECPLUG 202/* (requires Winamp 2.04+, only usable from plug-ins (not external apps))
** SendMessage(hwnd_winamp,WM_WA_IPC,(WPARAM)"vis_file.dll",IPC_EXECPLUG);
**
** IPC_EXECPLUG executes a visualization plug-in pointed to by WPARAM.
** the format of this string can be:
** "vis_whatever.dll"
** "vis_whatever.dll,0" // (first mod, file in winamp plug-in dir)
** "C:\\dir\\vis_whatever.dll,1"
*/
#define IPC_GETPLAYLISTFILE 211/* (requires Winamp 2.04+, only usable from plug-ins (not external apps))
** char *name=SendMessage(hwnd_winamp,WM_WA_IPC,index,IPC_GETPLAYLISTFILE);
**
** IPC_GETPLAYLISTFILE gets the filename of the playlist entry [index].
** returns a pointer to it. returns NULL on error.
*/
#define IPC_GETPLAYLISTTITLE 212/* (requires Winamp 2.04+, only usable from plug-ins (not external apps))
** char *name=SendMessage(hwnd_winamp,WM_WA_IPC,index,IPC_GETPLAYLISTTITLE);
**
** IPC_GETPLAYLISTTITLE gets the title of the playlist entry [index].
** returns a pointer to it. returns NULL on error.
*/
#define IPC_GETLISTPOS 125/* (requires Winamp 2.05+)
** int pos=SendMessage(hwnd_winamp,WM_WA_IPC,0,IPC_GETLISTPOS);
**
** IPC_GETLISTPOS returns the playlist position. A lot like
IPC_WRITEPLAYLIST
** only faster since it doesn't have to write out the list. Heh, silly me.
*/
#define IPC_GETINFO 126/* (requires Winamp 2.05+)
** int inf=SendMessage(hwnd_winamp,WM_WA_IPC,mode,IPC_GETINFO);
**
** IPC_GETINFO returns info about the current playing song. The value
** it returns depends on the value of 'mode'.
** Mode Meaning

** 0 Samplerate (i.e. 44100)
** 1 Bitrate (i.e. 128)
** 2 Channels (i.e. 2)
*/
#define IPC_GETEQDATA 127/* (requires Winamp 2.05+)
** int data=SendMessage(hwnd_winamp,WM_WA_IPC,pos,IPC_GETEQDATA);
**
** IPC_GETEQDATA queries the status of the EQ.
** The value returned depends on what 'pos' is set to:
** Value Meaning

** 0-9 The 10 bands of EQ data. 0-63 (+20db - -20db)
** 10 The preamp value. 0-63 (+20db - -20db)
** 11 Enabled. zero if disabled, nonzero if enabled.
** 12 Autoload. zero if disabled, nonzero if enabled.
*/
#define IPC_SETEQDATA 128/* (requires Winamp 2.05+)
** SendMessage(hwnd_winamp,WM_WA_IPC,pos,IPC_GETEQDATA);
** SendMessage(hwnd_winamp,WM_WA_IPC,value,IPC_SETEQDATA);
**
** IPC_SETEQDATA sets the value of the last position retrieved
** by IPC_GETEQDATA.
*/

Вопрос 444:

** Some API calls tend to require that you send data via WM_COPYDATA
** instead of WM_USER. Such as IPC_PLAYFILE:
*/
#define IPC_PLAYFILE 100
/*
** COPYDATASTRUCT cds;
** cds.dwData = IPC_PLAYFILE;
** cds.lpData = (void *) "file.mp3"
** cds.cbData = strlen((char *) cds.lpData)+1; // include space for null
char
** SendMessage(hwnd_winamp,WM_COPYDATA,(WPARAM)NULL,(LPARAM)amp&cds);
**
** This will play the file "file.mp3".
**
*/
#define IPC_CHDIR 103/*
** COPYDATASTRUCT cds;
** cds.dwData = IPC_CHDIR;
** cds.lpData = (void *) "c:\\download"
** cds.cbData = strlen((char *) cds.lpData)+1; // include space for null
char
** SendMessage(hwnd_winamp,WM_COPYDATA,(WPARAM)NULL,(LPARAM)amp&cds);
**
** This will make Winamp change to the directory C:\\download
**
*/

Вопрос 445:

** Winamp misc commands.
**
** to send these, use:
**
** SendMessage(hwnd_winamp, WM_COMMAND,command_name,0);
*/
#define WINAMP_OPTIONS_EQ 40036 // toggles the EQ window
#define WINAMP_OPTIONS_PLEDIT 40040 // toggles the playlist window
#define WINAMP_VOLUMEUP 40058 // turns the volume up a
little
#define WINAMP_VOLUMEDOWN 40059 // turns the volume down a
little
#define WINAMP_FFWD5S 40060 // fast forwards 5 seconds
#define WINAMP_REW5S 40061 // rewinds 5 seconds
// the following are the five main control buttons, with optionally shift
// or control pressed
#define WINAMP_BUTTON1 40044 //Previous Track
#define WINAMP_BUTTON2 40045 //Play
#define WINAMP_BUTTON3 40046 //Pause
#define WINAMP_BUTTON4 40047 //Stop
#define WINAMP_BUTTON5 40048 //Next Track
#define WINAMP_BUTTON1_SHIFT 40144 //rewinds 5 seconds
#define WINAMP_BUTTON2_SHIFT 40145 //Open file and play
#define WINAMP_BUTTON3_SHIFT 40146 //Null
#define WINAMP_BUTTON4_SHIFT 40147 //Fades out and stops
#define WINAMP_BUTTON5_SHIFT 40148 //fast forwards 5 seconds
#define WINAMP_BUTTON1_CTRL 40154 //Starts previous file in the
playlist
#define WINAMP_BUTTON2_CTRL 40155 //Open location
#define WINAMP_BUTTON3_CTRL 40156 //Null
#define WINAMP_BUTTON4_CTRL 40157 //Null
#define WINAMP_BUTTON5_CTRL 40158 //Starts next file in the
playlist
#define WINAMP_FILE_PLAY 40029 // pops up the load file(s)
box
#define WINAMP_OPTIONS_PREFS 40012 // pops up the preferences
#define WINAMP_OPTIONS_AOT 40019 // toggles always on top
#define WINAMP_HELP_ABOUT 40041 // pops up the about box
/*** EOF.. Enjoy.
*/
#endif
#ifndef _WAFE_H_


Вопрос 446:

От: Вертянкин Алексей

Как избежать активизации события
перерисовки формы OnPaint каким-нибудь красивым способом?

У меня на форме есть объекты-наследники класса TImage;
Есть методы, двигающие эти объекты на форме.
Во время движения такого объекта происходит полная перерисовка формы.
Но для оптимизации нужно перерисовать только часть канвы формы.
Методы движения моих объектов в своем теле используют унаследованную
от Timage перерисовку себя: (inherited repaint).
После такой перерисовки происходит событие Onpaint формы. Так вот
здесь мне и нужно это событие "подавить"
Можно конечно попробовать с глобальным флагом, но я чувствую должно
быть более рациональное решение.


Ответить.

Ответ 1:


Вопрос 447:

От: Prytkov@tut.by

На одной машине используется несколько приложений, работающих через
BDE с локальными БД (dbf, PDox). Если в один момент времени активно
только одно из них, все ОК. Но если они работают параллельно,
слетает либо приложение, либо система. Причем приложения
использует разные базы - каждое свою.


Ответить.

Ответ 1:
Возможно у тебя в Configuration -> Drivers -> Native-> PARADOX -> NET
DIR
разные каталоги указаны.
Если так, то прменяй всем на один и тот же каталог в каотором должен
лежать
PDOXUSER.NET
Очень важно, чтобы у всех каталог бал одинаков !!!!!!


Вопрос 448:

От: Алексей Малиновский

Устанавливаю Interbase Server на сервер (невыделеный).
Запускаю ibserver.exe.
Запускаю мою программу - РАБОТАЕТ!
Устанавливаю Interbase Client на клиентскую машину.
Запускаю ibguard.exe.
Запускаю мою программу, и выбираю БД с серверной машины - ПРОГРАММА НЕ
РАБОТАЕТ (ошибка соединения с сервером)!

В чём может быть поблема???


Ответить.

Ответ 1:
Эта проблема решается довольно просто (в хелпе описана но непонятно )
необходимо в файл SERVICES в корне виндов дописать строку (окрытия порта) на всех локальных машинах:
gds_db 3050/tcp
На сервера она автоматом прописывается.
потом на клиентах проверить через communication diagnostic
p.s. всё для IB 4-5 и без NT проверено временем работы на сети. ;-)


Вопрос 449:

От: My Portal Inc.

Каким образом можно читать инфу из запущенного
exe-файла, или его скоприровать, как это делает
напр. FAR.

Операции через поток TFileStream не помогают,
в "лоб" тоже косяк..... Можа кто скажет как?


Ответить.

Ответ 1:


Вопрос 450:

От: banov

:
Подскажите, почему не работает!

Клиент:
procedure TForm1.OKClick(Sender: TObject);
var
thefile:TFilestream;
begin
thefile:=TFilestream.Create('Путь к файлу', fmOpenread);
ClientSocket1.Socket.SendStream(thefile);
thefile.Free;
t:=false;
end;

Сервер:
procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
e:integer;
buf:PChar;
thefile: file of Char;

begin
assignfile(thefile,'newfile.tmp');
rewrite(thefile);
e:=Socket.ReceiveLength;
GetMem(buf,e+1);
Socket.ReceiveBuf(buf^,e);
BlockWrite(thefile,buf^,e);
FreeMem(buf);
closefile(thefile);
end;


Ответить.

Ответ 1:


Вопрос 451:

От: Богер Евгений

Где достать описание всех функций WinAPI на русском языке?


Ответить.

Ответ 1:
Посмотри тут http://sharig.webzone.ru/global/index_api.htm


Вопрос 452:

От: Богер Евгений

Подскажите где есть содержимое дискеты к книге "OpenGL графика в
проектах
DELPHI" автор М.Краснов ?


Ответить.

Ответ 1:
На сайте издательства "BHV"
www.bhv.ru


Вопрос 453:

От: Poi$0n


А не подскажет ли кто, как можно для Dial-Up соединения считать
кол-во
переданной и принятой информации?


Ответить.

Ответ 1:


Вопрос 454:

От: Viscount

У меня большая просьба, Написал программу, через clientsocket и
serversocket идет передача текста, который переводится в команды. Но у
меня проблема, если компьютер с серверной частью отключен, то при
обращении с клиентской машины на ней выходит Windows-ское сообщение об
ошибке соединения, можно ли проверить по известному IP адресу есть ли
возможность соединиться или машина выключена или недоступна,


Ответить.

Ответ 1:
А не лучше ли реагировать на появление ошибки, чем производить огромное количество разных проверок (тем более, что все возможные проверки бывает
очень сложно предсказать, может у пользователя Вашего клиента что-нибудь неправильно настроено).
Включите код "общения" с сервером в блок try ... except.
Ответ 2:
ставим обработчик ошибок соединения

procedure TForm1.CS1Error(Sender: TObject; Socket: TCustomWinSocket;
ErrorEvent: TErrorEvent; var ErrorCode: Integer);
begin
ErrorCode:=0;
Memo1.Lines.Add('сервер не фурычит');//При ошибки подключения кс покажет в мемо1 ошибку
end;


Вопрос 455:

От: Алексей Малиновский

В своей проге я хочу сделать отчёты в MS Word. Сначала я выполняю SQL
запрос (БД - InterBase), а затем перебирая каждую запись вставляю её в
таблицу шаблона Word'а.
Так вот проблема в том, что все эти операции происходят очень долго...
Вопрос: нельзя ли как-нить результат SQL запроса поместить в какоу
нибудь массив, чтобы потом быстро его перебрать и вставлять данные в
шаблон, или может у кого-нибудь другие предложения повысить скорость
построения отчётов с помощью OLE в Word'е?


Ответить.

Ответ 1:
У нас в конторе проводили опыт по работе с WORDом,
работает действительно не шустро - и это не SQL виноват, а WORD
немного (в 2,5 раза) ускорили, скрыв аппликейшн Ворда,
еще одна мысль - должна быть проперть типа DisableUpdate(Refresh),
чтобы он потом все изменения перерисовал..
Ответ 2:
Если необходимо передать в Word данные в виде таблицы, причем таблица достаточно простая (т.е. без объединений и разбиений ячеек), то быстрее всего
вставлять данные с использованием преобразования текста в таблицу: сначала накапливаем данные в какой-то строчной переменной, разделяя каким-то спец.
символом значения ячеек в строке (например, точкой с запятой) и символом #13 строки таблицы. Например, так:

1434;534;436
456;5;4
54;34656546;543

Затем вставляем строку в Word, выделяем ее и преобразуем в таблицу (кажется, команда TextToTable)

p.s. Делал это уже давно, могу ошибаться в деталях
p.p.s. Вставка данных происходит процентов на 20 быстрее, если делать это в режиме Normal (команда ViewNormal), чем в режиме разметки страницы
(ViewPage)
Ответ 3:
Время теряется на переключение проццесов. Чем больше таблица тем хуже.
Каждая клетка таблицы это переключение.
Сформируйте стороку данных передайте Word (один процесс) затем конвертируйте
текст в таблицу (второй процесс)
Ниже приведе текст рабочей процедуры, написанны на Delphi 6.0 для
компанентов Офиса 97. Успешно работает и с 2000
procedure Spisok_Sotrudnikov2(Name: String);
var
{Объявление переменных, для передачи их в качестве формальных параметров в}
{ сервер автоматизации}
Shablon,FileName,Tempo,Separator,NumColumns:OleVariant;
i,k : Integer;
MyRange : Range; {Область документа}
Tabl : Table; {Одна таблица}
Pars : Paragraphs; {Массив параграфов}
Par : Paragraph; {Один параграф}
S : Array[1..9] of String;
Text : WideString;
Text1: String;
begin
Screen.Cursor:=crHourGlass;
{Оформление бегущей линейки}
Otchet_Spisok_Sotrudnikov.BitBtn1.Visible:=False;
Otchet_Spisok_Sotrudnikov.Gauge1.Visible:=True;
{Определяем файл шаблона документа и файл для сохранения результата}
Shablon:=ExtractFilePath(Application.EXEName)+'Spisok.Doc';
FileName:=ExtractFilePath(Application.EXEName)+'Spisok_Sotrudnikov1.DOC';
{Открываем шаблон документа}

Otchet_Spisok_Sotrudnikov.WordApplication1.Documents.Open(Shablon,EmptyParam
,EmptyParam,EmptyParam,

EmptyParam,EmptyParam,EmptyParam,EmptyParam,
EmptyParam,EmptyParam);
{Связываем компоненту с существующим интерфейсом}

Otchet_Spisok_Sotrudnikov.WordDocument1.ConnectKind:=ckAttachToInterface;

Otchet_Spisok_Sotrudnikov.WordDocument1.ConnectTo(Otchet_Spisok_Sotrudnikov.
WordApplication1.ActiveDocument);
{Обязательно отключить проверки орфографии и граматики в Word}

Otchet_Spisok_Sotrudnikov.WordApplication1.Options.CheckSpellingAsYouType:=f
alse;

Otchet_Spisok_Sotrudnikov.WordApplication1.Options.CheckGrammarAsYouType:=fa
lse;
{Опредеоляем область документа}

MyRange:=Otchet_Spisok_Sotrudnikov.WordDocument1.Range(EmptyParam,EmptyParam
);
Tempo:=MyRange;
{Оформляем заголовок}
Pars:=Otchet_Spisok_Sotrudnikov.WordDocument1.Paragraphs;
Par:=Pars.Add(Tempo);
Par.Alignment:=wdAlignParagraphCenter; {Выравнивание параграфа}
Par.Range.Font.Bold:=1; {Шрифт жирный}
Par.Range.Font.Size:=14; {Размер шрифта}
Par.Range.Font.ColorIndex:=1; {Цвет шрифта зеленый}
Par.Range.InsertBefore(Name);
Tempo:=Par.Range.Get_End_; {Определяем конец области}
MyRange:=Otchet_Spisok_Sotrudnikov.WordDocument1.Range(Tempo);
{Формирование данных}
DataModule1.IBQuery2.Open;
DataModule1.IBQuery2.FetchAll;
i:=DataModule1.IBQuery2.RecordCount;
Otchet_Spisok_Sotrudnikov.Gauge1.MaxValue:=i;
Text:='? п/п@Фамилия, Имя, Отчество@Должность@Табельный номер@';
for k:=1 to i do begin
Text1:='';
Text1:=Text1+IntToStr(k)+'@';
Text:=Text+Text1;
if not DataModule1.IBQuery2.FieldByName('FML').IsNull then
S[1]:=DataModule1.IBQuery2.FieldByName('FML').Value;
if not DataModule1.IBQuery2.FieldByName('IME').IsNull then
S[2]:=DataModule1.IBQuery2.FieldByName('IME').Value;
if not DataModule1.IBQuery2.FieldByName('OTC').IsNull then
S[3]:=DataModule1.IBQuery2.FieldByName('OTC').Value;
Text1:=S[1]+' '+S[2]+' '+S[3]+'@';
Text:=Text+Text1;
S[1]:=' ';S[2]:=' ';S[3]:=' ';S[4]:=' ';S[5]:=' ';
S[6]:=' ';S[7]:=' ';S[8]:=' ';S[9]:=' ';
if not DataModule1.IBQuery2.FieldByName('NPZ').IsNull then
S[1]:=DataModule1.IBQuery2.FieldByName('NPZ').Value;
if not DataModule1.IBQuery2.FieldByName('NSP').IsNull then
S[2]:=DataModule1.IBQuery2.FieldByName('NSP').Value;
Text1:=S[1]+' '+S[2]+'@';
Text:=Text+Text1;
S[1]:=' ';S[2]:=' ';S[3]:=' ';S[4]:=' ';S[5]:=' ';
S[6]:=' ';S[7]:=' ';S[8]:=' ';S[9]:=' ';
if not DataModule1.IBQuery2.FieldByName('NNN').IsNull then
S[1]:=DataModule1.IBQuery2.FieldByName('NNN').Value;
Text1:=S[1]+'@';
Text:=Text+Text1;
S[1]:=' ';S[2]:=' ';S[3]:=' ';S[4]:=' ';S[5]:=' ';
S[6]:=' ';S[7]:=' ';S[8]:=' ';S[9]:=' ';
Otchet_Spisok_Sotrudnikov.Gauge1.Progress:=k;
DataModule1.IBQuery2.Next;
end;
{Передаем строку текста в Word}
Tempo:=MyRange;
Par:=Pars.Add(Tempo);
Par.Range.InsertBefore(Text);
{Конвертируем текст в таблицу}
Separator:='@';
NumColumns:=4;
MyRange.ConvertToTable(Separator,EmptyParam,NumColumns,EmptyParam,
EmptyParam,EmptyParam,EmptyParam,EmptyParam,
EmptyParam,EmptyParam,EmptyParam,EmptyParam,
EmptyParam,EmptyParam);
{Связываем переменную и таблицу, а затем меняем размер столбцов и
выравнивание}
Tabl:=Otchet_Spisok_Sotrudnikov.WordDocument1.Range.Tables.Item(1);
Tabl.Columns.Item(1).SetWidth(30,wdAdjustNone);
Tabl.Columns.Item(2).SetWidth(250,wdAdjustNone);
Tabl.Columns.Item(3).SetWidth(250,wdAdjustNone);
Tabl.Columns.Item(4).SetWidth(200,wdAdjustNone);
Tabl.Range.Paragraphs.Format.Alignment:=wdAlignParagraphCenter;
Tabl.Range.Cells.VerticalAlignment:=wdAlignParagraphCenter;
Tempo:=Par.Range.Get_End_; {Определяем конец области}
MyRange:=Otchet_Spisok_Sotrudnikov.WordDocument1.Range(Tempo);
{Сохранение документа и отображение его в OLE контейнере (предварительный
просмотр)}
Otchet_Spisok_Sotrudnikov.WordDocument1.SaveAs(FileName);
Otchet_Spisok_Sotrudnikov.WordDocument1.Close;
{Включить проверки в Word}

Otchet_Spisok_Sotrudnikov.WordApplication1.Options.CheckSpellingAsYouType:=T
rue;

Otchet_Spisok_Sotrudnikov.WordApplication1.Options.CheckGrammarAsYouType:=Tr
ue;
Screen.Cursor:=crDefault;
Otchet_Spisok_Sotrudnikov.Gauge1.Visible:=False;
Otchet_Spisok_Sotrudnikov.BitBtn1.Visible:=True;
Otchet_Spisok_Sotrudnikov.OleContainer1.CreateLinkToFile(FileName,false);
Otchet_Spisok_Sotrudnikov.OleContainer1.Refresh;
end;'





Если Вы хотите как можно скорее получить ответ на свой вопрос, то
укажите в теме письма - delphiV,иначе письмо будет прочитано значительно
позже, если же у вас есть предложения то в теме письма укажите delphiP.

Для интересующихся - немного о себе. Работаю на
железнодорожном транспорте ведущим программистом.
Основные мои разработки - это сбор и доставка клиентам
информации о вагонах и поездах: где находится(по России),
куда едет. В связи с этим программировал для e-mail,Socket,БД,ISAPI.

За сим прощаюсь - скорых Вам и качественных программ.

Автор рассылки - Дмитрий.
ICQ - 89533941.

ВСЕ ВОПРОСЫ СПРОСИТЬ ПРЕДЛОЖИТЬ АРХИВЫ СКОЛЬКО НАС



http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу
Рейтингуется SpyLog

В избранное