Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "KOL";
Текущий архив: 2007.03.04;
Скачать: [xml.tar.bz2];

Вниз

Ошибка в 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 вся ветка

Форум: "KOL";
Текущий архив: 2007.03.04;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.044 c
2-1171442801
DelphiLexx
2007-02-14 11:46
2007.03.04
Получить имя директории


2-1171454196
newbie2
2007-02-14 14:56
2007.03.04
Немодальное окно в модальном приложении, возможно?


15-1170155727
Vlad Oshin
2007-01-30 14:15
2007.03.04
Не пора прикрутить ввод кода на картинке для права задать вопрос?


4-1161262695
DevilDevil
2006-10-19 16:58
2007.03.04
Серый Битмап


2-1171549235
Соня
2007-02-15 17:20
2007.03.04
Paradox - Oracle





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский