Вверх ↑
Ответов: 4621
Рейтинг: 746
#1: 2020-09-08 11:24:49 ЛС | профиль | цитата
Обратите внимание на мой метод _Get() - чтобы избежать предварительного определения длины строки я использую буфер заведомо большего размера.
Это может добавлять немного производительности, но максимальная длина строки будет ограничена размером буфера (в данном случае 4 Кб).

Для выбора - моя оптимизированная версия изначального варианта с предварительным определением длины:
function THIRichEdit._Get(var Item: TData; var Val: TData): Boolean;
var
Ind, L: Integer;
Text: string;
begin
Ind := ToIntIndex(Item);
Result := (Ind >= 0) and (Ind < Control.Count);

if Result then
begin
L := Control.Perform(EM_LINELENGTH, Ind, 0); // Посчитать длину строки
if L > 0 then
begin
Inc(L, 2); // Размер буфера с запасом SizeOf(Word) (иначе не работает)
SetLength(Text, L);
PWord(Pointer(Text))^ := L; // В первом Word буфера - размер буфера

L := Control.Perform(EM_GETLINE, Ind, Longint(Pointer(Text)));
if (L <> 0) and (Text[L] = #13) then Dec(L); // Выдаёт также символ #13 в конце
if (L <> Length(Text)) then SetLength(Text, L); // В L - действительная длина строки (обычно меньше выделенного размера)
end
else
Text := '';

dtString(Val, Text);
end;
end;
карма: 26

0
Редактировалось 3 раз(а), последний 2020-09-09 10:35:11