0 / 0 / 0
Регистрация: 02.10.2014
Сообщений: 27
1

Работа со строкой в Delphi 7

02.10.2014, 15:06. Показов 2423. Ответов 37
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте уважаемые форумчане!
У меня возник вопрос, собственно есть строка - /peripheral/tim: 1: 0 2: 0 3: 0 4: 3795 5: 3782 6: 7127
В строке за место нулей может быть 3-4 значное число. Так вот как бы мне сделать так что бы:

1) Была проверка что это нужная мне строка, так как строка может быть и другая
2) Как заполнить двумерный массив, где значение первого столбца будет однозначным, цифра перед : например 3:, а значение второго столбца будет число после :, например : 3425

Пример: 1: 325 2: 7121 3: 0 4: 3795 5: 3782 6: 7127

1 325
2 7121
3 0
4 3795
5 3782
6 7127
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.10.2014, 15:06
Ответы с готовыми решениями:

Работа с файлами, чтение/работа со строкой
Доброго времени суток. Начал работать с C++ Builder 6. Есть текстовый файл .txt с различными...

Работа со строкой
Ребята подскажите, как можно реализовать изменение части строки, если это возможно на С#....

Работа со строкой
Работа со строкой

Работа о строкой
Подскажите каким методом из такой вот строки вытащить только температуру <div...

37
993 / 521 / 102
Регистрация: 19.03.2013
Сообщений: 3,114
Записей в блоге: 19
02.10.2014, 15:36 2
1) Ответить на вопрос, что в этой строке уникального.
Например /peripheral/tim это уникальная часть строки, которая отличает ее 100% от других, то можно поставить проверку типа if pos("/peripheral/tim")<>-1 then...

2) Тут алгоритм может быть следующий

2.1 сплиттим строку через пробел http://stackoverflow.com/quest... -delimiter

2.2 пробегаем по полученному массиву, если индекс начинается с 1, то в нечетных элементах будет номер с пробелом (1:,2:,3: ...), в четных элементах массива будут числа ( 325, 7121,0...)

2.2.1. При выборе нечетных элементов делаем StringReplace http://www.delphibasics.ru/StringReplace.php , убираем двоеточие, записываем в двумерный массив. При выборе четных элементов записываем без преобразований.

Как то так
1
0 / 0 / 0
Регистрация: 02.10.2014
Сообщений: 27
02.10.2014, 16:49  [ТС] 3
Цитата Сообщение от chizz Посмотреть сообщение
Например /peripheral/tim это уникальная часть строки,
Да, уникальная
Цитата Сообщение от chizz Посмотреть сообщение
2) Тут алгоритм может быть следующий
Что то не получается... Можете разжевать поподробнее.
Вот задача - из COM порта я получаю строку с параметрами, строка хранится в глобальной переменной resData, так вот строки могут быть любыми, но мне нужна которая начинается на /peripheral/tim, и из нее нужно выдрать значения. Причем параметры эти постоянно меняются и меняются очень быстро.

Добавлено через 23 минуты
Цитата Сообщение от chizz Посмотреть сообщение
if pos("/peripheral/tim")<>-1 then...
Строка находится в переменной resData как мне правильно написать условие?
0
993 / 521 / 102
Регистрация: 19.03.2013
Сообщений: 3,114
Записей в блоге: 19
02.10.2014, 16:56 4
infoehra, Пример
var
S: string;
I: Integer;
begin
S:= 'В лесу родилась елочка';
I:= Pos( 'лес', S); // I:= 3
end;

Т.е. в вашем случае if Pos("/peripheral/tim",resData) > 0 then...
0
0 / 0 / 0
Регистрация: 02.10.2014
Сообщений: 27
02.10.2014, 17:50  [ТС] 5
Цитата Сообщение от chizz Посмотреть сообщение
Т.е. в вашем случае if Pos("/peripheral/tim",resData) > 0 then...
Вот мой текст

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
var
  fMain: TfMain;
  NameCOM: string;
  resData: string;
 
implementation
 
uses Config;
 
{$R *.dfm}
 
procedure TfMain.ComPortReceiveData(Sender: TObject; DataPtr: Pointer;
  DataSize: Cardinal);
var
 i,x,pos: integer;
 str: string;
 wordArray: array[word] of string;
begin
 i :=0;
 For i:=0 to (DataSize-1) do begin
  resData:=resData+(PChar(DataPtr)[i]);  //+'*'+IntToStr(i)+'*'
 end;
Memo1.lines.add(resData);
end;
 
procedure TfMain.Button1Click(Sender: TObject);
begin
ComPort.SendString('tim in print'+char($0D)+char($0A));
if Pos('/peripheral/tim',resData) > 0 then
 ShowMessage('OK');
end;
Как я понимаю при нужной мне строке должно появлятся сообщение, но оно не появляется.

Добавлено через 23 минуты
Цитата Сообщение от infoehra Посмотреть сообщение
if Pos('/peripheral/tim',resData) > 0 then
С этим разобрался)

Добавлено через 7 минут
Цитата Сообщение от chizz Посмотреть сообщение
2) Тут алгоритм может быть следующий
2.1 сплиттим строку через пробел http://stackoverflow.com/quest... -delimiter
2.2 пробегаем по полученному массиву, если индекс начинается с 1, то в нечетных элементах будет номер с пробелом (1:,2:,3: ...), в четных элементах массива будут числа ( 325, 7121,0...)
2.2.1. При выборе нечетных элементов делаем StringReplace http://www.delphibasics.ru/StringReplace.php , убираем двоеточие, записываем в двумерный массив. При выборе четных элементов записываем без преобразований
Пожалуйста, можно поподробнее, желательно с примером)
0
993 / 521 / 102
Регистрация: 19.03.2013
Сообщений: 3,114
Записей в блоге: 19
02.10.2014, 18:05 6
infoehra, т.е. вы дошли до того, что в resData теперь хранится строка /peripheral/tim: 1: 0 2: 0 3: 0 4: 3795 5: 3782 6: 7127 так?

Теперь надо заменить код ShowMessage('OK'); на алгоритм, который я привел.

Ок..

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
var
   A: TStringList;
 
// это вставить вместо ShowMessage('OK');
 
  A := TStringList.Create;
  Split(' ', resData , A) ;
 
 // в итоге у вас будет массив A
 // Дальше надо будет пройти по массиву и далее по алгоритму
 
procedure Split
   (const Delimiter: Char;
    Input: string;
    const Strings: TStrings) ;
begin
   Assert(Assigned(Strings)) ;
   Strings.Clear;
   Strings.Delimiter := Delimiter;
   Strings.DelimitedText := Input;
end;
0
0 / 0 / 0
Регистрация: 02.10.2014
Сообщений: 27
02.10.2014, 18:11  [ТС] 7
Цитата Сообщение от chizz Посмотреть сообщение
т.е. вы дошли до того, что в resData теперь хранится строка /peripheral/tim: 1: 0 2: 0 3: 0 4: 3795 5: 3782 6: 7127 так?
Нет, в resData храниться то что прилетает с контроллера в COM порт.
Но если я нажимаю на кнопку и в это время там оказывается строка с началом /peripheral/tim, то вылетает сообщение.... Но почему то если после того как вылетело сообщение в COM порт приходит другая строка, то сообщение все равно вылетает, такое ощущение что где то это запоминается и значение Pos не обновляется, хотя resData меняет свои значения (вижу это в Memo1)
Delphi
1
2
3
4
5
procedure TfMain.Button2Click(Sender: TObject);
begin
if Pos('/peripheral/tim',resData) > 0 then
   ShowMessage('OK');
end;
0
993 / 521 / 102
Регистрация: 19.03.2013
Сообщений: 3,114
Записей в блоге: 19
02.10.2014, 18:25 8
infoehra, ну так у вас showmessage по Button2Click, а resdata обновляется по ComPortReceiveData, который неизвестно где и когда вызывается.
0
0 / 0 / 0
Регистрация: 02.10.2014
Сообщений: 27
02.10.2014, 18:29  [ТС] 9
Вот процедура чтения из COM порта
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
procedure TfMain.ComPortReceiveData(Sender: TObject; DataPtr: Pointer;
  DataSize: Cardinal);
var
 i,x,pos: integer;
 str: string;
 wordArray: array[word] of string;
begin
 i :=0;
 For i:=0 to (DataSize-1) do begin
  resData:=resData+(PChar(DataPtr)[i]);  //+'*'+IntToStr(i)+'*'
 end;
Memo1.lines.add(resData);
Memo2.Lines.Clear;
Memo3.Lines.Add(resData);
[B]if AnsiPos('/peripheral/tim',resData) > 0 then
 Memo2.Lines.Add('yes')
 else
 Memo2.Lines.Add('no');
end;[/B]
Выделенный текст это то что я перенес с кнопки, изменений 0. В Memo3 все нормально, в Memo2 работает 1 раз, до первого yes, потом все время yes.
0
993 / 521 / 102
Регистрация: 19.03.2013
Сообщений: 3,114
Записей в блоге: 19
02.10.2014, 18:31 10
Посмотрите что в resData.

Memo2.Lines.Add(resData)

Возможно оно (resData) не очищается
0
0 / 0 / 0
Регистрация: 02.10.2014
Сообщений: 27
02.10.2014, 18:33  [ТС] 11
Цитата Сообщение от chizz Посмотреть сообщение
Посмотрите что в resData.
Memo2.Lines.Add(resData)
Возможно оно (resData) не очищается
Не очень понял о чем Вы...
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
procedure TfMain.ComPortReceiveData(Sender: TObject; DataPtr: Pointer;
  DataSize: Cardinal);
var
 i,x,pos: integer;
 str: string;
 wordArray: array[word] of string;
begin
 i :=0;
 For i:=0 to (DataSize-1) do begin
  resData:=resData+(PChar(DataPtr)[i]);  //+'*'+IntToStr(i)+'*'
 end;
Memo1.lines.add(resData);
Memo2.Lines.Clear;
Memo3.Lines.Add(resData);
if AnsiPos('/peripheral/tim',resData) > 0 then
 Memo2.Lines.Add('yes')
 else
 Memo2.Lines.Add('no');
end;
Это вся процедура, то что в resData выводит в Memo3, там все нормально, а вот этот кусок работает один раз до первого YES, потом всегда YES
Delphi
1
2
3
4
5
if AnsiPos('/peripheral/tim',resData) > 0 then
 Memo2.Lines.Add('yes')
 else
 Memo2.Lines.Add('no');
end;
0
993 / 521 / 102
Регистрация: 19.03.2013
Сообщений: 3,114
Записей в блоге: 19
02.10.2014, 18:36 12
infoehra, у вас написано resData:=resData+(PChar(DataPtr)[i]);

По идее если resData глобальный объект, то он постоянно должен добавляться. Нет очищения. resData = '';

i :=0;
resData = '';
For i:=0 to (DataSize-1) do begin
resData:=resData+(PChar(DataPtr)[i]); //+'*'+IntToStr(i)+'*'
end;

Вот так должно работать
0
0 / 0 / 0
Регистрация: 02.10.2014
Сообщений: 27
02.10.2014, 18:48  [ТС] 13
Цитата Сообщение от chizz Посмотреть сообщение
i :=0;
resData = '';
For i:=0 to (DataSize-1) do begin
resData:=resData+(PChar(DataPtr)[i]); //+'*'+IntToStr(i)+'*'
end;
Вот так должно работать
РАБОТАЕТ!!! Еще один вопрос решили))) Спасибо огромное!!!

Добавлено через 6 минут
Цитата Сообщение от chizz Посмотреть сообщение
Теперь надо заменить код ShowMessage('OK'); на алгоритм, который я привел.
var
* *A: TStringList;
// это вставить вместо ShowMessage('OK');
A := TStringList.Create;
* Split(' ', resData , A) ;
// в итоге у вас будет массив A
*// Дальше надо будет пройти по массиву и далее по алгоритму
procedure Split
* *(const Delimiter: Char;
* * Input: string;
* * const Strings: TStrings) ;
begin
* *Assert(Assigned(Strings)) ;
* *Strings.Clear;
* *Strings.Delimiter := Delimiter;
* *Strings.DelimitedText := Input;
end;
Написал, а что делать дальше??? Как можно посмотреть массив? Мне нужно значение после '3:' привязать к ScrollBar.Position
0
993 / 521 / 102
Регистрация: 19.03.2013
Сообщений: 3,114
Записей в блоге: 19
02.10.2014, 18:52 14
infoehra, почитайте про TStringList. Потом создайте из одномерного массива двумерный. Потом найдите в двумерном массиве 3, вытащите значение и привяжите к ScrollBar.Position.

1. Создать из одномерного StringList двумерный array.

Как сделаете, напишите
0
0 / 0 / 0
Регистрация: 02.10.2014
Сообщений: 27
02.10.2014, 21:51  [ТС] 15
Цитата Сообщение от chizz Посмотреть сообщение
1. Создать из одномерного StringList двумерный array.
Как из одномерного двумерный создать я представляю, а вот как заполнить его так как мне надо вот с этим проблема. Может поможете)
0
993 / 521 / 102
Регистрация: 19.03.2013
Сообщений: 3,114
Записей в блоге: 19
02.10.2014, 22:47 16
infoehra, вы сначала создайте а потом помогу

Не по теме:


пысы. я тоже себе много чего представляю :)

0
0 / 0 / 0
Регистрация: 02.10.2014
Сообщений: 27
02.10.2014, 22:54  [ТС] 17
ок, будем разбираться)
0
993 / 521 / 102
Регистрация: 19.03.2013
Сообщений: 3,114
Записей в блоге: 19
02.10.2014, 22:58 18
infoehra, Memo1.Lines.Add(IntToStr(x)+' '+IntToStr(y));

У вас x и y это индексы из
for x:= 1 to 2 do
for y:= 1 to 6 do
0
0 / 0 / 0
Регистрация: 02.10.2014
Сообщений: 27
02.10.2014, 22:59  [ТС] 19
Цитата Сообщение от chizz Посмотреть сообщение
У вас x и y это индексы из
for x:= 1 to 2 do
for y:= 1 to 6 do
Да, да, да спасибо уже заметил)))
0
993 / 521 / 102
Регистрация: 19.03.2013
Сообщений: 3,114
Записей в блоге: 19
02.10.2014, 23:03 20
infoehra, вам надо пройти по StringList и забить двумерный массив.

Т.е. for надо делать по StringList.

Как-то так:
Начинать надо с 1, так как в 0-вом элементе у вас будет содержаться /peripheral/tim:

Delphi
1
2
3
4
for i := 1 to A.Count-1 do
begin
// вот тут надо реализовать логику заполнения двумерного массива
end;
0
02.10.2014, 23:03
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.10.2014, 23:03
Помогаю со студенческими работами здесь

Работа со строкой
Здравствуйте! Помогите с такой проблемой, нужно вырывать цифры перед запятой, что-то в этом роде:...

Работа со строкой
Всем доброго времени суток. подскажите вот такую вещь. Имеется строка к примеру Строка=&quot;Пробный...

Работа со строкой
Всем доброго дня! Подскажите такой вопрос. пока не могу разобраться. Есть входная строка - Иванов...

Работа со строкой.
Общие начало условий всех задач- Пользователь вводит фразу состоящую из нескольких слов. Слова...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru