Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Ошибка в OpenSaveDialog [Delphi, Windows]


Don ©   (2006-06-14 13:31:00) 

Вызываю диалог OpenSaveDialog (чистый KOL). Необходимо было получить результат, включена ли опция OSReadOnly или нет. К сожалению не получилось. Если это можно как-то по-другому реализовать, объясните плиз. Если нельзя, то большая просьба Владимиру, в следующей версии исправить код.


ECM   (2006-06-15 18:00:00) [1]

Как паллиатив - создайте свою функцию OpenSaveExecute и скопируйте туда код с нравящимися Вам исправлениями из TOpenSaveDialog.Execute
только добавьте параметр - указатель на OpenSaveDialog
а родной Execute - не вызвайте...


Don   (2006-06-15 17:41:00) [2]

Да я особо и не настаиваю. Спасибо за код (с asm-ом проблемы). Как вариант можно включить эти опции под директивой. Тогда кому не надо, код за собой тащить не будет :)


ECM   (2006-06-15 17:37:00) [3]

Ну тогда второй вариант как раз для Вас
[2] а выбор пользователя, в опции, при повторном открытии (или сразу после закрытия), Вам никто не мешает затолкать самостоятельно. Просто большинству (и Автору) это вобщем то особо не нужно - а код будет тянуться  в  модуль...


Don   (2006-06-15 17:21:00) [4]

Да я не горячусь :) Просто как раз не вижу смысла в описании этих опций, если я не могу узнать результат операции. OSHideReadOnly показывает checkbox  в котором пользователь может указать открывает он файл для чтения или для записи. Включен этот checkbox или нет как раз и указыватся OSReadOnly. Но получается, если я не могу узнать результат этой операции, то мне эти свойства совсем не нужны.
А насчет практики... Нужно открыть файл, причем для чтения его может открыть кто угодно, а если для записи, нужно ввести пароль.


ECM   (2006-06-15 17:08:00) [5]


> Убрать их нафик. Зачем их описывал?

Не надо горячиться... :) Они как раз нужны, да и дополнительный код не просят. А размер кода - это приоритет для KOL.
А вот какой особый смысл в считывании этой опции то?
Я что то затрудняюсь даже найти применение....:(


Don   (2006-06-15 16:58:00) [6]

Ну тогда какой смысл в опциях OSReadOnly, OSHideReadOnly, OSNoReadonlyReturn.
Убрать их нафик. Зачем их описывал?


Vladimir Kladov   (2006-06-15 15:16:00) [7]

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


Don   (2006-06-15 10:49:00) [8]

С другой стороны первый вариант более правильный. В опциях сохраняется OSReadonly. И при открытии окна в следующий раз, checkbox будет иметь то состояние, которое выбрал пользователь в прошлый раз. А так приходится самому  проверять свойство OpenReadOnly и добавлять/удалять OSReadOnly в опции.


ECM   (2006-06-14 19:20:00) [9]

Ну тогда так:

 TOpenSaveDialog = object( TObj )
 {* Object to show standard Open/Save dialog. Initially provided
    for XCL by Carlo Kok. }
 protected
 ...
{+++}
   fOpenReadOnly: Boolean;
{/+++}
 public
...
{+++}
   property OpenReadOnly: Boolean read fOpenReadOnly;
{/+++}
 end;
...
{$IFDEF _ASM_VERSION}
//[function TOpenSaveDialog.Execute]
function TOpenSaveDialog.Execute: Boolean;
asm
...
       MOV      EAX, [ESP+4].TOpenFileName.nFilterIndex
       MOV      [EBX].FFilterIndex, EAX
{+++}
       MOV      EAX,[ESP+4].TOpenFileName.Flags
       AND      EAX, OFN_READONLY
       MOV      DWORD PTR [EBX].FOpenReadOnly,EAX
{/+++}
       MOV      EAX, [ESP+4].TOpenFileName.lpstrFile
       MOV      EDX, EAX
       XOR      ECX, ECX
...
end;
{$ELSE ASM_VERSION} //Pascal
function TOpenSaveDialog.Execute: Boolean;
...
 if result then begin
   fFilterIndex := ofn.nFilterIndex; // by Vadim
{+++}
   fOpenReadOnly := (OFN_READONLY and ofn.Flags) <> 0;
{/+++}
   if OSAllowMultiSelect in foptions then begin
...


Vladimir Kladov   (2006-06-14 18:49:00) [10]

Щачем его (или на его основе что-то инициализировать). Это просто read only свойство, которое возвратит результат Execute. Надо программисту - сам пусть с ним что хочет то и делает.


ECM   (2006-06-14 17:42:00) [11]


> Vladimir Kladov   (14.06.06 17:20) [5]

Возможно... так код будет меньше. Но появится неопределённость - эта опция будет присутствовать в двух местах и возможно давать разные результаты. Опять же при создании диалога свойство прийдется инициализировать исходя из наличия OSReadOnly в Options. Либо городить методы Set(Get)OpenReadOnly - что опять же добавит код. Иначе всё это придётся описывать как "фичу" KOL - поэтому ИМХО уж лучше не вводить доп. свойство


Vladimir Kladov   (2006-06-14 17:20:00) [12]

Не слишком ли много команд (машинных) для фичи, которая понадобилась-то 1 раз за 6 лет? Достаточно свойства OpenReadOnly: boolean и присваивания ей того выражения что под if. И не надо менять опции.


Don   (2006-06-14 15:48:00) [13]

Большое спасибо.


ECM   (2006-06-14 15:31:00) [14]


> Дело в том, что нет результата выбора пользователя. Включил
> он checkbox "readonly" или нет (при выключеной опции OSHideReadOnly).
>

Тогда "ой" (проблема в [0] была не раскрыта или я "не въехал")
Для решения проблемы внесите сл. добавления в файл KOL.PAS самостоятельно (исправления выделены):

{$IFDEF ASM_VERSION}
//[function TOpenSaveDialog.Execute]
function TOpenSaveDialog.Execute: Boolean;
asm
...
@@8:
       PUSH     EAX
       XOR      EDX, EDX
       TEST     EAX, EAX
       JZ       @@10

       MOV      EAX, [ESP+4].TOpenFileName.nFilterIndex
       MOV      [EBX].FFilterIndex, EAX
{+ecm}
       MOV      AX, [EBX].FOptions
       TEST     BYTE PTR [ESP+4].TOpenFileName.Flags, OFN_READONLY
       JZ       @@81
       OR       AX, 1 shl OSReadOnly
       JMP      @@82
@@81:
       AND      AX, NOT (1 shl OSReadOnly)
@@82:
       MOV      [EBX].FOptions,AX
{/+ecm}
       
       MOV      EAX, [ESP+4].TOpenFileName.lpstrFile
       MOV      EDX, EAX
       XOR      ECX, ECX

       TEST     [EBX].FOptions, 1 shl OSAllowMultiSelect
       JZ       @@10

       DEC      EAX
@@9:    INC      EAX
...
{$ELSE ASM_VERSION} //Pascal
function TOpenSaveDialog.Execute: Boolean;
...
 if fOpenDialog then
   result:=GetOpenFileName(CommDlg.POpenFileName( @ofn )^)
 else
   result:=GetSaveFileName(CommDlg.POpenFileName( @ofn )^);
 if result then begin
   fFilterIndex := ofn.nFilterIndex; // by Vadim
{+ecm}
   if ((OFN_READONLY and ofn.Flags) <> 0) then Include(FOptions,OSReadOnly)
   else Exclude(FOptions,OSReadOnly);
{/+ecm}

   if OSAllowMultiSelect in foptions then begin
...


Don   (2006-06-14 14:16:00) [15]

Дело в том, что нет результата выбора пользователя. Включил он checkbox "readonly" или нет (при выключеной опции OSHideReadOnly).
Если сам добавляешь в опции OSReadOnly или убираешь, тогда никаких проблем.


ECM   (2006-06-14 13:46:00) [16]


> Необходимо было получить результат, включена ли опция OSReadOnly
> или нет. К сожалению не получилось.

А уменя почемуто получилось :)

 if OSReadOnly in OpenSaveDialog1.Options then asm int 3 end;


Наверх

Титульная страница Поиск, карта сайта Написать письмо