![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Unicode. Функция copy для widestring. [D7, WinXP]
rolex2002 © (2007-06-27 12:58:00)Функция Copy{s:ShortString; index,count:Integer):ShortString}; предназначена для не WideString'ов. Я перевожу свою программу на unicode, теперь мне необходима функция copy для widestring'ов. Есть ли такая или что можно придумать?
rolex2002 (2007-06-27 17:17:00) [1]
> Вот если бы ты для китайцев свою прогу юникодовую лепил,
> они бы тебе сказали все что они думают о тебе по поводу
> AnsyCopy вместо WideCopy)
А мне вот что ответили:
Видимо, Вы взяли этот код из System.pas? На самом деле при вызове функции Copy с параметрами типа WideString вызовется не эта функция, а функция WStrCopy, предназначенная для работы с WideString. Тоже самое касается динамических массивов, с которыми функция Copy так же работает нормально. Поэтому можно смело использовать Copy при работе с WideString.
Правда есть ещё один вопрос.
В библиотеке Masks.pas есть функция MatchesMask() как быть с ней? Она же тоже работает не с widestring.
Сергей М. (2007-06-27 14:14:00) [2]
> Чтож вы сразу не сказали!
Вот если бы ты для китайцев свою прогу юникодовую лепил, они бы тебе сказали все что они думают о тебе по поводу AnsyCopy вместо WideCopy)
Ну а для русского народного потребителя в подавляющем большинстве случаев на самом деле по барабану - что AnsyCopy, что WideCopy)
rolex2002 (2007-06-27 13:50:00) [3]Чтож вы сразу не сказали!
clickmaker (2007-06-27 13:48:00) [4]
> можно использовать и copy ???
думаю, никто тут не будет против
rolex2002 (2007-06-27 13:42:00) [5]Только что проверил как ведут себя обе функции, следующим кодом:
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;
В Мемо вставлял всякую дребедень юникодную типа "ᾛᾢᾛᾢ" и нажимал кнопки буттон1 и 2. Обе функции работали нормально!
Вывод: можно использовать и copy ???
clickmaker (2007-06-27 13:35:00) [6]
> [8] rolex2002 (27.06.07 13:31)
_WStrCopy вызывается неявно из Copy для WideString
Loginov Dmitry (2007-06-27 13:32:00) [7]
> Есть.
>
> см. MidStr()
Тот же Copy(), но с дополнительными расходами на преобразование WideString -> AnsiString и обратно
rolex2002 (2007-06-27 13:31:00) [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 ещё можно, но его почему-то нельзя использовать. Зачем они так с именами сделали...
rolex2002 (2007-06-27 13:23:00) [9]
> Если переводишь, то это не единственная проблемаНадо задействовать
> компоненты третьих сторон и перейти на 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.
clickmaker (2007-06-27 13:20:00) [10]
> [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
Сергей М. (2007-06-27 13:15:00) [11]
> Из исходника system.pas
В исходники следует лезть, когда инф-ции нет в справке или она неполная/неточная.
А в справке к ф-ции Copy() черным по белому написано:
Delphi syntax:
function Copy(S; Index, Count: Integer): string;
function Copy(S; Index, Count: Integer): array;
где S - это, в т.ч. любой строковый тип, поддерживаемый Делфи.
Anatoly Podgoretsky (2007-06-27 13:14:00) [12]> rolex2002 (27.06.2007 12:58:00) [0]
Если переводишь, то это не единственная проблема
Надо задействовать компоненты третьих сторон и перейти на 2006
rolex2002 (2007-06-27 13:10:00) [13]
> и с чего-бы там именно 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);
...
Сергей М. (2007-06-27 13:06:00) [14]
> Есть ли такая
Есть.
см. MidStr()
clickmaker (2007-06-27 13:05:00) [15]lstrcpyW()
Move()
и с чего-бы там именно ShortString? Нормальные строки и динамические массивы, в том числе