Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Обработка атрибутов в строках с несколькими разделителями: точка с запятой и двоеточие в проектах на Delphi и Pascal

Delphi , Компоненты и Классы , Списки

Обработка атрибутов в строках с несколькими разделителями в Delphi и Pascal

Работа с строками, содержащими атрибуты с несколькими разделителями, является распространенной задачей при разработке на Delphi и Pascal. В частности, когда атрибуты разделены точкой с запятой, а значения атрибутов - двоеточием. В данной статье мы рассмотрим, как правильно обработать такую строку, используя примеры из реального проекта.

Описание проблемы

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

Пример строки:

;EncoderMin:250;EncoderMax:5755;MinPixel:-240;MaxPixel:980;

Функция должна принимать тип атрибута (например, EncoderMin) и возвращать его значение, в данном случае 250.

Пример неудачного кода

В качестве примера приведен код, который не справляется с задачей обработки двух разделителей:

function TFrameLayout3DSTD.GetAttributiSTD(ALoc: Integer; AField: String; AVarType: Word): Variant;
var
  Q: TADOQuery;
  LLista : TStringList;
begin
  Result := nil;
  Q := DMConn.GetQuery(
    'select AttributiSTD from Locazioni3D where idLocazione = %d', [ALoc]);
  try
    Q.Open;
    LLista := TStringList.Create;
    try
      LLista.Delimiter := ';';
      LLista.StrictDelimiter := True;
      LLista.DelimitedText := Q.Fields[0].AsString;
      Result := LLista.Values[AField];
    finally
      LLista.Free;
    end;
  finally
    Q.Free;
  end;
end;

Альтернативное решение

Проблема в том, что код ожидает только один разделитель, в то время как в строке их два. Чтобы решить эту задачу, необходимо указать дополнительный разделитель для TStringList. В комментариях предложено добавить строку LLista.NameValueSeparator := ':';, однако это решение не будет работать корректно из-за того, что StrictDelimiter и NameValueSeparator не могут быть установлены одновременно.

Подтвержденное решение

Автор вопроса нашел решение, установив в качестве разделителя символ равенства =, что позволило Delphi автоматически распознать значения. Это решение работает, так как в TStringList нет ограничений на использование символа равенства в качестве разделителя, и он не конфликтует с другими возможными разделителями в данном контексте.

Альтернативное решение с использованием Split и IndexOfText

Другой способ обработки строк - использование функций Split и IndexOfText из модуля System.SysUtils. Пример кода:

uses
  System.SysUtils, System.StrUtils, System.Variants;
var
  txt: string;
  arr: TArray<string>;
  i: Integer;
  v: Variant;
begin
  try
    v := nil;
    txt := ';EncoderMin:250;EncoderMax:5755;MinPixel:-240;MaxPixel:980;';
    arr := txt.Split([';', ':']);
    i := IndexOfText('EncoderMin', arr);
    if i > 0 then
      v := arr[Succ(i)];
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end;

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

Вывод

При работе с строками, содержащими несколько разделителей, важно правильно выбрать инструменты для их обработки. В данном случае, использование TStringList с правильно установленным разделителем, или же использование функций Split и IndexOfText позволяет достичь желаемого результата.

Создано по материалам из источника по ссылке.

Задача заключается в обработке строк с атрибутами и значениями, разделенными точками с запятой и двоеточиями соответственно, с целью извлечения значений атрибутов в среде разработки Delphi и Pascal.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Списки ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-05-09 09:37:24/0.0060830116271973/0