Вверх ↑
Этот топик читают: Гость
Ответов: 1173
Рейтинг: 49
#1: 2012-06-15 13:10:46 ЛС | профиль | цитата
Здравствуйте!
Собственно, сабж в названии: нужно узнать индекс (номер) строки, в которой произошли изменения в RichEdit.
Агоритм должен быть быстрый.
Заранее спасибо.
карма: 0

0
Ответов: 3889
Рейтинг: 362
#2: 2012-06-15 13:24:58 ЛС | профиль | цитата
Ex_ писал(а):
Агоритм должен быть быстрый

Нет уж, будьте добры берите что дают code_28182.txt
------------ Дoбавленo в 13.24:
Схема простейшая, не считает добавление строки изменением.
карма: 1

0
файлы: 1code_28182.txt [1KB] [111]
Ответов: 1173
Рейтинг: 49
#3: 2012-06-15 13:29:16 ЛС | профиль | цитата
1nd1g0, спасибо, но есть небольшая проблема -- при переводе каретки первый символ не засчитывается.
карма: 0

0
Ответов: 3889
Рейтинг: 362
#4: 2012-06-15 13:32:24 ЛС | профиль | цитата
Ex_ писал(а):
при переводе каретки первый символ не засчитывается

Естественно, это и считается созданием строки, можно добавить отслеживание создания новых строк и синхронизировать списки, тогда первичное заполнение тоже будет учитываться. Вообще всё зависит от того, как у Вас изменяют строки, если только вручную, то у текстовых контролов, в принципе, можно попробовать выявить текущую строку редактирования и считать её изменённой, что быстрее сравнений, но не так универсально. И RichEdit не имеет штатного атрибута номера текущей строки, позиция курсора измеряется в символах от начала всего текста.
карма: 1

0
Ответов: 1173
Рейтинг: 49
#5: 2012-06-15 14:03:53 ЛС | профиль | цитата
1nd1g0, попробовал так, но что-то не работает:
code_28184.txt
------------ Дoбавленo в 14.03:
Кстати, у RE есть точка EndIdx, но в pas-нике её нет
карма: 0

0
файлы: 1code_28184.txt [1.1KB] [66]
Ответов: 3889
Рейтинг: 362
#6: 2012-06-15 14:10:13 ЛС | профиль | цитата
Ex_ писал(а):
в pas-нике её нет

Она унаследована у EWinList (который её унаследовал от WinList и т.д. и т.п.).
карма: 1

0
Ответов: 1173
Рейтинг: 49
#7: 2012-06-15 15:01:44 ЛС | профиль | цитата
Всё, понял: нужно организовать список/массив, записывать Position, как увеличится EndIdx -- записывать в новую строку/элемент, затем при проверке смотреть, в какой строке/элементе лежит нужный Position. Как сделаю, выложу.
------------ Дoбавленo в 15.01:
Подскажите, кто-нибудь, в чём проблема?

Add(RichEdit,9333498,133,175)
{
Left=10
Top=10
Width=340
Height=185
Point(Position)
Point(EndIdx)
link(onChange,3737871:doEvent1,[])
}
Add(Label,2765785,462,343)
{
Left=10
Top=205
}
Add(IntegerArray,10814854,378,182)
{
IntArray=[]
}
Add(ArrayRW,317121,378,343)
{
link(onRead,2765785:doText,[])
link(Array,10814854:Array,[])
link(Index,13840914:Var,[])
link(Value,9333498:Position,[(398,278)(160,278)])
}
Add(Button,10973677,140,336)
{
Left=295
Top=205
Data=Integer(1)
link(onClick,8314777:doEvent1,[])
}
Add(GetIndexData,13840914,385,238)
{
link(Data1,9333498:EndIdx,[(391,226)(167,226)])
link(Data2,11084464:Text,[(398,226)(454,226)])
}
Add(Edit,11084464,448,182)
{
Left=80
Top=200
Text=""
DataType=2
}
Add(Hub,8314777,182,336)
{
link(onEvent1,5118320:doWork3,[(290,342)])
link(onEvent2,317121:doRead,[])
}
Add(Hub,3737871,182,175)
{
link(onEvent1,10761919:doData,[])
link(onEvent2,317121:doWrite,[(230,188)(230,356)])
}
Add(DoData,10761919,238,175)
{
Data=Integer(0)
link(onEventData,5118320:doWork1,[(290,181)])
}
Add(HubEx,5118320,286,238)
{
link(onEvent,13840914:doIndex,[])
}
карма: 0

0
Ответов: 1821
Рейтинг: 168
#8: 2012-06-15 15:05:38 ЛС | профиль | цитата
Ex_, уточните - какая проблема и что должно быть.
карма: 5

0
Ответов: 1173
Рейтинг: 49
#9: 2012-06-15 15:09:01 ЛС | профиль | цитата
sаmakacd, должно выдавать сохранённый в массиве Position, а индекс (откуда брать значение) должно брать из ЭдитБокса.
[flood]
sаmakacd писал(а):
какя
Точно, какя какая-то [/flood]
карма: 0

0
Ответов: 3889
Рейтинг: 362
#10: 2012-06-15 15:52:02 ЛС | профиль | цитата
Ex_, У Вас постоянно "сбрасывается" GetIndexData даже при простом движении курсора в RichEdit (появляется событие onChange).
карма: 1

0
Ответов: 1173
Рейтинг: 49
#11: 2012-06-15 16:00:23 ЛС | профиль | цитата
1nd1g0 писал(а):
У Вас постоянно "сбрасывается" GetIndexData
Но перед чтением массива он устанавливается в 1, так что должно работать.
карма: 0

0
Ответов: 8961
Рейтинг: 824
#12: 2012-06-15 16:15:14 ЛС | профиль | цитата
Ex_,
1) Запоминать положение курсора при редактировании и смысла нет, т. к. длина строки меняется, и запомненные положения его за местом редактирования не соответствуют действительности
2) В RichEdit количество строк (точка внизу) считается не по символам 10 и 13, а по видимому разбиению строк и тоже изменяется при именении размеров RichEdit-а
Логика работы должна это учитывать
------------ Дoбавленo в 16.13:

Add(MainForm,2953706,539,140)
{
}
Add(RichEdit,9333498,301,28)
{
Left=10
Top=10
Width=340
Height=185
Strings=#7:флоывав|6:ьтячси|7:щзйцшге|
Point(Position)
link(onChange,13636937:doValue,[])
}
Add(Label,2765785,539,98)
{
Left=10
Top=205
}
Add(IntegerArray,10814854,483,21)
{
IntArray=[]
}
Add(ArrayRW,317121,455,98)
{
link(onRead,2765785:doText,[])
link(Array,10814854:Array,[(461,85)(489,85)])
link(Value,9333498:Position,[(475,75)(328,75)])
}
Add(Edit,11084464,301,84)
{
Left=80
Top=200
Text="0"
DataType=2
link(onEnter,1582635:doEvent1,[])
}
Add(Hub,1582635,343,91)
{
link(onEvent1,11084464:doText2,[(363,97)(363,79)(289,79)(289,97)])
link(onEvent2,317121:doRead,[])
}
Add(DoData,11914164,490,140)
{
link(onEventData,2953706:doCaption,[])
link(Data,10814854:Count,[])
}
Add(Hub,5751639,427,112)
{
link(onEvent1,317121:doAdd,[])
link(onEvent2,11914164:doData,[(450,125)(450,146)])
}
Add(MemFifo,13636937,378,28)
{
link(onData,10693080:doCompare,[(421,34)(421,87)(366,87)(366,118)])
}
Add(If_else,10693080,378,112)
{
Type=5
link(onTrue,5751639:doEvent1,[])
link(Op1,13636937:Value1,[])
link(Op2,13636937:Value2,[])
}
------------ Дoбавленo в 16.15:
Кстати, просто установка курсора на поле тоже вызывает событие onChange
карма: 19

0
Ответов: 1173
Рейтинг: 49
#13: 2012-06-15 16:27:30 ЛС | профиль | цитата
Леонид, что-то не пойму, как ваша схема работает
карма: 0

0
Ответов: 8961
Рейтинг: 824
#14: 2012-06-15 16:40:02 ЛС | профиль | цитата
Ex_, в массив запоминаются положения курсора при внесении изменений. Посмотреть их можно по индексу в Edit нажав Enter.
Два последних события запоминаются в MemFifo и их неравенство соответствуют изменению и положение курсора добавляется в массив.
Вот ещё схемка по подсчёту строк в RichEdit-е: code_28191.txt
карма: 19

0
файлы: 1code_28191.txt [2.3KB] [153]
Ответов: 1173
Рейтинг: 49
#15: 2012-06-15 16:59:12 ЛС | профиль | цитата
Леонид, спасибо, однако, не думал, что понадобятся такие вот "пляски"
Тема закрыта.
карма: 0

0
15
Сообщение
...
Прикрепленные файлы
(файлы не залиты)