Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.05.2011, 12:18   #1
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
Вопрос Установка нескольких атрибутов сразу

Встала задача установки сразу нескольких атрибутов файлу, например: Файл только для чтения, Скрытый файл, Системный файл, Сжатый файл.
Атрибуты задаются через CheckBox's.
1. Куда поместить список всех выбранных атрибутов через CheckBox's?
2. Как их применить к файлу?
В ручную это будет так
Код:
FileSetAttr('test.txt', faReadOnly or faHidden or faSysFile or faArchive);
Shouldercannon вне форума Ответить с цитированием
Старый 01.05.2011, 15:00   #2
Daramant
Форумчанин
 
Регистрация: 06.01.2009
Сообщений: 340
По умолчанию

Цитата:
1. Куда поместить список всех выбранных атрибутов через CheckBox's?
Видимо так:
Код:
int attrs = 0;
if (checkbox1.Checked)
    attrs = attrs or faReadOnly;
if (checkbox2.Checked)
    attrs = attrs or faHidden;
...
FileSetAttr('test.txt', attrs);
Истинный успех – это то, что Вы сделали в сравнении с тем, что могли бы сделать.
Никогда не бойся делать то, что ты не умеешь. Помни, ковчег был построен любителем. Профессионалы построили "Титаник".
Daramant вне форума Ответить с цитированием
Старый 01.05.2011, 18:23   #3
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
По умолчанию

Возникла проблема при показе оповещения, в котором должен быть выведен список установленных атрибутов. Когда я задавал только один атрибут я делал так
Код:
          // 0 - атрибут изменён, 1 - не удалось изменить атрибут
          if FileSetAttr('file.txt', attr) = 0 then
          begin
            case attr of
            0: attr := 'Обычный файл';
            1: attr := 'Файл только для чтения';
            2: attr := 'Скрытый файл';
            4: attr := 'Системный файл';
            8: attr := 'Дисковод метка тома';
            16: attr := 'Папка или каталог';
            32: attr := 'Файл был изменен после последнего резервного копирования';
            64: attr := 'Ссылка или ярлык';
            128: attr := 'Сжатый файл';
            end;

            ShowMessage('Файлу "file.txt" установлен атрибут "' + attr + '"');
          end
Теперь при установке нескольких атрибутов он стал бесполезен.

Последний раз редактировалось Shouldercannon; 01.05.2011 в 18:37.
Shouldercannon вне форума Ответить с цитированием
Старый 01.05.2011, 20:15   #4
Daramant
Форумчанин
 
Регистрация: 06.01.2009
Сообщений: 340
По умолчанию

Цитата:
Теперь при установке нескольких атрибутов он стал бесполезен.
Теперь, получается, необходимо делать так:
Код:
if (attr and 0 = 0)
  'Обычный файл';
if (attr and 1 = 1)
  'Файл только для чтения';
...
Строки из каждого условия можно собрать в список и вывести.
Истинный успех – это то, что Вы сделали в сравнении с тем, что могли бы сделать.
Никогда не бойся делать то, что ты не умеешь. Помни, ковчег был построен любителем. Профессионалы построили "Титаник".
Daramant вне форума Ответить с цитированием
Старый 01.05.2011, 20:55   #5
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
По умолчанию

Код:
    // 0 - атрибут изменён, 1 - не удалось изменить атрибут
    if FileSetAttr(txt1, StrToInt(txt2)) = 0 then
    begin
      if (StrToInt(txt2) and 0) <> 0 then s := 'Обычный файл';
      if (StrToInt(txt2) and 1) <> 0 then s := s + ', ' + 'Файл только для чтения';
      if (StrToInt(txt2) and 2) <> 0 then s := s + ', ' + 'Скрытый файл';
      if (StrToInt(txt2) and 4) <> 0 then s := s + ', ' + 'Системный файл';
      if (StrToInt(txt2) and 8) <> 0 then s := s + ', ' + 'Дисковод метка тома';
      if (StrToInt(txt2) and 16) <> 0 then s := s + ', ' + 'Папка или каталог';
      if (StrToInt(txt2) and 32) <> 0 then s := s + ', ' + 'Файл был изменен после последнего резервного копирования';
      if (StrToInt(txt2) and 64) <> 0 then s := s + ', ' + 'Ссылка или ярлык';
      if (StrToInt(txt2) and 128) <> 0 then s := s + ', ' + 'Сжатый файл';

      if Copy(s, 1, 1) = ',' then s := Copy(s, 3, Length(s));

      ShowMessage('Файл "' + ExtractFileName(txt1) + '" по адресу "' + ExtractFilePath(txt1) + '" установлен атрибут "' + s + '"');
    end
Если устанавливаю атрибут Обычный файл или Обычный файл + какой либо другой атрибут, то в ShowMessage Обычный файл не показывается (пустота), сам атрибут применяется.
Shouldercannon вне форума Ответить с цитированием
Старый 01.05.2011, 21:03   #6
Daramant
Форумчанин
 
Регистрация: 06.01.2009
Сообщений: 340
По умолчанию

Цитата:
Если устанавливаю атрибут Обычный файл или Обычный файл + какой либо другой атрибут, то в ShowMessage Обычный файл не показывается (пустота), сам атрибут применяется.
Получается, т.к. (0 and 0) <> 0 всегда дает false.
Нужно:
Код:
if (StrToInt(txt2) and 0) = 0 then s := 'Обычный файл';
P.S. Альтернативная проверка для других условий:
Код:
...
if (StrToInt(txt2) and 1) = 1 then s := s + ', ' + 'Файл только для чтения';
if (StrToInt(txt2) and 2) = 2 then s := s + ', ' + 'Скрытый файл';
...
Added:
Или можно написать функцию:
Код:
function bool IsAttributeSpecified(int value, int attr)
begin
   Result := value and attr = attr;
end;
Истинный успех – это то, что Вы сделали в сравнении с тем, что могли бы сделать.
Никогда не бойся делать то, что ты не умеешь. Помни, ковчег был построен любителем. Профессионалы построили "Титаник".

Последний раз редактировалось Daramant; 01.05.2011 в 22:49.
Daramant вне форума Ответить с цитированием
Старый 01.05.2011, 22:37   #7
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
По умолчанию

Издевательство.
Код:
      if (StrToInt(txt2) and 0) = 0 then s := 'Обычный файл';
      if (StrToInt(txt2) and 1) = 1 then s := s + ', ' + 'Файл только для чтения';
      if (StrToInt(txt2) and 2) = 2 then s := s + ', ' + 'Скрытый файл';
      if (StrToInt(txt2) and 4) = 4 then s := s + ', ' + 'Системный файл';
      if (StrToInt(txt2) and 8) = 8 then s := s + ', ' + 'Дисковод метка тома';
      if (StrToInt(txt2) and 16) = 16 then s := s + ', ' + 'Папка или каталог';
      if (StrToInt(txt2) and 32) = 32 then s := s + ', ' + 'Файл был изменен после последнего резервного копирования';
      if (StrToInt(txt2) and 64) = 64 then s := s + ', ' + 'Ссылка или ярлык';
      if (StrToInt(txt2) and 128) = 128 then s := s + ', ' + 'Сжатый файл';
Атрибут Обычный файл показывается даже если CheckBox1 (Обычный файл) не выделен.

При получении атрибута проблем нет, всё правильно выводится
Код:
var
  attr: Integer;
  s: string;
begin
  attr := FileGetAttr(Edit1.Text);
  if (attr and 0) <> 0 then s := 'Обычный файл';
  if (attr and 1) <> 0 then s := s + ', ' + 'Файл только для чтения';
  if (attr and 2) <> 0 then s := s + ', ' + 'Скрытый файл';
  if (attr and 4) <> 0 then s := s + ', ' + 'Системный файл';
  if (attr and 8) <> 0 then s := s + ', ' + 'Дисковод метка тома';
  if (attr and 16) <> 0 then s := s + ', ' + 'Папка или каталог';
  if (attr and 32) <> 0 then s := s + ', ' + 'Файл был изменен после последнего резервного копирования';
  if (attr and 64) <> 0 then s := s + ', ' + 'Ссылка или ярлык';
  if (attr and 128) <> 0 then s := s + ', ' + 'Сжатый файл';

  if Copy(s, 1, 1) = ',' then s := Copy(s, 3, Length(s));

  ShowMessage('Файл "' + ExtractFileName(Edit1.Text) + '" по адресу "' + ExtractFilePath(Edit1.Text) + '" имеет атрибут "' + s + '"');
А при установке косячит.

Последний раз редактировалось Shouldercannon; 01.05.2011 в 23:01.
Shouldercannon вне форума Ответить с цитированием
Старый 01.05.2011, 22:49   #8
Daramant
Форумчанин
 
Регистрация: 06.01.2009
Сообщений: 340
По умолчанию

Цитата:
Атрибут Обычный файл показывается даже если CheckBox1 (
(0 and 0) <> 0 всегда дает false.
(0 and 0) = 0 всегда дает true.

Тут надо использовать какое-то другое условие.
faAnyFile - это любой файл, даже каталог, поэтому этот атрибут можно вообще опустить.
Истинный успех – это то, что Вы сделали в сравнении с тем, что могли бы сделать.
Никогда не бойся делать то, что ты не умеешь. Помни, ковчег был построен любителем. Профессионалы построили "Титаник".
Daramant вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
заполнение сразу нескольких однотипных значений Domanoff БД в Delphi 2 22.04.2010 13:37
Возможно ли изменить колонтитул нескольких документов сразу Grant84 Microsoft Office Word 2 14.04.2010 18:41
Создание сразу нескольких txt файлов Nice42ru Помощь студентам 11 11.02.2010 18:35
Установка атрибутов файлу в ShellListView artemavd Общие вопросы Delphi 7 12.01.2010 09:35
Получение и установка атрибутов файла Волк Microsoft Office Excel 1 21.05.2009 04:56