Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 09.03.2020, 17:46
Alex7 Alex7 вне форума
Новичок
 
Регистрация: 18.09.2018
Сообщения: 62
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию Перенос строки

Здравствуйте, пытаюсь сделать так, чтобы при достижении определённого количества символов в 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  
Старый 09.03.2020, 18:41
Аватар для Karsh
Karsh Karsh вне форума
Активный
 
Регистрация: 22.09.2007
Адрес: SPb
Сообщения: 228
Версия Delphi: 7, 2009, XE2
Репутация: 70
По умолчанию

Вам нужно прервать цикл после первого нахождения пробела в строке, иначе цикл будет обновлять 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  
Старый 09.03.2020, 18:51
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,004
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Ну правильно. Где второе условие на длинну строки?
Код:
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  
Старый 09.03.2020, 21:20
Alex7 Alex7 вне форума
Новичок
 
Регистрация: 18.09.2018
Сообщения: 62
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Не получается ни с одним вариантом.
Ответить с цитированием
  #5  
Старый 10.03.2020, 23:02
Alex7 Alex7 вне форума
Новичок
 
Регистрация: 18.09.2018
Сообщения: 62
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Рабочий вариант:

Код:
 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);

Подсказали на другом форуме.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 21:26.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter