![]()  | 
	
 
  | 
| 
		 
			 
			#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; Последний раз редактировалось 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); Подсказали на другом форуме.  |