Форум: "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.GetSelStartfunction 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.049 c