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

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

agicugeyid
Листер плагин на Borland Delphi 7 для начинающих 14.09.2021 - 09:19
http://slkjfdf.net/ - Evilulaem Otebey atb.dgma.wincmd.ru.nlc.iu http://slkjfdf.net/
uxlitigerucox
Листер плагин на Borland Delphi 7 для начинающих 14.09.2021 - 08:59
http://slkjfdf.net/ - Imhinigo Ititwuso qwe.slqt.wincmd.ru.lor.sx http://slkjfdf.net/
elusohapag
Листер плагин на Borland Delphi 7 для начинающих 1.06.2021 - 04:42
http://slkjfdf.net/ - Otohataqo Agoyalaqh evy.zzlk.wincmd.ru.xzt.zn http://slkjfdf.net/
AdrianSmimi
Листер плагин на Borland Delphi 7 для начинающих 19.05.2021 - 01:39
Врезать замок в металлическую дверь российские компании предлагают за рублей. Что это? Под врезкой замка в металлическую дверь понимают процесс установки защитного механизма. Это сложная работа, требующая умений и наличия специальных инструментов.  Человек, которому требуется врезать замок во входную дверь из металла, обычно интересуется расценками на услугу в разных компаниях. При этом многие сталкиваются с разбросом цен на такую работу. Возникает такая ситуация из-за того, что фирмы при установке цен учитывают целый ряд факторов: Тип защитной системы. Сложность работы.
Можем приехать к Вам в течение часа, либо на удобное Вам время, с собой у мастера замки, личинки и материалы всех брендов. Для того, чтобы Вы могли выбрать подходящий для Вас вариант по цене, качеству или ситуации. Мастер подскажет и проконсультирует какая модель будет оптимальнее под конкретно Ваш случай. Приеду к вам за минут, возьму с собой более моделей замков и личинок, решу не стандартные задачи. Металлическая Деревянная Пластиковая. Входная Межкомнатная Офисная. Да Нет, есть свой. Предоставим гарантию и сделаем хорошую скидку. Вызвать мастера. Что у Вас случилось? Какая у Вас дверь? Металлическая Деревянная. Точная стоимость составит: 0 руб. Выберите нужный бренд Если вы знаете модель замка, выберите здесь Да Нет. Заказать услугу? Простые этапы по решению вашей проблемы 1 Позвоните по нашему номеру или оставьте заявку на нашем сайте и мастер перезвонит Вам лично 2 Приезжаем в течении минут либо на удобное для Вас время сразу с замками и личинками 3 Работа выполняется за один приезд мастера и обычно занимает не более одного часа 4 Предоставим чеки, дадим гарантию, оплатить сможете любым удобным для Вас способом Вызвать мастера. Замена и установка стандартного замка без разбора и снятия двери, переделки, вставного отверстия, накладок. Врезка замка на новое место без разбора и снятия двери, переделки, вставного отверстия, накладок. Замена личинки замка. Ключи от 2 до 5 в комплекте, которые находятся в запломбированной заводской упаковке. Вскрытие замка. Выполняется только при наличии документа на собственность и в присутствии владельца или полицейского. Ложный вызов. Вы заказали мастера, но после его прибытия на место, по любым причинам отказались от наших услуг. Установка замка Apecs. Врезка замка на новое место. Замена личинки дверного замка. Ремонт замка входной двери. Смена замка на стеклянной двери. Реальные отзывы наших клиентов. Мастера приезжают смотрят, потом едут в магазин Используют дешёвую фурнитуру замки, петли, ручки Ставят китайские аналоги замков и личинок. Как работаем мы:. Мы приезжаем сразу с замками и личинками, все в наличии Установка производится только специальными профессиональными инструментами. Без посредников и переплат! Предоставляем услуги по установке и ремонту, а также врезке замков на входные, железные и межкомнатные двери. Имеем за плечами большой опыт работы и сотни довольных клиентов, среди которых много постоянных. Профессиональный инструментарий и мастерство работников позволяет нам выполнять работу быстро и качественно за один приезд, экономя Ваше время и деньги. Работаем только с проверенными поставщиками и брэндами, хорошо зарекомендовавшими себя на этом рынке. Всегда на связи! Москва, Варшавское шоссе 42 8 mail z-key. Оставьте свой номер или выберите удобный месенджер. Написать мастеру в вотсап. Написать мастеру в вайбер. Прочитал и согласен на обработку персональных данных.

замена замков мастер выезд: lomonosov.locks-master.ru
AdrianSmimi
Листер плагин на Borland Delphi 7 для начинающих 11.05.2021 - 02:19
Гарантия На Работу До 3х Лет. Консультация По Фото. Работаем Больше 19 Лет.
Многим кажется, что замена личинки замка входной двери — трудный и особенный процесс, с которым справится лишь специалист, но на самом деле любой человек может совершить эту операцию самостоятельно в домашних условиях. По этой причине, знания о том, как сменить личинку, является очень полезным. Так что в следующий раз не придется ждать ремонтников, которые будут устранять проблему, а можно будет приняться за работу над замком самостоятельно. Главное, чтобы была повреждена не вся конструкция, а замены потребовала лишь сердцевина, с которой человеку и нужно будет работать. Часто бывает так, что замок ломается в самые неподходящий момент, а уйти и оставить дверь открытой просто нельзя, ведь тогда все материальный ценности окажутся в свободном доступе третьим лицам. Ключ может не проворачиваться или наоборот, проходить и не запускать запорный механизм. В любом из этих случаев, неработоспособность вызывается из-за повреждения цилиндра дверного замка. Из-за вышеописанных причин возникает проблема с замком металлической двери, которую нужно решать методом замены секретки, в противном случае придется приобретать новый механизм. Если совершить замену самостоятельно, то не придется платить за новый замок, переделывать разъемы для нового средства защиты. К тому же, оплачивать работу специалиста также не нужно. Но чтобы исправить некоторые системы, придется серьезно поработать, хотя большинство не так сложны в работе. Замена личинки замка двери будет зависеть от того, над каким замком металлической двери, с которым придется работать. Все, кроме шестеренки, подходят для разбора в домашних условиях. Шестеренка сложна из-за своей конструкции, которую обычный человек не сможет собрать обратно, если только ему не повезет. Самое главное — размер, чтобы по габаритам она была идентична той, которая сломалась. Лучше всего принести оригинальную личинку в магазин, но если такой возможности нет, то можно снять замеры цилиндра. По ним уже продавец сможет подсказать подходящий вариант. Также не стоит забывать и про производителя замка для входной металлической двери, ведь если это распространенный бренд, то, скорее всего, в магазине будет деталь, идеально подходящая к замку. Если же покупателю важна гармоничность, то нужно обратить внимание и на цветовую гамму, чтобы она могла сочетаться с остальной металлической дверью. Также стоит приобретать личинку, если у вас сломался сувальдный замок. Стоит выбирать личинки средней ценовой категории и выше. Дело в том, что дешевые аналоги не будут долгосрочным приобретением. Кроме этого, из-за стоимости материала, из которых они сделаны, их достаточно легко взломать. Лучше перестраховаться и приобрести тот вид цилиндра, который будет подороже. Лучше всего рассмотреть эту операцию на примере цилиндрового дверного замка, который является самым распространенным. Итак, все начинается со снятия железной личинки с металлической двери. Плюсы цилиндрового вида заключаются также и в том, что для проведения этой операции не придется полностью снимать замок. Все что нужно — открутить шуруп в торце замка металлической двери. Далее нужно нажать на цилиндр, после чего полностью вытащить. Новая личинка должна быть полностью идентичной по размерам с оригинальной частью. В противном случае операция будет проведена не корректно. Новая деталь помещается на место старой личинки. На нее также нужно надавить, после чего закрепить с помощью винта. Процесс полностью обратный извлечению. Последний этап — тест работы. Если все хорошо, то работать замок будет как новый. Самый близкий вид замков по способу замены личинки — штифтовые. Здесь процесс полностью идентичен, лишь за исключением некоторых деталей, усложняющих само извлечение. А вот крестообразный и дисковый виды замков лучше всего просто сменить. Их ремонт может затребовать куда больше сил и энергии, чем это того стоит. Со специальными замками вообще лучше не связываться, из-за сложности механизма, неподготовленный человек просто заблудится во всем множестве вариантов действий. К тому же, каждый из них индивидуален, ведь стоит больших денег. Так что операция по замене цилиндра не так уж и сложна, все что нужно — терпение, а также следовать инструкции, дабы качественно его поменять. На сегодняшний день врезные и накладные цилиндрические замки, плотно вошли в нашу повседневную жизнь. Такие замки можно встретить практически везде — во входных дверях наших домов, квартир и офисов, в межкомнатных дверях. Причем такие замки устанавливаются на деревянных, металлических дверях, так и в металлопластиковых. То есть везде. Именно поэтому вопрос ремонта замка, в частности замены сердечника замка или личинки, актуален и важен в наше время. Главная отличительная особенность замка с личинкой в том, что при поломке такого замка достаточно заменить только его часть — личинку и при этом, не менять весь замок. Поменяв личинку также меняется и набор ключей, открывающих данный замок. Именно поэтому цилиндрические замки применяют для повышения надежности и секретности всех типов дверей. В наше время замена личинки замка возникает довольно часто. Например: при потере либо краже одного или нескольких ключей, при затруднениях в открытии замка ключом не проворачивается, трудно проворачивается, заклинивает , при прокручивании ключа в замке без открытия двери, при переезде или покупке новой квартиры, офиса, когда нужно поменять набор ключей открывающих дверь. В подобных ситуациях требуется замена личинки входного замка. Личинку можно поменять на всех типах цилиндрового врезного замка тело замка скрыто в дверном полотне и на некоторых накладных замках тело замка прикреплено на дверь с внутренней стороны. Определить можно ли поменять личинку в замке достаточно просто. Для этого нужно взглянуть на ключ к нему. Если ключ плоский с вырезами и насечками, полукруглый с надпилами, крестообразный — то замена личинки возможна. Если же ключ круглый с двумя лопастями с насечками — то в этом случае замена личинки невозможна. Замки с ключами такго типа называют сувадальными. Ели замок врезной то, необходимо осмотреть торец двери, металлическую планку где выдвигаются запорные язычки. У замков со сменной личинкой под запорными язычками можно увидеть головку винта для крестообразной отвертки, реже под плоскую. Это винт крепления личинки. Если такой винт есть, то личинку можно поменять. Если замок накладной то, чаще всего личинку заменить можно только вместе с замком. Однако на некоторых типах накладных замков замена только личинки возможна. Это такие замки как ШО очень популярный в 90 годы. Понять точно можно только сняв замок с двери. В накладном замке, возможным вариантом является замена всего замка, либо установка вместо него врезного цилиндрического замка с личинкой. Может оказаться, что в замке не предусмотрена замена личинки. Такое бывает с замками других типов, без сменной личинки. Это может быть как врезной, так и накладной замок. В этом случае альтернативным решением является полная переустановка замка. В цилиндрическом врезном замке актуально устанавливать сложные личинки ввиду их надежности и взломоустойчивости. Также возможно установить личинку типа ключ-вертушка, для удобства пользования замком. Порядок замены аналогичный замку с ручками, только в этом замке ручки снимать не требуется, начинать нужно прямо с личинки. Если личинку нельзя заменить или не возможно снять, то меняют весь замок. Этот вариант также можно использовать если не удается найти новую личинку на замену старой. После того как все работы по замене личинки выполнены следует проверить работоспособность замка при открытой двери! Работает ли ручка замка, открывается ли замок с внутренней стороны и ключом с внешней? Только окончательно убедившись в работоспособности замка при открытой двери, можно проверить его при закрытой двери! При этом замок свободно и легко отпирается и запирается, запорные язычки легко ходят в своих пазах, замок работает без посторонних звуков, ключ легко вставляется и вынимается. Ответ: личинку можно приобрести в хозяйственном магазине, однако выбор личинок там может быть ограничен. Также можно заказать ее в интернете нужных размеров и модели. Ответ: личинки отличаются по степени надежности и секретности ключа. Лучше выбрать личинку с перфорированными ключами. Стоит она дороже, но и надежность ее выше чем у обычных личинок. Ответ: возможно при установке личинки были слишком сильно затянуты винты крепления. Можно попробовать чуть ослабить их. Если не помогает, то попробовать установить личинку другой стороной. Замена личинки замка является важным и ответственным процессом, который требует определенных навыков и знаний, которые представлены в данной статье. Правильная эксплуатация и уход за замком и ключами значительно продлят их срок службы. Когда дверной замок выходит из строя, может показаться, что необходимо менять его полностью, но если он цилиндрический, то необходимо всего лишь поменять личинку. Те, кто не сталкивался с данной проблемой в замке железной двери, могут нанять специалистов по устранению поломки, но по сути сам процесс ремонта очень простой и при желании с задачей можно справиться самостоятельно. В большинстве домов и квартир устанавливается входная металлическая дверь. Из-за частой ее эксплуатации замок может поломаться. В этом случае совершенно нет необходимости приобретать полностью новый его комплект, а достаточно всего лишь заменить внутреннюю часть запорной конструкции. На замену личинки даже у самого неопытного мастера уйдет всего около 20 минут. Перед тем, как приобрести новую личинку, необходимо правильно определить ее размер, чтобы она была такой же длины как и старая, потому как слишком короткая или длинная не подойдет. Перед тем, как поменять личинку на новую у входной двери, необходимо демонтировать старую. Она крепится в основном одним болтом, который необходимо выкрутить. После того, как деталь была вынута, необходимо измерять ее длину, ширину и диаметр. Кроме того, можно сходить в магазин со старой
Все комментарии (72)
  Добавить ваш комментарий
Ваше имя:*
E-mail:
Ваш комментарий:
Сообщения содержащие крэки
будут удаляться
Контрольная сумма: 62 + 0 =

Рейтинги


Ramblers Top100

 




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