var
s: string;
begin
s := Memo1.Lines.Strings[StrToInt(Edit1.Text)];
end;
Вопрос по TMemo
У меня возник такой вопрос: Допустим на форме стоит TMemo, два TEdit и TButton. Как сделать так: Я ввожу какое-то число в 1-ый TEdit - это будет номер строки в TMemo и нажимаю кнопку. Прога должна сделать так: Выделить строку под этим номером и добавить её значение во 2-ой TEdit.
Заранее спасибо за помощь!:)
Код:
в переменной s храница нужная строка, теперь с ней можно делать всё что угодно.
а вот как выделить требуемую строку...
вот написал функцию...
тестирование показало, что баги отсутствуют, но кто его знает... :)
Код:
// StrNumber is [1..n]
procedure SelectString(Memo: TMemo; StrNumber: Integer);
var
i, SelSt: Integer;
begin
if not Assigned(Memo)
or (Memo.Lines.Count < 1)
or (StrNumber < 1)
or (StrNumber > Memo.Lines.Count) then
Exit;
SelSt := 0;
for i := 0 to StrNumber - 2 do
Inc(SelSt, Length(Memo.Lines) + 2);
Memo.SelStart := SelSt;
Memo.SelLength := Length(Memo.Lines[StrNumber - 1]);
end;
procedure SelectString(Memo: TMemo; StrNumber: Integer);
var
i, SelSt: Integer;
begin
if not Assigned(Memo)
or (Memo.Lines.Count < 1)
or (StrNumber < 1)
or (StrNumber > Memo.Lines.Count) then
Exit;
SelSt := 0;
for i := 0 to StrNumber - 2 do
Inc(SelSt, Length(Memo.Lines) + 2);
Memo.SelStart := SelSt;
Memo.SelLength := Length(Memo.Lines[StrNumber - 1]);
end;
Tokolist все отлично +1, но надо в процедурку добавить Memo.SetFocus или потом учитывать, чтобы перед вызовом процедуры фокус ввода был у Memo, а то не выделится ничего. на мой взгляд лучше сразу в процедуру это включить, а то потом забыть можно и думать, что же не так.
Цитата: kosfiz
Tokolist все отлично +1, но надо в процедурку добавить Memo.SetFocus или потом учитывать, чтобы перед вызовом процедуры фокус ввода был у Memo, а то не выделится ничего. на мой взгляд лучше сразу в процедуру это включить, а то потом забыть можно и думать, что же не так.
Согласен, но тут все зависит от ТЗ. Можно, например, вместо передачи фокуса просто выставить в TMemo свойство HideSelection в False, как было у меня. Сдесь ИМХО лучше разделить процедуру и получение фокуса для того чтобы сделать процедуру более универсальной... или же перезагрузить процедуру с дополнительным параметром булевского типа, тогда у нас будет два варианта вызова:
Код:
procedure SelectString(Memo: TMemo; StrNumber: Integer; SetFocus: Boolean); overload;
begin
if SetFocus then
Memo.SetFocus;
SelectString(Memo, StrNumber);
end;
begin
if SetFocus then
Memo.SetFocus;
SelectString(Memo, StrNumber);
end;