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

Вниз

Copy String to Char Array   Найти похожие ветки 

 
Афонтий   (2013-04-04 19:11) [0]

Доброго времени суток!
Имеется:

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;


 
clickmaker ©   (2013-04-04 19:16) [1]

> есть готовые функции?:

StringToWideChar()


 
Афонтий   (2013-04-04 19:21) [2]

Ошибок не выдаёт, но и текста нету, пусто. =(
Где я дурак?


 
Rouse_ ©   (2013-04-04 20:06) [3]

move за глаза


 
Dimka Maslov ©   (2013-04-04 21:05) [4]

1. А цикл for уже отменили?
2. Давным давно сделали функцию StrPCopy
3. Строка и есть массив символов, зачем нужен лишний тип?


 
KilkennyCat ©   (2013-04-04 21:11) [5]


> Где я дурак?


> Как осуществить:
>
> A:="blabla"; // ??? // A:=B;


> Вообще работает так
>      B[i]:=WCHAR(A[i+1]);

ты уж определись, откуда куда


 
NoUser   (2013-04-04 21:43) [6]


> Ошибок не выдаёт, но и текста нету, пусто. =(
> Где ..

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;


 
Игорь Шевченко ©   (2013-04-04 23:33) [7]

А что надо сделать-то ? Ansi-строку в Widechar массив преобразовать или наоборот ?


 
Афонтий   (2013-04-05 12:07) [8]

> [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-05 12:09) [9]

в [1] все сказано


 
Rouse_ ©   (2013-04-05 13:23) [10]


> А ничего что CHAR и WCHAR разного SizeOf?

Смотря в какой дельфи, в 2010 и выше размеры совпадают.


 
Афонтий   (2013-04-12 16:13) [11]

StringToWideChar("text",@thbtn.szTip[0],2);

Не работает.

StringToWideChar("text",@thbtn.szTip[0],3);

Не работает.

StringToWideChar("text",@thbtn.szTip[0],4);

Не работает.

StringToWideChar("text",@thbtn.szTip[0],5);

Фигаг! Заработало. И для всех цифр выше работает и результат одинаков. Поясните?


 
MBo ©   (2013-04-12 17:22) [12]

А не написано ли чего полезного в хелпе по этой функции?


 
Афонтий   (2013-04-12 17:55) [13]

Там не написано что если Length(SourceString) равно или больше чем TargetSize, то функция грохается вообще ничего не скопировав...


 
Германн ©   (2013-04-12 18:33) [14]


> Афонтий   (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-18 19:20) [15]

хм. Тогда она мне не подходит. Ещё варианты? =(

З.Ы. Дайте мне вашу версию хэлпа?


 
Германн ©   (2013-04-18 19:31) [16]


> Дайте мне вашу версию хэлпа?

http://docwiki.embarcadero.com/Libraries/XE2/en/System.StringToWideChar


 
han_malign   (2013-04-19 09:52) [17]


> Там не написано что если 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));


 
brother ©   (2013-04-19 10:36) [18]

вот ведь не хотелписать сюда, но..
[11] как долго нужно думать, чтоб до подобного додуматься?
[15] почему? не можешь длинну рассчитать? Length всегда покажет сколько в попугаях!
Я понимаю, что это в начинающих, но так то зарываться тож нельзя...
Интересно посомтреть ответ автора на [17]



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

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

Наверх




Память: 0.51 MB
Время: 0.006 c
1-1321391616
Человек
2011-11-16 01:13
2014.02.16
Многопоточное логирование


2-1366182901
ttt
2013-04-17 11:15
2014.02.16
Перемещение окна


15-1377248429
Шишки-Баб
2013-08-23 13:00
2014.02.16
Можно ли покупать дорогие вещи, не имея официальных доходов?


2-1366032117
Cayenne
2013-04-15 17:21
2014.02.16
Ошибка при выгрузке файла


2-1366625537
novai
2013-04-22 14:12
2014.02.16
проблемма с BorderStyle:= bsNone;