Урок Delphi 12

Работа со строками Delphi




Уроки Delphi
  1.  Первая программа
  2.  Использование компонентов
  3.  События Delphi
  4.  Типы данных Delphi
  5.  Создание своих типов данных
  6.  Выражения и операторы
  7.  Работа с файлами в Delphi
  8.  Дополнительные формы
  9.  Подпрограммы в Delphi
  10. Исключительные ситуации
  11. Взаимодействие приложения с пользователем
  12. Указатели в Delphi
  13. Обзор компонентов
  14. Работа со строками
  15. Создание интерфейса
  16. Графика в Delphi
  17. Многопоточность в Delphi
  18. Динамическое создание
        компонентов
Поиск по сайту




 Это важно:
   Метод Application.ProcessMessages;

 Это полезно:
   Параметр Sender в обработчиках событий;










Бояться не надо



   Работа со строками Delphi позволяет извлечь из строки необходимую информацию и представить её в нужном виде. Система предоставляет весь спектр необходимых функций для работы со строками Delphi и преобразования строк Delphi в необходимые форматы:

  • числовой формат, целый и дробный с плавающей точкой;
  • формат времени, даты, даты-времени;
  • преобразование символов к верхнему или нижнему регистру;
  • сравнение строк, поиск в строке и копирование подстроки;
    и многие другие...
   Непосредственно сами строки Delphi поддерживают единственную операцию, так называемую операцию конкатенации, то есть присоединения. Несмотря на "научное" название, операция конкатенации выполняет очень простую процедуру. С помощью операции конкатенации одна строка присоединяется к другой:

var S, S1, S2: String;
begin
 S:=S1+S2;
end;

   Результирующая строка S будет суммой двух слагаемых строк. Длина строки, то есть количество символов в строке, возвращается встроенной функцией

   function Length(S: String): Integer;

   Delphi работает со строками типа String, в котором длина строки записывается в начале строки, перед первым символом. Поэтому индекс первого символа в строке не 0, а 1. То есть, если:

S:='Строка типа String';

то S[1] - символ 'С', S[2] - символ 'т', последний символ в строке - S[Length(S)], равный 'g'.

   Однако часто приходится иметь дело со строками типа PChar, которые использует операционая система Windows. В строках типа PChar длина строки определяется специальным символом конца строки - #0. Поэтому для использования функций Windows тип String необходимо предварительно переводить в тип PChar. Преобразование типа String в тип PChar выполняет функция

   function PChar(S: String): PChar;

   Для полноценной работы со строками Delphi используются следующие стандартные процедуры и функции:

Функции преобразования в числовой формат и обратно

Выполняя вычисления, используем для ввода данных и отображения результатов следующие функции, работающие со строками Delphi:

 функция IntToStr(N: Integer): String
 Преобразует целое число N в строку.
 функция StrToInt(S: String): Integer
 Преобразует строку S в целое число.
 функция FloatToStr(X: Extended): String
 Преобразует число с плавающей точкой X в строку.
 функция StrToFloat(S: String): Extended
 Преобразует строку S в число с плавающей точкой.

Процедуры и функции преобразования дат и времени

Сначала собственно функции, предоставляющие информацию о текущих дате и времени:

 функция Now: TDateTime
 Возвращает текущую дату и время.
 функция Date: TDateTime
 Возвращает текущую дату.
 функция Time: TDateTime
 Возвращает текущее время.

Далее, функции, работающие с составляющими даты и времени (год, месяц, число, день недели, часы, минуты, секунды и даже миллисекунды):

 функция DayOfWeek(Date: TDateTime): Integer
 Возвращает текущий номер дня недели: 1 - воскресенье, 7 - суббота.
 процедура DecodeDate(Date: TDateTime; var Year, Month, Day: Word)
 Разбивает дату Date на год - Year, месяц - Month и день - Day.
 процедура DecodeTime(Time: TDateTime; var Hour, Min, Sec, MSec: Word)
 Разбивает время Time на час - Hour, минуты - Min, секунды - Sec и миллисекунды - MSec.
 функция EncodeDate(Year, Month, Day: Word): TDateTime
 Объединяет год - Year, месяц - Month и день - Day в значение типа TDateTime.
 функция EncodeTime(Hour, Min, Sec, MSec: Word): TDateTime
 Объединяет час - Hour, минуты - Min, секунды - Sec и миллисекунды - MSec в значение типа TDateTime.

Наконец, собственно, функции, переводящие дату и время из формата TDateTime в строчный формат:

 функция DateTimeToStr(DateTime: TDateTime): String
 Преобразует дату и время DateTime в строку.
 функция DateToStr(Date: TDateTime): String
 Преобразует дату Date в строку.
 функция TimeToStr(Time: TDateTime): String
 Преобразует время Time в строку.

Следующие функции работают с параметрами возвращаемой строки. Функции с приставкой Ansi работают в том числе и с кириллическими символами. Если символы в строках предполагаются исключительно латинские, то можно использовать аналогичные функции, но без приставки Ansi:

 функция AnsiLowerCase(const S: String): String
 Возвращает строку S, преобразованную к нижнему регистру.
 функция AnsiUpperCase(const S: String): String
 Возвращает строку S, преобразованную к верхнему регистру.
 функция Length(const S: String): Integer
 Возвращает количество символов в строке S.
 функция Trim(const S: String): String
 Удаляет из строки S начальные и завершающие пробелы и управляющие символы.
 функция TrimLeft(const S: String): String
 Удаляет из строки S начальные пробелы и управляющие символы.
 функция TrimRight(const S: String): String
 Удаляет из строки S завершающие пробелы и управляющие символы.

Следующие функции сравнивают две строки между собой:

 функция AnsiCompareStr(const S1, S2: String): Integer
 Сравнивает две строки S1 и S2 с учётом регистра символов.
 Возвращает значение <0 если S1<S2, 0 если S1=S2, >0 если S1>S2
 функция AnsiCompareText(const S1, S2: String): Integer
 Сравнивает две строки S1 и S2 без учёта регистра символов.
 Возвращает значение <0 если S1<S2, 0 если S1=S2, >0 если S1>S2

Следующие функции осуществляют поиск в текущей строке подстроки, вставляют, удаляют или заменяют подстроку:

 функция Pos(Substr: String; Str: String): Integer
 Возвращает позицию (индекс) первого вхождения Substr в строке Str. Если Substr нет в Str, возвращает 0.
 функция Insert(Source: String; var S: String; Index: Integer): Integer
 Вставляет строку Source в строку S, начиная с номера символа, равного Index
 процедура Delete(var S: String; Index, Count: Integer)
 Удаляет из строки S подстроку, начинающуюся с номера символа, равного Index, и содержащую до Count символов.
 функция StringReplace(const S, OldPattern, NewPattern: string; Flags: TReplaceFlags): String
 Заменяет в строке S подстроку OldPattern на строку NewPattern с учётом флага TReplaceFlags. Для работы с этой функцией нужно создать переменную типа TReplaceFlags - это множество, и включить в него одно или оба значения из следующих:
   rfReplaceAll - будут заменены все вхождения. Если это значение не будет включено во множество, то будет заменено только первое вхождение;
   rfIgnoreCase - замена будет без учёта регистра символов. Если это значение не будет включено во множество, то замена будет чувствительна к регистру символов.

Наконец, функция копирования части строки:

 функция Copy(S: String; Index, Count: Integer): String
 Возвращает подстроку строки S, начиная с номера символа, равного Index и содержащую до Count символов.

Помимо прочего, эту функцию можно использовать для вывода нецелого числа с нужным количеством цифр после запятой. Для этого, сначала получаем строку из числа формата Real, затем находим функцией Pos позицию запятой в этой строке, прибавляем нужное количество и копируем в результат это количество символов. Вот готовая функция:

function RealToStr(X: Real; Count: Integer): String;//Count - количество цифр после запятой
var S: String;
    N: Integer;
begin
  S:=FloatToStr(X); //после запятой - длинная последовательность цифр
//DecimalSeparator - константа, содержащая истинный разделитель целой и дробной частей числа   N:=Pos(DecimalSeparator, S); //позиция запятой в строке
//вычисляем длину строки с нужным количеством знаков после запятой:
  if N=0//если в строке нет запятой - это целое число, и
    then N:=Length(S)//тогда просто выводим это число
    else N:=N+Count;//иначе вычисляем длину строки
  Result:=Copy(S, 1, N);//копируем часть строки в результат
end;


   Или вот, к примеру, текст модуля, обеспечивающего ввод в компонент Edit только чисел.

   Продолжение. Списки строк, создание и использование


Обзор компонентов Delphi           В начало урока          Создание интерфейса  

Уроки Delphi начинающим



Вопросы и комментарии (89)      Решение задач в Delphi

Ян, добавлено 26.08.09, 00:55:10 
Отличный урок, без лишних слов, всё по теме, нашёл то, чего не нашёл в других источниках. Спасибо.
Yaksan, добавлено 8.09.09, 19:51:52 
Уроки просто супер спс. Будем ждать продолжения :)
Murod_tj, добавлено 15.09.09, 07:53:43 
a как на счет выделение текста или строки?
Автор, добавлено 15.09.09, 11:23:44 
Текст или часть строки выделяются в рамках какого-либо окна, например, компонентов Edit или Memo. На сайте есть описание этих компонентов.

Человек, добавлено 19.02.10, 12:47:31 
спасиб искал функцию для работы со строками... a как на счет выделение текста или строки? - для Мемо это SelStart, SelLength ...
Автор, добавлено 19.02.10, 15:56:44 
Всё написано выше.
Аноним, добавлено 28.02.10, 15:36:51 
Помоему здесь ошибка:
"функция Copy(S: String; Index, Count: Integer): Integer
Возвращает подстроку строки S, начиная с номера символа, равного Index и содержащую до Count символов."
copy должна возращать тип string
Автор, добавлено 28.02.10, 18:40:07 
Справедливо. Исправляю на
Copy(S: String; Index, Count: Integer): String;
X-8973, добавлено 14.03.10, 20:23:05 
Функции AnsiLoVerCase не существует. Есть функция AnsiLoWerCase.
Автор, добавлено 15.03.10, 07:13:25 
Спасибо!))) Исправил.
Аноним, добавлено 16.04.10, 19:47:24 
как прочитать дату?
Автор, добавлено 17.04.10, 00:26:49 
С помощью функции Now. Она даёт текущую дату и время. Можно сохранить в переменную типа TDate, или вывести с помощью метки Label:
Label1.Caption := DateToStr(Now);
Андрей, добавлено 23.07.10, 08:07:58 
Я бы внес корректировочку одну, потому как локали то бывают разные на машинах. и огрести можно по полной :-)

function RealToStr(X: Real; Count: Integer): String; //Count - количество цифр после запятой
var S: String;
N: Integer;
begin
S:=FloatToStr(X); //после запятой - длинная последовательность цифр
N:=Pos(DecimalSeparator, S); //позиция запятой в строке
N:=N+Count; //вычисляем длину строки с нужным количеством знаков после запятой
Result:=Copy(S, 1, N);
end;

Автор, добавлено 23.07.10, 09:06:23 
Совершенно справедливая поправка. Но, возможно, начинающим будет более понятен первый вариант. А возникновение ошибки будет дополнительным стимулом для развития! Тем не менее спасибо - поправку учёл!!!
Мельхиор, добавлено 9.08.10, 16:44:04 
Здравствуйте!
Можете подсказать, пожалуйста, как посчитать кол-во строк в TString? Например, заполнена, переменная Unt: Tstrings каким-то текстом, разбитым на строки.
Автор, добавлено 9.08.10, 20:02:41 
Переход на новую строку кодируется последовательностью #13+#10. Подсчитайте количество вхождений и прибавьте единичку. Второй вариант: создайте переменную типа TStringList (ну или воспользуйтесь компонентом Memo), запишите в неё ваш текст - он сам на строчки разобъётся, и подсчитайте их. Про TStringList и Memo на сайте есть странички.
Владимир, добавлено 8.01.11, 21:44:03 
TString.Count - количество строк в TString. Учтите, что строки TString начинаются с нуля.
Виктор, добавлено 14.03.11, 20:57:36 
Прекрасный материал для учащихся школы изучающих информатику на профильном уровне!
Использую на уроках.
Спасибо!
Мария, добавлено 8.04.11, 08:55:49 
Подскажите, как определить количество вхождений в подстроки в строку?
Автор, добавлено 8.04.11, 10:19:59 
Мария, с помощью функции pos определяем первое вхождение подстроки, если оно вообще есть. Затем с помощью функции delete удаляем первые символы, ключая символы подстроки, и повторяем это в цикле, пока функция pos не равна нулю.

var Str, StrCopy, Substr: String;
  N: Integer;
begin
  N:=0; //Количество вхождений
  StrCopy:=Str; //Чтобы не затереть оригинал, будем работать с копией
  while pos(SubStr, StrCopy)<>0 do
  begin
    delete(StrCopy, 1, pos(SubStr, StrCopy)+Length(SubStr)-1);
    N:=N+1;
  end;
end;

Вадим Мошев, добавлено 29.05.11, 13:43:56 
Здравствуйте.
Скажите, у Вас опечаток в описаниях функций сравнения строк нет случайно?
А то формулировка
функция AnsiCompareStr(const S1, S2: String): Integer
 Сравнивает две строки S1 и S2 с учётом регистра символов.
 Возвращает значение <0 если S1, 0 если S1=S2, >0 если S1>S2

Несколько непонятна. Может, имелось в виду :
Возвращает значение <0 если S10 если S1>S2
?
Автор, добавлено 29.05.11, 14:22:48 
Ну, конечно могут быть и ошибки, кто без греха...
Так что спасибо за помощь, Вадим, исправляю... Кстати, это не опечатка, а особенность отображения знаков < и > в html-страницах.
Дело в том, что эти знаки также составляют элементы html-тегов, вот браузер и путается.
иван, добавлено 9.06.11, 12:19:39 
я читаю строеу с 10 по15 символ, если есть пробел мне надо удалить пробел и вывести строку как это сделать
Автор, добавлено 9.06.11, 17:21:46 
Смотрите список функций вверху, найдите подходящую. Не получится, давайте ваш вариант, найдем ошибку.
Альбина Абенова, добавлено 22.06.11, 14:37:12 
решите кто нить плизззз задачу по Делфи!!!!!!!!!! Даны строки s1, s2 и символ С. Перед после каждого вхождения символа С в строку вставить строку s2
Иван, добавлено 2.08.11, 09:57:53 
Здраствуйте, а какой функцией возможно вычислить количество строк в memo?
Иван, добавлено 2.08.11, 10:10:09 
функцию нашел.
Автор, добавлено 2.08.11, 10:13:57 
количество строк в Memo1: Memo1.Lines.Count
Туся, добавлено 4.09.11, 15:32:40 
При удалении подстроки используется ПРОЦЕДУРА delete, а не функция. исправьте пожалуйста, а то весь мозг сломала когда ошибку искала .^_^
Автор, добавлено 4.09.11, 15:37:52 
Посмотрите внимательнее, Delete это именно функция, возвращающая, кроме изменения S, и собственное значение типа Integer. Я, правда, не описал его смысл, но тем не менее.
Туся, добавлено 5.09.11, 13:11:18 
Справка Делфи выдает
  Delphi syntax: procedure Delete(var S: string; Index, Count:Integer);

и какое собственное значение типа Integer выдает Delete?
Другие источники тоже указывают что это процедура. Если интересно могу привести ссылки.
Автор, добавлено 5.09.11, 21:28:53 
Вот это и называется работа с первоисточниками! Я был невнимателен, простите, и спасибо за подсказку. Статью немедленно исправляю.
Ерлан, добавлено 22.11.11, 14:34:25 
Version 300
Charset "WindowsCyrillic"
Delimiter ","
CoordSys Earth Projection 8, 1001, "m", 75, 0, 1, 13500000, 0 Bounds (13273605.238, 5282774.137) (13295340.939, 5306095.988)
Columns 1
  X Char(1)
Data

Pline 2
13275451.93 5304308.518
13275466.01 5304287.43
  Pen (2,2,139)
Pline 2
13275610.94 5304285.176
13275607.21 5304258.546
  Pen (2,2,139)

Использую Memo на чиная с 11 строки первую цифру мне нужно присвоить в первую переменную через пробел вторую цифру во вторую переменную,
на 12 строке первую цифру мне нужно присвоить в третью переменную через пробел вторую цифру в четвертую переменную потом сделать над ними вычисления.
Это возможно? Если да то как?
Автор, добавлено 22.11.11, 18:35:34 
Так вы же и читаете статью "Работа со строками"! Применяйте соответствующие функции, и всё!

Сначала нужно выделить нужную строку.

S:=Memo.Lines[n];//n - нужная строка

Затем найти позицию пробела

k:=pos(' ', S);

Первое число

X1:=copy(S, 1, k-1);

Второе число аналогично, но сами подумайте.
Ерлан, добавлено 24.11.11, 12:15:59 
Спасибо Большое!
Сможете ли помочь новичку написать цикл с заменой
s:=Memo1.Lines[10] ;
k:=pos(' ', S);
x1:=copy(S, 1, k-1);
y1.Text:=copy(S, 13, k-1);
s:=Memo1.Lines[11] ;
k:=pos(' ', S);
x1:=copy(S, 1, k-1);
y1:=copy(S, 13, k-1);
// здесь произойдут вычисления где получу новые зн-я х2 и у2 их надо заменить // заместо 11 строки
s:=Memo1.Lines[14] ;
k:=pos(' ', S);
x1:=copy(S, 1, k-1);
y1.Text:=copy(S, 13, k-1);
s:=Memo1.Lines[15] ;
k:=pos(' ', S);
x1:=copy(S, 1, k-1);
y1:=copy(S, 13, k-1);

Автор, добавлено 24.11.11, 21:48:26 
Если этот вопрос продолжение предыдущего, то второе число y1 найдено неверно. k - позиция пробела, т.е. для первого числа это конечная точка, а для второго - начальная. В функции pos сначала идёт строка, затем начальная позиция, затем количество символов. Для второго числа количество символов равно длина строки минус позиция пробела.

А заменить строку просто

Memo1.Lines[n]:=S;//n - нужная строка, S - текст замены
Ерлан, добавлено 26.11.11, 09:17:58 
Да это продолжение. Может я не верно как -то сделал y1, но в переменную он (дельфи)правильно записал, как можно сделать цикл со вторыми четырмя цифрами
Автор, добавлено 26.11.11, 09:29:33 
Даже если программа выдаёт правильные результаты, это ещё не значит, что она сделана правильно сама. Вы просто скопировали второе число, равное по длине первому и получилось правильно, но по смыслу оператора это неверно. Пример: 3+2=5, но это не значит, что этим действием нужно корень из 25 извлекать, хотя и равно одно другому.

Но если вас удовлетворяет результат, оставьте как есть. Со временем всё равно разберётесь.

Насчёт цикла вопрос не понял.
Дмитрий, добавлено 29.11.11, 21:31:57 
Не могу понять как вывести полученное значение. Когда пытаюсь вывести его при помощи Label1.Caption := IntToStr(Result); программа выдает ошибку,подскажите как его вывести, или же ошибка в самой программе?

procedure TForm1.Button1Click(Sender: TObject);
var A,B:integer; C,P:real;
begin
A := StrToInt(Edit1.Text);
B := StrToInt(Edit2.Text);
C := Sqrt(Sqr(A)+Sqr(B));
P := A+B+C;
end;

function RealToStr(P: Real; Count: Integer): String;
var S: String; N: Integer;
begin
S:=FloatToStr(P);
N:=Pos(',', S);
N:=N+Count;
Result:=Copy(S, 1, N);
end;

Автор, добавлено 29.11.11, 22:35:15 
Простите за задержку. Был занят с вопросами на другой странице.

Вот у вас текст, например в эдите:

Edit1.Text:=3,1415

Вам нужно вывести это число с двумя знаками после запятой в Label:

Label1.Caption:=RealToStr(Edit1.Text, 2);

Если же у вас число типа Real, то сначала переводим его в строку типа String, а только потом используем в функции RealToStr:

Label1.Caption:=RealToStr(FloatToStr(P), 2);

Но функцию RealToStr нужно разместить выше предыдущего кода.
Илья, добавлено 24.12.11, 23:55:27 
подскажите пожалуйста, вот тренируюсь (паскаль еще толком не освоил =)
procedure TForm1.Button1Click(Sender: TObject);
Var x: string; s:integer;
begin
x:=Edit1.Text;
s:=Length(x);
label3.Caption := 'В тексте '+ s + 'символов';
end;

Хочу написать программу подсчета символов в тексте, выдает ошибку тут:label3.Caption := 'В тексте '+ s (ТУТ КУРСОР) + 'символов'; звучит Incompatible types: 'String' and 'Integer'
понятно что какое то несоответствие типов, но где оно??? сто раз проверял, все правильно, на паскале аналог (тем же способом) работает нормально... что не верно?
Автор, добавлено 25.12.11, 07:38:59 
Ну как это где? S: Integer, 'В тексте' - (сами пишете!) текст. То есть вы текст прибавляете к целому числу, вот и несоответствие, это разные типы. Хотя на самом деле несоответствие Label3.Caption (тип String) и S. В статье первая же табличка содержит функцию преобразования числа, чтобы оно выводилось как текст: IntToStr. Короче, должно быть:

label3.Caption := 'В тексте '+ IntToStr(s) + ' символов';
Илья, добавлено 25.12.11, 19:02:23 
спасибо большое, вот еще тут аналогичная проблема(( хелп плиз!!!
procedure TForm1.Button1Click(Sender: TObject);
Var a,b,c,d,x1,x2:real;
begin
a:= StrToFloat(Edit1.Text);
b:= StrToFloat(Edit3.Text);
c:= StrToFloat(Edit4.Text);
d:= b*b-4*a*c;
x1:= (-b+sqrt(d))/2;
x2:= (-b-sqrt(d))/2;
label6.Caption:= 'x1= '+x1;
label7.Caption:= 'x2= '+x2;
end;

label6.Caption:= 'x1= '+x1;(ТУТ КУРСОР)
ошибка Incompatible types: 'String' and 'Real'
StrToFloat(x1) не помогает... помогите пжл :)
(п.с. в теории прога должна находить корни кв. уравнения)
Автор, добавлено 25.12.11, 22:58:26 
Ну при чём тут StrToFloat. Может, наоборот? FloatToStr.
Ник, добавлено 17.04.12, 18:13:15 
Скажите как разделить значение строки DBGrid ФИО на отдельные строки фамилия,имя, отчество
Автор, добавлено 17.04.12, 18:53:04 
С помощью функции pos находим позицию первого пробела. Функцией copy копируем фамилию с помощью delete эти символы из строки удаляем. С оставшейся строкой проделываем те же действия и получаем имя. В оставшейся части строки - отчество.
Аноним, добавлено 27.04.12, 09:34:50 
Скажите, а как вообще должна выглядеть дата, какой должен быть у нее формат записи. То есть ддммгггг, и какой у нее должен быть разделитель?
Автор, добавлено 27.04.12, 09:56:00 
А самому? Возьмите сегодняшнюю дату, и посмотрите третий символ. Все функции для этого приведены в статье.

Caption:=DateToStr(Now)[3];
Антон, добавлено 1.05.12, 17:51:37 
Скажите, а как можно сравнить две строки на совпадение по символам? Как я понял приведенные в уроке функции сравнивают строки по длине (иначе что означает запись s1Автор, добавлено 1.05.12, 18:10:11 
Нет, это сравнение по некоему значению, зависящему от алфавита. Например

'a12345' < 'b1'


Проверка на совпадение по символам - это проверка на равенство S1=S2
Аноним, добавлено 3.07.12, 22:26:11 
Кто может помогите!
Как найти в тексте все пары слов-соседей, второе из которых начинается на ту же букву, которой заканчивается первое из такой пары.
Автор, добавлено 4.07.12, 07:11:26 
Слова разделяются пробелом. Вот и ищите пробелы и смотрите символ до него и после него.

Если обратитесь по ссылке "Решение задач", я вам сделаю. Или давайте делайте сами, код - сюда. Что не будет получаться - помогу.
Аноним, добавлено 4.07.12, 12:46:34 
Допустим я нашел пробелы, как сделать так, чтобы выводились нужные пары слов?

Автор, добавлено 4.07.12, 14:52:57 
Вы имеете позицию пробела в тексте. Позиция минус один - предыдущий символ, плюс один - последующий. Если они равны, вы нашли. А потом нужно выявить эти слова. Опять же по пробелам до и после слова.

Нужен, конечно, пробный текст, так как могут ещё быть точки, запятые и другие знаки препинания, переходы на другую строку...
Аноним, добавлено 4.07.12, 15:00:45 
Спасибо.
Дмитрий, добавлено 31.08.12, 13:08:24 
Спасибо за отличный и подробный материал.
Николай, добавлено 21.09.12, 02:33:42 
Статья неплохая. Но хотелось бы больше узнать про другие строковые типы ShortString, LongString (AnsiString), WideString. Кстати тип String давно приравнен к LongString.
Ну и пара советов, правда они больше касаются вопросов в комментариях.
1). По поводу путаницы с десятичной точкой/запятой. Советую обратить внимание на переменнную SysUtils.DecimalSeparator . Она отвеает за локаль. Кстати в этом модуле много интересных переменных. Список можно получить через предметный указатель справки введя "DecimalSeparator variable".
2). Для разбивки строки на подстроки по вхождению некого символа удобно использовать класс TStringList, точнее два его свойства Delimiter и DelimitedText. Первое отвечает за этот самый символ, второе является строкой которую будем разбивать. Результат получаем в свойстве Strings.
Владимир, добавлено 11.10.12, 13:52:45 
Кто сможет помочь решить задачу в delphi?
Автор, добавлено 11.10.12, 16:31:19 
ПОМОЧЬ могу и я. Рассмотря ваши наработки и указав на ошибки или подсказав алгоритм.
Владимир , добавлено 12.10.12, 11:40:34 
я тебя не совсем понял)
Автор, добавлено 12.10.12, 11:51:11 
Если нужно помочь в том что не получается, то так. А если решить вместо тебя, то смотри ссылку выше: Решение задач (небесплатно).
Вовка, добавлено 10.10.13, 19:57:20 
Здравствуйте) с вашего сайта начал изучать делфи 22 августа этого года)) У меня вопрос. есть два мемо поля. в одном список чисел. я нахожу самое большое значение и копирую его в переменную. как вывести сообщение с текстом из второго мемо, строка должны быть такой же как у максимального числа из первого мемо. например в первом мемо число 700 на 26 строчке, нужно из второго мемо в шоумессэдж вывести значение 26 строки
Автор, добавлено 10.10.13, 20:11:33 
Вывести значение строки Memo2 с тем же индексом что и найденный в Memo1?

ShowMessage(Memo2.Lines[i]);

где i - найденный индекс строки первого Memo. Если не так понял, извиняйте - выражайтесь точнее.
Аноним, добавлено 10.10.13, 20:25:34 
procedure TForm1.Button23Click(Sender: TObject);
var
  max: real;
  i: word;
begin
  if Memo36.Lines.Count = 0 then Exit;//если первое поле пусто -выходим из процедуры
  max:= StrToFloat(Memo36.Lines[0]);//максимальное значение - первая строка в списке мемо
  for i:= 1 to Memo36.Lines.Count-1 do// от второй строки до последней строки
  begin
  if StrToFloat(Memo36.Lines[i]) > max then // если строка преобразованная в текст больше чем максимаьное текущее значение то
  max:= StrToFloat(Memo33.Lines[i]) ;//то максимальным значением делаем значение этой строки
  end;
  ShowMessage(FloatToStr(max));//показываем в сообщении максимальное число
end;
. я знаю мах значение, как узнать строку этого мах значения?? и потом показать текст такого же номера строки из другого мемо
Автор, добавлено 10.10.13, 20:44:07 
Ну как узнать???

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

procedure TForm1.Button23Click(Sender: TObject);
var
  max: real;
  i, n: word;//n - переменная для хранения текущего индекса строки с максимальным значением
begin
  if Memo36.Lines.Count = 0 then Exit;//если первое поле пусто -выходим из процедуры
  max:= StrToFloat(Memo36.Lines[0]);//максимальное значение - первая строка в списке мемо
  n:=0;
  for i:= 1 to Memo36.Lines.Count-1 do// от второй строки до последней строки
  if StrToFloat(Memo36.Lines[i]) > max then // если строка преобразованная в число больше чем максимаьное текущее значение то
  begin
  max:= StrToFloat(Memo33.Lines[i]) ;//то максимальным значением делаем значение этой строки
  n:=i;//запоминаем индекс строки с текущим максимальным значением
  end;
  ShowMessage(FloatToStr(max));//показываем в сообщении максимальное число
end;

Вовка, добавлено 10.10.13, 21:10:23 
Спасибо большое. а я не в том направлении думал и не мог сообразить как имея значение - отыскать строку. спасибо еще раз.
Павел, добавлено 5.11.13, 16:19:05 
Спасибо!
Сергей, добавлено 22.12.13, 22:44:26 
Прошу помочь разобраться. Возможно ли реализовать поиск строки учитывая, что часть символов в нем является значимой, а часть нет?
Например, задана строка для поиска: edit53.Text:='(:4624'+chr(32)+'81760'+chr(32)+ks+chr(32)+'2'+chr(32)+'1305'+chr(32)+edit1.text+chr(32)+'1'; в которой подстрока "ks" значимой не является?
Длина подстроки "ks" является постоянной.
Автор, добавлено 22.12.13, 22:57:11 
Всё это делается с помощью регулярных выражений, хотя я всё никак не соберусь их освоить.
А не осваиваю я их потому, что также можно искать подстроки с помощью обычных функций pos и copy.
Например, вашу подстроку можно поискать как строку, одновременно содержащую и '(:4624'+chr(32)+'81760'+chr(32)' и chr(32)+'2'+chr(32)+'1305'+chr(32)+edit1.text+chr(32)+'1'.
То есть позиции этих подстрок одновременно не должны быть равны нулю в этой строке. При этом ks никак не влияет.
Аноним, добавлено 3.03.14, 14:07:21 
Чтобы сложить секунды, минуты и часы, можно сделать так:
DecodeTime(StrToTime(Edit1.Text.Text),h,m,s,ms);
Edit1.Text:=IntToStr(s+(m*60)+(h*60)*60);
Хотелось бы узнать, как число распределить "обратно" по часам, минутам и секундам.
(это нужно для того, чтобы, например, к 15:59:50 прибавить 20 секунд, чтобы получилось 16:00:10 но никак иначе =)
Автор, добавлено 3.03.14, 14:24:19 
Отвлекитесь от программирования, и сами возьмите число 3721 секунда например. Сколько это часов минут и секунд? Вы сможете решить эту задачу?

Если сможете, то запомните операции, которые для этого нужны - и затем переведите в команды Delphi (mod и div вам в помощь). Это и называется разработка алгоритма. А если не сможете, то программирование вообще ни при чём... Я арифметике не учу.
Ульяна, добавлено 16.03.14, 16:41:06 
Разработать программу, которая из строки, содержащей некоторый текст, выделяет все слова и печатает их в алфавитном порядке (по первой букве).
Очень нужна помощь!!!
Автор, добавлено 16.03.14, 16:47:35 
Алгоритм должен быть такой: составляете множество всех разделителей слов - пробела, знаков препинания, ещё чего придумаете. Далее в цикле проверяете все символы, найдёте разделитель - копируете в список символы от первого до разделителя минус 1, затем эти символы удаляете. И начинаете сначала. Список типа StringList сортирует слова автоматически, если его об этом "попросить".

Что непонятно, спрашивайте.
Ульяна, добавлено 16.03.14, 17:07:39 
массив должен задаваться в procedure TForm2.Edit1Change(Sender: TObject);а в обработчике события кнопки уже выводить в Label
Автор, добавлено 16.03.14, 17:14:34 
Это круто.
Ульяна, добавлено 16.03.14, 17:27:08 
Не спорю.Но не очень получается.Можете мне написать?
Ульяна, добавлено 16.03.14, 17:32:36 
и вот такую: На форму поместить N точек (каждая точка помещается на форму по нажатию левой / правой кнопок мыши и имеет номер 1..N). Вычислить сумму расстояний между всеми парами точек с четными номерами. Задачу решить отдельно для групп точек, созданных по левой и по правой кнопке мыши. Начало работы алгоритма - по нажатию определенной клавиши на клавиатуре, результат выдать функцией TextOut в середине окна.Пожалуйста!
Ульяна, добавлено 16.03.14, 17:34:07 
извиняюсь,вот такую надо.На форму поместить N точек (каждая точка помещается на форму по нажатию правой кнопки мыши и имеет номер 1..N). Упорядочить точки по возрастанию / убыванию расстояния до точки, заданной последним нажатием левой кнопки мыши. Начало работы алгоритма - по нажатию определенной клавиши на клавиатуре, результат выдать функцией TextOut, подписав номера каждой точки.
Автор, добавлено 16.03.14, 17:37:14 
Там, рядом со ссылочкой "Комментарии" есть другая: "Решение задач на заказ". Так и говорите, что нужно не помочь а сделать для вас. Стоить будет недорого.
А если вы хотите "помощи", то чем могу - помогу, подскажу, но делать за вас не стану.
Автор, добавлено 16.03.14, 17:48:36 
Да, можно. Но только во вторник - пока занят. Напоминаю - это не бесплатно.
Ульяна, добавлено 16.03.14, 17:54:00 
Хорошо.Спасибо
Алеся, добавлено 16.03.14, 18:46:59 
Скажите, что делает данная функция function GetSubStr(st:string; expl:string; n:integer):string;
Автор, добавлено 16.03.14, 20:30:15 
Хм, я полез в интернет и выяснил, что это самостоятельно написанная кем-то функция. Советую вам сделать то же самое. Это не встроенная функция Delphi. По смыслу - эта функция выделяет часть строки.
Ульяна, добавлено 16.03.14, 21:58:53 
Вот,что у меня получилось.Но вот что у меня получилось.Подскажите пожалуйста,что со сравнением не так:
function TForm1.Vvod(st:string; expl:string; n:integer):string;
 Var p,i:integer;
Begin
 for i:= 1 to n-1 do
 begin
  p:=pos(expl,st);
  st:=copy(st,p+1,Length(st)-p);
  while (pos(expl,st)=1) and (length(st)>0) do
  delete(st,1,1);
 end;
p:=pos(expl,st);
if p<>0 then result:=copy(st,1,p-1)
else result:=st;

End;




procedure TForm1.Button1Click(Sender: TObject);
var
a:array[1..10] of string;
i,j:integer;
Tmp:string;
st:string;
begin

 For i := 1 to 10-1 do
  begin {ëåêñèêîãðàôè÷åñêîå óïîðÿäî÷åíèå ñëîâ}
  For j := 1 to 10-1 do
  If a[j]>a[j+1] then
  begin
{Tmp := a[j]; a[i]:=a[j+1];}a[j+1]:=Tmp;
  end;
end;
 for i:=0 to 10-1 do
 a[i]:=Vvod(Edit1.text,' ',i);
for i:=1 to 10-1 do
st:=st+IntTostr(i)+' '+a[i]+#13;
ShowMessage(st);
end;

 
Автор, добавлено 16.03.14, 22:17:16 
А что мы делаем-то? Слова выделяем?
1. Нужно составить множество разделителей
const Divide = [' ', .'., ',' '!', '?', ':', '"'];//недостающие добавить
2. Проверять все символы в цикле
for i:=1 to Length(S) do
  if (S[j] in Divide) then
 - тут копируем от 1 до i-1, это очередное слово
  List.Add(copy(S, 1, i-1));
 - удаляем из S i символов
  Delete(S, 1, i);
 - начинаем заново
Ульяна, добавлено 16.03.14, 22:24:02 
у меня в качестве разделителей только пробелы.Массив из слов у меня есть,осталось только загвоздка как сравнить по алфавиту.нужен новый массив или нет?
Автор, добавлено 16.03.14, 22:29:48 
Ну в чём проблема?
если S[i]=' ' то
begin
копируем
удаляем
end;
начинаем сначала
Оставить комментарий:

Имя  

Текст комментария