#c# #delphi #wsdl
#c# #delphi #wsdl
Вопрос:
Пытаюсь узнать, как использовать WSDL в приложении Delphi 7. WSDL, который я пытаюсь использовать, имеет пользовательский тип массива.
Паскаль
ArrayOfSomething = array of Something;
Как мне создать экземпляр этого типа массива?
Пробовали:
Паскаль
var
somethingList : ArrayOfSomething;
begin
somethingList := ArrayOfSomething...
end;
The … выше означает, что я ищу метод и не нахожу его. Обычным способом я бы создал экземпляр объекта, например:
Паскаль
var
object : className;
begin
object := className.Create;
end;
Итак, вы можете понять, почему я пытаюсь создать массив таким же образом, даже если это не объект.
Имейте в виду, я переписываю код C # и пытаюсь заставить его работать на Pascal. Исходный C # похож:
C#
List<Something> somethingList = new List<Something>();
И использование похоже:
C#
envelope.listField = somethingList.ToArray();
Я также пробовал это:
Паскаль
var
somethingList : TList;
begin
somethingList := TList.Create;
end;
Да, это работает, пока я не попытаюсь отправить его в конверт.
Паскаль
envelope.listField := somethingList;
Конверт ожидает ArrayOfSomething не TList . Ошибка — это что-то вроде «Несовместимые типы, TList и ArrayOfSomething».
Ответ №1:
An array of
— это встроенный тип, это не класс. Чтобы задать его размер, используйте SetLength()
, например
var
Arr: ArrayOfSomething;
begin
SetLength(Arr, 273);
Также обратите внимание, что это не то же самое, что список, это массив, в котором нет встроенного способа вставки или удаления значений. Вы можете читать и изменять значения или изменять размер массива, не более.
Если вам нужны обобщения, как в C #, вам придется использовать более высокую версию Delphi, чем 7. Я не уверен, но я думаю, что они были введены в Delphi 2010 или Delphi XE. Я думаю, кто-нибудь может сообщить мне об этом (обновление: Дэвид Хеффернан сказал мне, что это версия 2009)
В этих более высоких версиях вы также можете использовать TList<T> , что, вероятно, то, что вы хотите. До тех пор вы можете использовать TList, который содержит указатели (но не может быть использован напрямую в связи с WSDL, поэтому содержимое, возможно, придется сначала переместить в массив). Возможно, вам придется использовать New() , Dispose() и приведения, чтобы использовать его.
Комментарии:
1. Delphi 2009 для обобщений
2. Итак, подводя итог, маршрут, по которому я иду, просто не будет работать, но есть обходной путь с TList .
3. @user Вы не хотите иметь ничего общего с TList. У вас есть динамический массив.
4. Я не знаю, по какому маршруту вы хотите пойти. Динамические массивы могут быть очень полезны, возможно, также в вашем коде, но они не являются списками. Чтобы получить списки, к которым вы привыкли в C #, вам нужно будет получить более современную версию, чем Delphi 7, которая, IIRC, примерно такая же старая, как C # 1.0 (в которой также не было дженериков).
5. @Rudy в WSDL используются динамические массивы. Поэтому предложение TList кажется тупиковым.
Ответ №2:
type
ArrayOfSomething = array of Something;
Это динамический массив Delphi. Вы инициализируете его вызовом SetLength
:
SetLength(somethingList, 42);
Вам следует ознакомиться с документацией по динамическим массивам, чтобы узнать больше.