![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Copy String to Char Array [D2, D7, 95/98, 2000]
Афонтий © (2013-04-04 19:11:00)Доброго времени суток!
Имеется:
A: Array [0..N] Of WCHAR;
B: String='testing!';
Как осуществить:
A:='blabla'; // ??? // A:=B;
Вообще работает так вот (на коленке наваял), но может ошибки наделал, али есть готовые функции?:
Procedure CCC(A: String; Var B: Array Of WCHAR);
Var i: Integer;
Begin
i:=0;
While (i<Length(A)) And (i<Length(B)) Do
Begin
B[i]:=WCHAR(A[i+1]);
Inc(i);
End;
End;
brother (2013-04-19 10:36:00) [1]вот ведь не хотелписать сюда, но..
[11] как долго нужно думать, чтоб до подобного додуматься?
[15] почему? не можешь длинну рассчитать? Length всегда покажет сколько в попугаях!
Я понимаю, что это в начинающих, но так то зарываться тож нельзя...
Интересно посомтреть ответ автора на [17]
han_malign (2013-04-19 09:52:00) [2]
> Там не написано что если Length(SourceString) равно или
> больше чем TargetSize, то функция грохается вообще ничего
> не скопировав...
- наглая ложь... StringToWideChar - как раз для ленивых и неопытных...
function StringToWideChar(const Source: string; Dest: PWideChar;
DestSize: Integer): PWideChar;
begin
Dest[WCharFromChar(Dest, DestSize - 1, PChar(Source), Length(Source))] := #0;
Result := Dest;
end;
- а правильный шаблон вызова не
StringToWideChar('text',@thbtn.szTip[0], Random(17));
а
StringToWideChar('text',@thbtn.szTip[0], Length(thbtn.szTip));
Германн (2013-04-18 19:31:00) [3]
> Дайте мне вашу версию хэлпа?
http://docwiki.embarcadero.com/Libraries/XE2/en/System.StringToWideChar
Афонтий (2013-04-18 19:20:00) [4]хм. Тогда она мне не подходит. Ещё варианты? =(
З.Ы. Дайте мне вашу версию хэлпа?
Германн (2013-04-12 18:33:00) [5]
> Афонтий (12.04.13 17:55) [13]
>
> Там не написано что если Length(SourceString) равно или
> больше чем TargetSize, то функция грохается вообще ничего
> не скопировав...
Не написано?
А это что значит:
Source is the string to convert. It must include at most DestSize – 1 characters.
Афонтий (2013-04-12 17:55:00) [6]Там не написано что если Length(SourceString) равно или больше чем TargetSize, то функция грохается вообще ничего не скопировав...
MBo (2013-04-12 17:22:00) [7]А не написано ли чего полезного в хелпе по этой функции?
Афонтий (2013-04-12 16:13:00) [8]StringToWideChar('text',@thbtn.szTip[0],2);
Не работает.
StringToWideChar('text',@thbtn.szTip[0],3);
Не работает.
StringToWideChar('text',@thbtn.szTip[0],4);
Не работает.
StringToWideChar('text',@thbtn.szTip[0],5);
Фигаг! Заработало. И для всех цифр выше работает и результат одинаков. Поясните?
Rouse_ (2013-04-05 13:23:00) [9]
> А ничего что CHAR и WCHAR разного SizeOf?
Смотря в какой дельфи, в 2010 и выше размеры совпадают.
Игорь Шевченко (2013-04-05 12:09:00) [10]в [1] все сказано
Афонтий (2013-04-05 12:07:00) [11]> [5] > ты уж определись, откуда куда
Всё правильно, это же внутри функции, локальные переменные! Ну назвал наобум и совпали и перепутались словно... Так лучше?:
// прототип: Procedure CCC(Input: String; Var Output: Array Of WCHAR);
Output[i]:=WCHAR(Input[i+1]);
// вызов: CCC('blabla', A); // A:='blabla';
> [4]
ну... Спасибо, похоже очень, но у меня же WCHAR, получаются иероглифы какие-то вместо моей строки. =)))))
> [3]
гм... А ничего что CHAR и WCHAR разного SizeOf? Строки по умолчанию вроде ANSI? Как-то явно приводить тип сперва?
Спасибо. С:
> [7] > А что надо сделать-то ?
Есть чужая функция (в dll). Один из параметров функции чужая struct (указатель или по ссылке, как там правильно говорить?). Одно из полей этой структуры типа "Array [0..127] Of WCHAR". Править заголовочник идущий с dll мне нельзя.
Объявляю переменную типа этой структуры, заполняю поля, передаю в функцию. Только не знаю как в это поле засунуть константу 'Hello World!' например, или переменную типа String:
[Error] Project1.dpr(): Incompatible types: 'Array' and 'String'
...
[Error] Project1.dpr(): Incompatible types: 'Array' and 'WideString'
А к примеру так вполне работает, но выглядит прискорбнейше. :3
Strct.Fld[0]:='H';
Strct.Fld[1]:='e';
Strct.Fld[2]:='l';
Strct.Fld[3]:='l';
Strct.Fld[4]:='o';
...
Повожусь с move, думаю должно получиться)
Игорь Шевченко (2013-04-04 23:33:00) [12]А что надо сделать-то ? Ansi-строку в Widechar массив преобразовать или наоборот ?
NoUser (2013-04-04 21:43:00) [13]
> Ошибок не выдаёт, но и текста нету, пусто. =(
> Где ..
Procedure CCC(A: String; Var B: Array Of WCHAR);
type TChars = Array Of Char;
Procedure ToArr(const A: string; var B: TChars);
Begin
SetLength(B, Length(A) );
Move(A[1], B[0], Length(A) * sizeof(Char) );
End;
KilkennyCat (2013-04-04 21:11:00) [14]
> Где я дурак?
> Как осуществить:
>
> A:='blabla'; // ??? //A:=B;
> Вообще работает так
>B[i]:=WCHAR(A[i+1]);
ты уж определись, откуда куда
Dimka Maslov (2013-04-04 21:05:00) [15]1. А цикл for уже отменили?
2. Давным давно сделали функцию StrPCopy
3. Строка и есть массив символов, зачем нужен лишний тип?
Rouse_ (2013-04-04 20:06:00) [16]move за глаза
Афонтий (2013-04-04 19:21:00) [17]Ошибок не выдаёт, но и текста нету, пусто. =(
Где я дурак?
clickmaker (2013-04-04 19:16:00) [18]> есть готовые функции?:
StringToWideChar()