Добрый день !!! Меня зовут Эрвин, я студент второго курса. У меня была курсовая по написанию компоненты для Delphi. Я её написал, но мне хотелось бы автоматизировать установку этой компоненты и чтобы когда нажимали на F1 открывался мой help.Как этого можно добиться? Помогите пожалуйста. Заранее благодарю.
Доброе время суток, Ervin! Ну ты можешь, например, взять любой инсталлятор и устанавливать на другой компьютер компонент с его помощью. Вот где регистритуются компоненты я не нашел, можкт где в реестре или в каком-нибудь файле палитры Билдера(Дельф). Ну зарегистрировать компонент в палитре не составляет труда, просто выбираешь из меню Components пункт Install Packages, и устнавливаешь с помощью диалога свой пакадж в Билдер(Дельфи). Я тебе написал для 5-й версии Билдера. Правда в Дельфах этот пункт может нахзодится в другом месте и называться подургому, но я не думаю чтоб Борланд сали менять чтото в одинаковых версиях Билдера и Дельф. А вот имплементацию F1 тебе нада сделать самому, то есть просто создаешь свой файл хелпа для своего компонента или группы компонент, а затем вызывашь программу OpenHelp и с помощью ее добавь свой нелп в файл содержащий инфу о всех хелпах. Ответ отправлен: 13.10.2002, 15:03 Отправитель: Pablo
Вопрос № 216
Добрый час! Не могу разобраться, как в Delphi использовать функции WinAPI. Конкретно, мне надо выполнить, например, функцию IOCTL_DISK_GET_DRIVE_LAYOUT - информация о разделах жёсткого диска, но я не могу разобраться, что за главная функция DeviceIoControl и как её использовать. Вроде бы нужно создать дескриптор(Handle) жёсткого диска с помощью функции CreateFile, но не получается. Ведь язык WinAPI - это язык Си, а тут - Object Pascal. Как описать переменные, как выполнить эти функции, чтобы получить нужную мне информацию. Я об этом пока ничего не знаю, поэтому извиняйте, если что не так сказал. Можно просто пример, я сам разберусь, просто не хватает знаний :) Спасибо!
Приветствую Вас, undying! Все очень просто(хм...кажется это становится моей коронной фразой). То, что WinAPI представляет из себя сишный код не должно смущать!!! Помни (для истории), что винда сначала была написана на паскале. Некоторые конструкции сохраняют паскалевские вызовы. И все функции WinAPI могут быть вызваны в Паскале - это проще пареной репы. Теперь к делу: то, что тебе надо сделать описано ниже: function GetDriveGeometry(^DrGeom: DISK_GEOMETRY): Boolean; var hDevice: HANDLE; //дескриптор устройства bResult: Boolean; nBytes : DWORD; //количество возвращенных байт begin //Получаем дескриптор устройства //не нужно удивляться методу, просто следи за параметрами //вместо Х в слове PhysicalDrive пиши номер устройства hDevice := CreateFile('\\.\PhysicalDriveX', //открываемое устройство 0, //если не надо
читать/писать физически на диск FILE_SHARE_READ | FILE_SHARE_WRITE, //разделить диск с другими процессами 0, //атрибуты безопасности по умолчанию OPEN_EXISTING, //только этот флаг! не пытайся использовать иные значения 0, //атрибуты файла 0); //не копировать аттрибуты файла //теперь важно корректно проверить наличие дескриптора //ЗАПОМНИ: CreateFile никогда nil или 0 не возвращает!!!! Это ошибка и довольно распространенная //получаем INVALID_HADNLE_VALUE, если дескриптора нет if (hDevice = INVALID_HANDLE_VALUE) then return False; //теперь получаем то, что нас интересует bResult := DeviceIonControl(hDevice, //дескриптор диска IOCTL_DISK_GET_DRIVE_GEOMETRY, //или твоя константа 0, 0, //нет входящего буфера, значит здесь нули DrGeom, sizeof(DrGeom^), //выходящий буфер junk, //колличество байт возвращенных LPOVERLAPPED(nil)); //синхронный
ввод-вывод //если ничего не получилось if (not bResult) then return False; //Закроем дескриптор диска CloseHandle(hDevice); //и выходим return True; end; теперь вызов этой функции где-то (в карибском море :)) ): .............Твой код......... var pdg: DISK_GEOMETRY; bResult: Boolean; DiskSize: ULONGLONG //это 64-битное беззнаковое..замени на эквивалент в Паскале...я просто не помню или его и юзай - это встроенный тип винды begin //вызываем нашу функцию bResult = GetDriveGeometry(@pdg);
а дальше если bResult = true, берешь pdg и вытаскиеваешь нужные тебе поля. Напомню, если ты хочешь получить сведения о разделах диска, тогда вместо DISK_GEOMETRY юзай PARTITION_INFORMATION....все, как ты видишь, действительно крайне просто. Да, сорьки, если где напутал со знаками указателя :) (я сишник...а на Паскале когда-то писал, но
забыл многое). Пиши, коли будут вопросы на jadd@rol.ru Ответ отправлен: 11.10.2002, 14:28 Отправитель: Jadd Отвечает Артём Шегеда
Добрый день, undying!
Глупости говоришь... Но это от непонимания, а если поймёшь - сам смеяться будешь тому, что написал. 1. WinAPI (Windows Application Programming Interface) - это интерфейс приложений, то есть набор функций, типов данных, переменных, классов (ООП), необходимых для решения прикладной задачи. А то, на каком языке это реализовано, и то, на каком языке ты будешь писать, - не имеет значения. 2. При написании приложений для Win32 необходимо придерживаться строгих правил, регламентированных документацией. Одно из таких правил - передача параметров в функцию и управление стеком STDCALL. В Pascal это записывается так:
3. IOCTL_DISK_GET_DRIVE_LAYOUT - не функция, а константа, которая передаётся функции DeviceIoControlю А вот то, что делает сама функция - нам не важно, важен Результат. 3. А простой пример - функция MessageBox. Дёшево и сердито. Можешь отрабатывать кое-что на ней.
Здравствуйте, undying! ===== Pro bono publico, no bloody panico! ===== Если немного знаешь английский проблем возникнуть не должно... Для примера: читаем что наша функция возвращает хэндл, тогда возьмем его у нее - h:=CreateFile('C: est.txt', GENERIC_WRITE, 0, nil, OPEN_ALWAYS, FILE_ATTRIBUTE_TEMPORARY, 0); (где h:HFILE, так как нужен хэндл файла), обрати внимание на аттрибут FILE_ATTRIBUTE_TEMPORARY и на то, что файл следует снести по окончании работы, а хэндл закрыть (CluseHandle(h)), тольео не сразу ;). Далее: подсовываем полученный хэндл функции DeviceIoControl. Примечание: при переводе функции опирайся на указанные в References типы переменных, т.е. сказано HANDLE hDevice - суем ей хэндл, сказано DWORD dwIoControlCode - выбираем из предложенных ниже кодов, сказано LPVOID lpInBuffer - объявляем и даем указатель, сказано DWORD nInBufferSize -
измеряем size of [объявленный буфер], и т.д. Думаю алгоритм перевода функций понятен... Не забудь :) в интерфейсной секции в uses указывать модуль ShellAPI/ShlObj/ShellCtrls или другой используемый... Можешь зяглянуть на http://www.winnt.rsm.org.ru там есть материалы по АПИ (в т.ч. перевод функций на ООПаскаль). Ответ отправлен: 11.10.2002, 01:14 Отправитель: Idle Sign
Вопрос № 217
Всем привет... Я пишу приложение для работы с Internet На Delphi. Использую WinInet . Есть и полное его описание (214 страниц в Ворде!), но все на английском и не везде понятно... В общем, вопросы. Как передать данные из элемента TextArea html-формы? Я прочитал в книжке, что эти данные передаются уже не через строку URL (которая имеет ограниченную длину), а другим способом. Каким? Подскажите функцию. В какой компонент можно выводить и форматированный текст, и картинки? Если обобщенно, то надо что-то типа отображения html-документа, но в собственном оформлении (то есть не просто компонент, которму скармливаешь текст, а он его форматирует по разметке, а собственный анализатор). Можно ли и как вставлять, например, картинки в RichEdit? А если мне надо вставить анимированный gif? Вроде пока все... Спасибо...
Здравствуйте, baldr! Ты первый свой вопрос уточни, куда ты собрался передавать текст из TextArea html-формы? Для разметки и форматирования долкумента можно кончено исполдьзовать TRichEdit, но у него довольно много недостатков, по поводу форматирования. Можно также использовать IWebBrowser. Или тебе вообще самому нада заново писать компонент для обработки HTML, хотя впрочем бровсера Mozilla имеет открытые исходники, точно не помню, сходи на их сайт и посмотри там по этому поводу. Ответ отправлен: 13.10.2002, 14:46 Отправитель: Pablo Отвечает Артём Шегеда
Здравствуйте, baldr!
1. Это лучше спросить у тех, кто с инетом работает. Но знаю, что данные формы могут передаваться Web-серверу методами PUT(через дополнительные параметры в запросе), GET(через строку адреса) и SEND(по e-mail). 2. Боюсь, тебе придётся использовать какой-нибудь HTML-визуализатор, например >HTMLlite. Эта компонента может очень многое, в том числе обработку данных форм. К недостаткам можно отнести отсутствие поддержки скриптов (Java или VB). Я использую её в своих программах на полную катушку. Уже есть версия для CBuilder. А у RichEdit много своих заморочек, с которыми замучаешься бороться. Да и размеры конечного документа, содержащего не ASCII-коды, оставляют желать лучшего.
Ответ отправлен: 12.10.2002, 16:43 Отправитель: Артём Шегеда
Форма отправки вопроса
Внимание!
Форма может работать некорректно в почтовых программах "Microsoft Outlook"
и "Microsoft Outlook Express". В программе The Bat!
подобные формы не работают вообще!
После нажатия на кнопку "Отправить", будет открыто второе окно. Заметьте,
что в некоторых браузерах могут стоять запреты на открытие других
окон, а также "чрезмерное" кэширование данных,
при этом факт отправки Вашего вопроса стоит под сомнением.
Мы рекомендуем открывать рассылку в программе Internet
Explorer 5.0+ или отправлять вопросы с сайта по адресу:
http://rusfaq.ru/cgi-bin/Message.cgi.