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

Вниз

Использование EM_GETSEL в KOL   Найти похожие ветки 

 
Galkov ©   (2007-06-01 21:18) [0]

1) Ну во-первых TControl.GetSelStart
...
Result := LoWord( Perform( fCommandActions.aGetSelRange, 0, 0 ) )
...

Вроде бы логично делать как в PAS-версии для TControl.GetItemSelected
Типа так:
function TControl.GetSelStart: Integer;
var SR: TCharRange;
begin
 SR.cpMin := 0;
 if fCommandActions.aGetSelRange <> 0 then
   Perform( fCommandActions.aGetSelRange, Integer( @SR.cpMin ), 0 )
 else
 if fCommandActions.aExGetSelRange <> 0 then
   Perform( fCommandActions.aExGetSelRange, 0, Integer( @SR ) );
 Result := SR.cpMin;
end;


2) В ASM-версии того же TControl.GetSelStart для этих же строк стоит беспардонное:
...
        CALL     Perform
        CWDE
        RET
...

Причем тут ЗНАКОВОЕ расширение - никак не пойму

3) В свете п.1 могу предложить такую ASM-версию для TControl.GetSelStart
function TControl.GetSelStart: Integer;
asm
        XOR      EDX, EDX
        PUSH     EDX
        PUSH     EDX
        MOVZX    ECX, [EAX].fCommandActions.aGetSelRange
        JECXZ    @@1
        PUSH     EDX
        LEA      EDX,[ESP+4]
        PUSH     EDX
        JMP      @@2
@@1:
        MOVZX    ECX, [EAX].fCommandActions.aExGetSelRange
        JECXZ    @@exit
        PUSH     ESP
        PUSH     EDX
@@2:
        PUSH     ECX
        PUSH     EAX
        CALL     Perform
@@exit:
        POP      EAX
        POP      EDX
end;


4) Для TControl.GetItemSelected ASM-версия не соответствует PAS и уже не берет данные выходящие за 2 байта

5) В TControl.GetSelLength я вообще ничего понять не могу :(
...
   if (fCommandActions.aGetSelCount and $8000) = 0 then
     if Result >= 32768 then
       Result := HiWord( Result ) - LoWord( Result )
     else
     if Result < 0 then
       Result := 0;
...

Вроде бы первое условие отсекает LVM_
А второе, видимо, разделяет EM_ и LB_ (но уже не уверен)
И почему 32768...
И почему разница двух WORD-ов должна расширяться знаком...

Знаю что неправильно, что надо делать в вышеописанном стиле, а конкретных предложений дать не могу :((


 
Galkov ©   (2007-06-02 10:56) [1]


> Пардон, окном ошибся.

Я понял :))


> Почему 32768 - ну, для небольших текстов этого явно хватает.
>  Наверное, поэтому.

С короткими текстами - вопроса нет.
Но как я получаю такую багу?
Мой юзер, ничего даже не зная про EM_LIMITTEXT, грузит в Memo текст килобайт на 40 и спрашивает почему SelStart отрицательный получается

Вот он и CWDE (в PAS-версии-то все нормально).
Дальше начинаю разбираться...
"Быстрый фиксинг" для себя я сделал для TControl.GetSelStart - он постом выше
Про то, что он менее "SMALLEST" - как-то не очень похоже.
В чем сомнения: не знаю будет ли это работать на младших виндах (где EDIT по определению не больше 32К), добраться хотя бы до 98-й в ближайшее время - даже и не знаю как...
В этом плохом случае надо проверку в run-time делать :(


> Плохо, что не можете предложить (а почему, хватило же терпения
> и знаний, чтобы разобраться в нынешнем коде).

Да потому-что сомнения остаются

1) сомнения про TControl.GetSelStart - вот только-что выше

2) поправить несоответствие ASM и PAS версий для TControl.GetItemSelected - чисто техническая работа. Вопросов нет, кроме опять же сомений, как и для TControl.GetSelStart: не факт, что я сделаю менее "SMALLEST", нужна ли проверка версии винды в run-time

3) а в TControl.GetSelLength - это уже не просто механическая замена способа вызова Perform, а изменение способа селекции всех 3-х вариатов: ну явно >=32768, или <0 - не прокатывают в общем случае (про маленькие - нет вопросов).
Автор о чем-то думал, когда творил такое разделение - это не всегда усваивается из кодов... Отсутствие такого знания тормозит категорически, при прнятии самостоятельных решений такого плана.

Т.е.. тут нужны небольшие идеологические решения, на них у меня нахальства не хватает пока...
А техническая реализация - да не вопрос, в общем-то


> Насчет разницы 2х вордов все-таки непонятно, что непонятно.
>  Разница может быть и отрицательная, а ответ должен быть
> дворд (точнее Integer)

в TControl.GetSelLength - это я поспешил :( по инерции ляпнул
Все в этом аспекте там нормально, даже CWDE не стоит:
       PUSH      EAX
       POP       DX
       POP       AX
       SUB       AX, DX
       MOVZX     EAX, AX


Но этот 2-х байтный аспект - тоже не дело ведь :)


 
имя   (2007-06-17 23:48) [2]

Удалено модератором


 
имя   (2007-06-17 23:48) [3]

Удалено модератором


 
имя   (2007-06-17 23:49) [4]

Удалено модератором


 
имя   (2007-06-17 23:49) [5]

Удалено модератором



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

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

Наверх




Память: 0.48 MB
Время: 0.012 c
3-1187100144
Мистик
2007-08-14 18:02
2007.12.23
прямой доступ


15-1195700635
Slider007
2007-11-22 06:03
2007.12.23
С днем рождения ! 22 ноября 2007 четверг


2-1196306724
snake-as
2007-11-29 06:25
2007.12.23
не могу воспроизвести звук


2-1196172512
alll_23
2007-11-27 17:08
2007.12.23
Графический интерфейс


2-1195902105
ice321i
2007-11-24 14:01
2007.12.23
Аудит в InterBase 6.5