Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.08.2016, 16:22   #1
alio
Новичок
Джуниор
 
Регистрация: 05.08.2016
Сообщений: 1
По умолчанию Работа с WideString в D7

Почему данный код работает неправильно?

procedure TForm1.BitBtn1Click(Sender: TObject);
var rw1,rw2,rw3: widestring;
begin
rw1:='aaaaaa';
rw2:='';
rw3:='';
rw1:=rw2+rw3;
Caption:=rw1;
//в результате - значение rw1 остается прежним 'aaaaaa'
end;
alio вне форума Ответить с цитированием
Старый 05.08.2016, 17:10   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Похоже глюк компилятора. Сброс оптимизации и дебагера в свойствах проекта не помогает. Если сделать так rw1:=rw2+rw3+''; то все Ok
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 05.08.2016, 19:01   #3
PIKACHU
Пользователь
 
Аватар для PIKACHU
 
Регистрация: 20.10.2009
Сообщений: 23
По умолчанию

Глюк, хотя в делфи 7 с widestring много глюков было.
PIKACHU вне форума Ответить с цитированием
Старый 08.08.2016, 19:48   #4
Vapaamies
Ваш К. О.
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,755
По умолчанию

Ух ты, какой классный глюк! Не встречался с ним на практике. В модуле System Delphi 6 и 7:
Код:
procedure _WStrCat3(var Dest: WideString; const Source1, Source2: WideString);
var
  Source1Len, Source2Len: Integer;
  NewStr: PWideChar;
begin
  Source1Len := Length(Source1);
  Source2Len := Length(Source2);
  if (Source1Len <> 0) or (Source2Len <> 0) then
  begin
    NewStr := _NewWideString(Source1Len + Source2Len);
    Move(Pointer(Source1)^, Pointer(NewStr)^, Source1Len * sizeof(WideChar));
    Move(Pointer(Source2)^, NewStr[Source1Len], Source2Len * sizeof(WideChar));
    WStrSet(Dest, NewStr);
  end;
end;
Не понятно, что курили разработчики. А вот в System от Delphi XE2 уже так:
Код:
procedure _WStrCat3(var Dest: WideString; const Source1, Source2: WideString);
var
  Source1Len, Source2Len: Integer;
  NewStr: PWideChar;
begin
  Source1Len := Length(Source1);
  Source2Len := Length(Source2);
  if (Source1Len <> 0) or (Source2Len <> 0) then
  begin
    NewStr := _NewWideString(Source1Len + Source2Len);
    Move(Pointer(Source1)^, Pointer(NewStr)^, Source1Len * sizeof(WideChar));
    Move(Pointer(Source2)^, NewStr[Source1Len], Source2Len * sizeof(WideChar));
    WStrSet(Dest, NewStr);
  end
  else
    _WStrClr(Dest);
end;
Почувствуйте разницу.
Vapaamies вне форума Ответить с цитированием
Старый 08.08.2016, 19:57   #5
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

У-у, в генокоде даже
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 09.08.2016, 13:22   #6
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,859
По умолчанию

Исправлено было при переходе от Delphi к BDS
northener вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

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

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
WideString и буфер обмена _ZixeL_ Общие вопросы Delphi 0 15.11.2012 08:27
Вопрос по WideString Den7656 Общие вопросы Delphi 2 10.10.2011 17:26
Работа с файлами и WideString Alt Общие вопросы Delphi 25 20.12.2010 05:40
Конвертиция WideString в String [D2007] AndreyFreeman Общие вопросы Delphi 5 18.09.2010 17:51
WideString и String Mitron Общие вопросы Delphi 1 11.02.2008 19:14