Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Про DeleteLines


=BuckLr= ©   (2007-06-10 19:25:00) 

Обнаружил, что DeleteLines не удаляет линию, если она
I1 := Item2Pos( FromLine );
 I2 := Item2Pos( ToLine+1 );
 SStart := SelStart;
 SLength := SelLength;
 SelStart := I1;
 SelLength := I2 - I1;


В этом случае SelStart и SelLength - оба будут равны нулю


Vladimir Kladov   (2007-06-12 12:19:00) [1]

О! Я не прав. (Но и не лев). Это не MSDN, это я виноват. Надо было внутрь Item2Pos / Pos2Item смотреть. Там стоит зануление отрицательного результата. Достаточно убрать лишний код, и все в порядке. Только надо dword возвращать, а не Integer, и всех делов.


=BuckLr=   (2007-06-11 23:00:00) [2]


>  Поздравляю, вы нашли ошибку в MSDN

Не очень радуют такие ошибки в мсдн"не и в самой системе :( Однако...


Vladimir Kladov   (2007-06-11 21:43:00) [3]

Что я могу сказать. И правда не работает, если программно добавлять. Поздравляю, вы нашли ошибку в MSDN. По поводу EM_LINEINDEX там написано:

Return Value

The return value is the character index of the line specified in the wParam parameter, or it is –1 if the specified line number is greater than the number of lines in the edit control.

Но возвращается 0, а не -1 (которое было бы = $FFFFFFFF как DWORD).
В обновлении исправлю.


=BuckLr=   (2007-06-11 21:17:00) [4]

Jсь у меня XP тоже, сервиспак 2 плюс куча обновлений самых новых. КОЛ 2,66. От юникода не зависит. Вот, выложил проект, можете посмотреть: http://ifolder.ru/2314526
Первая кнопка у меня не удаляет, вторая - удаляет. Но стоит снести строку в первом мемо, как нажатие на кнопку приведёт к желаемому эффекту. Может быть, у вас будет по-другому, мне тоже интересно. А пока я поступаю тупо - определяю символы возврата каретки в конце текста в мемо, и если их нет и строка последняя - сношу каретку.


Vladimir Kladov   (2007-06-11 09:37:00) [5]

На memo - работает. Ctrl+A - работает только для rich edit, сам. Но и на RichEdit тоже работает, проверил. Даже после ctrl+A и ввода текста без последненго enter.

Может, разница в ОС? У меня XP. С unicode не проверял.


=BuckLr=   (2007-06-10 23:29:00) [6]

Не, всё-таки, не так я делаю, у меня удаляет :) А ваш код имеет тот же недостаток - не удаляет именно последнююлинию. Удаляет нормально только если последняя линия является пустой и содержит #13#10. А если  не содержит, то хана :)

Т.е. если нажать контрол+а, удалить ВЕСЬ текст, а затем ввести одну лишь строку, не нажимая интер, то ничего не будет - строка останется на месте. А если на следующей строке даже ничего нет, но на ней стоит каретка (нажали интер), то строка будет удалена. Вот я про что.


=BuckLr=   (2007-06-10 22:57:00) [7]

Ну я примерно так и делаю. Просто думал, может имеет смысл чуть подправить исходную процедуру, чтобы удаляла любую строчку :) если вы не против, конечно


Vladimir Kladov   (2007-06-10 19:49:00) [8]

Удаление непустой последней строки:

procedure TForm1.Button16Click(Sender: PObj);
var i: Integer;
begin
 i := Memo1.Count-1;
 if Memo1.Items[ i ] = '' then dec( i );
 if i < 0 then Exit;
 Memo1.DeleteLines( i, i );
end;


проверил, работает.


=BuckLr=   (2007-06-10 19:26:00) [9]


> если она

последняя :)


Наверх

Титульная страница Поиск, карта сайта Написать письмо