Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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;


В Мемо вставлял всякую дребедень юникодную типа "&#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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.063 c
2-1186662007
Gamer
2007-08-09 16:20
2007.09.02
работа с Firebird из Delphi 2006


15-1186486501
@!!ex
2007-08-07 15:35
2007.09.02
Как скролить RichEdit


15-1186166932
tesseract
2007-08-03 22:48
2007.09.02
Sergay masloff контакты.


15-1186115317
Alarm
2007-08-03 08:28
2007.09.02
С днем рождения Yakudza


3-1178791509
zero
2007-05-10 14:05
2007.09.02
Как отловить ощибку





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский