Форум: "Прочее";
Текущий архив: 2009.05.10;
Скачать: [xml.tar.bz2];
ВнизВопрос про 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;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.004 c