Форум: "Основная";
Текущий архив: 2007.09.02;
Скачать: [xml.tar.bz2];
Вниз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;
В Мемо вставлял всякую дребедень юникодную типа "ᾛᾢᾛᾢ" и нажимал кнопки буттон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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.048 c