Форум: "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