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

Вниз

Использование 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 вся ветка

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

Наверх




Память: 0.47 MB
Время: 0.041 c
2-1196208395
Кевларвестов Семен
2007-11-28 03:06
2007.12.23
Чтение данных с поврежденного CD


15-1195998290
Kostafey
2007-11-25 16:44
2007.12.23
Как сравнить директории


2-1196229163
d@nger
2007-11-28 08:52
2007.12.23
Как узнать противоположный цвет?


2-1196509892
WFS
2007-12-01 14:51
2007.12.23
Как сделать из цветного черно белое изображение


2-1196307370
TheEd
2007-11-29 06:36
2007.12.23
Как DBGrid отображает несколько записей, не меняя RecNo датасета?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский