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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 27.03.2009, 17:58
SmaZz SmaZz вне форума
Прохожий
 
Регистрация: 27.03.2009
Сообщения: 10
Репутация: 11
По умолчанию Помогите плиз программу поправить

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

Код:
procedure TForm1.Button1Click(Sender: TObject);
var s,d:string; i,n,p:integer;
begin
s:=edit1.Text;
n:=0;
for i:=1 to length (s)do
begin
  if s[i]=':' then
  n:=n+1;
end;
if n<=1 then
edit2.Text:='Введите значения'
else
begin
repeat
p:=0;
n:=0;
for i:=1 to length (s)do
begin
  if s[i]=':' then
  n:=n+1;
  p:=i;
  End;
  delete(s,p,99);
until n=1;
for i:=1 to p do
  if s[i]=':' then
  d:=copy(s,i+1,p);
  edit2.Text:=(d);
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
form1.Close
end;

end.

2 тип решения
Код:
procedure TForm1.Button1Click(Sender: TObject);
var s,d:string; i,n,p,h:integer; g:array[1..20]of integer;
begin
s:=edit1.Text;
n:=0;
h:=1;
for i:=1 to length (s)do
begin
  if s[i]=':' then
  n:=n+1;
end;
if n<=1 then
edit2.Text:='Введите значения'
else
begin
for i:=1 to length (s)do
if s[i]=':' then
for p:=h to h+1 do
begin
g[p]:=i;
h:=h+1;
end;
d:=copy(s,g[1]+1,g[2]-g[1]);
edit2.Text:=d;
end;
end;
end.
Ответить с цитированием
  #2  
Старый 27.03.2009, 19:11
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,087
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Все гораздо проще.

Код:
function ExtractVals(AStr : String) : String;
begin
  AStr := Copy(AStr, Pos(':',AStr)+1,Length(AStr) - Pos(':',AStr));
  Result := Copy(AStr,1,Pos(':',AStr)-1);
end;

Алгоритм:
1. Отрезаем все с начала до первого двоеточия, включая само двоеточие, и выкидываем (т.е. берем хвост).
2. Вырезаем в результат с первого символа до двоеточия (второго, первое уже выкинули), не включая само двоеточие.

Это если я правильно понял задачу. Твой код не смотрел, т.к. больно ты там накрутил, а задача то элементарная.
Ответить с цитированием
  #3  
Старый 27.03.2009, 23:36
SmaZz SmaZz вне форума
Прохожий
 
Регистрация: 27.03.2009
Сообщения: 10
Репутация: 11
По умолчанию

lmikle
спасибо огромное.
переделал немного под себя
Код:
var f : String;
begin
  edit2.Text:='';
  f:=edit1.Text;
  f:=Copy(f,Pos(':',f)+1,Length(f));
  edit2.Text:=Copy(f,1,Pos(':',f)-1);
  end;
  end.


Не мог бы ты посоветовать какую нибудь книгу для таких как я? нам препод мало объясняет и никакой доп литературы не говорит. заранее спасибо!!!

Страдалецъ
Мы не проходили WrapText но все равно спасибо

Последний раз редактировалось SmaZz, 27.03.2009 в 23:52.
Ответить с цитированием
  #4  
Старый 29.03.2009, 17:34
BloodFooria BloodFooria вне форума
Новичок
 
Регистрация: 30.10.2008
Адрес: Улан-Удэ
Сообщения: 81
Репутация: 10
По умолчанию

У меня сейчас такая же проблемка...

Вообщем, дан String, записанный по шаблону xQy, где x, y - любое число, а Q - один из знаков действия (+, -, *, /). Нужно выудить эти числа из String и знак действия. Ну посчитать я сам смогу

Помогите решить, сейчас сидел, ничего не получилось.
__________________
Auta i Lome...
Ответить с цитированием
  #5  
Старый 29.03.2009, 19:59
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Смотрите вариант lmikle
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #6  
Старый 30.03.2009, 16:21
BloodFooria BloodFooria вне форума
Новичок
 
Регистрация: 30.10.2008
Адрес: Улан-Удэ
Сообщения: 81
Репутация: 10
По умолчанию

Ну вот я пробовал по варианту lmikle ничего не получилось Я в этих функциях пока полный ноль, до них не доходил, а сделать это нужно
__________________
Auta i Lome...
Ответить с цитированием
  #7  
Старый 30.03.2009, 18:58
Nyctos Kasignete Nyctos Kasignete вне форума
Активный
 
Регистрация: 29.03.2009
Сообщения: 300
Репутация: 94
По умолчанию

Цитата:
Сообщение от BloodFooria
У меня сейчас такая же проблемка...

Вообщем, дан String, записанный по шаблону xQy, где x, y - любое число, а Q - один из знаков действия (+, -, *, /). Нужно выудить эти числа из String и знак действия. Ну посчитать я сам смогу

Помогите решить, сейчас сидел, ничего не получилось.
Вот насочиняла такую функцию. Принимает аргумент в виде строки Expression в формате 'xQy', как вы описали, и разделяет на три строки 'x', 'Q', 'y', где Q — один из знаков ('+', '-', '*', '/').
Код:
procedure ExtractNumbersAndSign(Expression: string);
type
  TSigns = set of Char;
var
  x, y, Q: string;
  i, ExpLen: Integer;
  Signs: TSigns;
begin
  Signs := ['+', '-', '*', '/'];
  i := 1; ExpLen := Length(Expression);
  while (not (Expression[i] in Signs) and (i < ExpLen)) do Inc(i);
  Q := Expression[i];
  x := Copy(Expression, 1, i - 1);
  y := Copy(Expression, i + 1, ExpLen - i);
  ShowMessage('Q = ' + Q + #13#10'x = ' + x + #13#10'y  = ' + y);
end;

В общем, древний-древний Pascal... Почти. =)


P.S. Ой, только сейчас увидела небольшой промах. Теперь исправлено. Раньше было так (не совсем корректно):
Код:
while (not (Expression[i] in Signs) or (i = ExpLen)) do Inc(i);

Последний раз редактировалось Nyctos Kasignete, 31.03.2009 в 13:10.
Ответить с цитированием
  #8  
Старый 31.03.2009, 15:02
BloodFooria BloodFooria вне форума
Новичок
 
Регистрация: 30.10.2008
Адрес: Улан-Удэ
Сообщения: 81
Репутация: 10
По умолчанию

Спасибо! Просто гениально!
__________________
Auta i Lome...
Ответить с цитированием
  #9  
Старый 27.03.2009, 19:14
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Можно сделать это несколько иначе,если воспользоваться функцией WrapText:
Код:
procedure TForm5.Edit1Change(Sender: TObject);
Var S: TStringList;
begin
 S := TStringList.Create;
 S.Text := WrapText(Edit1.Text,#13#10,[':'],1);
 S.Text := StringReplace(S.Text,':','',[rfReplaceAll]);
 Edit2.Text := '';
 if S.Count > 1 then Edit2.Text := S.Strings[1];
 S.Free;
end;
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

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