Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.03.04;
Скачать: CL | DM;

Вниз

Ошибка в OpenSaveDialog   Найти похожие ветки 

 
Don ©   (2006-06-14 13:31) [0]

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


 
ECM ©   (2006-06-14 13:46) [1]


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

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

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


 
Don ©   (2006-06-14 14:16) [2]

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


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


> Дело в том, что нет результата выбора пользователя. Включил
> он 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 15:48) [4]

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


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

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


 
ECM ©   (2006-06-14 17:42) [6]


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

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


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

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


 
ECM ©   (2006-06-14 19:20) [8]

Ну тогда так:

 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
...


 
Don ©   (2006-06-15 10:49) [9]

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


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

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


 
Don ©   (2006-06-15 16:58) [11]

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


 
ECM ©   (2006-06-15 17:08) [12]


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

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


 
Don ©   (2006-06-15 17:21) [13]

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


 
ECM ©   (2006-06-15 17:37) [14]

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


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

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


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

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



Страницы: 1 вся ветка

Текущий архив: 2007.03.04;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.038 c
2-1171294166
well
2007-02-12 18:29
2007.03.04
Excel. Работа с рисунком.


2-1171376695
Gtnheirby
2007-02-13 17:24
2007.03.04
Не восстанавливается БД


3-1165411941
ergoist
2006-12-06 16:32
2007.03.04
Обновление записи


6-1158733101
mat99
2006-09-20 10:18
2007.03.04
обработка mailto в delphi


15-1170824825
boriskb
2007-02-07 08:07
2007.03.04
Ваше мнение о проекте