Как я могу использовать перечисление Windows SpecialFolder в Dynamics NAV - PullRequest
0 голосов
/ 03 марта 2020

Я хочу получить доступ к перечислению Windows SpecialFolder из кода C / AL. Каков наилучший способ сделать это?

1 Ответ

0 голосов
/ 03 марта 2020

После некоторых исследований и испытаний я придумал следующие методы. Они могут go в Codeunit или Codeunit File Management (419). В конце я также включил метод TestSpecialFolders.

1. GetSpecialFolder takes a SpecialFolder enum value and returns the associated path
2. GetSpecialFolders returns all of the names and values in a temp Name/Value Buffer table (823)
   a. LoadSpecialFolder is a helper function to accomplish the task

3. GetSpecialFolderNames returns a comma delimited list of SpecialFolder enum Names
4. GetSpecialFolderValues returns a comma and newline delimited list of SpecialFolder enum Values
5. GetSpecialFolderNamesAndValues returns a list of SpecialFolder enum Names and Values

6. TestSpecialFolders

Обратите внимание, что значения перечисления Do tNet имеют a. разделитель вместо :: separator.

Обратите внимание, что иногда, но не всегда, можно сделать Do tNet переменную версии agnosti c, удалив свойства Version, Culture и PublicKeyToken.

Например, System.Drawing.Bitmap.'System.Drawing 'вместо полностью определенного System.Drawing.Bitmap.'System.Drawing, Версия = 4.0.0.0, Culture = нейтральный, PublicKeyToken = b03f5f7f11d50a3a '

Наслаждайтесь ...

PROCEDURE GetSpecialFolder@1000000008("Special Folder"@1000000000 : DotNet "'mscorlib'.System.Environment+SpecialFolder") : Text;
VAR
  Environment@1000000001 : DotNet "'mscorlib'.System.Environment";
BEGIN
  EXIT(Environment.GetFolderPath("Special Folder"));
END;

PROCEDURE GetSpecialFolders@1000000003(VAR "Special Folders List"@1000000000 : TEMPORARY Record 823);
VAR
  ID@1000000002 : Integer;
  Counter@1000000001 : Integer;
  SpecialFolders@1000000003 : DotNet "'mscorlib'.System.Environment+SpecialFolder";
BEGIN
  CLEAR("Special Folders List");
  "Special Folders List".RESET;
  "Special Folders List".DELETEALL;
  "Special Folders List".SETCURRENTKEY(ID);

  // It would be nice to be able to iterate these.
  LoadSpecialFolder(SpecialFolders.Desktop, ID, "Special Folders List");
  LoadSpecialFolder(SpecialFolders.Programs, ID, "Special Folders List");
  LoadSpecialFolder(SpecialFolders.Personal, ID, "Special Folders List");
  LoadSpecialFolder(SpecialFolders.MyDocuments, ID, "Special Folders List");
  LoadSpecialFolder(SpecialFolders.Favorites, ID, "Special Folders List");
  LoadSpecialFolder(SpecialFolders.Startup, ID, "Special Folders List");
  LoadSpecialFolder(SpecialFolders.Recent, ID, "Special Folders List");
  LoadSpecialFolder(SpecialFolders.SendTo, ID, "Special Folders List");
  LoadSpecialFolder(SpecialFolders.StartMenu, ID, "Special Folders List");
  LoadSpecialFolder(SpecialFolders.MyMusic, ID, "Special Folders List");
  LoadSpecialFolder(SpecialFolders.DesktopDirectory, ID, "Special Folders List");
  LoadSpecialFolder(SpecialFolders.MyComputer, ID, "Special Folders List");
  LoadSpecialFolder(SpecialFolders.Templates, ID, "Special Folders List");
  LoadSpecialFolder(SpecialFolders.ApplicationData, ID, "Special Folders List");
  LoadSpecialFolder(SpecialFolders.LocalApplicationData, ID, "Special Folders List");
  LoadSpecialFolder(SpecialFolders.InternetCache, ID, "Special Folders List");
  LoadSpecialFolder(SpecialFolders.Cookies, ID, "Special Folders List");
  LoadSpecialFolder(SpecialFolders.History, ID, "Special Folders List");
  LoadSpecialFolder(SpecialFolders.CommonApplicationData, ID, "Special Folders List");
  LoadSpecialFolder(SpecialFolders.System, ID, "Special Folders List");
  LoadSpecialFolder(SpecialFolders.ProgramFiles, ID, "Special Folders List");
  LoadSpecialFolder(SpecialFolders.MyPictures, ID, "Special Folders List");
  LoadSpecialFolder(SpecialFolders.CommonProgramFiles, ID, "Special Folders List");

  Counter := "Special Folders List".COUNT;
END;

PROCEDURE GetSpecialFolderNames@1000000007(VAR "Special Folders List"@1000000000 : TEMPORARY Record 823;VAR Names@1000000002 : Text);
VAR
  Counter@1000000001 : Integer;
  Delimiter@1000000003 : Text;
BEGIN
  Names := '';
  WITH "Special Folders List" DO
  BEGIN
    RESET;
    SETCURRENTKEY(ID);
    Counter := COUNT;
    IF FINDFIRST THEN
    BEGIN
      REPEAT
        Names += Delimiter + Name;
        Delimiter := ', ';
      UNTIL NEXT = 0;
    END;
  END;
END;

PROCEDURE GetSpecialFolderValues@1000000012(VAR "Special Folders List"@1000000000 : TEMPORARY Record 823;VAR Values@1000000002 : Text);
VAR
  Counter@1000000001 : Integer;
  Delimiter@1000000003 : Text;
BEGIN
  Values := '';
  WITH "Special Folders List" DO
  BEGIN
    RESET;
    SETCURRENTKEY(ID);
    Counter := COUNT;
    IF FINDFIRST THEN
    BEGIN
      REPEAT
        Values += Delimiter + Value;
        Delimiter := ', \';
      UNTIL NEXT = 0;
    END;
  END;
END;

PROCEDURE GetSpecialFolderNamesAndValues@1000000015(VAR "Special Folders List"@1000000000 : TEMPORARY Record 823;VAR Names@1000000002 : Text;VAR Values@1000000005 : Text);
VAR
  Counter@1000000001 : Integer;
  Delimiter@1000000003 : Text;
BEGIN
  GetSpecialFolderNames("Special Folders List", Names);
  GetSpecialFolderValues("Special Folders List", Values);
END;

LOCAL PROCEDURE LoadSpecialFolder@1000000036(SpecialFolders@1000000004 : DotNet "'mscorlib'.System.Environment+SpecialFolder";VAR ID@1000000002 : Integer;VAR "Special Folders List"@1000000001 : TEMPORARY Record 823);
VAR
  Environment@1000000000 : DotNet "'mscorlib'.System.Environment";
  EnumName@1000000003 : Text;
  EnumValue@1000000005 : Text;
BEGIN
  ID += 1;
  EnumName := FORMAT(SpecialFolders);
  EnumValue := Environment.GetFolderPath(SpecialFolders);

  "Special Folders List".INIT;
  "Special Folders List".ID := ID;
  "Special Folders List".Name := EnumName;
  "Special Folders List".Value := EnumValue;
  "Special Folders List".INSERT;
END;

LOCAL PROCEDURE TestSpecialFolders@1000000014();
VAR
  SpecialFoldersList@1000000003 : TEMPORARY Record 823;
  FileManagement@1000000002 : Codeunit 419;
  SpecialFolder@1000000004 : DotNet "'mscorlib'.System.Environment+SpecialFolder";
  Names@1000000005 : Text;
  Values@1000000006 : Text;
BEGIN
  SpecialFolder := SpecialFolder.Desktop;
  MESSAGE('%1\    %2', FORMAT(SpecialFolder), FileManagement.GetSpecialFolder(SpecialFolder));
  SpecialFolder := SpecialFolder.Favorites;
  MESSAGE('%1\    %2', FORMAT(SpecialFolder), FileManagement.GetSpecialFolder(SpecialFolder));

  FileManagement.GetSpecialFolders(SpecialFoldersList);

  FileManagement.GetSpecialFolderNames(SpecialFoldersList, Names);
  MESSAGE('Special Folder Names:\\''%1''.', Names);

  FileManagement.GetSpecialFolderValues(SpecialFoldersList, Values);
  MESSAGE('Special Folder Values:\\''%1''.', Values);

  FileManagement.GetSpecialFolderNamesAndValues(SpecialFoldersList, Names, Values);
  MESSAGE('Special Folder Names:\\''%1''\\Special Folder Values:\\''%2''.', Names, Values);

  MESSAGE('Completed');
END;
...