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

Вниз

Вопрос про Memo   Найти похожие ветки 

 
kolokol   (2009-03-09 13:56) [0]

Как узнать "корректный" номер строки при WirdWrap = True, т.к. при WordWrap = False его значение другое, и меня интересует возможность получения этого значения, вне зависимости, включен перенос строк или нет.


 
kolokol   (2009-03-09 14:00) [1]


> WirdWrap = True

прошу прощения, WordWrap, конечно же)


 
kolokol   (2009-03-09 14:03) [2]

Ау, мастера, подскажите, гугль не гуглит!


 
Palladin ©   (2009-03-09 14:11) [3]

procedure TForm1.Memo1KeyUp(Sender: TObject; var Key: Word;
 Shift: TShiftState);
var
 l,c:Integer;
begin
 l:=Memo1.Perform(EM_LINEFROMCHAR,-1,0);
 c:=Memo1.Perform(EM_LINEINDEX,-1,0);
 Label1.Caption:=IntToStr(l)+":"+IntToStr(Memo1.SelStart-c);
end;


Вопрос только, зачем?


 
Palladin ©   (2009-03-09 14:13) [4]

Или еще проще. TMemo.CaretPos
Не понимаю, в чем была проблема в справку заглянуть?


 
kolokol   (2009-03-09 14:15) [5]

Код работает неверно (пробовал я много и иных вариаций подобного рода).
Пишется (чисто в студенческих целях) шифрование/дешифрование файлов, текст берется в Memo. Цикл шифрования проходится по строчкам.
Пусть есть три строки, тогда выведет нормально при WordWrap = False, однако стоит включить перенос, и строк (последняя длинная, а компонент растянут на малую ширину, и она переносится аж на три строчки) становится 5.


 
kolokol   (2009-03-09 14:16) [6]

Caretpos также неверно работает, будь все так просто, я бы не беспокоил уважаемы х Мастеров.


 
Palladin ©   (2009-03-09 14:20) [7]

Мля, тебе индекс в Lines нужен чтоли? Термин "нормальный" расшифоровать по нормальному нельзя было? Ты не поверишь, при включеном WordWrap Lines.Count все равно останется 3, какие проблемы?


 
kolokol   (2009-03-09 14:20) [8]

Хочу отметить, что авторы Блокнота так и не справились с этой проблемой, посчитав перенос строк и показ позиций курсора взаимоисключающими)


 
kolokol   (2009-03-09 14:21) [9]


> при включеном WordWrap Lines.Count все равно останется 3,
>  какие проблемы?

неправда. Lines.Count = 5. Я гарантирую это. Посмотрите сами.


 
Palladin ©   (2009-03-09 14:24) [10]

хм... и правда... звиняюсь... тогда выход только один, содержать рядышком TStringList с адекватным содержанием...


 
kolokol   (2009-03-09 14:27) [11]

Обидно, я и сам об этом подумал, но решил, что способ уж совсем дебильный)


 
Anatoly Podgoretsky ©   (2009-03-09 14:31) [12]

Дебильно привязываться к номеру визуальной строки, а претензии к физическому. Объяснение зачем это нужно пока не выдерживает критики.


 
Palladin ©   (2009-03-09 14:33) [13]

Хм, ну есть вариант держать не TStringList, а массив длин строк. И получать доступ к строкам из мемо при помощи кучи простейших математических пертурбаций. Тогда способ из "дебильного" легким нажатием кучи клавиш превращается из "дебильного" в изощренно-ректальный :)


 
kolokol   (2009-03-09 14:35) [14]

то есть Вы действительно поддерживаете, что необходимо работать с TStringList, а на Memo, пусть даже оно будет на экране, не оглядываться, и единственное, в чем оно будет связано с TStringList - синхронизация значений, т.е. по onChange что-то вида
memo1.wordwrap := false;
SL.Lines.Assign(memo1.Lines);
memo1.wordwrap := true;

Так?


 
kolokol   (2009-03-09 14:37) [15]

Паладин, не вполне понял вашу идею про массив длин строк. Поясните подробнее, коли можно.


 
Palladin ©   (2009-03-09 14:48) [16]

а чего непонятного то?

Var
li:TList;

Procedure AddLineToMemo(Const s:String;Memo:TMemo);
Begin
 If li.Count=0
  Then li.add(Pointer(Length(s)))
  Else li.Add(Pointer(Integer(li[li.count-1])+Length(s)));
 Memo.Lines.Add(s);
End;

Function GetNormalLineIndexFromPos(Memo:TMemo):Integer;
Var
 n,i:Integer;
Begin
 n:=Memo.SelStart;
 For i:=0 to li.Count-1 Do
  If n<=Integer(li[i]) Then
   Begin
    Result:=i;
    Exit;
   End;
End;


Что то на вроде этого


 
kolokol   (2009-03-09 14:57) [17]

Если есть три строки длиной 8, 5 и 22 символа соответственно, то список будет выглядеть как (не беру в расчет указатели для простоты)

8
13
35

так?


 
Palladin ©   (2009-03-09 15:00) [18]

да, ты посчитал правильно...


 
kolokol   (2009-03-09 15:02) [19]

Еще вопросик... А если использовать TStringList, то при событии onChange код

procedure TForm1.Memo1Change(Sender: TObject);
begin
Memo1.WordWrap := False;
SL.Assign(Memo1.Lines);
Memo1.WordWrap := True;
end;

выдает ошибку "List Index out of bounds(-1)". В чем проблема?


 
Palladin ©   (2009-03-09 15:22) [20]

а фих его знает...


 
kolokol   (2009-03-09 15:24) [21]

Причем это на одном-единственном файле)  с двумя строчками:

Это тестовый файл.
В нем несколько строк.


 
kolokol   (2009-03-09 15:26) [22]

Нет, вру: на одних файлах выдает, на других нет. Как корректно присвоить StringList-у содержимое Memo?


 
Palladin ©   (2009-03-09 15:27) [23]

StringList.Text:=Memo.Text


 
kolokol   (2009-03-09 15:30) [24]

А теперь сделайте тестовый проект и попробуйте)


 
Smile   (2009-03-09 15:33) [25]

Чат находится здесь:
http://www.delphimaster.ru/chat/
а кроме того, для личной переписки существуют различного рода мессенджеры
:)


 
Palladin ©   (2009-03-09 15:35) [26]

ну попробовал... нет никаких ошибок.... зачем вообще в OnChange это делать?


 
Palladin ©   (2009-03-09 15:36) [27]


> Smile   (09.03.09 15:33) [25]

Все так. Только это не личная переписка.


 
kolokol   (2009-03-09 16:03) [28]

Забыл отписаться, вы правы, вся трабла была, что я при загрузке файла делал

sl.loadfromfile(...);
memo1.lines.assign(sl);


 
Админ   (2009-03-09 18:19) [29]

Просто мемо переносит строку физически, а не визуально :(


 
Админ   (2009-03-09 18:22) [30]

я имею ввиду, что lines перезаписывается
ну вы... поняли


 
Palladin ©   (2009-03-09 18:25) [31]


> Админ

Я тебе больше скажу, в памяти ничего не хранится и ничего не перезаписывается, все методы TStrings транслируются сразу на edit control )


 
test ©   (2009-03-10 11:58) [32]

Может все дело в том что по умолчанию TMemo.wrodwrap = true?


 
test ©   (2009-03-10 12:00) [33]

*TMemo.WordWrap = true

опечатка



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

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

Наверх




Память: 0.54 MB
Время: 0.011 c
11-1196939671
MTsv DN
2007-12-06 14:14
2009.05.10
Редактирование элементов ImageList...


9-1179316059
Ксандр
2007-05-16 15:47
2009.05.10
Ламерский фопрос но всё таки...


2-1238059763
ggg111
2009-03-26 12:29
2009.05.10
Массив байт в JPEG (картинка)


15-1236693437
DillerXX
2009-03-10 16:57
2009.05.10
Помогите с .htaccess


2-1238409167
korefey
2009-03-30 14:32
2009.05.10
ActiveX проверка запущеного приложения word