Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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()


Наверх

Титульная страница Поиск, карта сайта Написать письмо