Total Commander Forum Index Total Commander
Форум поддержки пользователей Total Commander
Сайты: Все о Total Commander | Totalcmd.net | Ghisler.com | RU.TCKB
 
 RulesRules   SearchSearch   FAQFAQ   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Получение списка выделенных файлов сторонними утилитами

 
Post new topic   Reply to topic    Total Commander Forum Index -> Написание плагинов для Total Commander printer-friendly view
View previous topic :: View next topic  
Author Message
Yams



Joined: 17 Oct 2005
Posts: 115
Location: Тверь

Post (Separately) Posted: Sun Dec 10, 2006 15:26    Post subject: Получение списка выделенных файлов сторонними утилитами Reply with quote

Доброго времени суток.

Решил выложить здесь свои небольшие наработки, суть наработок - получение сторонними программами (не плагинами) списка выделенных файлов от Total Commander.

Для начала - немного теории.
На настоящий момент существует следующая проблема: от TC очень сложно получить список выделенных файлов. Одним способом является отсылка команды CM_CopyFullNamesToClip = $7E2:
Code:
 
// 1. Хэндл окна Total Commander
TCHnd:= FindWindow('TTOTAL_CMD', Nil);

// 2. Получаем список выделенных файлов
if TCHnd<>0 then
begin
  SaveClipboard;           // сохраняем буфер обмена

  SendMessage(TCHnd, EM_DISPLAYBAND, CM_CopyFullNamesToClip, 0); // после этой команды в буфере обмена находится список выделенных файлов

  try
   S:= Clipboard.AsText;   // получаем этот список
  except
   on E: Exception do S:='';
  end;

  RestoreClipboard;        // восстанавливаем буфер обмена
end;

Достоинство этого кода - его экономичность. Недостаток находится в процедурах SaveClipboard и RestoreClipboard. Дело в том, что у буфера обмена нет функции сохранения себя в какое-нибудь резервное место. Также нет возможности обратиться к буферу обмена как к некоей RAW-области памяти, чтобы просто считать целиком информацию оттуда, независимо от типа информации, и потом восстановить эту информацию таким же образом.
Возможно, на самом деле способ существует, и если вам известен этот способ, то огромная просьба - сообщите об этом.

Таким образом, в функции SaveClipboard необходимо определить тип содержащейся там информации (всего типов 65536) и правильно эту информацию сохранить. Позже, в функции RestoreClipboard, сохранённый блок требуется вернуть на место.

Недавно вышла новая версия Total Commander'а, в которой эта проблема была частично решена. В history.txt было зявлено следующее:
Quote:
15.09.06 Release Total Commander 7.0a10 (alpha test version 10)
...
15.09.06 Added: Support for accessibility tools (e.g. for blind users) to main lists+separate tree+sync+CD-Tree, allows to retrieve current line via LB_GETTEXT

В версиях 6.5x и ранее действительно нельзя было получить список файлов, использую Windows-команду LB_GETTEXT: вместо ожидаемых строк на выходе оказывались ссылки на неизвестный мне тип информации. Вообще говоря, этого и стоило ожидать: Ghisler использует возможности ListBox'a по максимуму, и свойство OwnerDraw давно уже было установлено в True.

Но в версии 7.0 public beta 1, которой я сейчас и пользуюсь, появилась возможность получить при помощи LB_GETTEXT список выделенных файлов. Предлагаю вашему вниманию код (скачать можно здесь), показывающий способ использования этой возможности. Данный код написан на языке Object Delphi (кажется, теперь так Object Pascal называется). Основная часть размещена в .dpr - файле, связано это с особенностью работы функции GetForegroundWindow.

К сожалению, этот способ также имеет свои недостатки. На настоящий момент недостатков два, и все они связаны с видом строк, возвращаемых от TC.
Рассмотрим пример. Выделено 2 файла:
1.bmp 10000б дата_создания время_создания атрибуты
2.bmp 12500б дата_создания время_создания атрибуты

Проблема 1: TC возвращает строки в зависимости от набора колонок. При кратком виде отображения результирующие строки будут:
Code:
1.bmp
2.bmp

При подробном виде результат будет следующим:
Code:
1.bmp 10000 дата_создания время_создания атрибуты
2.bmp 12500 дата_создания время_создания атрибуты

В случае, если пользователь сменит набор колонок и вначале будут стоять не колонки имя/расширение, а какие-то другие, то этот способ уже работать не будет: функция GetFullFileName (см. ссылку) будет отрабатывать неправильно.

Проблема 2: ТС возвращает строки, в которых значения столбцов отделены друг от друга символом ПРОБЕЛ. Это очень сильно затрудняет работу, так как пользователь может использовать пробел в именах файлов.

Но это нововведение с LB_GETTEXT уже сейчас здорово облегчило работу программистам, пишущим утилиты для TC.

P.S. Я написал письмо Ghisler'у, где изложил свои сображения по этому поводу. Одним из соображений была замена пробела на табулятор (#9), таким образом будет решена проблема №2.

P.P.S. Отсюда можно загрузить исполняемый файл, в архивах выше только исходный код.
_________________
In Pascal we trust
Back to top
View user's profile Send private message
CaptainFlint



Joined: 14 Dec 2004
Posts: 6151
Location: Москва

Post (Separately) Posted: Sun Dec 10, 2006 15:35    Post subject: Reply with quote

Yams wrote:
В случае, если пользователь сменит набор колонок и вначале будут стоять не колонки имя/расширение

Пользователь этого не сделает. Тотал не даст.
_________________
Почему же, ё-моё, ты нигде не пишешь "ё"?
Back to top
View user's profile Send private message
Yams



Joined: 17 Oct 2005
Posts: 115
Location: Тверь

Post (Separately) Posted: Sun Dec 10, 2006 15:40    Post subject: Reply with quote

Вот это не поглядел! Отлично, тогда осталась только одна проблема. Надеюсь, Ghisler будет ставить табуляторы вместо пробелов.
_________________
In Pascal we trust
Back to top
View user's profile Send private message
Maximus



Joined: 07 Apr 2005
Posts: 927
Location: Украина, Кировоградская обл., г. Знаменка

Post (Separately) Posted: Thu Dec 14, 2006 11:27    Post subject: Reply with quote

Code:
int SelFileCount=SendMessage(hActivePanel,LB_GETSELCOUNT,0,0);

При просмотре эскизов возвращает SelFileCount==0.
Недоделка Гислера?
_________________
tcPhonebook|AppLoader|Українізація TC|Ultimate Calendar
Back to top
View user's profile Send private message
Yams



Joined: 17 Oct 2005
Posts: 115
Location: Тверь

Post (Separately) Posted: Sat Dec 16, 2006 03:14    Post subject: Reply with quote

При показе эскизов TC действительно возвращает число выделенных файлов равным единице. Видимо, у Ghisler'а в этом случае стоит не ListBox, а ListView. Спрошу у Ghisler'а по этому поводу.

Оффтоп. Как Ghisler быстро отвечает на письма, при его-то загруженности. Приятно, чёрт возьми. Оказывается, для получения списка выделенных файлов есть тэг %L. Он не подходит для F4 по файлам, но его можно использовать как альтернативу: TC создаёт TEMP-файл, который содержит список полных путей до выделенных файлов. Путь до TEMP-файла передаётся утилите в командной строке параметром, так что от утилиты требуется только считать список файлов из этого текстовика.
_________________
In Pascal we trust
Back to top
View user's profile Send private message
Maximus



Joined: 07 Apr 2005
Posts: 927
Location: Украина, Кировоградская обл., г. Знаменка

Post (Separately) Posted: Sat Dec 16, 2006 14:29    Post subject: Reply with quote

Значит для плагина этот тэг нельзя использовать?
Что Гислер ответил на счет разделителя типа табулятор?
_________________
tcPhonebook|AppLoader|Українізація TC|Ultimate Calendar
Back to top
View user's profile Send private message
Yams



Joined: 17 Oct 2005
Posts: 115
Location: Тверь

Post (Separately) Posted: Sat Dec 16, 2006 15:26    Post subject: Reply with quote

Quote:
Значит для плагина этот тэг нельзя использовать?

Насчёт плагинов - не уверен, не разбирался. Просто я занимаюсь разработкой утилиты, а плагинами для TC пока не занимался.
В принципе, по моим непроверенным сведениям, получение плагинами выделенных файлов не составляет особой трудности - есть callback-функции, позволяющие плагину узнать о выделенных файлах. Если я не прав, то поправьте меня Smile
Этот вопрос проблематичен именно для утилит, к сожалению.

Quote:
Что Гислер ответил на счет разделителя типа табулятор?

Насчёт разделителя, в ответе Ghisler ничего не ответил, его заинтересовали предложенные мной альтернативные варианты, с передачей информации через SendMessage. Но, надеюсь, табулятор всё-таки использован будет.
_________________
In Pascal we trust
Back to top
View user's profile Send private message
Maximus



Joined: 07 Apr 2005
Posts: 927
Location: Украина, Кировоградская обл., г. Знаменка

Post (Separately) Posted: Mon Dec 18, 2006 10:07    Post subject: Reply with quote

Quote:
есть callback-функции, позволяющие плагину узнать о выделенных файлах
Может они и есть, но я о них ничего не знаю.
В описании интерфейса листер-плагинов об этом ничего не сказано.
_________________
tcPhonebook|AppLoader|Українізація TC|Ultimate Calendar
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic    Total Commander Forum Index -> Написание плагинов для Total Commander All times are GMT + 4 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group