Как получить текущую директорию.

Автор snegok74, 31.07.12, 09:23:48

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

snegok74

Помогите найти способ получить текущую директорию в компасе и именно ту которая откроется при вызове диалога открытия файла.

Есть вариант использовать GetCurrentDir из SysUtils,  но если компас только что открыт он выдаёт папку где приложение установлено.

#1
ksSystemPath и ksSystemPathW описаны в файле LibTool.pas

// Экспортный номер - 194 kAPI2D5.dll
//------------------------------------------------------------------------------------------------
//  Выдать системный путь установленного типа (типы определены в ltdefine.h (LtDefine.pas))
//  sptSYSTEM_FILES .. sptCURR_SHEETMETAL_FILES
//  Если buff не равен NULL и buffLen больше или равен реальной длине строки пути
//  (включая завершающий 0), возвращается количество переписанных байт
//  В противном случае возвращается требуемый размер буфера
//  Пути не завершаются символом '\' (за исключением случая корневого каталога
//  устройства - "<drive>:\")
//------------------------------------------------------------------------------------------------
function ksSystemPath( buff     : PChar;
                       buffLen  : Integer;
                       pathType : Integer) : Integer; stdcall;


// Экспортный номер - 917 kAPI2D5.dll
//------------------------------------------------------------------------------------------------
//  Выдать системный путь установленного типа (типы определены в ltdefine.h (LtDefine.pas))
//  sptSYSTEM_FILES .. sptCURR_SHEETMETAL_FILES
//  Если buff не равен NULL и buffLen больше или равен реальной длине строки пути
//  (включая завершающий 0), возвращается количество переписанных байт
//  В противном случае возвращается требуемый размер буфера
//  Пути не завершаются символом '\' (за исключением случая корневого каталога
//  устройства - "<drive>:\")
//------------------------------------------------------------------------------------------------
function ksSystemPathW( buff     : PWideChar;
                        buffLen  : Integer;
                        pathType : Integer) : Integer; stdcall;

snegok74

спасибо огромное. работает!
и подскажите пожалуйста, так корректно использовать эту функцию? я в смысле про типы данных (String и PChar)

procedure MyProc;
  var  CurrPath   : array [0..255] of Char;
        SCurrPath : String;
begin
  ksSystemPath(CurrPath,255,sptCURR_WORK_FILES);
  SCurrPath := StrPas(CurrPath);
  showmessage(SCurrPath);
end;

Вот Вам рисунок с отладчика, я использовал ksSystemPathW и Вам советую использовать её, так, как XP вымирающая система:
1. - Мусор в массиве при входе в процедуру. 
2. - Очистка массива от мусора ZeroMemory(@CurrPath,512);
3. - Массив после использования ksSystemPathW.
4. - Код процедуры и результат в строке, после копирования из массива.
По поводу String и PChar, рекомендую взять любую книгу по Delphi и почитать, там довольно подробно расписана разница.

snegok74

Нижайший поклон за такой развернутый ответ.
Спасибо!

snegok74

И все таки еще один вопрос возник ...
как установить текущий путь для открытия файлов?
1. надеялся что функция OpenDocument  при открытии фалов будет автоматически менять текущий путь, но нет, не меняет она его.
2. ksSystemPath и ksSystemPathW - только выдают результат
3. применение SetCurrentDir тоже не помогло.



Попробуйте ksChoiceFile, ksChoiceFileW или ksChoiceFileAppointedDir.

snegok74

#7
Единственное направление которое вижу это используя ksChoiceFileW:

1. подписаться на событие OnShow диалога открытия файла;
2.   запустить второй поток;
2.1 вызвать диалог открытия из второго потока ksChoiceFileW;
3. поймать событие OnShow, вписать в диалог нужный файл, и нажать ок;
4. закрыть второй поток;
5. отписаться от событий.

чтотокактосложновато  :)))))
Может порекомендуете что то другое?

#8
Воспользуйтесь нужной константой функции ksSystemPathW.

Типы системных папок
sptSYSTEM_FILES - 0  - папка системных файлов,
sptLIBS_FILES - 1 - папка файлов библиотек,
sptTEMP_FILES - 2 - папка хранения временных файлов,
sptCONFIG_FILE - 3 - папка хранения файлов конфигурации системы.
sptINI_FILE - 4 - папка хранения INI-файла системы.
sptBIN_FILE - 5 - папка исполняемых файлов системы
sptPROJECT_FILES - 6 - папка сохранения kompas.prj
sptDESKTOP_FILES - 7 - папка сохранения kompas.dsk
sptTEMPLATES_FILES - 8 - папка шаблонов КОМПАС-документов
sptPROFILES_FILES - 9 - папка сохранения профилей пользователя
sptWORK_FILES - 10 - рабочая папка
sptSHEETMETAL_FILES - 11 - папка таблиц сгибов
sptPARTLIB_FILES - 12 - папка PartLib
sptMULTILINE_FILES - 13 - папка шаблонов мультилинии
sptPRINTDEVICE_FILES - 14 - папка конфигураций плоттеров/принтеров

Последняя папка, использовавшаяся в диалогах Open|Save для:
sptCURR_WORK_FILES - 15 - открытия/сохранения файлов документов
sptCURR_LIBS_FILES - 16 - подключения прикладных библиотек и библиотек документов
sptCURR_SYSTEM_FILES - 17 - подключения библиотек стилей
sptCURR_PROFILES_FILES - 18 - загрузки/сохранения профиля
sptCURR_SHEETMETAL_FILES - 19 - загрузки таблиц сгибов

Выше на рисунке измените код, сделайте из него универсальную функцию, которая будет возвращать по константе то, что Вам нужно.
Создайте свой диалог открытия или воспользуйтесь стандартным уже готовым компонентом, который идёт со средой программирования, там меняется и устанавливается все.

snegok74

#9
Наверно я не правильно задал вопрос.
Создан свой диалог открытия файлов(с предварительным просмотром), который открывается по текущему пути Компаса используя код ksSystemPathW(@CurrPath,255,sptCURR_WORK_FILES);

но, после выбора и открытия файла командой-
OpenDocument(PAnsiChar(FileName),0);
текущий путь Компаса  не меняется!

поэтому подумываю реализовать это так - открывать файл не функцией  OpenDocument а при помощи стандартного диалога открытия Компаса ksChoiceFileW , но перед выводом его(диалога ) на экран, перехватывать его хендл, вписывать в диалог свое имя файла и нажимать в нем кнопку ОК(все это программно), и тогда текущий путь путь будет установлен на директорию из которой был открыт файл.

ну и вот вопрос - а может есть путь проще? а то это похоже на стрельбу по воробьям из пушки  :-)))

и прилагаю исходники(пока без попытки реализации задуманного).

Создайте свой диалог открытия или воспользуйтесь стандартным уже готовым компонентом, который идёт со средой программирования, там меняется и устанавливается все.

snegok74

Дошло о чем Вы говорите. Заменять стандартную кнопку открытия как то сурово  :)
НО, надо так надо. так уж точно проще.

Сделал себе функцию которая возвращает путь, в зависимости от входного параметра, константы которого определены в файле LDefin2D.pas, может кому пригодится.
//==============================================================================
function GetKompasSystemPathW(PathType:Integer):WideString;
var
CurrPath:array[0..255] of WideChar;
SCurrPath:WideString;
K:Integer;
begin
  ZeroMemory(@CurrPath,512);
  ksSystemPathW(@CurrPath,255,PathType);
  K:=0;
  SCurrPath:='';
  while CurrPath[K]<>#0 do
   begin
     SCurrPath:=SCurrPath+CurrPath[K];
     Inc(K);
   end;
  Result:=SCurrPath;
end;
//==============================================================================
+ Благодарностей: 1