Назначения OleVariant и String в Delphi 5 - PullRequest
1 голос
/ 07 марта 2012

У меня есть устаревшее приложение Delphi 5, и есть часть, в которой значение "string" было присвоено переменной "OleVariant".Примерно так:

var
   X: OleVariant;
   S: string;
Begin
   S:= ‘This string should contain 200 characters as per design’;
   X:= S; 
End;

Если длина «S» больше 128, то значение «X» будет усечено, и оно будет содержать максимум 128 символов.

Есть ли способ преодолеть это?

Я считаю, что есть способ, потому что, если я создаю свое собственное демо-приложение с нуля (на том же ПК, с тем же Delphi 5), это позволяет мне проходить дольшестроковые значения и усечение не выполняется.

Возможно, это что-то из настроек проекта или директив компилятора.Я поиграл с этой идеей, но у меня пока нет обходного пути.

Любая помощь приветствуется.Спасибо.

Демо:

procedure TForm1.Button1Click(Sender: TObject);
var
  X: OleVariant;
  S: string;
begin
  //in the Edit I pass a string of 240 chars, let's say;
  S:= Edit1.Text;
  X:= S;
  ShowMessage(IntToStr(Length(X)) + ' : ' + IntToStr(Length(S)));
  //this showmessage shows "128 : 240"
end;

Ответы [ 3 ]

2 голосов
/ 28 августа 2012

Попробуйте это OleVariantToString и StringToOleVariant функции на http://www.foxbase.ru/delphi/vzaimnye-preobrazovaniya-olevariant-i-string.htm

Они отлично работают для меня.

uses Classes, Variants;
function OleVariantToString(const Value: OleVariant): string;
  var ss: TStringStream;
      Size: integer;
      Data: PByteArray;
begin
  Result:='';
  if Length(Value) = 0 then Exit;
  ss:=TStringStream.Create;
  try
    Size := VarArrayHighBound (Value, 1) - VarArrayLowBound(Value, 1) + 1;
    Data := VarArrayLock(Value);
    try
      ss.Position := 0;
      ss.WriteBuffer(Data^, Size);
      ss.Position := 0;
      Result:=ss.DataString;
    finally
      VarArrayUnlock(Value);
    end;
  finally
    ss.Free;
  end;
end;

function StringToOleVariant(const Value: string): OleVariant;
  var Data: PByteArray;
      ss: TStringStream;
begin
  Result:=null;
  if Value='' then Exit;
  ss:=TStringStream.Create(Value);
  try
    Result := VarArrayCreate ([0, ss.Size - 1], varByte);
    Data := VarArrayLock(Result);
    try
      ss.Position := 0;
      ss.ReadBuffer(Data^, ss.Size);
    finally
      VarArrayUnlock(Result);
    end;
  finally
    ss.Free;
  end;
end;
1 голос
/ 07 марта 2012

Одно из объяснений состоит в том, что OleVariant содержит всю строку, но вы смотрите на подсказку отладчика. В более старых версиях Delphi подсказка отладчика усекается до 128 символов для строк, содержащихся в варианте. Обратите внимание, что подсказка отладчика для простого string не усекается при такой длине. Попробуйте показать вариант в диалоговом окне, и вы увидите, что присутствует вся строка.

Я проверил это на Delphi 6, и у вас не было усечения с вашим кодом (кроме подсказки отладчика). Андреас сделал то же самое на Delphi 4, а Родриго сделал то же самое с Delphi 5. Я не могу представить, что действительно может быть так, что строки в Delphi 5 OleVariant усекаются до 128 символов.

Если вы действительно видите, что вы сообщаете, тогда я могу придумать следующие объяснения:

  • Ваш код ошибочно усекает строку, но вы еще не нашли код, который делает это. Только вы можете отладить это.
  • У вас есть локальная ошибка, частная для вашей установки Delphi. Вы случайно не составляли свой собственный RTL?
0 голосов
/ 07 марта 2012

Я сделал эту работу.Резюме: вместо заполнения «OleVariant» «строкой»;Я заполнил «Вариант», а затем набрал «Вариант» в «ОлеВариант».Посмотрите на приведенный ниже код, чтобы вы могли понять эту идею.

procedure TForm1.Button1Click(Sender: TObject);
var
  //X: OleVariant;
  X: Variant;
  S: string;
begin
  //Let's say in the Edit1 I pass a string of 240 chars,
  S:= Edit1.Text;
  X:= S;

  //ShowMessage(IntToStr(Length(X)) + ' : ' + IntToStr(Length(S)));
  ShowMessage(IntToStr(Length(OleVariant(X))) + ' : ' + IntToStr(Length(S)));
  //This ShowMessage shows "128 : 240"
end;

Честно говоря, я не знаю наверняка, почему это имеет значение, но это имеет значение.Теперь все работает нормально.

Большое спасибо за помощь, ребята!

...