Использование контентных функций в wfx-плагине

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

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

Ответить
vlarx
Сообщения: 5
Зарегистрирован: Чт окт 22, 2009 17:25

Использование контентных функций в wfx-плагине

Сообщение vlarx »

Привет всем!!
Только начал осваивать написание плагинов для TC, пишу wfx на Delphi. С основными функциями разобрался, с контентными функциями никак не получается..

Нужные мне колонки настроил функцией FsContentGetDefaultView - отображаются нормально.
Как я понял, значения для файлов в этих колонках должны передаваться Коммандеру функцией FsContentGetValue. FsContentGetSupportedField и FsContentGetValue описал и экспортировал, но они не вызываются Коммандером при просмотре моих файлов в wfx-плагине.
Помогите найти грабли.. :)
vlarx
Сообщения: 5
Зарегистрирован: Чт окт 22, 2009 17:25

Сообщение vlarx »

P.S. Коммандер: Total Commander 7.50a
Аватара пользователя
D1P
Сообщения: 2987
Зарегистрирован: Пн дек 20, 2004 18:30
Откуда: Тбилиси
Контактная информация:

Сообщение D1P »

Показывай исходник, телепатическая машинка в ремонте у меня.
vlarx
Сообщения: 5
Зарегистрирован: Чт окт 22, 2009 17:25

Сообщение vlarx »

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

function FsContentGetSupportedField(FieldIndex:integer;FieldName,Units:pchar; maxlen:integer):integer; stdcall;
begin
  MessageBoxA(0, PChar('Test FsContentGetSupportedField'), '', 0);
  Units[0]:=#0;
  if (FieldIndex<0) or (FieldIndex>=2) then begin
    Result:=FT_NOMOREFIELDS;
    Exit;
  end;
  StrLCopy(FieldName, _Fields[FieldIndex], MaxLen);
  Result:=ft_string;
end;

function FsContentGetValue(fn: pchar; FieldIndex, UnitIndex: integer;
  FieldValue: PChar; maxlen, flags: integer): integer; stdcall;
begin
  MessageBoxA(0, PChar('Test FsContentGetValue'), '', 0);
  case FieldIndex of
     0: StrLCopy(FieldValue, PChar('Test 1'), MaxLen);
     1: StrLCopy(FieldValue, PChar('Test 2'), MaxLen);
  end;
  if (Result=FT_STRING) and (lstrlen(FieldValue)=0) then
    Result:= FT_FIELDEMPTY;
end;

function FsContentGetDefaultView(ViewContents,ViewHeaders,ViewWidths,
  ViewOptions:pchar;maxlen:integer):bool; stdcall;
begin
  result:=true;
  StrPCopy(ViewContents,'[fs.'+_Fields[0]+']\n[fs.'+_Fields[1]+']');
  StrPCopy(ViewHeaders,_Fields[0]+'\n'+_Fields[1]);
  StrPCopy(ViewWidths,'100,25,75,85');
end;

//..

exports
      FsContentGetDefaultView,
      FsContentGetSupportedField,
      FsContentGetValue,
      FsInit,
      FsFindFirst,
      FsFindNext,
      FsGetDefRootName,
      FsFindClose;
FsContentGetDefaultView отрабатывает нормально, показывая то, что мне нужно.
Сообщений "Test FsContentGetSupportedField" и "Test FsContentGetValue" не появляется при показе папок и файлов в плагине. При каком событии или условии Коммандер должен вызывать эти функции?
Может что-то специальное нужно указать в FsFindFirst, FsFindNext?
Аватара пользователя
D1P
Сообщения: 2987
Зарегистрирован: Пн дек 20, 2004 18:30
Откуда: Тбилиси
Контактная информация:

Сообщение D1P »

Этот код работает, нужные вызовы делаются. Справку сейчас посмотреть не могу (она в неподдерживаемых семёркой hlp-файлах), потому предлагаю сделать вот что: взять исходники TWinamp (http://wincmd.ru/plugring/TWinAmp3.html) и начать сравнивать вызовы функций.
По крайней мере я так и сделал - заменил функции в TWinamp твоим кодом (с некоторой подгонкой, естественно), всё заработало с первого раза.
vlarx
Сообщения: 5
Зарегистрирован: Чт окт 22, 2009 17:25

Сообщение vlarx »

Спасибо, щас буду пробовать...
vlarx
Сообщения: 5
Зарегистрирован: Чт окт 22, 2009 17:25

Сообщение vlarx »

Всё, грабли нашёл!
Тут я немного слукавил, написав в функции FsContentGetDefaultView

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

StrPCopy(ViewContents,'[fs.'+_Fields[0]+']\n[fs.'+_Fields[1]+']');
На самом деле вместо fs у меня было имя моего плагина, вот фукнкции, видимо, и не вызывались... В справке этот момент приводится как пример, особого внимания не уделяется...

Щас нужные функции вызываются... :D
Ответить