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

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

  Все выпуски  

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


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

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


Чего только не делаешь ради науки?
А она для тебя...?


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


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


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


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


Вопрос 550:

От: Eugeny A. Emelyanchikov chat

Ребята подскажите как правильно написать в Дельфях алгоритм
поиска минимального пути (например для машины)?


Ответить.

Ответ 1:


Вопрос 551:

От: Михаил Логинов

Возникла необходимость написать программу для взаимодействия с Lotus
(чтение/запись и др.). Существует-ли способ такой работы кроме прямых
COM-вызовов? А может встречались кому доступные компоненты для работы с
базами
Lotus Domino 5?


Ответить.

Ответ 1:


Вопрос 552:

От: Roman Baranov


Есть проблема - Приложение запускает процесс (CreateProcess) и
мониторит его - жив ли он? Отследить не закрылся ли он легко - по коду
выхода, а вот как отследить не висит ли он для того, что-бы прибить и
запустить по новой?


Ответить.

Ответ 1:


Вопрос 553:

От: Ilya Solovyov

Хочу написать свой клиент серверов новостей. Стандартный компонент
TNMNNTP имеет слишком мало возможностей. Поэтому использую
TClientSocket. И имею с ним проблемы... Как обрабатывать ответы
сервера? Не всегда понятно, закончил ли сервер передачу ответа или
собирается ещё что-то передать вдобавок. И вообще дайте, пожалуйста,
какие-нибудь примеры использования TClientSocket. Как организовывать
передачу информации? Ну, короче, чем больше полезной информации
(примеры, мнения, ссылки в Инете, книги), тем лучше...



Ответить.

Ответ 1:


Вопрос 554:

От: Виталий (aka Night)

Имеется Application.OnMessage
Очень хотелось бы увидеть фрагмент кода где было бы показано как
отлавливать
сообщения и их обрабатывать. Буду благодарен за любую информацию,
фрагменты
кода, URL на доки...



Ответить.

Ответ 1:


Вопрос 555:

От: LYNX


Как создать вспомагательную процедуру и потом вызывать её из других
процедур?


Ответить.

Ответ 1:



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


Вопрос 486:

От: Dabadabiabo

Пдскажите, можно ли в StringGrid
установить выравнивание строк в ячейках


Ответить.

Ответ 1:
Можно самому считая ширину ячейки, ширину текста в пикселях и выводить текст
в нужное место
Ответ 2:
TAdvStringGrid
http://www.tmssoftware.com
Отличный с кучей наворотов

Ответ 3:
Поскольку в компоненте StringGrid по умолчанию все столбцы имеют одинаковую ширину - в некоторых ячейках текст обрезается.

Чтобы этого избежать, после заполнения StringGrid нужно для каждого столбца находить текст максимальной длины и в соответствии с

его длиной устанавливать ширину всего столбца.

Здесь StringGrid заполняется случайными строками при создании формы.
procedure TForm1.FormCreate(Sender: TObject);
var
x, y, w: integer;
s: string;
MaxWidth: integer;
begin
with StringGrid1 do
ClientHeight := DefaultRowHeight * RowCount + 5;
randomize;
with StringGrid1 do begin
for y := 0 to RowCount - 1 do
for x := 0 to ColCount - 1 do begin
s := '';
for w := 0 to random(20) do
s := s + chr(ord('a') + random(26));
Cells[x,y] := s;
end;
Canvas.Font := Font;
for x := 0 to ColCount - 1 do begin
MaxWidth := 0;
for y := 0 to RowCount - 1 do begin
w := Canvas.TextWidth(Cells[x,y]);
if w > MaxWidth then MaxWidth := w;
end;
ColWidths[x] := MaxWidth + 5;
end;
end;
end;


Вопрос 487:

От: Олег Гончаренко

Моя программа ведет складской учет......
А теперь требуется чтобы она, начала работать с
кассовым аппаратом. Например со склада проданы
материалы и помимо складского учета эти операции
нужно провести через КА... Может кто сталкивался
с применением КА или подскажет где чего почитать
или взять? Буду признателен за подробный пример...


Ответить.

Ответ 1:
Работал я в магазине
но там к кассе присоединялся блок памяти продаж и сканер штрих-кодов
затем в конце дня снимал отчёт в комп в Excel (там учёт вёлся)
сейчас это распространено, а года три назад мы были одними из первых
Учти, для этого не менее чем на 90% товара должен быть штрих-код!
Ответ 2:
Кассовый аппарат подключается к компьютеру как правило через COM порт.
Для работы с приложениями типа твоего к каждому кассовому аппарату имеются
библиотеки (dll) которые содержат в себе сервисные функции для работы с КА.
Значит почитать нужно описание этих функций, если есть библиотека. Если ее нет и надо
ее написать - нужно почитать документацию к самому аппарату (руководство программиста, описание
протокола обмена с аппаратом). В принципе ничего сложного нет что в написании библиотеки, что в ее использовании .)


Вопрос 488:

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

Почему-то не стала грузится Delphi 5.0. При загрузке компьютер виснет,
причём причина в загрузке библиотек визуальных компонентов: LMD Tools и
TRITON 2000, т.к. когда их отключаешь при загрузке всё грузится отлично.
Раньше всё было нормально, эти библиотеки грузились и всё было в
порядке. А что сейчас случилось не пойму, потерял весь день для
выяснения причины, но так ничего существенного не нашёл.


Ответить.

Ответ 1:
'Попробуй, сдвинуть движок аппаратного ускорения графики влево. Если не пойдёт опять, сдвинь ещё влево, поэкспериментиуй так.
(Система --> Быстродействие --> Графика)
Ответ 2:
LMD у меня стоит уже лет 5 - проблемм вообще никаких не было. Смотри Тритона



Вопрос 489:

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


Подскажите как вставить целую строчку, где данные разделены каким-то
разделителем в готовую таблицу WORD (это мне необходимо для ускорения
посторения отчётов в Word, все отчёты строятся по шаблонам). Говорят
есть какая-то процедура типа TextToTable, но как с ней работать и как её
вызвать я не знаю.

Примечание: я использую компонент TWordApplication. Пробовал так
WordApp.Selection.TypeText(Text);
WordApp.Selection.ConvertToTable(...) но здесь ничего хорошего не
происходит


Ответить.

Ответ 1:
Вообще-то я генерирую Word-овский файл напрямую в формате rtf. описание
формата есть у Била Гейтса на сайте. Получается быстро, просто и не
зависит от того установлен на целевой машине Word или нет.
Есть некоторые различия в форматах W6 и W97, лучше использовать W6 - он
попроще и гарантированно читается во всех остальных


Вопрос 490:

От: ILYA

У меня есть проблема.Поменять картинку во
время работы в Windows,подскажите
как это сделать, желательно с примером.


Ответить.

Ответ 1:
Из вопроса не понятно в каком именно месте её поменять.
Если в программе написаной в Дельфи в компоненте TImage, то напрмер так:
Image1.Picture.BitMap.LoadFromFile('filename'), она обновится,
если сразу после этого выполняются какие-то действия, т.е. которые не дадут
Windows перерисовать данный компонент сразу, то нужно вручную
вызвать перерисовку вызовом UpDate и Validate
Ответ 2:
Для того чтобы поменять обои на рабочем столе используется функция:

SystemParametersInfo(SPI_SETDESKWALLPAPER,0,PChar('C:\Windows\Plus!.bmp'), SPIF_UPDATEINIFILE);
Ответ 3:
Вот готовая процедура для замены картинки на рабочем столе:

uses Registry;

...........

procedure SetWallPaper(sFileName:string;iType:integer);
var
regWall:TRegistryIniFile;
begin
regWall:=TRegistryIniFile.Create('Control Panel\Desktop');
try
regWall.WriteString('','Wallpaper',sFileName);
case iType of
0:begin
regWall.WriteString('','TileWallpaper','0');
regWall.WriteString('','WallpaperStyle','0');
end;
1:begin
regWall.WriteString('','TileWallpaper','1');
regWall.WriteString('','WallpaperStyle','0');
end;
2:begin
regWall.WriteString('','TileWallpaper','0');
regWall.WriteString('','WallpaperStyle','2');
end;
end;{case}
SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, Nil,
SPIF_SENDWININICHANGE );
finally
regWall.Free;
end;{try..finally}
end;

Вызов следующий:
SetWallPaper('c:\Windows.98\циновка.bmp',0); - Посередине
SetWallPaper('c:\Windows.98\циновка.bmp',1); - Рядом
SetWallPaper('c:\Windows.98\циновка.bmp',2); - Растянуть.


Вопрос 491:

От: Dmitry Podolkhov


У меня есть программа - одна главная форма
и три дочерние (похоже на Photoshop).
Все дочерние StayOnTop. Но любое из них должно иметь возможность
быть нормальным перекрывающимся окном.
Для переключения можно использовать:
1) свойство FormStyle. Но окно при этом пропадет, затем рисуется снова -
некрасиво.
2) функцию SetWindowPos. Все работает красиво. Форма становится какой
надо,
НО
ПОЧЕМУ-ТО если все дочерние окна StayOnTop и какое-то одно из них
делается
обычным, то таким-же обычным (не StayOnTop) становятся ВСЕ!!! дочерние
окна.
Handle в SetWindowPos пишу конкретного дочернего окна, однако - глюк.


Ответить.

Ответ 1:


Вопрос 492:

От: Hitman

1. Проблема передачи голосовых (звуковых) данных через (скорее в) модем.
2. Как она решается с точки зрения Delphi.
Буду рад ссылкам и документации.


Ответить.

Ответ 1:
Посмотри Voice Modem library для Borland Delphi
Роман М. Мочалов
http://www.sar.nnov.ru/~roman/download/VML.zip
Я её правда скачал с torry
http://www.torry.net/vcl/comms/voice/vml.zip


Вопрос 493:

От: Ignat Cherepanoff aka goodenemy


создаю безFORMенное приложение (не консольное!), т.е. с одним
DPR-файлом.

выглядит примерно так:

program myprog;

uses
Windows,
SysUtils,
Classes,
Graphics,
Forms,
jpeg;

{$R *.RES}

procedure main;

begin
try
while not Application.Terminated do
begin
Application.ProcessMessages;
{что-то выполняю}
sleep(1000);
end;
finally
end;
end;


begin
Application.Initialize;
Application.Run;
main;
end


так вот, проги не видно, дело она свое делает, но:
1. очень сильно тормозит систему в период SLeep
2. при ShutDown'е система ожидает ее окончания, а затем только
"убивает"
3. при CTRL-ALT-DEL прога видна и при попытке ее прервать
система через некоторое время вываливает сообщение о повисшей задаче с
кнопкой "насильственного убийства".

Вопрос │1 - как заставить программу реагировать на закрытие без
проблем?

Вопрос │2 - как уменьшить нагрузку на процессор в период SLEEP (или
чем заменить этот SLEEP)?

Вопрос │3 - как убрать процесс из списка по CTRL-ALT-DEL?


Ответить.

Ответ 1:
Немедленно убери использование Application!!!
Ответ 2:
1. очень сильно тормозит систему в период SLeep

Что-то вы путаете, как раз системное Sleep - это
комманда отдать все всремя другим процессам, и
тормозить она не может по определению. Наоборот почаще
поставьте в своем коде Sleep(10) чтоб не тормозила, но
в Вашем коде вы в цикле выполняете какие-то операции и
именно "{что-то выполняю}" или
"Application.ProcessMessages" тормозят ваш процесс.
Кстати зачем создавать объект "Application", если вы
им все равно не пользуетесь... Просто не делайте его и
крутите все в цикле. Если Вы посмотрите на определение
объекта TApplication - то это своеобразная форма,
только с нулевыми размерами, так что вы никакого
бесформенного приложения и не создали, с тем же
успехом включите в проект форму и сделайте ее
невидимой - эффект будет тот же, размер то же
практически не увеличиться.

"при ShutDown'е система ожидает ее окончания" -
естественно, Вам надо ловить и обрабатывать
соответствующие сообщения виндов, иначе Ваша программа
не может закончиться корректно, ее просто винды
убивают в непредсказуемый момент. Если вы не
используете форму то Вам прийдется писать собственный
обработчик событий.


Вопрос 494:

От: ШО МКТУ

Хочу использовать SQL Server 7.0, но возникает множество глюков.
Например:
Поле аналогичное Autoincrement есть, но при добавлении в таблицу новой
записи в ентом поле автономер не генерируется.


Ответить.

Ответ 1:
Если речь идет о Delphi, неплохо бы указать через что собираешься работать
(BDE, ADO)
А если об SQL Server, тогда слушай
1. Поле должно иметь тип int
2. Null-значения недопустимы. Т.е. снимаем галочку "Allow nulls"
3. Identity = yes
4. Identity seed = 1 начало отсчета
5. Identity increment = 1 приращение
6. Если собираешься считывать значения, делать это следует не после Append,
а после Post

Ответ 2:
Hi. You must use "newid()" function for default value. Field must be
"uniqueidentifier" type. When you added new string in table don't set
this field manually. Server will fill this field using function for
value on-default (newid())
Ответ 3:
Посмотрите внимательно на свойство этого автокриментого поля. Необходимо включить генерирование автокриментого ключа, выставив в
одном из свойств Yes (к сожеление не помню какого именно- SQL- серевера нет под рукой).


Вопрос 495:

От: vas

Как мне узнать в программе что другой пользователь редактирует запись
в таблице Парадокс ?


Ответить.

Ответ 1:
Вы об этом узнаете, когда попытаетесь начать редактирование
уже редактируемой записи по Exception, так как при редактировании в Paradox
запись блокируется
Ответ 2:


Вопрос 496:

От: Усатов Константин

Скажите, пожалуйста, как принимать и отправлять
системные/WinPopup сообщения (которые под Windows NT/2000
посылаются командой net send) ? Желательно привести пример,
желательно на Delphi.


Ответить.

Ответ 1:


Вопрос 497:

От: Ольга

Я использую таблицы PARADOX в сети и проблема в том,
что очень часто портятся индексы. Отчего это происходит и можно ли
этого как то избежать?
И еще вопрос: как печатать на рулонной бумаге,
чтобы в конце документа принтер не проматывал бумагу до конца листа.
Для формирования отчетов я использую QuickReport,
принтер матричный FX-1170,
операционная система Windows 2000 и Windows NT4.
P.S. в Windows 98 этого удалось добиться.


Ответить.

Ответ 1:
Есть несколько соображений.
Индексы портятся от того, что клиентские приложения не знают о том что
БД используется еще кем -то (каким -либо другим приложением)
1. в BDE администраторе Configuration\Drivers\native\paradox
свойство Net Dir установи на всех клиентских машинах в тот каталог где
располагается БД.
2. в BDE администраторе Configuration\Sistem\init свойство Local Share
установи в TRUE.

Ответ 2:
Во всех критических моментах сбрасывать буфера на диск.
Ответ 3:
К сожелению Paradox очень не надежная СУБД и использовать ее я бы
не советовал. Я сам ее забросил когда несколько раз потерял данные.
Используйте другие СУБД , например SQL-сервер, Oracle, MySQL и так далее.
Однако они требуют дополнительных знаний (знание
технологии клиент-сервер, например).
На счет QuickReport отвечу примерно то же самое- очень глюкавая вещь.
Используйте другие построители отчетов- FastReport, BuildReport и
другие. Првда они должны доставляться дополнительно и за них надо
дополнительно платить. Я в ручную формирую отчеты в формате Word,
используя компоненты я палитры Servers.
На счет промотки бумаги отвечу следующее: скорее всего QuickReport здесь
не причем. Я то же сталкивался с такой проблемой. Как мне
удалось понять, все притензии здесь надо отнести к создателям принтера.
Если вы еще не пробывали, попробуйте по экспериментировать с
выбором бумаги, например поставить рулонную бумагу.


Вопрос 498:

От: Vladimir Vladimirov

Уже несколько лет мы используем RxLib. Последняя версия - 2.75.
Никаких сведений о RxLib для Delphi 6 в интернете не нашли,
www.rxlib.com отсутствует. Что известно о версии RxLib для Delphi 6 ?
Или придется адаптировать RxLib самостоятельно ?


Ответить.

Ответ 1:
Смотри здесь:
http://www.oxygensoftware.com/download/rx275d6.zip


Вопрос 499:

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


У меня есть два вопроса по InterBase:
1) Обязательно ли загружать, перед выполнением своей программы,
ibGuard.exe или ibServer.exe и чем вообще эти два файла отличаются
(функции то они выполняют одни и те же)?
2) Можно ли как-нибудь убрать иконку из нижнего правого угла экрана, (в
индикаторной области) обозначающей InterBase сервер?


Ответить.

Ответ 1:
Не одни и теже
сервер нужен
иконку по-моему не убрать , если нигде нет в опциях
Ответ 2:
> У меня есть два вопроса по InterBase:
> 1) Обязательно ли загружать, перед выполнением своей программы,
> ibGuard.exe или ibServer.exe и чем вообще эти два файла отличаются
> (функции то они выполняют одни и те же)?
не совсем так, ibguard.exe - это сторож для ibserver.exe
Т.е., когда ibserver.exe подвисает и вылетает (не часто, но иногда
случается), то стражник автоматически его перезапускает.

На компьютере, являющимся СУБД-сервером для твоей БД необходимо
запускать ibserver.exe, т.к. он прослушивает заданный порт и принимает
запросы клиентского компьютера на подключение, передает результаты.

Если выполняешь клиентскую программу на том же компьютере, то
фактически используется так называемая "петля" (IP адрес 127.0.0.1)

На клиентском компьютере для подключения к серверу должен быть всего
лишь gds32.dll (в system32 - для WinNT, в system - для Win 9x)

> 2) Можно ли как-нибудь убрать иконку из нижнего правого угла экрана, (в
> индикаторной области) обозначающей InterBase сервер?
если сервер запускаешь под NT, то по умолчанию он стартует, как сервис
и иконки не показвает, хотя под NT можно запускать и как приложение (я
так и делаю, для этого в папку автозагрузки положил ярлык с
параметрами ком.строки ibserver.exe -a. считаю, что так удобнее,
поскольку можно быстро вызвать окно настройки и статуса).

Под Win9x мне кажется, что можно убрать (ведь если грузить
ibserver.exe, то иконка одна, а если ibguard.exe - то другая, значит
ibguard.exe как-то убивает одну иконку и заменяет ее другой), но как
это делается - не знаю, сорри! ;-)
Да у меня никогда и не возникало такой мысли

Ответ 3:
:по поводу 1 вопроса - кто тебе сказал, что функции они выполняют одинаковые? Тебя обманули. Это наблюдающий процесс за сервером.
по поводу 2 вопроса - убрать ее нельзя. Я так понял, что ты запускаешь сервер из под 95 или 98?
Если тебя эта иконка раздражает, то запускай из под НТ как сервис. .)
И напоследок маленький совет - почитай документацию по интербейсу.

Ответ 4:
1. IBServer грузить обязательно, IBGuard по желанию - это сервисная
программа, она как бы следит за IB... ))
2. Убрать иконку можно. Для этого перейди на WindowsNT или Windows
2000 там существует понятие служба и IB работает как служба (servis)
поэтому его невидно... ))


Вопрос 500:

От: dipper

возможно ли в dbGrid произвести подсчет
промежуточных итогов? Например: есть таблица на 2-а поля. В 1-м некие
коды, во 2-м числа (просто числа)
код число
1000 итог по коду 1001,1002
1001 1
1002 2
2000 итог по 2100,2200
2100 итог по 2101,2102
2101 3
2102 4
2200 итог по 2201,2202
...


Ответить.

Ответ 1:
Садись на событие OnCalculate
В нем пишешь код для расчёта
Ответ 2:
DBGrid не работает по принципу Excel. У тебя есть 2 варианта -
либо писать расчет в Delphi, либо ставить FormulaOne - она сможет решить за тебя внутренние
расчеты.

Вопрос 501:

От: Stark

Уважаемые эксперты,
1) Программирование TCP-IP. Как?
2) Как в Delphi 5 провести опрос широковещательного канала
UDP. По сути надо написать небольной сниффер.
3) Киньте в меня ссылками на статьи и/или примеры для этих
задач.


Ответить.

Ответ 1:


Вопрос 502:

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

Делаю программу с удалённым сервером InterBase. Связь идёт между
городами, т.е. в одном городе стоит сервер, а с другого города надо
иметь доступ к серверу через телефонную линию.
Как сделать так чтобы клиент дозванивался до сервера и тот отвечал ему и
соединялся с ним, т.е. какие компоненты, технологии, укажите направление
в котором мне следует исследовать Delphi?


Ответить.

Ответ 1:
Во первых проанализируй какой объем будет иметь база в рабочем режиме? Дело в том, что если объемы будут большие, то
диалапный канал может не потянуть. Т.е. будут наблюдаться дикие тормоза при выборках и вставках данных. Если объемы большие
и тормоза не будут устраивать прийдется отказаться от интербейса а использовать скажем оракл.
А по поводу дозванивания клиента - писать ничего не надо. Все это решается на уровне конфигурирования сети. Т.е. ставиться какой нибуть
винроут
или еще чего и настраивается так, что бы при запросе к серверу (понимать к IP адрессу или имени машины) происходила дозвонка и
подключение к удаленному серверу.
В общем что то вроде удаленного доступа к сети получается. .)
Ответ 2:
Никакие компоненты не нужны... всё происходит само собой (так же как в
локальной сети) Устанавливается физический канал (два модема
договорились) дальше на порт 3050 (порт IB по умолчанию) клиент кидает
message типа "вот и я", а сервер отвечает "очень хорошо"... и всё
закрутилось....

Проблема в другом... как удержать соединение.... IB очень чуток к
плохим пакетам... (( поэтому траблы типа "хост недоступен" будут
постояно...

Вопрос 503:

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

После установки Delphi 6 при компиляции старого проекта выдал сообщение
"Undeclared identifier: Null"
if (DataSet['Cena']<>Null) and (DataSet['Kol_Upk']<>Null) then

DataSet['Cen_Edn']:=Round(DataSet['Cena']/DataSet['Kol_Upk']*100)/100;


Ответить.

Ответ 1:
Нужно так:

if (not (VarType(DataSet['Cena']) in [varNull])) and
(not (VarType(DataSet['Kol_Upk']) in [varNull])) then
Ответ 2:
А можно и проще - прописать variants в uses


Вопрос 504:

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

Что может заставить отреагировать прогу на нажатие кнопок
со стрелками(вверх, вниз, лево-право).?
В Паскале можно было анализировать с помощью readkey а потом
с помощью Chr нажатия на эти кнопки.
Если поставить на событие OnKeyPress формы
(предварительно включив для нее KeyPreview в истину) какой либо
обработчик, то он реагирует на почти все кнопки кроме нужных кнопок
управления, и еще кроме кнопок Insert, Del, Page-UP-Down etc.
Может я что то делаю кардинально не так? Что заставит реагировать на
нажатия?


Ответить.

Ответ 1:
Надо обрабатывать события onKeyUp или onKeyDown и обрабатывать
передаваемую в процедуру переменную Key

if Key=vk_up then
if key=vk_down

и т.д. параметр Shift может иметь такие значения множества:

ssShift The Shift key is held down.
ssAlt The Alt key is held down.
ssCtrl The Ctrl key is held down.
Например if (Key=vk_up) and (ssShift in Shift) then ... // нажата клавиша вверх вместе с шифтом. Но, замечу, что это условие выполнится также
например, если нажата и Shift и Ctrl., для отбора только Shift надо
написать: ... and (Shift=ssShift)...


Вопрос 505:

От: Alex Gross

Модем Zyxel U1496 набирает номер под D5 с AsincPro, к
модему подключен телефонный аппарат.
Как сделать так, чтобы после ответа абонента человек
мог говорить по телефону? Модем можно выключить и
тогда говорить, а вот КАК ОБОЙТИСЬ БЕЗ ВЫКЛЮЧЕНИЯ
МОДЕМА?


Ответить.

Ответ 1:
Читать документацию к своему модему, а точнее раздел Voice комманд.
Либо же после того, как человек поднял трубку на параллельном аппарате обязать этого человека нажать на кнопку в обработчике событий
которой будет процедура бросания трубки модемом.


Вопрос 506:

От: Mickle


Дано: есть компонент типа TTreeView TreeView1
Цель: возможность нарисовать около каждой ветви рисунок TBitMap. Я рисую
через канвас т.е.
Решение: Ставим приведённую ниже процедуру на событие
TreeView1AdvancedCustomDrawItem, (вызывается при перерисовке ветвей)
таким образом:

procedure TreeView1AdvancedCustomDrawItem(Sender: TCustomTreeView;
Node: TTreeNode; State: TCustomDrawState; Stage: TCustomDrawStage;
var PaintImages, DefaultDraw: Boolean);
var BitMap:TBitMap;
NodeRect:TRect;
begin
with Node do
begin
// Определяем координаты куда рисовать
NodeRect:=DisplayRect(True); // на строке данной ветки, но: True -
сразу слева от ветки, False - справа от границы компонента
BitMap:=TBitMap.Create;
try
ImageList1.GetBitMap(1,BitMap); // загружаем в битовую карту
изображение из компонента TImageList
TreeView.Canvas.Draw(NodeRect.Left,NodeRect.Top,BitMap); //
Собственно рисуем
finally
BitMap.Free; // освобождаем память уже от ненужного компонента
end;
end;
end;


Проблема: Всё работает отлично, но!!! при рисование канвой изображения,
ШРИФТ ВЕТКИ МЕНЯЕТСЯ на уродливый System, не знаю чего с ним делать.

Если есть идеи, напишите.

P.S. Canvas.Font не помогает. Помогает только
Canvas.Font.Assign(TreeView1.Font) но только для текущей ветки, когда с
неё переключаеь на другую, "старая" снова меняется на System :(((


Ответить.

Ответ 1:
Пиктограммы узлов дерева лучше отрисовывать не на канве "руками",
а используя компонент TImageList. Имя этого
компонента (свойство TImageList.Name)
указывается в свойстве TTreeView.Images. Заполните TImageList
bmp-изображениями. Для отображения пиктограмм на дереве
устанавливайте свойства
TTreeView..Items[i].ImageIndex и
TTreeView.Items[i].SelectedIndex i-тых узлов в
соответствующие номера пиктограмм из списка.
Ответ 2:
Проблема в том, что при вызове Canvas.Handle создается новый Font.
Можно рисовать на DC. Но у меня обычно картинки выводятся стандартным
образом, а текст около них рисую на DC.

Если решать только текущую задачу, то можно так:



uses Commctrl;

procedure TForm1.TreeView1AdvancedCustomDrawItem(Sender: TCustomTreeView;
Node: TTreeNode; State: TCustomDrawState; Stage: TCustomDrawStage;
var PaintImages, DefaultDraw: Boolean);
var
DC : HDC;
NodeRect : TRect;
begin
NodeRect := Node.DisplayRect(True);
DC := GetDC(TreeView1.Handle);
ImageList_Draw(ImageList1.Handle, 3, DC,
NodeRect.Left, NodeRect.Top, ILD_NORMAL);
ReleaseDC(TreeView1.Handle, DC);
end;


Вопрос 507:

От: Овечкин Денис


Не подскажет ли кто ни будь, возможно ли программно переключить какой
ни будь параметр в BIOS и желательно из Delphi. Если возможно то
хотелось бы кусочек кода с примером.


Ответить.

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

Вопрос 508:

От: MyPortal Inc.

Каким образом можно из программы зарегистрировать
собственные типы файлов, (имеется ввиду по их расширению),
что бы при клике на этих файлах вызывалось мое приложение,
и соответственно к ним цеплялась "родная" иконка приложения.
Старый метод (самопальный) в 6-ом Делфи не работает:
// Процедура регистрации файлового типа программы
procedure RegisterFileType( ft, key, desc, icon, prg : string );
var
myreg : TRegIniFile;
ct : Integer;
begin
ct := pos('.',ft);
while ct > 0 do begin
System.Delete(ft,ct,1);
ct := pos('.',ft);
end;
if (ft = '') or (prg = '') then exit;
ft := '.'+ft;
myreg := TRegIniFile.Create('');
try
myreg.rootkey := hkey_classes_root;
if key = '' then key := copy(ft,2,maxint)+'_auto_file';
myreg.writestring(ft,'',key);
myreg.writestring(key,'',desc);
if icon <> '' then
myreg.writestring(key+'\DefaultIcon','',icon);
myreg.writestring(key+'\shell\open\command','',prg+' "%1"');
finally
myreg.Free;
end;
end;



Ответить.

Ответ 1:


Вопрос 509:

От: MyPortal Inc.

Кто нибудь сможет подсказать технологию построения
самораспаковывающихся файлов, т.е., что бы я из
своего приложения мог построить exe-файл и при
запуске последнего он сам из себя доставал
какие нить файлы, пусть даже без компресии.
Например пишется готовый exe-шник, и к нему
прoстым copy (или через Fstream), цепляется
какой нить файл, а при запуске последнего,
"хвостик" отделяется в отдельный нармальный файл.


Ответить.

Ответ 1:
В ресурс засовываешь все что надо, и в run-time можешь
его выташить в поток или в файл.
Ответ 2:


Вопрос 510:

От: corp

У меня к Вам просьба, помогите разобраться с проблемой!
Есть DLL написанная в то ли C++ Builder, то ли в Borland C++ 5.02
В описании сказано, что совместима со средствами разработки приложений
фирмы Borland.
У меня есть документация со списком экспортируемых функций из этой DLL.
Подключить я смогу эту библиотеку, но для меня проблема как можно
перевести (ведь нужно описать) эти функции в Delphi?
Извиняюсь за такой объем :(

Вот список экспортируемых функций DLL :
--
Подключиться к устройству.
BOOL CPSO_ConnectToHW();
Возвращаемое значение - FALSE, если были ошибки при открытии порта.
--
Установить параметры и подключиться к устройству.
BOOL CPSO_ConnectWithProp(LPCTSTR szPortName,
UINT HWType,
UINT ChCount,
UINT OutputChCount,
double dTiming,
UINT nSamplesToSkip = 0);
Возвращаемое значение FALSE, если были ошибки при открытии порта.
szPortName Имя порта как строковая переменная
оканчивающаяся нулевым байтом (напр. "COM1", "COM2", и т.д.)
HWType Tип протокола устройства. Целое без знака. 0 -
тип L. 1 - тип A.
ChCount Количество входных каналов.
OutputChCount Количество выходных каналов.
dTiming Интервал времени между соседними выборками,
получаемыми из устройства.
nSamplesToSkip Количество выборок, опускаемых при программном
прореживании.
--
Отключиться от устройства.
void CPSO_DisconnectFromHW();
--
Преобразовать время из внутреннего формата в строковый как абсолютное
время.
void CPSO_FormatAbsTime(double TimeInSeconds,
LPTSTR sz);
TimeInSeconds Время в секундах, в формате как оно передается в
пользовательские функции приема данных и алгоритма управления.
sz Адрес буфера пользователя, куда будет помещена
строка в формате HH:MM:SS.FFFFF , где HH - часы, MM - минуты, SS -
секунды, FFFFF - дробная часть секунд. Строка оканчивается нулевым
байтом.
--
Преобразовать время из внутреннего формата в строковый как относительное
время.
void CPSO_FormatRelTime(double TimeInSeconds,
LPTSTR sz);
TimeInSeconds Время в секундах, в формате, как оно передается
в пользовательские функции приема данных и алгоритма управления.
sz Адрес буфера пользователя, куда будет помещена
строка в формате HH:MM:SS.FFFFF , где HH - часы, MM - минуты, SS -
секунды, FFFFF - дробная часть секунд. Строка оканчивается нулевым
байтом.
--
Включить/отключить выдачу сообщений об ошибках на зкран (в виде
MessageBox).
void CPSO_PopupErrorMessages(BOOL bDisplay);
bDisplay - если TRUE, то при возникновении ошибки обращения к порту
показывать сообщения и возвращать значение FALSE из функций интерфейса.
Если FALSE, то только сигнализировать возвращаемым значением переменной
типа BOOL.
--
Задать данные для вывода.
void CPSO_PutDataForWriting(signed short *WSampleBuffer);
WSampleBuffer Указатель на буфер, из которого будут
скопированы данные для вывода. Хотя в данный момент число каналов на
вывод ограничено 8-ю, воизбежание проблем совместимости с будущими
версиями следует выделять буфер размером 64 шестнадцатиразрядных слов.
--
Задать функцию алгоритма автоматического управления
void CPSO_SetUpACLoopProc(LPVOID pACLoopProc);
pACLoopProc Указатель на функцию пользователя, в которой
выходное воздействие определяется как результат операции над входными
данными.
Функция пользователя должна быть определена как:
BOOL ACLoopProc(double dInputTime,
unsigned short * InputCodeSample,
signed short * OutputCodeSample);
где:
Возвращаемое значение Следует устанавливать TRUE. Устанавливайте
FALSE, если хотите сэкономить процессорное время, в случаях когда данные
реально не изменились с момента последнего обращения.
dInputTime Время на момент приема текущей выборки.
InputCodeSample Адрес массива, из которого могут быть прочитаны
последние принятые данные.
OutputCodeSample Адрес массива, в который необходимо поместить
данные для вывода.
Примечание: Длина обоих массивов равна 64
шестнадцатиразрядных слов. Решение о том, с какими элементами следует
работать, принимается иходя из заданного числа каналов. См.
CPSO_SetHWProp и CPSO_ConnectWithProp . (Внимание!! Не следует хранить
адреса этих массивов и ссылаться на них после завершения функции!)
--
Установить параметры.
void CPSO_SetHWProp(LPCTSTR szPortName,
UINT HWType,
UINT ChCount,
UINT OutputChCount,
double dTiming,
UINT nSamplesToSkip = 0);
szPortName Имя порта как строковая переменная
оканчивающаяся нулевым байтом (напр. "COM1", "COM2", и т.д.)
HWType Tип протокола устройства. Целое без знака. 0 -
тип L. 1 - тип A.
ChCount Количество входных каналов.
OutputChCount Количество выходных каналов.
dTiming Интервал времени между соседними выборками,
получаемыми из устройства.
nSamplesToSkip Количество выборок, опускаемых при программном
прореживании.
--
Задать функцию, принимающую данные.
void CPSO_SetUpReceiverProc(LPVOID pReceiverProc);
pReceiverProc Указатель на функцию пользователя, в которой
принятые данные будут передаваться для последующей обработки.
Функция пользователя должна быть определена как:
BOOL ReceiverProc(double dInputTime, unsigned short * InputCodeSample);
где:
Возвращаемое значение Обычно следует возвращать TRUE. Устанавливайте
FALSE, если пользовательская программа занята и не успевает обработать
текущую выборку. Передача этой выборки будет повторена.
dInputTime Время на момент приема текущей выборки.
InputCodeSample Адрес массива, из которого пользователь может
прочитать последние принятые данные. Длина массива равна 64
шестнадцатиразрядных слов. Однако действительны только первые его
элементы, столько, чему равно количество входных каналов.
--
Установить прореживание.
void CPSO_SetSkipping(UINT nSamplesToSkip);
nSamplesToSkip Количество выборок, опускаемых при программном
прореживании. Если 0, принимается каждая выборка (максимально подробный
режим сбора).
--
Установить текущий момент вренени как начальный.
void CPSO_SetStartTimeToCurrent();
Примечание: Начальный момент времени это начало отсчета
шкалы времени, относительно которого определяется момент прихода
очередной выборки. Данные этой выборки и информация о времени ее прихода
передаются в соответствующие пользовательские функции.


Ответить.

Ответ 1:
Неважно на каком языке написана библиотека, достаточно знать
объявления процедур. Подключение процедур производится через указание
директивы external:
function CPSO_ConnectToHW:BOOL; external 'Connect.DLL' name
'CPSO_ConnectToHW';
Таким образом Delphi-имя процедуры даже может не совпадать с её
экспортируемым именем. Типы аргументов можно использовать
сишные т.к. в Windows.pas они определены либо преобразовать в родные
Delphi-аналоги.
Ответ 2:
В "Королевстве Дельфи" http://delphi.vitpc.com/ в разделе "свитки"
есть статья "Основы работы с Windows API" Антона Григорьева. В ней
очень хорошо расписан эквивалент описаний С для Delphi. А дальше
разберешься.
Ответ 3:
Модуль с описаниями функций из DLL:

unit Unit1;

interface

uses windows;

const NameDLL='Здесь надо указать имя файла вашей библиотеки';

{ Подключиться к устройству.
BOOL CPSO_ConnectToHW();
Возвращаемое значение - FALSE, если были ошибки при открытии порта.}
function CPSO_ConnectToHW(): boolean;
external NameDLL name 'CPSO_ConnectToHW';

{ Установить параметры и подключиться к устройству.
BOOL CPSO_ConnectWithProp(LPCTSTR szPortName,
UINT HWType,
UINT ChCount,
UINT OutputChCount,
double dTiming,
UINT nSamplesToSkip = 0);
Возвращаемое значение FALSE, если были ошибки при открытии порта.
szPortName Имя порта как строковая переменная
оканчивающаяся нулевым байтом (напр. "COM1", "COM2", и т.д.)
HWType Tип протокола устройства. Целое без знака. 0 -
тип L. 1 - тип A.
ChCount Количество входных каналов.
OutputChCount Количество выходных каналов.
dTiming Интервал времени между соседними выборками,
получаемыми из устройства.
nSamplesToSkip Количество выборок, опускаемых при программном
прореживании. }

function CPSO_ConnectWithProp(szPortName: PChar;
HWType: UINT;
ChCount: UINT;
OutputChCount: UINT;
dTiming: double;
nSamplesToSkip: UINT=0): boolean; cdecl;
external NameDLL name 'CPSO_ConnectWithProp';

{ Отключиться от устройства.
void CPSO_DisconnectFromHW(); }

procedure CPSO_DisconnectFromHW;
external NameDLL name 'CPSO_DisconnectFromHW';

{ Преобразовать время из внутреннего формата в строковый как абсолютное
время.
void CPSO_FormatAbsTime(double TimeInSeconds,
LPTSTR sz);
TimeInSeconds Время в секундах, в формате как оно передается в
пользовательские функции приема данных и алгоритма управления.
sz Адрес буфера пользователя, куда будет помещена
строка в формате HH:MM:SS.FFFFF , где HH - часы, MM - минуты, SS -
секунды, FFFFF - дробная часть секунд. Строка оканчивается нулевым
байтом. }

procedure CPSO_FormatAbsTime(TimeInSeconds: double; sz: PChar); cdecl;
external NameDLL name 'CPSO_FormatAbsTime';

{ Преобразовать время из внутреннего формата в строковый как относительное
время.
void CPSO_FormatRelTime(double TimeInSeconds,
LPTSTR sz);
TimeInSeconds Время в секундах, в формате, как оно передается
в пользовательские функции приема данных и алгоритма управления.
sz Адрес буфера пользователя, куда будет помещена
строка в формате HH:MM:SS.FFFFF , где HH - часы, MM - минуты, SS -
секунды, FFFFF - дробная часть секунд. Строка оканчивается нулевым байтом. }

procedure CPSO_FormatRelTime(TimeInSeconds: double; sz: PChar); cdecl;
external NameDLL name 'CPSO_FormatRelTime';

{ Включить/отключить выдачу сообщений об ошибках на зкран (в виде
MessageBox).
void CPSO_PopupErrorMessages(BOOL bDisplay);
bDisplay - если TRUE, то при возникновении ошибки обращения к порту
показывать сообщения и возвращать значение FALSE из функций интерфейса.
Если FALSE, то только сигнализировать возвращаемым значением переменной
типа BOOL. }

procedure CPSO_PopupErrorMessages(bDisplay: boolean); cdecl;
external NameDLL name 'CPSO_PopupErrorMessages';

{ Задать данные для вывода.
void CPSO_PutDataForWriting(signed short *WSampleBuffer);
WSampleBuffer Указатель на буфер, из которого будут
скопированы данные для вывода. Хотя в данный момент число каналов на
вывод ограничено 8-ю, воизбежание проблем совместимости с будущими
версиями следует выделять буфер размером 64 шестнадцатиразрядных слов. }

type TWSampleBuffer = array [0..63] of word;
procedure CPSO_PutDataForWriting(var WSampleBuffer: TWSampleBuffer); cdecl;
external NameDLL name 'CPSO_PutDataForWriting';

{ Задать функцию алгоритма автоматического управления
void CPSO_SetUpACLoopProc(LPVOID pACLoopProc);
pACLoopProc Указатель на функцию пользователя, в которой
выходное воздействие определяется как результат операции над входными
данными.
Функция пользователя должна быть определена как:
BOOL ACLoopProc(double dInputTime,
unsigned short * InputCodeSample,
signed short * OutputCodeSample);
где:
Возвращаемое значение Следует устанавливать TRUE. Устанавливайте
FALSE, если хотите сэкономить процессорное время, в случаях когда данные
реально не изменились с момента последнего обращения.
dInputTime Время на момент приема текущей выборки.
InputCodeSample Адрес массива, из которого могут быть прочитаны
последние принятые данные.
OutputCodeSample Адрес массива, в который необходимо поместить
данные для вывода.
Примечание: Длина обоих массивов равна 64
шестнадцатиразрядных слов. Решение о том, с какими элементами следует
работать, принимается иходя из заданного числа каналов. См.
CPSO_SetHWProp и CPSO_ConnectWithProp . (Внимание!! Не следует хранить
адреса этих массивов и ссылаться на них после завершения функции!) }

procedure CPSO_SetUpACLoopProc(var pACLoopProc: pointer); cdecl;
external NameDLL name 'CPSO_SetUpACLoopProc';

{ Установить параметры.
void CPSO_SetHWProp(LPCTSTR szPortName,
UINT HWType,
UINT ChCount,
UINT OutputChCount,
double dTiming,
UINT nSamplesToSkip = 0);
szPortName Имя порта как строковая переменная
оканчивающаяся нулевым байтом (напр. "COM1", "COM2", и т.д.)
HWType Tип протокола устройства. Целое без знака. 0 -
тип L. 1 - тип A.
ChCount Количество входных каналов.
OutputChCount Количество выходных каналов.
dTiming Интервал времени между соседними выборками,
получаемыми из устройства.
nSamplesToSkip Количество выборок, опускаемых при программном
прореживании. }

procedure CPSO_SetHWProp(szPortName: PChar;
HWType: UINT;
ChCount: UINT;
OutputChCount: UINT;
dTiming: double;
nSamplesToSkip: UINT = 0); cdecl;
external NameDLL name 'CPSO_SetHWProp';

{ Задать функцию, принимающую данные.
void CPSO_SetUpReceiverProc(LPVOID pReceiverProc);
pReceiverProc Указатель на функцию пользователя, в которой
принятые данные будут передаваться для последующей обработки.
Функция пользователя должна быть определена как:
BOOL ReceiverProc(double dInputTime, unsigned short * InputCodeSample);
где:
Возвращаемое значение Обычно следует возвращать TRUE. Устанавливайте
FALSE, если пользовательская программа занята и не успевает обработать
текущую выборку. Передача этой выборки будет повторена.
dInputTime Время на момент приема текущей выборки.
InputCodeSample Адрес массива, из которого пользователь может
прочитать последние принятые данные. Длина массива равна 64
шестнадцатиразрядных слов. Однако действительны только первые его
элементы, столько, чему равно количество входных каналов. }

procedure CPSO_SetUpReceiverProc(var pReceiverProc: pointer); cdecl;
external NameDLL name 'CPSO_SetUpReceiverProc';

{ Установить прореживание.
void CPSO_SetSkipping(UINT nSamplesToSkip);
nSamplesToSkip Количество выборок, опускаемых при программном
прореживании. Если 0, принимается каждая выборка (максимально подробный
режим сбора). }

procedure CPSO_SetSkipping(nSamplesToSkip: UINT); cdecl;
external NameDLL name 'CPSO_SetSkipping';

{ Установить текущий момент вренени как начальный.
void CPSO_SetStartTimeToCurrent();
Примечание: Начальный момент времени это начало отсчета
шкалы времени, относительно которого определяется момент прихода
очередной выборки. Данные этой выборки и информация о времени ее прихода
передаются в соответствующие пользовательские функции. }

procedure CPSO_SetStartTimeToCurrent; cdecl;
external NameDLL name 'CPSO_SetStartTimeToCurrent';
implementation

end.


Вопрос 511:

От: nErv

Может наглая просьба, но ни у кого нет исходника игры
"крестики-нолики" на Делфи? Мне просто хочется разобраться на примере
с некоторыми функциями...


Ответить.

Ответ 1:
Лучше скачай исходники к книге Delphi 5 Developers Guide
http://www.williamspublishing.com/archive/5-8459-0066-2/source.exe


Вопрос 512:

От: ILYA


Как сделать так, что бы картинка, которая отображается в
Image уменьшалась до нужного размера ?


Ответить.

Ответ 1:
Уменьшаешь сам image, свойство Stratch ставишь в true
Ответ 2:
Установите свойство Image.Stretch , а для растяжки-сжатия изображения вызовите Image.Canvas.StretchDraw(R, TGraphic(Image.Picture)), установив
нужные размеры в полях параметра R.
Ответ 3:
Изменяешь TImage и включаешь Stretch
var BitMap:TBitMap;
BitMap.LoadFromFile('filename');
with Image1 do
begin
Height:=высота;
Width:=ширина;
// При желании можно поменять позицию компонента
Left:=x;
Top:=y;
// Собственно говоришь Дельфи, чтобы он её отобразил в меньшем размере
Strecth:=True;
end;


Вопрос 513:

От: MyPortal Inc.

Очень нужна помощь. Не работает следующая процедура:


function GetInetFile(const fileURL, FileName : String) : boolean;
const BufferSize = 1024;
var hSession, hURL : hInternet;
Buffer : array[1..BufferSize] of Byte;
BufferLen : DWORD;
f : file;
sAppName : string;
begin
Result:=False;
sAppName:=ExtractFileName(Application.ExeName);

hSession:=InternetOpen(PChar(sAppName),INTERNET_OPEN_TYPE_PRECONFIG,
nil,nil,0);
try
hURL:=InternetOpenURL(hSession,
Pchar(fileURL),nil,0,0,0);
try
AssignFile(f,FileName);
Rewrite(f,1);
repeat
InternetReadFile(hURL, @Buffer,
SizeOf(Buffer),BufferLen);
BlockWrite(f,Buffer,BufferLen)
until BufferLen = 0;
CloseFile(f);
Result:=True;
finally
InternetCloseHandle(hURL)
end
finally
InternetCloseHandle(hSession)
end
end;



Ответить.

Ответ 1:


Вопрос 514:

От: Danil

Куда в проект можно запихнуть иконки, чтобы можно
было обратиться ним, например,
так "icon=delphi_project.exe,2"
пример: explorer.exe - и прога (не просто dll с иконками),
и иконки
содержит (я, конечно, понимаю, что explorer - не на Delphi)


Ответить.

Ответ 1:
Запихнуть естественно в ресурсы, куда же еще? Для подготовки ресурса
можно использовать Image Editor из комплекта поставки Delphi.
Ответ 2:
Чтобы добавить иконки в exe-шник, тебе необходим хороший редактор
ресурсов, например eXescope, Restoractor или Borland Rеsource WorkShop
(Resource Eхplorer не подходит). Там в секции Icons и добавляешь иконки.
Правда не все проги потом работают... :(
Ответ 3:
Компонент TImageList

пример ImageList1.GetIcon(1,Form1.Icon)
Ответ 4:
У тебя в файле проекта (.DPR) наверняка стоит строка {$R *.RES}, это
значит, что в экзешник вставяться все .RES файлы в директории проекта.
Создай новый файл ресурсов (например, с помощью Borland Resource
Workshop) и кинь его в директорию проекта

Пример:

файл icons.rc

//-------Cut here-------
ICON_1 ICON "res/mainico/mainicon.ico"
ICON_2 ICON "res/mainico/005800.ico"
ICON_3 ICON "res/mainico/102449.ico"
//-------Cut here-------

первое слово - имя ресурса
второе - тип ресурса
третье - путь к файлу

запусти команду

brcc32.exe icons.rc

(файл brcc32.exe должен быть в поставке Resource Workshop, если нигде
не найдешь пиши на delphi@australia.edu - вышлю ~70Kb)

После этого появится файл icons.res, его и кинь в директорию проекта



Вопрос 515:

От: Danil

как передать сообщение WinAMP"у?
Понятно, что через sendmessage, а как получить handle окна
и какие там
параметры? (например, клавишу V aka стоп).


Ответить.

Ответ 1:
Для этого нужно использовать функцию hwnd_winamp := FindWindow("Winamp v1.x", nil); (1.x -- это для совместимости)

На моем сайте http://theosoft.virtualave.net в разделе "Скачать" лежат
исходники готового плагина к WinAmp'y, откуда
можно черпнуть дополнительной информации, а также использовать модуль WinAmp.pas,
в котором описаны ВСЕ
команды WinAmp'a, их параметры и примеры использования .
Ответ 2:
Handle Winampa версии 2.XX ищется следующей строкой:
PrgHnd:=FindWindow('Winamp v1.x',nil);

Насчет 3-ей версии не знаю, не проверял.







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

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

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

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

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



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

В избранное