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

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

Вопрос по AnsiChar [D7, WinXP]


smirnoff ©   (2009-07-06 11:53:00) 

Здравствуйте! подскажите пожалуйста как в
a: array[0..2000] of ansichar;
записать содержимое Memo (Delphi 2009). Заранее спасибо!


smirnoff   (2009-07-07 12:05:00) [1]


> > > ошибки нет. но в массиве "а" виден только первый символ
> > Извини, но ты уже вышел из круга доверия.


Не обвиняйте меня жестокой топусти, я знаю что (напр.) ShowMessage и Memo будут отображать всё, пока не встретят 1-й ноль (не в кавычках - т.е. #0).


smirnoff   (2009-07-07 11:58:00) [2]

!!!Delphi 12.0.3390.20513

a: array[0..70] of ansichar; //массив, который необходимо заполнить.

В Memo1 находится такой текст: "1234abcdабвг:{}230(&^&*(kdfg"
---------------------------------------------------------------------------------------
Memo1.Perform(WM_GETTEXT, SizeOf(a), LParam(@a));
дает следующее:

'1', #0, '2', #0, '3', #0, '4', #0, 'a', #0, 'b', #0, 'c', #0, 'd', #0, '0', #4, '1', #4,
'2', #4, '3', #4, ':', #0, '{', #0, '}', #0, '2', #0, '3', #0, '0', #0, '(', #0, '&', #0,
'^', #0, '&', #0, '*', #0, '(', #0, 'k', #0, 'd'
---------------------------------------------------------------------------------------
StrCopy(a,pansichar(Memo1.Text));
дает следующее:

'1', #0, 'v', #20, #21, #1, #14, 'Ђ', #152, 'й', #1, #0, #0, #0, #0, #0, #0, #0, #0, #4,
#0, #0, #0, #0, #0, #0, #0, #1, #0, #0, #0, 'l', 'a', 't', 'n', '§', '


Юрий Зотов   (2009-07-06 23:57:00) [3]

Кстати, [14] тоже подтверждает п.3 -  Вы просто не умеете правильно интерпретировать содержимое памяти.


Юрий Зотов   (2009-07-06 23:56:00) [4]

> smirnoff

Если [6] заработало (о чем Вы сказали в [7]), то никакого юникода у Вас на самом деле нет, а есть просто AnsiStrinng - то есть, массив однобайтовых символов. Далее:

1. Копирование одного массива в другой - задачка для детского сада. Но Вы на ней споткнулись.

2. Как выяснилось, копирование Вам понадобилось лишь для того, чтобы вызвать некую функцию с параметром PAnsiChar. Но для этого копировать вообще ничего не нужно - чего Вы тоже не знали.

3. В [9] Вы утверждаете, что "в массиве "а" виден только первый символ из содержимого". Это говорит о том, что Вы просто не умеете правильно интерпретировать содержимое памяти.

===========

И после всего этого Вы говорите о каких-то подводных камнях и о том, что Ваш вопрос не для "начинающих"? Не смешите.


smirnoff   (2009-07-06 22:49:00) [5]


> > ошибки нет. но в массиве "а" виден только первый символ
> Извини, но ты уже вышел из круга доверия.

понял что результат юникода.
ну да вообщето там есть всё остальное. НО с НАРУШЕННОЙ кодировкой. русские символы НЕ отображаются как надо.


Leonid Troyanovsky   (2009-07-06 22:27:00) [6]


> smirnoff ©   (06.07.09 19:44) [9]

> ошибки нет. но в массиве "а" виден только первый символ

Извини, но ты уже вышел из круга доверия.

--
Regards, LVT.


smirnoff   (2009-07-06 22:16:00) [7]


> заработало! СПА-СИ-БО!!!вот теперь это сношу:

Уважаемые мастера. Имейте ввиду, что на поставленный вопрос никто не ответил правильно. был предложен альтернативный вариант отличный по функциональности.. он мне подошел. НО НА ВОПРОС НИКТО ТАК И НЕ ОТВЕТИЛ - продемонстрируйте же свои знания работы со строками, Юрий Зотов.

способы типа:

a: array[0..2000] of ansichar;
begin
for i := 1 to length(memo1.Lines.Text) do
   a[i - 1] := ansichar(memo1.Lines.Text[i]);
или
 a: array[0..2000] of ansichar;
begin
StrCopy(a,pansichar(Memo1.Text));

неуместны (для delphi 2009). почему? догадаетесь.


> подводный камень

- связан с кодировкой. русские символы теряются в указанных выше способах (только в d2009).


> - там ему и место

Да всё так. Спасибо, что все поставили на свои места. Еще только сайт остается назвать delphifighter.ru


Юрий Зотов   (2009-07-06 21:20:00) [8]

> думаю мой вопрос не совсем для начинающих (а то его переместили)..
Он не для начинающих. Он для даже еще не начавших. Извините, но это так.

> в нем закопан подводный камень..
И называется этот подводный камень - неумение работать со строками. Извините, но это тоже так.


Сергей М.   (2009-07-06 19:55:00) [9]


> потомучто с массивом придется работать


А AnsiString, надо так понимать, для беззаботно отдыхающих и праздно дзенствующих ?


> думаю мой вопрос не совсем для начинающих


Судя даже по формулировке - там ему и место.


smirnoff   (2009-07-06 19:44:00) [10]


> Leonid Troyanovsky ©  
> Не верю.

Memo1.Perform(WM_GETTEXT, SizeOf(a), LParam(@a));
ошибки нет. но в массиве "а" виден только первый символ из содержимого.
Delphi 12.0.3390.20513

var
a: array[0..2000] of ansichar;
begin
Memo1.Perform(WM_GETTEXT, SizeOf(a), LParam(@a));
ShowMessage(a);
end;

по ShowMessage видим только 1й символ из Memo.


Leonid Troyanovsky   (2009-07-06 15:54:00) [11]


> smirnoff ©   (06.07.09 15:18) [5]

> Увы
> Memo1.Perform(WM_GETTEXT, SizeOf(a), LParam(@a))
> не работает в delphi2009.

Не верю.

--
Regards, LVT.


smirnoff   (2009-07-06 15:45:00) [12]


> > работает только с pansichar и функции нужен pansichar var
>  s : AnsiString;begin  s := 'Превед, Медвед!';  SomeFunction(PAnsiChar(s));
> end;

заработало! СПА-СИ-БО!!!
вот теперь это сношу:
a: array[0..2000] of ansichar;


Ega23   (2009-07-06 15:29:00) [13]


> работает только с pansichar и функции нужен pansichar


var
 s : AnsiString;
begin
 s := 'Превед, Медвед!';

 SomeFunction(PAnsiChar(s));

end;


smirnoff   (2009-07-06 15:18:00) [14]

думаю мой вопрос не совсем для начинающих (а то его переместили).. в нем закопан подводный камень..

> Почему именно в массив, а не в AnsiString ?

потомучто с массивом придется работать. AnsiString не подходит уже пробовал. т.к. на массив ссылается b: pansichar;
b := @a;
а он в свою очередь передается как параметр для функции. (pansichar менять нельзя, всяко пробовал в d2009 глючить начинает. работает только с pansichar и функции нужен pansichar);


> главное: зачем? не с со stream или файлами пытаешься работать?

с файлами не работаю.

Увы
Memo1.Perform(WM_GETTEXT, SizeOf(a), LParam(@a))
не работает в delphi2009.


Leonid Troyanovsky   (2009-07-06 13:10:00) [15]


> smirnoff ©   (06.07.09 11:53)  

> a: array[0..2000] of ansichar;
> записать содержимое Memo (Delphi 2009).

Memo.Perform(WM_GETTEXT, SizeOf(a), LParam(@a))

--
Regards, LVT.


Ega23   (2009-07-06 12:39:00) [16]

Да ладно, нормальный вариант работы: один раз буфер выделил и работай с ним.


brother   (2009-07-06 12:27:00) [17]

главное: зачем? не с со stream или файлами пытаешься работать?


Сергей М.   (2009-07-06 12:26:00) [18]

Почему именно в массив, а не в AnsiString ?


Наверх

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