title
Total Commander
 



Total Commander

Листер плагин на Borland Delphi 7 для начинающих

Автор: Evgeniy Savich

Не боги горшки обжигают…

Наверное, данная статья является не учебным пособием, а попыткой обобщить опыт, полученный автором в процессе разработки плагина xBaseView на Delphi 7, когда пришлось столкнуться с про-блемами, довольно неприятными программисту, привыкшему мощной поддержке VCL среды.

Задача: создать плагин для просмотра RTF файлов.

Воспользуемся пунктами меню "File/New/Other" и в окне New Items выбираем значок DLL Wizard и сохраняем проект под именем ListSimple в отдельной папке, т.е. плагин является DLL библиотекой. Через пункты меню "Project/Options" откроем диалоговое окно и в поле Target file extension введем расширение имени плагина: WLX.

В разделе USES DPR файла модуль Classes изменяем на модуль Windows.

Плагин должен экспортировать из библиотеки три функции:

ListGetDetectString,
ListLoad,
ListCloseWindow.

Их тексты находятся в файле ListSimple.dpr.

ListGetDetectString должна записать в параметр DetectString строку, которая содержит RTF.

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

ListerWin - дескриптор окна Листера;
FileToLoad - полное имя RTF файла.

Плагин должен создать свое окно в качестве дочерней по отношению к окну Листера и вернуть дескриптор этого окна. Эту инициализацию мы будем осуществлять в функции ShowRTF:

function ShowRTF(ListerWin: HWND; FileToLoad: string): HWND;

ListCloseWindow требует от плагина завершения работы, передавая дескриптор окна плагина. Это освобождение ресурсов мы будем делать в процедуре HideRTF:

procedure HideRTF(PluginWin: HWND);

Надо добавить в проект форму, изменить ее имя на fmMain и сохранить модуль формы под именем unMain.pas. Эта форма и есть окно плагина.

В модуле unMain можно удалить бесполезную глобальную переменную:

var fmMain: TfmMain;

Замечание: ПЛАГИН НЕ ДОЛЖЕН ИСПОЛЬЗОВАТЬ ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ!

Бросив на форму компонент RichEdit, надо установить ему такие свойства:

Align = alClient,
ReadOnly = True,
ScrollBars = ssBoth.

Объект RichEdit1 обеспечивает всю работу с RTF файлом.

В плагинах часто используется контекстное меню, поэтому надо бросить на форму компонент PopupMenu и создать два пункта меню Help и About, назначив им клавиши F1 и F2, соответственно. Необходимо прикрепить контекстное меню объекту RichEdit1, установив свойство RichEdit1:
PopupMenu = PopupMenu1.

Окно плагина является дочерним, следовательно, оно не должно иметь рамку и заголовок. Для этого надо переопределить виртуальный метод CreateParams базового класса TCustomForm. Здесь, мы кроме настройки стилей окна:

Params.Style := WS_CHILD or WS_MAXIMIZE and not WS_CAPTION and not WS_BORDER;

зарезервируем память для хранения указателя на нашу форму:

Params.WindowClass.cbWndExtra := SizeOf(Pointer);

Указатель нужен процедуре HideRTF для корректного закрытия плагина. В функции ShowRTF мы сохраняем указатель в WinAPI структуре окна плагина следующим вызовом:

SetWindowLong(fmMain.Handle, GWL_USERDATA, Integer(p));

Позднее мы вытащим указатель из структуры, используя дескриптор нашего окна, который является параметром HideRTF, вызывая функцию GetWindowLong:

p := Pointer(GetWindowLong(PluginWin, GWL_USERDATA));

Для работы плагина нам понадобятся следующие данные: дескрипторы окон Тотал Командира и Листера, и режим работы плагина: в обычном окне или на одной из двух панелей Тотал Командира (так называемый Quick View - режим быстрого просмотра). Дескрипторы нужны, чтобы избежать краха по клавишам выхода Alt+X и для реагирования на быстрые клавиши Листера. Эти данные будем хранить, соответственно, в переменных TotCmdWin, ParentWin и QuickView.

Напишем нестандартный конструктор CreateParented для инициализации этих трех переменных формы и для загрузки RTF файла в наше окно (в RichEdit1). Достаточно иметь два параметра конст-руктора: ParentWindow - дескриптор окна Листера и FileToView - имя RTF файла. Дескриптор окна Тотал Командира мы можем найти по имени класса этого окна (это не VCL класс!) с помощью WinAPI функции FindWindow.

Однако, тут самое главное то, что этот конструктор перекрывает и вызывает конструктор CreateParented базового класса TWinControl, чтобы создать наше окно в качестве дочернего. Таким образом, инициализационная функция ShowRTF может создать наше окно простым вызовом не-стандартного конструктора CreateParented.

Немного теорий. Особенностью библиотеки визуальных компонентов Borland VCL является ис-пользование глобального объекта "приложение" - Application. Этот Application имеет скрытое окно, которое должно быть владельцем всех окон приложения, что обеспечивает корректное поведение всех окон программы. И DLL библиотека плагина, и исполняемый EXE файл Тотал Командира имеют собственный глобальный объект Application, следовательно, требуется их синхронизация. Для этого надо присвоить дескриптор скрытого окна объекта Application исполняемого файла к дескриптору объекта Application библиотеки. К сожалению, Тотал Командир, хотя он написан на Delphi и использует все удобства и прелести VCL, не передает нам дескриптор данного скрытого окна. (Может причиной этого является проблема версии компиляторов Delphi?). За неимением оно-го, вместо него будем использовать для синхронизации дескриптор окна Листера, в противном слу-чае, наше модальное окно (например, окно About) поведет себя неестественно, оно появится на панели задач Windows. Эта синхронизация является задачей для функции ShowRTF.

Чтобы защитить, Тотал Командир от сбоев плагина, будем использовать событие OnException объ-екта Application, которое перехватывает необработанное исключение. Кинем на форму компонент ApplicationEvents, переименуем его на App и создаем обработчик события OnException, куда введем вызов функции MessageBox для выдачи сообщения о сбое. Сохранив проект и модуль, можно уда-лить из формы ненужный компонент ApplicationEvents. Установка адреса обработчика события в Application.OnException также является задачей для функции ShowRTF.

Все готово для ShowRTF? Увы, "маленькая неточность" в Plugin API Тотал Командира (включая v.6.02) значительно усложняет нашу работу:

Если пользователь откроет окно плагина, затем переключится на Тотал Командир и закроет Тотал Командир, то мы не получим вызов через ListCloseWindow для завершения своей работы. Вместо этого Тотал Командир или Листер (кто его знает?) уничтожает наше окно вызовом WinAPI функции DestroyWindow, а потом, то же самое попытается сделать наш объект Application, в конечном счете плагин вылетает с нарушением защиты памяти (Access Violation)!

Если мы не будем делать вышеописанную синхронизацию, этой проблемы удалось бы избежать. Что ж, будем расплачиваться за это и поставим ловушку для перехвата сообщений, которое получа-ет наше же окно, подобно змее, которая пожирает себя за свой собственный хвост! Не будем вда-ваться в подробности Windows API (кому же он нравиться?), вкратце суть дела такова.

Объявляем тип записи TPlugInfo, где будем хранить данные, которые нужны для закрытия плагина. При инициализации выделяем память под эту запись и заполняем ее. Определяем функцию HookDestroy, который будет перехватывать оконные сообщения, чтобы среагировать на сообщение WM_DESTROY (уничтожение окна). Вызовом SetWindowLong(…, GWL_WNDPROC, …) подменя-ем стандартный обработчик оконных сообщений на функцию HookDestroy. Похожим вызовом SetWindowLong в процедуре завершения HideRTF обратно восстанавливаем прежний обработчик. Важно то, что когда функция HookDestroy поймает сообщение WM_DESTROY, она вызывает про-цедуру завершения HideRTF точно так же, как это делает процедура ListCloseWindow. В результате мы всегда успеваем нормально закрыть окно и убрать за собой, что, к примеру демонстрирует Dispose(p) из HideRTF, освобождая память, выделенную в ShowRTF.

Остается создать диалоговую форму About, обработчики контекстного меню и обработчик RichEdit1KeyDown, который ловит нажатие специальных клавиш и передает их с помощью PostMessage в соответствующее окно. Если здесь не перехватывать клавиши Alt+X, это приведет к краху плагина. Причем, здесь придется удерживать фокус ввода в RichEdit1, проверяя режим рабо-ты плагина, т.е. значение переменной QuickView.

Об отладке и тестировании плагина.

Листер имеет встроенную возможность просмотра RTF файлов, поэтому перед запуском плагина надо отключить ее, сняв пометку у флага RTF в окне Configure Lister.

Чтобы использовать интегрированный отладчик IDE Delphi, закройте Total Commander, а в Delphi через меню "Run/Parameters" откройте диалог и в поле Host Application введите путь к Total Com-mander с помощью кнопки [Browse]. Теперь можно запускать плагин из-под Delphi.

Ссылка для скачивания архива с примером здесь

PS. Уважаемый Читатель! Программирование - многовариантно и я никак не претендую на абсо-лютную истину. В качестве дополнительного материала, предлагаю Вам ознакомиться с исходными текстами плагина xBaseView - "Просмотр DBF, DB, MDB, ADO и ODBC баз данных", который предоставляется с исходными текстами, и где применяется аналогичный подход.

PPS. Прошу Читателя-Полиглота помочь мне перевести статью на английский язык, чтобы послать ее Кристиану Гислеру, автору знаменитого файл менеджера Тотал Командир, с призрачной надеж-дой, что он предпримет какие-то шаги навстречу нам - VCL программистам.

Е. Савич
19.03.04
© Mutex Ltd.
mutex@nm.ru

Комментарии пользователей

AdrianSmimi
Листер плагин на Borland Delphi 7 для начинающих 11.05.2021 - 02:19
Гарантия На Работу До 3х Лет. Консультация По Фото. Работаем Больше 19 Лет.
Многим кажется, что замена личинки замка входной двери — трудный и особенный процесс, с которым справится лишь специалист, но на самом деле любой человек может совершить эту операцию самостоятельно в домашних условиях. По этой причине, знания о том, как сменить личинку, является очень полезным. Так что в следующий раз не придется ждать ремонтников, которые будут устранять проблему, а можно будет приняться за работу над замком самостоятельно. Главное, чтобы была повреждена не вся конструкция, а замены потребовала лишь сердцевина, с которой человеку и нужно будет работать. Часто бывает так, что замок ломается в самые неподходящий момент, а уйти и оставить дверь открытой просто нельзя, ведь тогда все материальный ценности окажутся в свободном доступе третьим лицам. Ключ может не проворачиваться или наоборот, проходить и не запускать запорный механизм. В любом из этих случаев, неработоспособность вызывается из-за повреждения цилиндра дверного замка. Из-за вышеописанных причин возникает проблема с замком металлической двери, которую нужно решать методом замены секретки, в противном случае придется приобретать новый механизм. Если совершить замену самостоятельно, то не придется платить за новый замок, переделывать разъемы для нового средства защиты. К тому же, оплачивать работу специалиста также не нужно. Но чтобы исправить некоторые системы, придется серьезно поработать, хотя большинство не так сложны в работе. Замена личинки замка двери будет зависеть от того, над каким замком металлической двери, с которым придется работать. Все, кроме шестеренки, подходят для разбора в домашних условиях. Шестеренка сложна из-за своей конструкции, которую обычный человек не сможет собрать обратно, если только ему не повезет. Самое главное — размер, чтобы по габаритам она была идентична той, которая сломалась. Лучше всего принести оригинальную личинку в магазин, но если такой возможности нет, то можно снять замеры цилиндра. По ним уже продавец сможет подсказать подходящий вариант. Также не стоит забывать и про производителя замка для входной металлической двери, ведь если это распространенный бренд, то, скорее всего, в магазине будет деталь, идеально подходящая к замку. Если же покупателю важна гармоничность, то нужно обратить внимание и на цветовую гамму, чтобы она могла сочетаться с остальной металлической дверью. Также стоит приобретать личинку, если у вас сломался сувальдный замок. Стоит выбирать личинки средней ценовой категории и выше. Дело в том, что дешевые аналоги не будут долгосрочным приобретением. Кроме этого, из-за стоимости материала, из которых они сделаны, их достаточно легко взломать. Лучше перестраховаться и приобрести тот вид цилиндра, который будет подороже. Лучше всего рассмотреть эту операцию на примере цилиндрового дверного замка, который является самым распространенным. Итак, все начинается со снятия железной личинки с металлической двери. Плюсы цилиндрового вида заключаются также и в том, что для проведения этой операции не придется полностью снимать замок. Все что нужно — открутить шуруп в торце замка металлической двери. Далее нужно нажать на цилиндр, после чего полностью вытащить. Новая личинка должна быть полностью идентичной по размерам с оригинальной частью. В противном случае операция будет проведена не корректно. Новая деталь помещается на место старой личинки. На нее также нужно надавить, после чего закрепить с помощью винта. Процесс полностью обратный извлечению. Последний этап — тест работы. Если все хорошо, то работать замок будет как новый. Самый близкий вид замков по способу замены личинки — штифтовые. Здесь процесс полностью идентичен, лишь за исключением некоторых деталей, усложняющих само извлечение. А вот крестообразный и дисковый виды замков лучше всего просто сменить. Их ремонт может затребовать куда больше сил и энергии, чем это того стоит. Со специальными замками вообще лучше не связываться, из-за сложности механизма, неподготовленный человек просто заблудится во всем множестве вариантов действий. К тому же, каждый из них индивидуален, ведь стоит больших денег. Так что операция по замене цилиндра не так уж и сложна, все что нужно — терпение, а также следовать инструкции, дабы качественно его поменять. На сегодняшний день врезные и накладные цилиндрические замки, плотно вошли в нашу повседневную жизнь. Такие замки можно встретить практически везде — во входных дверях наших домов, квартир и офисов, в межкомнатных дверях. Причем такие замки устанавливаются на деревянных, металлических дверях, так и в металлопластиковых. То есть везде. Именно поэтому вопрос ремонта замка, в частности замены сердечника замка или личинки, актуален и важен в наше время. Главная отличительная особенность замка с личинкой в том, что при поломке такого замка достаточно заменить только его часть — личинку и при этом, не менять весь замок. Поменяв личинку также меняется и набор ключей, открывающих данный замок. Именно поэтому цилиндрические замки применяют для повышения надежности и секретности всех типов дверей. В наше время замена личинки замка возникает довольно часто. Например: при потере либо краже одного или нескольких ключей, при затруднениях в открытии замка ключом не проворачивается, трудно проворачивается, заклинивает , при прокручивании ключа в замке без открытия двери, при переезде или покупке новой квартиры, офиса, когда нужно поменять набор ключей открывающих дверь. В подобных ситуациях требуется замена личинки входного замка. Личинку можно поменять на всех типах цилиндрового врезного замка тело замка скрыто в дверном полотне и на некоторых накладных замках тело замка прикреплено на дверь с внутренней стороны. Определить можно ли поменять личинку в замке достаточно просто. Для этого нужно взглянуть на ключ к нему. Если ключ плоский с вырезами и насечками, полукруглый с надпилами, крестообразный — то замена личинки возможна. Если же ключ круглый с двумя лопастями с насечками — то в этом случае замена личинки невозможна. Замки с ключами такго типа называют сувадальными. Ели замок врезной то, необходимо осмотреть торец двери, металлическую планку где выдвигаются запорные язычки. У замков со сменной личинкой под запорными язычками можно увидеть головку винта для крестообразной отвертки, реже под плоскую. Это винт крепления личинки. Если такой винт есть, то личинку можно поменять. Если замок накладной то, чаще всего личинку заменить можно только вместе с замком. Однако на некоторых типах накладных замков замена только личинки возможна. Это такие замки как ШО очень популярный в 90 годы. Понять точно можно только сняв замок с двери. В накладном замке, возможным вариантом является замена всего замка, либо установка вместо него врезного цилиндрического замка с личинкой. Может оказаться, что в замке не предусмотрена замена личинки. Такое бывает с замками других типов, без сменной личинки. Это может быть как врезной, так и накладной замок. В этом случае альтернативным решением является полная переустановка замка. В цилиндрическом врезном замке актуально устанавливать сложные личинки ввиду их надежности и взломоустойчивости. Также возможно установить личинку типа ключ-вертушка, для удобства пользования замком. Порядок замены аналогичный замку с ручками, только в этом замке ручки снимать не требуется, начинать нужно прямо с личинки. Если личинку нельзя заменить или не возможно снять, то меняют весь замок. Этот вариант также можно использовать если не удается найти новую личинку на замену старой. После того как все работы по замене личинки выполнены следует проверить работоспособность замка при открытой двери! Работает ли ручка замка, открывается ли замок с внутренней стороны и ключом с внешней? Только окончательно убедившись в работоспособности замка при открытой двери, можно проверить его при закрытой двери! При этом замок свободно и легко отпирается и запирается, запорные язычки легко ходят в своих пазах, замок работает без посторонних звуков, ключ легко вставляется и вынимается. Ответ: личинку можно приобрести в хозяйственном магазине, однако выбор личинок там может быть ограничен. Также можно заказать ее в интернете нужных размеров и модели. Ответ: личинки отличаются по степени надежности и секретности ключа. Лучше выбрать личинку с перфорированными ключами. Стоит она дороже, но и надежность ее выше чем у обычных личинок. Ответ: возможно при установке личинки были слишком сильно затянуты винты крепления. Можно попробовать чуть ослабить их. Если не помогает, то попробовать установить личинку другой стороной. Замена личинки замка является важным и ответственным процессом, который требует определенных навыков и знаний, которые представлены в данной статье. Правильная эксплуатация и уход за замком и ключами значительно продлят их срок службы. Когда дверной замок выходит из строя, может показаться, что необходимо менять его полностью, но если он цилиндрический, то необходимо всего лишь поменять личинку. Те, кто не сталкивался с данной проблемой в замке железной двери, могут нанять специалистов по устранению поломки, но по сути сам процесс ремонта очень простой и при желании с задачей можно справиться самостоятельно. В большинстве домов и квартир устанавливается входная металлическая дверь. Из-за частой ее эксплуатации замок может поломаться. В этом случае совершенно нет необходимости приобретать полностью новый его комплект, а достаточно всего лишь заменить внутреннюю часть запорной конструкции. На замену личинки даже у самого неопытного мастера уйдет всего около 20 минут. Перед тем, как приобрести новую личинку, необходимо правильно определить ее размер, чтобы она была такой же длины как и старая, потому как слишком короткая или длинная не подойдет. Перед тем, как поменять личинку на новую у входной двери, необходимо демонтировать старую. Она крепится в основном одним болтом, который необходимо выкрутить. После того, как деталь была вынута, необходимо измерять ее длину, ширину и диаметр. Кроме того, можно сходить в магазин со старой
AdrianSmimi
Листер плагин на Borland Delphi 7 для начинающих 6.05.2021 - 20:59
Если надо поменять замок на входной металлической двери в Москве - вызовите мастера! Приезжаем с ассортиментом запирающих систем на дом и офис. Любые способы оплаты. Доступные расценки на наши услуги.
Приезд за 15 минут или в удобное для Вас время. Разумные цены — от рублей. Более моделей замков в наличии для замены. Гарантия и бесплатный сервис — до 3-х лет. Надежные мастера по замене замков с опытом более 5 лет. Работаем круглосуточно в Москве и области. Безопасность жилища или офиса, а также ценностей в сейфе, зависит от уровня сложности запирающего устройства. К сожалению высокая степень безопасности не соотносится с надежностью его использования. Основные причины сменить замок:. Смену замка можно предотвратить, если аккуратно им пользоваться. Для легкой и бесшумной работы рекомендуется производить его смазку. Часто встречается вопрос, можно ли заменить замок самостоятельно. При наличии необходимых профессиональных инструментов и навыков справиться с поставленной задачей получится без особых проблем. Если нужно произвести замену замка накладного типа, можно справиться без посторонней помощи. Для этого сначала определите тип механизма секретности на металлической двери и модель устройства. Так как менять замки полностью не всегда необходимо, можно перекодировать или заменить личинку. Самые популярные модели дверных замков имеют цилиндровый механизм секретности. В них сменить сердцевину можно самостоятельно. При необходимости врезки в полотно возникнут трудности. Помните, что ошибка в замене дверного замка приводит к его блокировке. Поэтому лучше обратиться к профессионалам по надежной замочной защите. Сколько стоит эта услуга? В столице высоким спрос на такой сервис. Есть много организаций, в которые можно обратиться. Стоит внимательно принимать решение. Низкая стоимость услуг - причина, чтобы заполучить ключи от Вашей квартиры для незаконного проникновения. Также будьте готовы к тому, что большинство специалистов оказывают услуги широкого профиля. А о редком механизме могут не иметь представления, даже просто вставить или поменять личинку. Особая сложность возникает у таких специалистов просьба заново врезать механизм или расширить монтажный карман. Качественную услугу срочная замена замка выезд мастера дешево Вы не найдете. В случае, когда требуется вскрыть дверь и поменять дверные замки за один раз, работа может растянуться на целый день. Почему профессиональную услугу стоит заказать у нас:. Смена запирающего механизма может потребоваться в различных ситуациях. Сюда можно отнести и ремонт блокиратора в автомобиле, так и быстро заменить замок на деревянной входной двери в случае его поломки. Наши слесари быстро справятся с любой задачей. Обратиться к нам можно не только в случае поломки запирающего устройства, но и в случае его износа. Рекомендуется срочно заменить в установленной двери вместо старого на новый, более современный аналог для повышения уровня безопасности помещения. Лучший выход из ситуации — обратиться к специалисту по замене, так как мастер демонтирует старую модель аккуратно и вставит новый, без повреждения дверного полотна. Срочно поставить замки с выездом на дом — приезд сотрудника через 15 минут после Вашего звонка. Вызов мастера прямо сейчас! Срочный выезд службы замены замков, когда Вам удобно! Замена дверных замков Москва. Почтовые и цилиндровые замки от р. Гаражные и сувальдные замки от р. Замков в входной двери с цепочкой или без от р. Замков электромеханического типа от р. Замена замка кодового типа от р. Тубулярный замок от р. Замена ручки металлической двери от р. Замена защелки дверей от р. Замена броненакладки от р. Доработка дверей после замены замков от р. Ремонт и замена замка от руб. Установка замка от руб. Врезка замка от руб. Безопасно — Официально — Удобно. Основные причины сменить замок: при потере или краже ключей обращаться за заменой замков; смена при попытке взлома металлических дверей; сломался ключ; блокировка запирающего устройства; другие арендаторы или владельцы помещения. Замена замка на входной металлической двери Москва с выездом цены Сколько стоит эта услуга? Почему профессиональную услугу стоит заказать у нас: Прием заказов и обслуживание 24 часа в сутки без выходных позволяют быстро устранить проблемы вечером или ночью. К экстренной смене замка слесарь нашего сервиса приступает уже через 15 минут после Вашего звонка в сервис. Перед выполнением работ специалист производит бесплатную диагностику для подбора замочной системы. Сотрудник выезжает, чтобы установить запирающий механизм на межкомнатную или наружную двери, с комплектом популярных моделей цилиндров, запирающих устройств, а также необходимых запчастей и новой фурнитуры от отечественных и импортных производителей врезных замков Agb , Archie , Atis , BSL , Crit , Dom , Falcon. Круглосуточное обслуживание в столице и Подмосковье. Стоимость услуги оговаривается до начала работ. Рейтинг 4.

замена замков в железной двери стоимость: vidnoe.locks-master.ru
suqefopi
Листер плагин на Borland Delphi 7 для начинающих 5.05.2021 - 23:07
http://slkjfdf.net/ - Oawtewuwa Geyimaji mgj.dkke.wincmd.ru.qwe.ma http://slkjfdf.net/
uhulikegeigo
Листер плагин на Borland Delphi 7 для начинающих 5.05.2021 - 22:58
http://slkjfdf.net/ - Ohutoluq Asisbuj jiy.uqzz.wincmd.ru.dxi.ve http://slkjfdf.net/
hodeyimig
Листер плагин на Borland Delphi 7 для начинающих 13.04.2021 - 21:23
http://slkjfdf.net/ - Ofenixute Isaseda htp.kvgk.wincmd.ru.tzh.uh http://slkjfdf.net/
Все комментарии (68)
  Добавить ваш комментарий
Ваше имя:*
E-mail:
Ваш комментарий:
Сообщения содержащие крэки
будут удаляться
Контрольная сумма: 71 + 4 =

Рейтинги


Ramblers Top100

 




Все о Total Commander © 2001-2012
Идея, программирование, дизайн и поддержка, © Andrei Piasetski