• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

Подсчёт символов в Richviewedit

  • Автор темы Shouldercannon
  • Дата начала
S

Shouldercannon

С помощью данной функции я веду подсчёт всего содержимого RichViewEdit
Код:
function GetCharCount(RVData: TCustomRVData): Integer;
var
i, r, c: Integer;
table: TRVTableItemInfo;
begin
Result := 0;
for i := 0 to RVData.Items.Count - 1 do
if RVData.GetItemStyle(i) >= 0 then
begin
inc(Result, RVData.ItemLength(i));
end
else
if RVData.GetItemStyle(i) = rvsTab then
inc(Result)
else
if RVData.GetItemStyle(i) = rvsTable then
begin
table := TRVTableItemInfo(RVData.GetItem(i));
for r := 0 to table.Rows.Count - 1 do
for c := 0 to table.Rows[r].Count - 1 do
if table.Cells[r, c] <> nil then
inc(Result, GetCharCount(table.Cells[r, c].GetRVData));
end;
end;

Вот так я вывожу количество символов в Caption панели
Код:
r := GetCharCount(RichViewEdit1.RVData);
Panel1.Caption := IntToStr(r);
Минус функции в том, что она не подсчитывает количество символов занимаемое при переводе каретки на новую строку с помощью Ctrl + Enter. Прошу помощи для испраления данной проблемы.
 

Вложения

  • Count.zip
    7,1 КБ · Просмотры: 147
S

sinkopa

Ну нихренаж себе извращеньице... поражен... ;)
а вот так не пробовали?
Код:
procedure TForm1.RichViewEdit1Change(Sender: TObject);
var
r: integer;
begin
r := RichViewEdit1.GetTextLen;
Panel1.Caption := IntToStr(r);
end;
 
S

Shouldercannon

И правда, хоть Ctrl + Enter принимается за один символ вместо двух, всёравно пасибо.
 
S

sinkopa

И правда, хоть Ctrl + Enter принимается за один символ вместо двух, всёравно пасибо.
не за что... :)
Дело в том что он (Ctrl + Enter) и есть у вас всего один символ...
Попробуйте добавить кнопку с кодом:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
r: integer;
s: string;
begin
// размер буфера с "двойным запасом"
r := RichViewEdit1.GetTextLen*2; 
SetLength(s,r);
// заливаем буфер #0
FillChar(s[1],r,0); 
// читаем в буфер содержание (все символы) окна
SendMessage(RichViewEdit1.Handle,WM_GETTEXT,r,Integer(@s[1]));
ShowMessage(s);

end;
Проследите (в пошаговом режиме) изменение состояния переменной "s".
Вы увидите что все переводы каретки будут #$D (#13).
Если проделать тоже самое... скажем для TMemo, то мы увидим #$D#$A...
Похоже что это особенности реализации компонета RichViewEdit...
Хотя вполне возможно эту "фичу" можно настроить через его свойства в design time.
Но я не проверял... :)
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!