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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 08.02.2023, 14:17
leon2009 leon2009 вне форума
Новичок
 
Регистрация: 18.03.2009
Сообщения: 71
Репутация: 10
Восклицание как передать по 5 символов из строки 100 символов

Здравствуйте! var text:='0123456789aaabbbccc'; Текст строка, знаю что 100 символов. как передать значение в str:string по 2 символа.
пр: в memo = 01 потом 23 потом 45 и.т.д пока строка (текст) не закончится
если можно ПОЖАЛУЙСТА не надо через FOR
Можно пару примерчиков
Код:
Result := MemoryStream.DataString;
until Result <= 0;
Ответить с цитированием
  #2  
Старый 08.02.2023, 14:18
leon2009 leon2009 вне форума
Новичок
 
Регистрация: 18.03.2009
Сообщения: 71
Репутация: 10
По умолчанию aфантастика

или я прошу из ряда фантастики?
Ответить с цитированием
  #3  
Старый 08.02.2023, 14:34
Vladimr Vladimr вне форума
Прохожий
 
Регистрация: 17.03.2021
Сообщения: 45
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Код:
const dl=5; //длина передаваемой строки за раз

while length(text)>dl do
begin
s1:=copy(text,1,dl); //считывание символов
memo1.lines.add(s1); //вывод символов
delete(text,1,dl); //удаление
end;

memo1.lines.add(text); //вывод оставшихся символов

Последний раз редактировалось Vladimr, 08.02.2023 в 14:36.
Ответить с цитированием
  #4  
Старый 08.02.2023, 21:23
leon2009 leon2009 вне форума
Новичок
 
Регистрация: 18.03.2009
Сообщения: 71
Репутация: 10
Печаль error

результат:
Цитата:
Memo1
01
23
45
67
89
aa
ab
bb
cc
c
text:='0123456789aaabbbccc';
а нужно
Цитата:
Memo1
11111
22222
33333
44444
55555
66666
77777
88888
result:=11111 22222 33333 44444 55555 66666 77777 88888
как файл загружаешь не сразу а блоками так же и текстовую строку поделить на 5 символов и выводить по 5 символов из 100.
а здесь код сразу все выдал.

Последний раз редактировалось leon2009, 08.02.2023 в 21:25.
Ответить с цитированием
  #5  
Старый 08.02.2023, 21:43
leon2009 leon2009 вне форума
Новичок
 
Регистрация: 18.03.2009
Сообщения: 71
Репутация: 10
Сообщение понял

пример
если text=
11111aa
22222bb
33333cc
44444dd
то в коде выше
вывод будет
Memo1
Цитата:
11111
aa 22
222bb
3333
3cc 4
4444d
d
а если не обрезать и оставить
как есть
Цитата:
11111aa
22222bb
33333cc
44444dd
только перенести не сразу текст а постепенно сначала:
11111aa
потом
22222bb потом
33333cc потом
44444dd
Ответить с цитированием
  #6  
Старый 08.02.2023, 22:18
leon2009 leon2009 вне форума
Новичок
 
Регистрация: 18.03.2009
Сообщения: 71
Репутация: 10
Счастье error_2

Код:
len:=length(text);

     while len>dl do begin
      s1:=copy(text,3,dl);
      //for i:=0 to len do begin
      memo1.Lines.add(s1);
      delete(text,3,dl);
    end;
      memo1.Lines.add(text);
     end;
если
Цитата:
text:=1111111
2222222
3333333
4444444
5555555
6666666
7777777
8888888
9999999
0100101
и const dl=8;
все отлично! т.к символов в строку влазит, но если const dl=5; а это значит что символы в одной строке не влезли не хватает еще 3, то result начинает просто прокручивать до бесконечности.
Ответить с цитированием
  #7  
Старый 08.02.2023, 22:48
leon2009 leon2009 вне форума
Новичок
 
Регистрация: 18.03.2009
Сообщения: 71
Репутация: 10
Вопрос Не справляюсь

Не справляюсь
результат:
Цитата:
aaaaaaa
0100101
b
текст =
Цитата:
1111111
2222222
3333333
4444444
5555555
6666666
7777777
8888888
9999999
aaaaaaa
0100101
bbbbbbb
Код:
function LoadFile(const FileName: TFileName):string;
var
  MemStr: TStringStream; text,s1:string;
begin
  MemStr:= TStringStream.Create;
  try
    MemStr.LoadFromFile(FileName);
    //Result := MemStr.DataString;
    text:=MemStr.DataString;
    while length(text)>20 do begin
      s1:=copy(text,1,20);
      result:=s1;
      delete(text,1,20);
    end;
 finally
    MemStr.Free;
  end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
//LoadFile('test.txt');
memo1.Lines.Text:=(LoadFile('test.txt'));
end;

Последний раз редактировалось leon2009, 08.02.2023 в 22:56. Причина: Не справляюсь
Ответить с цитированием
  #8  
Старый 09.02.2023, 00:19
Аватар для Kailon
Kailon Kailon вне форума
Активный
 
Регистрация: 06.06.2010
Сообщения: 340
Версия Delphi: 11.3
Репутация: 429
Сообщение

Цитата:
Сообщение от leon2009
Здравствуйте! var text:='0123456789aaabbbccc'; Текст строка, знаю что 100 символов. как передать значение в str:string по 2 символа.
пр: в memo = 01 потом 23 потом 45 и.т.д пока строка (текст) не закончится
если можно ПОЖАЛУЙСТА не надо через FOR
Задача простая. По 2 символа выводить в Memo пока не закончится строка. Вроде всё понятно. НО! Что начинается дальше?
Вот здесь Ваше решение не соответствует Вашему же заданию
Цитата:
Сообщение от leon2009
text:='0123456789aaabbbccc';
а нужно
Memo1
11111
22222
33333
44444
55555
66666
77777
88888
result:=11111 22222 33333 44444 55555 66666 77777 88888
как файл загружаешь не сразу а блоками так же и текстовую строку поделить на 5 символов и выводить по 5 символов из 100.
а здесь код сразу все выдал.
Если известно, что строка 100 символов, то по 5 символов поровну делится вся строка, а вот если по 8, то уже нет. Куда остаток? Так по сколько символов выводить? И как понимать "выводить по 5 символов"? По запросу? По таймеру?
Функция, что Вам предложили, за каждый проход будет отрезать 5 символов и выводить их пока не закончится строка. Если же необходимо выводить блоками, то их нужно где-то накапливать, например в массиве.
__________________
Всегда пишите код так, будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете.
Ответить с цитированием
  #9  
Старый 09.02.2023, 00:26
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,057
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Для начала, я думаю ты "наступаешь" на переводы строк. Их надо вырезать до начала раздела строки, иначе они тебе весь вывод поломают.
Код:
const
  wLen : Integer = 5; // сколько символов за раз вырезать
var
  Src : String;
  Idx : Integer;
begin
  Src := '...'; // исходная строка
  Src := StringReplace(Src, #13, '',[rfReplaceAll]);
  Src := StringReplace(Src, #10, '',[rfReplaceAll]);
  Idx := 1;
  While Idx < Length(Src) Do
    Begin
      Memo1.Lines.Add(Copy(Src,Idx,wLen));
      Inc(Idx,wLen);
    End;
End;
Ну вот как-то так, должно работать.
Ответить с цитированием
Этот пользователь сказал Спасибо lmikle за это полезное сообщение:
leon2009 (09.02.2023)
  #10  
Старый 09.02.2023, 08:50
leon2009 leon2009 вне форума
Новичок
 
Регистрация: 18.03.2009
Сообщения: 71
Репутация: 10
Хорошо спасибо

Спасибо!
Цитата:
function Reset(Rdx:string):string;
const
wLen : Integer = 5;
var
Src: String;
Idx : Integer;
begin
Src := Rdx; // исходная строка
Src := StringReplace(Src, #13, '',[rfReplaceAll]);
Src := StringReplace(Src, #10, '',[rfReplaceAll]);
Idx := 1;
While Idx < Length(Src) Do
Begin
result:=Copy(Src,Idx,wLen);
Inc(Idx,wLen);
End;
end;
функции изучаем = Спасибо! правда, я не знал, что так много времени 100 000 срок будет передавать Inc(Idx,wLen);, было 800 000
Ответить с цитированием
  #11  
Старый 09.02.2023, 12:36
Vladimr Vladimr вне форума
Прохожий
 
Регистрация: 17.03.2021
Сообщения: 45
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от lmikle
While Idx < Length(Src) Do

Если Length(Src)=Idx, то ничего не выведется.
поэтому после цикла while надо будет добавить проверку
Код:
if Idx=Length(Src) then Memo1.Lines.Add(Copy(Src,Idx,wLen)); 

Например Src='a', и Idx=1 то условие while не выполниться и строка не выведется.

Последний раз редактировалось Vladimr, 09.02.2023 в 12:39.
Ответить с цитированием
  #12  
Старый 09.02.2023, 12:44
Vladimr Vladimr вне форума
Прохожий
 
Регистрация: 17.03.2021
Сообщения: 45
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от leon2009
Код:
function Reset(Rdx:string):string;

если это делать через функцию, то вернется только последние символы.

К примеру Rdx='01234567890qwertyuiop[]asdfghjkl;'zxcvbnm,./'; то на выходе ты получишь только 'm,./', а все остальное пропадет.

Последний раз редактировалось Vladimr, 09.02.2023 в 12:47.
Ответить с цитированием
  #13  
Старый 09.02.2023, 18:36
leon2009 leon2009 вне форума
Новичок
 
Регистрация: 18.03.2009
Сообщения: 71
Репутация: 10
Стрелка Работает

все отлично работает
проверил и так и через функцию.
долго, но работает! через Memo и функцию.
RichEdit ставил , НО он как накопитель, сначала накопит, а потом все вываливает... а в мемо видны движение...
Ответить с цитированием
  #14  
Старый 10.02.2023, 19:22
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,057
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Цитата:
Сообщение от leon2009
все отлично работает
проверил и так и через функцию.
долго, но работает! через Memo и функцию.
RichEdit ставил , НО он как накопитель, сначала накопит, а потом все вываливает... а в мемо видны движение...

Тут в другом дело.
Видимо не успевают проходить сообщения об обновлении интерфейса. Что бы проходили, надо добавить Application.ProcessMessages в тело цикла. Но это еще более замедлит работу.

ЗЫ. Кстати, а нафига оно такое тебе надо? Просто добавление в визульный компонент явно тормозит выполнение...
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter