xBase ... View (Lister plugin)

Форум о самом популярном файловом менеджере Total Commander

Сообщение poiuytr » Пт мар 26, 2004 9:39 am

<!--QuoteBegin--></div><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td>Цитата </td></tr><tr><td id='QUOTE'><!--QuoteEBegin-->Есть готовый компонентик, к-рый смотрит на ЕХЕ-шник и создает INI-файл там, и с именем ЕХЕ-шника<!--QuoteEnd--></td></tr></table><div class='postcolor'><!--QuoteEEnd-->Зачем же тащить в код некий компонент если все вмещается в несколько строчек?
Примерик на сpp, winapi, vcl.
Код: выделить все
char mname[MAX_PATH];
GetModuleFileName( GetModuleHandle("xbaseview.wlx"), mname, MAX_PATH );
AnsiString asIniName = ChangeFileExt( (AnsiString)mname, ".ini" );

asIniName будет содержать путь к файлу xbaseview.ini, который будет лежать рядом с плагином, а не с totalcmd.exe.
Мало ли файл настроек TC вместо wincmd.ini будет totalcmd.ini. Тогда плагин будет писать настройки в чужой ини. Не очень красиво.
Hasta la victoria siempre!
poiuytr
Капитан
 
Сообщений: 233
Зарегистрирован: Ср авг 14, 2002 6:04 pm
Откуда: Рига, Латвия
Пункты репутации: 0

Сообщение mutex » Сб мар 27, 2004 12:28 am

2 poiuytr & Spine
Вы меня достали... :)
> можно получить имплементировав ListSetDefaultParams?
Дайте мне описание этого ListSetDefaultParams! Что-то его нет нигде у меня, хотя вроде я скачал все о плагино-сочинительстве, помогите...
Добавлено:
2 poiuytr
В Борланд-Хелпе про API.GetModuleFileName прочел, что она не совсем надежна!? Лучше будеть, если я смогу получить путь к папке плагинов от Тотала. Куда я гну ---> ListSetDefaultParams!!! Жду и надеюсь.
mutex
Старшина
 
Сообщений: 50
Зарегистрирован: Чт фев 12, 2004 5:07 pm
Пункты репутации: 0

Сообщение mutex » Сб мар 27, 2004 8:26 am

2 poiuytr
Насчет функции Findcontrol() класса TWinControl: пока не проверял, не успеваю.
Есть одна мысль: когда Тотал закроют раньше плагина, плагин погибает; т.е. придется все равно ловить сообщение wm_destroy ? :(

Эх, придумать бы, что-нибудь... Идея - замечательна, неужели отказаться от корректности диалогов, т.е. не делать присваивание:

Application->Handle = ListerWin;

Или, сможем. еще что-то изобрести, а?
mutex
Старшина
 
Сообщений: 50
Зарегистрирован: Чт фев 12, 2004 5:07 pm
Пункты репутации: 0

Сообщение StayAtHome » Сб мар 27, 2004 10:40 am

2mutex
ListSetDefaultParams есть в стандартной доке по написанию Lister плагинов от Кристиана. У тебя наверное устаревшая версия этой доки. Скачай повторно с офсайта.
<span style='color:gray'>Жизнь -- это песня!</span>
<span style='font-family:Courier'>Life.exe /?</span>
StayAtHome
Подполковник
 
Сообщений: 710
Зарегистрирован: Вс фев 09, 2003 11:30 pm
Откуда: Украина
Пункты репутации: 0

Сообщение mutex » Сб мар 27, 2004 1:12 pm

2 StayAtHome
Я брал отсюда, опять скачал, то же самое. Пойду к немцам в Швейцарию, может там новая версия.
mutex
Старшина
 
Сообщений: 50
Зарегистрирован: Чт фев 12, 2004 5:07 pm
Пункты репутации: 0

Сообщение poiuytr » Сб мар 27, 2004 2:34 pm

Код: выделить все
void __stdcall ListSetDefaultParams(ListDefaultParamStruct* dps);

(в хелпе она описана как FsSetDefaultParams, это Гислера ошибка)
или
Код: выделить все
procedure ListSetDefaultParams(dps:pListDefaultParamStruct); stdcall;


Description of parameters:

dps This structure of type ListDefaultParamStruct currently contains the version number of the plugin interface, and the suggested location for the settings file (ini file). It is recommended to store any plugin-specific information either directly in that file, or in that directory under a different name. Make sure to use a unique header when storing data in this file, because it is shared by other file system plugins! If your plugin needs more than 1kbyte of data, you should use your own ini file because ini files are limited to 64k.

Return value:

The function has no return value:

Important note:

This function is only called in Total Commander 5.51 and later. The plugin version will be >= 1.2.

ListNotificaListDefaultParamStruct is passed to ListSetDefaultParams to inform the plugin about the current plugin interface version and ini file location.

Declaration:
Код: выделить все
typedef struct {

int size;
   DWORD PluginInterfaceVersionLow;
   DWORD PluginInterfaceVersionHi;
   char DefaultIniName[MAX_PATH];
} ListDefaultParamStruct;


Description of struct members:


size The size of the structure, in bytes. Later revisions of the plugin interface may add more structure members, and will adjust this size field accordingly.

PluginInterfaceVersionLow Low value of plugin interface version. This is the value after the comma, multiplied by 100! Example. For plugin interface version 1.3, the low DWORD is 30 and the high DWORD is 1.

PluginInterfaceVersionHi High value of plugin interface version.

DefaultIniName Suggested location+name of the ini file where the plugin could store its data. This is a fully qualified path+file name, and will be in the same directory as the wincmd.ini. It's recommended to store the plugin data in this file or at least in this directory, because the plugin directory or the Windows directory may not be writable!
Hasta la victoria siempre!
poiuytr
Капитан
 
Сообщений: 233
Зарегистрирован: Ср авг 14, 2002 6:04 pm
Откуда: Рига, Латвия
Пункты репутации: 0

Сообщение mutex » Сб мар 27, 2004 5:29 pm

2 poiuytr
Ох, хорошо! Спасибо за помощь! Особенно, за то, что указали на ошибку Автора, энономив мои силы и время, Коллега!!!
mutex
Старшина
 
Сообщений: 50
Зарегистрирован: Чт фев 12, 2004 5:07 pm
Пункты репутации: 0

Сообщение poiuytr » Пн мар 29, 2004 10:55 am

<!--QuoteBegin-mutex+Mar 27 2004, 10:26--></div><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td>Цитата (mutex @ Mar 27 2004, 10:26)</td></tr><tr><td id='QUOTE'><!--QuoteEBegin-->2 poiuytr
Насчет функции Findcontrol() класса TWinControl: пока не проверял, не успеваю.
Есть одна мысль: когда Тотал закроют раньше плагина, плагин погибает; т.е. придется все равно ловить сообщение wm_destroy ? Изображение

Эх, придумать бы, что-нибудь... Идея - замечательна, неужели отказаться от корректности диалогов, т.е. не делать присваивание:

  Application->Handle = ListerWin;

Или, сможем. еще что-то изобрести, а?<!--QuoteEnd--></td></tr></table><div class='postcolor'><!--QuoteEEnd-->
Если уж плагин действительно погибает с шумом, то можно поймав wm_destroy самому вызвать
Код: выделить все
ListCloseWindow(this->Handle)
Если сообщения ловишь в классе своей формы, тогда this будет указателем на текущий экземпляр класса формы, соответственно this->Handle это хэндл окна, которому пришло wm_destroy и который надо уничтожить. Смею надеятся что какой-нибудь эквивалент this от cpp есть и для ObjectPascal. Все это на уровне размышлений, в живую не проверял.
Hasta la victoria siempre!
poiuytr
Капитан
 
Сообщений: 233
Зарегистрирован: Ср авг 14, 2002 6:04 pm
Откуда: Рига, Латвия
Пункты репутации: 0

Сообщение mutex » Пн мар 29, 2004 4:34 pm

this языка Си называется self на Паскале.
Не помню, но месяца 2-3 назад проводил эксперименты в этом направлении, СКЛЕРОЗ :), почему забросил перехват сообщений стандартными средствами VCL и ушел в WinAPI??? Но, идею твою, надо обязательно проверить и опубликовать!!!
mutex
Старшина
 
Сообщений: 50
Зарегистрирован: Чт фев 12, 2004 5:07 pm
Пункты репутации: 0

Сообщение poiuytr » Пт апр 02, 2004 10:23 am

В VCL достаточно переопределить в своей форме функцию TForm::WndProc.
Код: выделить все
void __fastcall TMyForm::WndProc( TMessage& Msg )
{
 switch(Msg.Msg)
 {
   case wm_destroy: ListCloseWindow(this->Handle); break; // wm_destroy обработаем сами
   default: TForm::WndProc(Msg); // остальные сообщения отдадим дефолтному обработчику
 }
}
Hasta la victoria siempre!
poiuytr
Капитан
 
Сообщений: 233
Зарегистрирован: Ср авг 14, 2002 6:04 pm
Откуда: Рига, Латвия
Пункты репутации: 0

Сообщение mutex » Сб апр 03, 2004 12:03 am

Молодчага!
Вот, что теперь осталось от моего дикого извращенного алгоритма:

В загрузке плагина, т.е. в function ListLoad(...), нужно только:

SetWindowLong(Handle, GWL_USERDATA, 1); //1 == "окно создано".

Твой же простой метод (гениальное - всегда просто!!!) выглядит так:

procedure TfmxBaseView.WndProc(var Message: TMessage);
begin
if Message.Msg = WM_DESTROY then
begin
if IsWindow(Handle) and (GetWindowLong(Handle, GWL_USERDATA) <> 0) then
begin
SetWindowLong(Handle, GWL_USERDATA, 0); //0 == "окно уничтожено"
Free;
end;
end
else
inherited WndProc(Message);
end;

потому что, уничтожение вызывается дважды (Листером и VCL), причем вызывается для каждого запущенного экземпляра плагина.

Вот, и есть конкретный результат.
Большое Спасибо!

Если не надоел: как бы поймать клавиши-акселераторы меню Листера? А то, из-за них вечно теряю фокус ввода.


Добавлено:
Ох, забыл! Еще ведь спасибо за ListSetDefaultParams, INI сделал, как надо.
mutex
Старшина
 
Сообщений: 50
Зарегистрирован: Чт фев 12, 2004 5:07 pm
Пункты репутации: 0

Сообщение Superman » Пн апр 12, 2004 7:39 am

Ты как проверяешь наличие BDE? Неважно как ты это делаешь, потому что твой способ определения не всегда срабатывает.
Лучше воспользуйся моим способом.
Вот его суть.
1) Пробуешь открыть ветку реестра: HKEY_LOCAL_MACHINE\SOFTWARE\Borland\Database Engine
2) Проверяешь значение: DLLPATH.
3) Если DLLPATH указывает на реальную папку, то считаем, что BDE есть.
<a href='http://tmse.com.ru' target='_blank'>http://tmse.com.ru</a>
Superman
Сержант
 
Сообщений: 31
Зарегистрирован: Сб май 10, 2003 8:57 pm
Пункты репутации: 0

Сообщение Evgenych » Сб окт 09, 2004 7:11 am

Как в Xbaseview упаковать DBF?
В ридми написано, что можно. Все облазил - нигде не нашел.
Evgenych
Прапор
 
Сообщений: 66
Зарегистрирован: Пт июл 11, 2003 3:38 pm
Пункты репутации: 0

Сообщение mutex » Сб окт 09, 2004 3:49 pm

2 Evgenych
Надо установить режим "Монопольно" и в меню будет добавлен пункт для упаковки DBF. Операция возможна только при монопольном доступе к файлу.
mutex
Старшина
 
Сообщений: 50
Зарегистрирован: Чт фев 12, 2004 5:07 pm
Пункты репутации: 0

Сообщение Evgenych » Вс окт 10, 2004 8:25 am

Действительно, добавился пункт Сервис <!--emo&:)-->[img]style_emoticons/<#EMO_DIR#>/smile.gif[/img]<!--endemo-->
Evgenych
Прапор
 
Сообщений: 66
Зарегистрирован: Пт июл 11, 2003 3:38 pm
Пункты репутации: 0

Пред.След.

Вернуться в Total Commander

Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 7

cron