Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.09.02;
Скачать: CL | DM;

Вниз

Unicode. Функция copy для widestring.   Найти похожие ветки 

 
rolex2002   (2007-06-27 12:58) [0]

Функция Copy{s:ShortString; index,count:Integer):ShortString}; предназначена для не WideString"ов. Я перевожу свою программу на unicode, теперь мне необходима функция copy для widestring"ов. Есть ли такая или что можно придумать?


 
clickmaker ©   (2007-06-27 13:05) [1]

lstrcpyW()
Move()

и с чего-бы там именно ShortString? Нормальные строки и динамические массивы, в том числе


 
Сергей М. ©   (2007-06-27 13:06) [2]


> Есть ли такая


Есть.

см. MidStr()


 
rolex2002   (2007-06-27 13:10) [3]


> и с чего-бы там именно ShortString? Нормальные строки и
> динамические массивы, в том числе

Из исходника system.pas:

...
function _LStrToPChar(const s: AnsiString): PChar;
procedure _Copy{ s : ShortString; index, count : Integer ) : ShortString};
procedure _Delete{ var s : openstring; index, count : Integer };
procedure _Insert{ source : ShortString; var s : openstring; index : Integer };
procedure _Pos{ substr : ShortString; s : ShortString ) : Integer};
procedure _SetLength(s: PShortString; newLength: Byte);
...


 
Anatoly Podgoretsky ©   (2007-06-27 13:14) [4]

> rolex2002  (27.06.2007 12:58:00)  [0]

Если переводишь, то это не единственная проблема
Надо задействовать компоненты третьих сторон и перейти на 2006


 
Сергей М. ©   (2007-06-27 13:15) [5]


> Из исходника system.pas


В исходники следует лезть, когда инф-ции нет в справке или она неполная/неточная.

А в справке к ф-ции Copy() черным по белому написано:

Delphi syntax:

function Copy(S; Index, Count: Integer): string;
function Copy(S; Index, Count: Integer): array;

где S - это, в т.ч. любой строковый тип, поддерживаемый Делфи.


 
clickmaker ©   (2007-06-27 13:20) [6]


> [3] rolex2002   (27.06.07 13:10)

{ } заметил?

function Copy(S; Index, Count: Integer): string;

Returns a substring of a string or a segment of a dynamic array.

(с) F1


 
rolex2002   (2007-06-27 13:23) [7]


> Если переводишь, то это не единственная проблемаНадо задействовать
> компоненты третьих сторон и перейти на 2006

Перешёл на TNT. А вот среда Delphi 7.

Т.е. MidStr() это аналог copy(), но только для WideString?
Что-то меня усомнила вот эта пометка в справке:
Note: If AText is an AnsiString and the current locale uses multi-byte characters, MidStr may return more than ACount bytes. To return a specific number of bytes, use MidBStr.


 
rolex2002   (2007-06-27 13:31) [8]

Нашёл в system.pas вот это:

function _WStrCopy(const S: WideString; Index, Count: Integer): WideString;
...
function _WStrCopy(const S: WideString; Index, Count: Integer): WideString;
var
 L, N: Integer;
begin
 L := Length(S);
 if Index < 1 then Index := 0 else
 begin
   Dec(Index);
   if Index > L then Index := L;
 end;
 if Count < 0 then N := 0 else
 begin
   N := L - Index;
   if N > Count then N := Count;
 end;
 _WStrFromPWCharLen(Result, PWideChar(Pointer(S)) + Index, N);
end;


Помоему это то что надо. Но только почему-то в справке об этом никакой инфы. Да и Dephi непонимает команду WStrCopy.

Просто мне кажется разумнее было бы сделать аналог copy для widestring функцию с более похожим назманием, что-нить типа WideCopy, или CopyW, а название MidStr вообще левое. Вот WStrCopy ещё можно, но его почему-то нельзя использовать. Зачем они так с именами сделали...


 
Loginov Dmitry ©   (2007-06-27 13:32) [9]


> Есть.
>
> см. MidStr()


Тот же Copy(), но с дополнительными расходами на преобразование WideString -> AnsiString и обратно


 
clickmaker ©   (2007-06-27 13:35) [10]


> [8] rolex2002   (27.06.07 13:31)

_WStrCopy вызывается неявно из Copy для WideString


 
rolex2002   (2007-06-27 13:42) [11]

Только что проверил как ведут себя обе функции, следующим кодом:
procedure TForm1.Button1Click(Sender: TObject);
begin
tntlabel1.Caption:=Copy(TntMemo1.Lines[0],0,Length(TntMemo1.Lines[0]));
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
tntlabel1.Caption:=MidStr(TntMemo1.Lines[0],0,Length(TntMemo1.Lines[0]));
end;


В Мемо вставлял всякую дребедень юникодную типа "&#8091;&#8098;&#8091;&#8098;" и нажимал кнопки буттон1 и 2. Обе функции работали нормально!
Вывод: можно использовать и copy ???


 
clickmaker ©   (2007-06-27 13:48) [12]


> можно использовать и copy ???

думаю, никто тут не будет против


 
rolex2002   (2007-06-27 13:50) [13]

Чтож вы сразу не сказали!


 
Сергей М. ©   (2007-06-27 14:14) [14]


> Чтож вы сразу не сказали!


Вот если бы ты для китайцев свою прогу юникодовую лепил, они бы тебе сказали все что они думают о тебе по поводу AnsyCopy вместо WideCopy)

Ну а для русского народного потребителя в подавляющем большинстве случаев на самом деле по барабану - что AnsyCopy, что WideCopy)


 
rolex2002   (2007-06-27 17:17) [15]


> Вот если бы ты для китайцев свою прогу юникодовую лепил,
>  они бы тебе сказали все что они думают о тебе по поводу
> AnsyCopy вместо WideCopy)

А мне вот что ответили:
Видимо, Вы взяли этот код из System.pas? На самом деле при вызове функции Copy с параметрами типа WideString вызовется не эта функция, а функция WStrCopy, предназначенная для работы с WideString. Тоже самое касается динамических массивов, с которыми функция Copy так же работает нормально. Поэтому можно смело использовать Copy при работе с WideString.

Правда есть ещё один вопрос.
В библиотеке Masks.pas есть функция MatchesMask() как быть с ней? Она же тоже работает не с widestring.



Страницы: 1 вся ветка

Текущий архив: 2007.09.02;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.023 c
15-1186383481
Kolan
2007-08-06 10:58
2007.09.02
Как перенести SelectDirectory из BDS2006 в D7?


15-1185970305
max999
2007-08-01 16:11
2007.09.02
как удалить файл?


4-1173115326
Dmitry_177
2007-03-05 20:22
2007.09.02
Курсор над кнопкой


10-1136807222
yanker
2006-01-09 14:47
2007.09.02
управление через OLE


1-1182330747
Makhanev Alexander
2007-06-20 13:12
2007.09.02
прочитать результат консольного приложения...