WFX Вызов функций TC изнутри

Только для тех, кто пишет плагины под Total Commander. Обмен опытом, решение проблем.

Модераторы: d-view, Моторокер, Avada, CaptainFlint, Nik

Ответить
Аватара пользователя
KorneySan
Сообщения: 4
Зарегистрирован: Ср май 25, 2011 12:26
Откуда: Беларусь, Гомель

WFX Вызов функций TC изнутри

Сообщение KorneySan »

Пишу FS-плагин.
Есть ли возможность:
1. обрабатывать в плагине нажатие F3, F4, F9 ?
2. использовать для внутреннего копирования функции самого TC ? (пример: файл плагина - это реальный файл на винте, и при желании его можно куда-нибудь скопировать или перенести).

P.S. Поиск тут ничего не нашёл, FsLinksToLocalFiles/FsGetLocalName попробовал - не работает.
Praemonitus praemunitus
Аватара пользователя
MVV
Сообщения: 4815
Зарегистрирован: Чт окт 15, 2009 10:58
Откуда: Ростов-Дон

Сообщение MVV »

Обрабатывать нажатия клавиш в плагине нельзя (разве что хуками и прочей низкоуровневой ерундой).

По нажатию F3/F4 тотал обычно извлекает файл во временную папку и открывает в листере/редакторе. По F8 (думаю, это подразумевалось, а не F9) тотал вызывает функцию плагина по удалению файла/папки. Если плагин скажет тоталу, что он - плагин временной панели, тотал будет спрашивать у плагина путь к физическому файлу вместо извлечения файла во временную папку.

Использовать функции тотала нельзя, никакой интерфейс для этого тотал не предоставляет (единственное, что предоставляет - это показ окон с полем ввода).
Аватара пользователя
KorneySan
Сообщения: 4
Зарегистрирован: Ср май 25, 2011 12:26
Откуда: Беларусь, Гомель

Сообщение KorneySan »

MVV писал(а):По F8 (думаю, это подразумевалось, а не F9) тотал вызывает функцию плагина по удалению файла/папки.
Я имел в виду именно F9, поскольку F8 у меня отлично заработала - после вопроса об удалении срабатывают все "вложенные" действия.
MVV писал(а):Если плагин скажет тоталу, что он - плагин временной панели, тотал будет спрашивать у плагина путь к физическому файлу вместо извлечения файла во временную папку.
Пробовал. В списке есть файлы типа .txt, которые, разумеется, должны были открыться. Однако на выходе получился пшик. ЧЯДНТ?
MVV писал(а):Использовать функции тотала нельзя, никакой интерфейс для этого тотал не предоставляет
Т.е. чтобы скопировать файл "из плагина, придётся реализовывать FsGetFile и остальной геморрой самостоятельно?

И ещё вопрос. Нашёл тут на форуме способ обновить панель через cm_RereadSource, однако и он не работает. В тоже время при "открытии" файла текст подтверждения указывает на то, что информация о файлах успешно обновилась. Почему же не обновилась панель?
Praemonitus praemunitus
Аватара пользователя
MVV
Сообщения: 4815
Зарегистрирован: Чт окт 15, 2009 10:58
Откуда: Ростов-Дон

Сообщение MVV »

Я имел в виду именно F9
А что есть F9?
Пробовал. В списке есть файлы типа .txt, которые, разумеется, должны были открыться.
Плагин точно экспортирует функции FsLinksToLocalFiles и FsGetLocalName?
Т.е. чтобы скопировать файл "из плагина, придётся реализовывать FsGetFile и остальной геморрой самостоятельно?

И ещё вопрос. Нашёл тут на форуме способ обновить панель через cm_RereadSource, однако и он не работает. В тоже время при "открытии" файла текст подтверждения указывает на то, что информация о файлах успешно обновилась. Почему же не обновилась панель?
Придется. Тотал ведь не знает, какая файловая система у плагина.

При вызове cm_RereadSource какая панель активна? Обновляется только активная панель. И вообще, вызов этой команды приводит к куче неприятных моментов типа выхода из архивов.
Аватара пользователя
KorneySan
Сообщения: 4
Зарегистрирован: Ср май 25, 2011 12:26
Откуда: Беларусь, Гомель

Сообщение KorneySan »

MVV писал(а):А что есть F9?
ХЕЗ. Я думал, что есть реакция на Fx, так что вопрос закрыт.
MVV писал(а):Плагин точно экспортирует функции FsLinksToLocalFiles и FsGetLocalName?

Код: Выделить всё

function FsLinksToLocalFiles:bool; stdcall;
begin
 Result:=True;
end;

function FsGetLocalName(RemoteName:pchar;maxlen:integer):bool; stdcall;
 var
   fn, rn: String;
   i: Integer;
begin
 CS_GLN.Enter;
 fn:=StrPas(RemoteName);
 Delete(fn, 1, 1);
 i:=DataIndex(fn);
 if i<0 then
   Result:=False
 else
  begin
   rn:=ExtractToken('saveto', DataGet(i));
   if FileExists(rn) then
    begin
     FillChar(RemoteName, maxlen, 0);
     if Length(rn)<maxlen then
      begin
       StrPCopy(RemoteName, rn);
       Result:=true;
      end
     else
       Result:=false;
    end
   else
     Result:=false;
  end;
 CS_GLN.Leave;
end;

exports
  FsInit,
  FsFindFirst,
  FsFindNext,
  FsFindClose,
  FsGetDefRootName,
  FsSetDefaultParams,
  FsExecuteFile,
  //FsGetFile,
  //FsStatusInfo,
  FsExtractCustomIcon,
  FsDeleteFile,
  FsLinksToLocalFiles,
  FsGetLocalName;
Как-то так.
MVV писал(а):Придется. Тотал ведь не знает, какая файловая система у плагина.
Ясно, спасибо.
MVV писал(а):При вызове cm_RereadSource какая панель активна? Обновляется только активная панель. И вообще, вызов этой команды приводит к куче неприятных моментов типа выхода из архивов.
Активна панель с моим плагином. Более того - панель не обновляется даже по кнопке "Обновить содержимое панели".
Просто задача стоит таким образом: происходят внешние изменения данных, которые должны отразиться в обновлении панели (меняются значки и размер файлов).
Praemonitus praemunitus
Аватара пользователя
CaptainFlint
Сообщения: 6239
Зарегистрирован: Вт дек 14, 2004 22:34
Контактная информация:

Сообщение CaptainFlint »

KorneySan писал(а):Просто задача стоит таким образом: происходят внешние изменения данных, которые должны отразиться в обновлении панели (меняются значки и размер файлов).
Поменяй для обновившегося файла дату модификации, чтобы при перечитывании каталога Тотал её получил. Тогда он обновит и остальное.
Почему же, ё-моё, ты нигде не пишешь "ё"?
Аватара пользователя
KorneySan
Сообщения: 4
Зарегистрирован: Ср май 25, 2011 12:26
Откуда: Беларусь, Гомель

Сообщение KorneySan »

CaptainFlint писал(а):Поменяй для обновившегося файла дату модификации, чтобы при перечитывании каталога Тотал её получил. Тогда он обновит и остальное.
Спасибо, помогло.
До этого я устанавливал дату модификации, одинаковую с датой создания. Теперь я устанавливаю дату модификации в текущее время, обновление работает.
Praemonitus praemunitus
Ответить