|
#1
|
|||
|
|||
Перенос строки
Здравствуйте, пытаюсь сделать так, чтобы при достижении определённого количества символов в edit1 текст после последнего пробела переносился в edit2
Код:
if Length(Edit1.Text) > 23 then begin for i:=length(Edit1.Text) downto 1 do if Edit1.Text[i]= ' ' then Edit2.Text := copy(Edit1.Text, i+1, Length(Edit1.Text)-i); но переносится после первого пробела. Подскажите пожалуйста как исправить. |
#2
|
||||
|
||||
Вам нужно прервать цикл после первого нахождения пробела в строке, иначе цикл будет обновлять Edit2 для каждого пробела, вплоть до самого первого. Просто добавьте BREAK после
Код:
Edit2.Text := copy(Edit1.Text, i+1, Length(Edit1.Text)-i); Код:
if Edit1.Text[i]= ' ' then begin Edit2.Text := copy(Edit1.Text, i+1, Length(Edit1.Text)-i); Break; end; Начинающий программист уверен, что в 1 килобайте 1000 байт.
Законченный программист уверен, что в 1 километре 1024 метра. Последний раз редактировалось Karsh, 09.03.2020 в 18:45. |
#3
|
|||
|
|||
Ну правильно. Где второе условие на длинну строки?
Код:
if Length(Edit1.Text) > 23 then begin for i:=length(Edit1.Text) downto 1 do if (Edit1.Text[i]= ' ') And (i >= 23) then Edit2.Text := copy(Edit1.Text, i+1, Length(Edit1.Text)-i); 1. Делаем функцию, которая реализует перенос по нужной длинне и возвращает результат как список строк. 2. В месте вызова уже используем результат. Код:
procedure stringSplit(S : String; SplitLen : Integer) : TStringList; var I : Integer; Buf : String; begin Result := TSTringList.Create; Buf := ''; For I := 1 To Length(S) Do Begin If (S[i] = ' ') And (I >=SplitLen) Then Begin Result.Add(Buf); Buf := ''; End Else Buf := Buf + S[i]; End; If Buf <> '' Then Result.Add(Buf); end; Ну и пример использования: Код:
S := '...'; // тут типа длинная строка задается SL := stringSplit(S,23); Edit1.Text := SL[0]; If SL.Count>1 Then Edit2.Text := SL[1] Else Edit2.Text := ''; SL.Free; // не забываем освободить память... PS. Вообще, обычно такого рода перенос делается по длинне, меньшей, чем указанная, но там код посложнее будет, хотя тоже не самая сложная задача... |
#4
|
|||
|
|||
Не получается ни с одним вариантом.
|
#5
|
|||
|
|||
Рабочий вариант:
Код:
if Length(Edit1.Text) > 23 then for i:=23 downto 1 do if Edit1.Text[i]= ' ' then Break; Edit2.Text := copy(Edit1.Text, i+1, Length(Edit1.Text)-i); Подсказали на другом форуме. |