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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 08.02.2021, 19:26
Katerina1993 Katerina1993 вне форума
Прохожий
 
Регистрация: 22.09.2018
Сообщения: 11
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию Не работают коллекции в коде?

Мне в коде нужно использовать коллекции.
Пример:
Код:
 strArray: TArray<string> = ['Раз', 'Два', 'Три', 'Четыре', 'Пять'];
Выдает ошибку, подключить в uses -> System.Generics.Collections, не получается. Может кто-нибудь сюда pas файл скинуть Collections, чтобы я могла подключить его?
P.S.
У меня delphi 7.

Последний раз редактировалось Katerina1993, 08.02.2021 в 19:33.
Ответить с цитированием
  #2  
Старый 08.02.2021, 21:08
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,004
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Ну так нет в D7 этого модуля, как, в прочем, и дженериков вообще.
Варианты:
1. Перейти на свежую версию, где они есть (есть бесплатная Community Edition, там с ограничениями, но они скорее декларативные, просто зарегистрироваться надо для получения ключа, раньше еще была бесплатная Starter Edition, но что с ней сейчас просто не знаю).
2. искать модуль для имплементации контейнеров для D7.
3. Использовать контейнеры общего назначения, как то TStringList в твоем случае. Кода будет чуть побольше, но не принципиально:
Код:
var
  strArray : TStringList;

procedure CreateStrArray(var cont : TStringList; items : Array Of String);
var
  I : Integer;
begin
  if Not Assigned(cont) Then cont := TStringList.Create;
  cont.Clear;
  For I := Low(items) To High(items) Do
    cont.Add(items[i]);
end;

Ну и в коде, где надо инициализировать твой массив пишешь:
Код:
CreateStrArray(strArray,['Раз', 'Два', 'Три', 'Четыре', 'Пять']);
Ответить с цитированием
  #3  
Старый 11.02.2021, 08:48
Katerina1993 Katerina1993 вне форума
Прохожий
 
Регистрация: 22.09.2018
Сообщения: 11
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Мне нужно присвоить эту процедуру к переменной. Какой тип переменной объявить в var?
Код:
CurrentString := CreateStrArray(strArray,['Раз', 'Два', 'Три', 'Четыре', 'Пять']);

Например
var CurrentString: -> ?
Ответить с цитированием
  #4  
Старый 12.02.2021, 01:46
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,004
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Это ПРОЦЕДУРА. Она не возвращает значение. Соответственно, так писать нельзя. Для возвращаемого значения у нее есть первый параметр.

Если очень хочется иметь в виде функции, то тогда так:
Код:
function CreateStrArray(items : Array Of String) : TStringList;
var
  I : Integer;
begin
  Result := TStringList.Create;
  For I := Low(items) To High(items) Do
    Result.Add(items[i]);
end;

И тогда вызов:
Код:
var
  CurrentString : TStringList;
...
  CurrentString := CreateStrArray(['Раз', 'Два', 'Три', 'Четыре', 'Пять']);
Ответить с цитированием
  #5  
Старый 14.02.2021, 14:15
Katerina1993 Katerina1993 вне форума
Прохожий
 
Регистрация: 22.09.2018
Сообщения: 11
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

У меня тут пример есть, который тоже не работает выдает ошибку. Как нибудь массивы можно сделать по delphi 7, так как здесь тоже есть TArray<TypeString>?
Код:
var
  Str: PWideChar;
begin
  Str := '"T My \" " x'; // 11
 
  ShowMessage(Test(Str[0], Length(Str), 0).ToString);
end;
Код:
function Test(var Buffer; BufferLen, Offset: Cardinal): Integer;
type
  TypeString = char;
var
  CurrentByte: TypeString;
  CurrentLen: Cardinal;
  SkipDoubleQuotes: Boolean;
begin
  SkipDoubleQuotes := false;
 
  CurrentLen := Offset;
  while CurrentLen <= BufferLen do
  begin
    CurrentByte := TArray<TypeString>(@Buffer)[CurrentLen];
    inc(CurrentLen);
 
    if SkipDoubleQuotes then
    begin
      case CurrentByte of
        '"', '''':
          begin
            if TArray<TypeString>(@Buffer)[CurrentLen - 2] = '\' then
              Continue;
 
            SkipDoubleQuotes := false;
          end;
      end;
    end
    else
      case CurrentByte of
        #9, #10, #13, #32:
          exit(CurrentLen);
        '"', '''':
          SkipDoubleQuotes := true;
      end;
  end;
 
  exit(-1);
end;

Последний раз редактировалось Katerina1993, 14.02.2021 в 14:18.
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter