Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.50/18: Рейтинг темы: голосов - 18, средняя оценка - 4.50
 Аватар для extrimportal
0 / 0 / 0
Регистрация: 28.02.2015
Сообщений: 83

Не работает length(s)

10.08.2017, 15:38. Показов 4265. Ответов 59
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Проблема следующая. Есть многопоточное приложение. s:string;
И если в потоке указать
Delphi
1
if (s[length(s)]='/') then Copy(s,1,Length(s)-1);
поток зависает намертво. Можно каким то аналогичным способом заменить последний символ в переменной если он равен слешу? Пробовал разные варианты, проблема почему то именно length(s). стрингреплейс например работает.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
10.08.2017, 15:38
Ответы с готовыми решениями:

Вопрос про Length !
Привет всем. Использую функцию length для того что бы узнать сколько символов в строке. Она работает норм ДО 10 мегабайт !! Уже...

Переделать с фукнцией length!
Есть программа, надо чтобы без pos, delete, insert было а с функцией length! Помогите плиз! program Project2; {$APPTYPE CONSOLE} ...

Ошибка incompatible types в length
Вот код: var ran,r,lenran:integer; begin repeat randomize; ran:=random(r); lenran:=length(ran); until lenran=6;

59
 Аватар для extrimportal
0 / 0 / 0
Регистрация: 28.02.2015
Сообщений: 83
11.08.2017, 10:41  [ТС]
Студворк — интернет-сервис помощи студентам
Вспомнил по нику, что вы мне когда то помогли)
Все что вы мне написали я понял как "бла бла, бла, бла бла бла") Как понимаете я в длефи на уровне вырезать не нужный кусок. Как я понимаю вцл это объекты которые можно изменить в форме и лучше дать их значения переменным перед запуском потоков? Чем это лучше? За синхронизацию и онтерминейт не пойму точно. А что можете сказать по поводу ленгс(с)?
0
6003 / 4578 / 1096
Регистрация: 29.08.2013
Сообщений: 28,276
Записей в блоге: 3
11.08.2017, 10:57
а я не заметил в коде потока что бы в переменную t что то присваивалось
0
Житель Земли
 Аватар для DenNik
3004 / 3026 / 390
Регистрация: 26.07.2011
Сообщений: 11,465
Записей в блоге: 1
11.08.2017, 10:57
Цитата Сообщение от extrimportal Посмотреть сообщение
Как я понимаю вцл это объекты которые можно изменить в форме
в учебниках о потоках написано, что из потока НЕЛЬЗЯ НАПРЯМУЮ взаимодействовать с ВИЗУАЛЬНЫМИ компонентами на форме. понимаешь, что такое визуальные компоненты? более подробно читай в книгах

Цитата Сообщение от extrimportal Посмотреть сообщение
лучше дать их значения переменным перед запуском потоков?
вот тебе пример (из другой темы, не хочу писать заново)
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
unit Unit1;
 
interface
 
uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
 
type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure EndThreadWork(Sender: TObject);
  end;
 
  TMyThread = class(TThread)
    FThreadNumber: byte;
    FStartValue: integer;
    FEndValue: integer;
    FResult: integer;
  protected
    procedure Execute; override;
  end;
 
var
  Form1: TForm1;
  thrCount: byte;
  totalSumm: integer;
 
implementation
 
{$R *.dfm}
 
{ TMyThread }
 
procedure TMyThread.Execute;
var
  i: word;
begin
  FResult:= 0;
  for i:= FStartValue to FEndValue do
    FResult:= FResult + i;
end;
 
// ========================================================================================
 
procedure TForm1.Button1Click(Sender: TObject);
var
  i: byte;
  MyThread: TMyThread;
begin
  // START
  Memo1.Clear;
  thrCount:= 11;
  totalSumm:= 0;
  // create Threads
  for i:= 0 to Pred(thrCount) do
  begin
    MyThread:= TMyThread.Create(true);
    MyThread.FreeOnTerminate:= true;
    MyThread.OnTerminate:= EndThreadWork;
    MyThread.FThreadNumber:= i;    // для контроля
    MyThread.FStartValue:= i * 1000;
    MyThread.FEndValue:= i * 1000 + 999;
    MyThread.Start;
  end;
end;
 
// ========================================================================================
 
procedure TForm1.EndThreadWork(Sender: TObject);
var
  MyThread: TMyThread absolute Sender;
begin
  // очередной поток завершил работу. считывание результата
  Memo1.Lines.Add(Format('Поток %d завершил работу. Результат %d',[MyThread.FThreadNumber,MyThread.FResult]));
  totalSumm:= totalSumm + MyThread.FResult;
  Dec(thrCount);
  if thrCount = 0 then  // все потоки завершили работу
  begin
    Memo1.Lines.Add('=========================');
    Memo1.Lines.Add(Format('Total Summ: %d',[totalSumm]));
end;
 
end.
0
 Аватар для extrimportal
0 / 0 / 0
Регистрация: 28.02.2015
Сообщений: 83
11.08.2017, 10:57  [ТС]
Я для теста взял эту переменную.
Ну я понял, ну вот если мне все же нужно ответы от потоков выводить в мемо то как поступить?
0
 Аватар для krapotkin
6854 / 4680 / 1465
Регистрация: 14.04.2014
Сообщений: 20,686
Записей в блоге: 21
11.08.2017, 11:17
вы вообще читаете?
в предыдущем посте ответ от потока выводится в мемо
что еще нужно???
0
 Аватар для extrimportal
0 / 0 / 0
Регистрация: 28.02.2015
Сообщений: 83
11.08.2017, 19:56  [ТС]
Извините за много глупых вопросов, но без учителя с учебником могу учиться только на форуме. Вот какая штука.
Есть procedure TMyThread.Execute;
в нем объявлена s:string;
В потоке есть строка которая делает
Delphi
1
s:=StringReplace(s,'ht','',[rfReplaceAll]);
Хочу перенести это в функцию, вернее научиться писать их правильно.
Пишу
Delphi
1
2
3
4
function test(s:string) :string;
begin
               s:=StringReplace(s,'ht','',[rfReplaceAll]);
end;
В потоке вместо
Delphi
1
s:=StringReplace(s,'ht','',[rfReplaceAll]);
пишу
s:=linktest(s);
После чего s становится пустым. Как я понимаю функция не получает переменную так как обьявлена только в потоке, или я ооочень оооочень далеко от делфи и мне нужно все забросить?
0
пофигист широкого профиля
4770 / 3207 / 862
Регистрация: 15.07.2013
Сообщений: 18,615
11.08.2017, 20:01
Delphi
1
2
3
4
function test(s:string) :string;
begin
   Result:=StringReplace(s,'ht','',[rfReplaceAll]);
end;
0
 Аватар для GoodWeather
886 / 588 / 179
Регистрация: 28.02.2017
Сообщений: 2,359
Записей в блоге: 1
11.08.2017, 20:04
Либо так:
Delphi
1
function test(VAR s: string) :string;
Либо так:
Delphi
1
RESULT:=StringReplace(s,'ht','',[rfReplaceAll]);
Добавлено через 1 минуту

Не по теме:

Да что такое, обновлял же прям перед отправкой, какие две минуты разницы.....

0
 Аватар для extrimportal
0 / 0 / 0
Регистрация: 28.02.2015
Сообщений: 83
11.08.2017, 20:16  [ТС]
ЕСТЬ!!! Поборол я ленгс(с). Всем большое спасибо что тратите время и учите уму разуму!
Теперь еще хотел бы спросить.
Есть 10 условий вида:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
if ((Pos('body', link) > 0) and (s=''))
               then begin link:=nik+'body'+kik; end else
                    if ((Pos('body', link) > 0) and (s<>''))
                    then begin link:=nik+'nobody'+s; end;
 
if ((Pos('kody', link) > 0) and (s=''))
               then begin link:=nik+'kody'+kik; end else
                    if ((Pos('kody', link) > 0) and (s<>''))
                    then begin link:=nik+'nobody'+s; end;
 
if ((Pos('pody', link) > 0) and (s=''))
               then begin link:=nik+'pody'+kik; end else
                    if ((Pos('pody', link) > 0) and (s<>''))
                    then begin link:=nik+'nobody'+s; end;
Как записать прием параметров если переменные link, nik,kik берутся с private а переменная s описана в потоке?
0
 Аватар для krapotkin
6854 / 4680 / 1465
Регистрация: 14.04.2014
Сообщений: 20,686
Записей в блоге: 21
11.08.2017, 20:19
функция должна вернуть результат. result. а то что вы присвоили в локальные переменные, теряется
поэтому
Delphi
1
2
3
4
function XXX(param:string):string;
begin
  result := 'yyyy';
end;
Добавлено через 1 минуту
боюсь, без кода этого не понять
что такое прием параметров?
у какого класса в private записаны переменные?
что значит s "описана в потоке" ?
0
 Аватар для extrimportal
0 / 0 / 0
Регистрация: 28.02.2015
Сообщений: 83
11.08.2017, 20:26  [ТС]
Не пинайте сильно я только учусь.
В потоке выполняется проверка на наличие символов в переменной link. В зависимости от результата ей присваивается новое значение. Под приемом параметров я имел ввиду, как описать для функции переменные если
link, nik,kik записаны в самом верху программы
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
   procedure Button13Click(Sender: TObject);
    procedure Button14Click(Sender: TObject);
 
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
  type
  TMyThread = class (TThread)
  http: THTTPSend;
  StringList: TStringList;
  Data: TStringStream;
  private
    link,kik,nik: string;
    buf: string;
а переменная s
Delphi
1
2
3
procedure TMyThread.Execute;
var
   s:string;
А в теле функции я так понимаю должны быть все эти 10 проверок и в конце result:=link; Правильно?
0
 Аватар для krapotkin
6854 / 4680 / 1465
Регистрация: 14.04.2014
Сообщений: 20,686
Записей в блоге: 21
11.08.2017, 20:49
link,kik,nik - это ПОЛЯ класса
в любом МЕТОДЕ этого класса они доступны
поэтому если в одном месте им присвоить 1 то и в другом в них будет 1
на этом и основывается использование класса потока
делаем ему столько полей сколько нужно и заполняем их после создания но до запуска
после этого происходит Execute, где вы что-то делаете, и после этого поток может вызвать обработчик OnTerminate, где из этих полей можно забрать обработанные/полученные/придуманные данные
после чего поток нам больше не нужен

таким образом для выполнения каждой операции мы создаем поток и задаем ему одно задание
другому - другое.
каждый работает и приносит результаты, вы их собираете

в любом случае, если у вас нет базовых знаний по классам, локальным переменным, процедурам и функциям, боюсь, вам еще рановато лезть в сложные вещи типа потоков
0
 Аватар для extrimportal
0 / 0 / 0
Регистрация: 28.02.2015
Сообщений: 83
11.08.2017, 21:04  [ТС]
Я осознаю что рано, но так как вы объясняете человеческим языком, легче понять чем перелопатить кучу статей на тем потоков и ничего не понять. Проблема в том что есть программа рабочая на 95% и хочется хотя бы до 98% дотянуть своими силами. Я же никого не напрягаю, спрашиваю у кого время есть что то объяснит. Насчет работы потока более мене понимаю. Дело в том что эта функция которую я хочу создать обрабатывает переменную link в потоке, потом в потоке над этой переменной еще проходят действия, и уже после этого я забираю результат с потока.
То если я правильно понял выглядит должно так?
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
function linktest(var s,link,kik,tik:string) :string;
 
begin
if ((Pos('kody', link) > 0) and (s=''))
               then begin link:=nik+'kody'+kik; end else
                    if ((Pos('kody', link) > 0) and (s<>''))
                    then begin link:=nik+'nobody'+s; end;
 
if ((Pos('pody', link) > 0) and (s=''))
               then begin link:=nik+'pody'+kik; end else
                    if ((Pos('pody', link) > 0) and (s<>''))
                    then begin link:=nik+'nobody'+s; end;
result:=link;
end;
Получил [dcc32 Error] Unit1.pas(508): E2035 Not enough actual parameters на
linktest1(link);
0
7 / 6 / 1
Регистрация: 29.03.2015
Сообщений: 501
11.08.2017, 21:29
бро, попробуй так
Delphi
1
if pos(s[length(s)],'/')>0 then copy(s,1,Length(s)-1);
0
 Аватар для krapotkin
6854 / 4680 / 1465
Регистрация: 14.04.2014
Сообщений: 20,686
Записей в блоге: 21
11.08.2017, 21:32
нет смысла присваивать что-то в link а потом в result
почему сразу не писать result :=
это раз

два. Ваш кусок должен выглядеть вот так:
Кликните здесь для просмотра всего текста
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
  if ((pos('kody', link) > 0) then
  begin
    if (s = '')) then
      link := nik + 'kody' + kik
    else
      link := nik + 'nobody' + s;
  end;
 
  if ((pos('pody', link) > 0) and (s = '')) then
  begin
    if (s = '')) then
      link := nik + 'pody' + kik
    else
      link := nik + 'nobody' + s;
  end;

а еще точнее, вот так
Кликните здесь для просмотра всего текста
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
function linktest(s,link,kik,tik:string) :string;
 
  function getXXX(key:string):string;
  begin
    if ((pos(key, link) > 0) then
    begin
      if (s = '')) then
        result := nik + key + kik
      else
        result := nik + 'nobody' + s;
    end
    else
      result := '';
  end;
begin
  result := GetXXX('kody');
  if result ='' then
    result := GetXXX('pody');
end;
0
7 / 6 / 1
Регистрация: 29.03.2015
Сообщений: 501
11.08.2017, 21:34
нет смысла присваивать что-то в link а потом в result
почему сразу не писать result :=
это раз
таким образом вы ему софт переписываете , но вроде если ответить на его вопрос, то можно сделать все проще вот так
Delphi
1
if pos(s[length(s)],'/')>0 then copy(s,1,Length(s)-1);
0
 Аватар для krapotkin
6854 / 4680 / 1465
Регистрация: 14.04.2014
Сообщений: 20,686
Записей в блоге: 21
11.08.2017, 21:41
я больше скажу
http://docwiki.embarcadero.com... hDelimiter

Delphi
1
2
3
uses Sysutils;
 
s:=ExcludeTrailingPathDelimiter(s);
0
 Аватар для extrimportal
0 / 0 / 0
Регистрация: 28.02.2015
Сообщений: 83
11.08.2017, 21:50  [ТС]
Трудно что нибудь по такой статье, еще учиться и учиться. По первому коду лучше так как таких условий у меня 10, в пример поставил только 2. И все равно Not enough actual parameters. По второму не понимаю как переработать под свои 10 условий.
0
 Аватар для krapotkin
6854 / 4680 / 1465
Регистрация: 14.04.2014
Сообщений: 20,686
Записей в блоге: 21
11.08.2017, 22:08
где два там и 10 можно написать, не?
0
 Аватар для extrimportal
0 / 0 / 0
Регистрация: 28.02.2015
Сообщений: 83
11.08.2017, 22:09  [ТС]
Пробую так
Delphi
1
2
linktest1(link,s,kik,nik);
form1.label7.caption:= link;
результат: link который отправляю в функцию, тоесть функция не обрабатывает почему то.

Можно и 10, но я уже 14 часов за компом, и просто не понимаю её работу.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
11.08.2017, 22:09

Программа реализации алгоритма Run-Length Encoding (RLE)
Уважаемые программисты не могу исправить код этой программы напишите в чем проблема и исправьте пожалуйста очень нужно через день сессия...

.length не работает
Здравствуйте. Очень нупский вопрос :( Но почему .length отдает 0? В чем ошибка? &lt;script type = 'text/javascript'&gt; var...

НЕ работает функция length
Почему-то не работает функция length. Выводится только 1 элемент массива а не все. &lt;?php $user = array(5,10,15,20,25,30,40,50); ...

POST запрос через JS имеет Content-Length: 0, по клику работает нормально. Chrome + FireFox
И в Хроме и в Лисе если отправляю форму через JS по form.submit() то она отправляется пустой с Content-Length: 0 код формы ...

@length
Задача очень простая: Есть поле типа Number (однозначное), необходимо посчитать количество символов в числе, которое хранится в нем. Делаю...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru