Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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
2-1237911598
Zheksonz
2009-03-24 19:19
2009.05.10
Как спрятать вывод на консоль?


15-1235938698
TInt
2009-03-01 23:18
2009.05.10
Можно ли сделать чтоб класс менял размер массива не зная его типа


2-1233876018
Alexei
2009-02-06 02:20
2009.05.10
Копирование с WebBrowser a


15-1236243315
Mephisto
2009-03-05 11:55
2009.05.10
Regular Expression


2-1238434818
yammi
2009-03-30 21:40
2009.05.10
Чем заменить сишный Return в дельфи?





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