Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.08.15;
Скачать: [xml.tar.bz2];

Вниз

Pchar   Найти похожие ветки 

 
Вентилятор   (2004-07-28 10:56) [0]

Вопрос немного необычный. Просьба не ругать. Как можно преобразовать переменную pchar из нижнего регистра в верхний и наоборот , НЕ используя при этом тип string и функции с ним связанные ?


 
Reindeer Moss Eater ©   (2004-07-28 10:58) [1]

регистр переменных в паскале не имеет значения


 
Reindeer Moss Eater ©   (2004-07-28 10:59) [2]

Unit

Sysutils

Category

string handling routines (null-terminated)


 
Вентилятор   (2004-07-28 11:05) [3]

я про SysUtils в курсе. И про то что с pchar оно умеет работать тоже знаю. Но преобразовать переменную из более чем 8 символов не очень то получилось


 
Poirot ©   (2004-07-28 11:21) [4]

Покажи нам как ты ето делаешь.


 
Вентилятор   (2004-07-28 11:22) [5]

program Project1;

uses
 windows,sysutils;

{$R *.res}
var p,c:pchar;
begin
p:="dDd";

messagebox(0,AnsiStrLower(p),"",0);

end.

выдает ошибку. почему?


 
Fay ©   (2004-07-28 11:23) [6]

CharUpperBuff
The CharUpperBuff function converts lowercase characters in a buffer to uppercase characters. The function converts the characters in place.

DWORD CharUpperBuff(
 LPTSTR lpsz,      // characters
 DWORD cchLength   // number of characters to process
);
Parameters
lpsz
[in] Pointer to a buffer containing one or more characters to process.
cchLength
[in] Specifies the size, in TCHARs, of the buffer pointed to by lpsz. This refers to bytes for ANSI versions of the function or WCHARs for Unicode versions.
The function examines each character, and converts lowercase characters to uppercase characters. The function examines the number of characters indicated by cchLength, even if one or more characters are null characters.

Return Values
The return value is the number of TCHARs processed.

For example, if CharUpperBuff("Zenith of API Sets", 10) succeeds, the return value is 10.

Remarks
Note that CharUpperBuff always maps lowercase I to uppercase I, even when the current language is Turkish or Azeri.

Windows NT/2000/XP: To make the conversion, the function uses the language driver for the current language selected by the user at setup or by using Control Panel. If no language has been selected, the system completes the conversion by using internal default mapping. The conversion is made based on the code page associated with the process locale.

Windows 95/98/Me: The function makes the conversion based on the information associated with the user"s default locale, which is the locale selected by the user at setup or by using Control Panel. The system does not have language drivers.

Windows 95/98/Me: CharUpperBuffW is supported by the Microsoft Layer for Unicode. To use this, you must add certain files to your application, as outlined in Microsoft Layer for Unicode on Windows 95/98/Me Systems.


 
Poirot ©   (2004-07-28 11:25) [7]

А ты пямять выделить не забыл случайно????... ))))


 
Anatoly Podgoretsky ©   (2004-07-28 11:28) [8]

Чего же ты пытаешься писать в память ReadOnly, в константу.


 
Вентилятор   (2004-07-28 11:33) [9]


> Anatoly Podgoretsky ©   (28.07.04 11:28) [8]

где ?

var p:pchar;
begin
p:="dDd";

тут?^

но ведь p это вроде переменная? или всетаки константа?


 
Вентилятор   (2004-07-28 11:34) [10]


> Poirot ©   (28.07.04 11:25) [7]

обязательно выделять? а каким методом предпочтительнее?


 
Вентилятор   (2004-07-28 11:35) [11]


> Fay ©   (28.07.04 11:23) [6]

за F1 отдельное спасибо :)


 
Fay ©   (2004-07-28 11:42) [12]

2Вентилятор   (28.07.04 11:35) [11]

> за F1 отдельное спасибо :)

Мог бы и сам нажать.


 
Fay ©   (2004-07-28 11:44) [13]

2Вентилятор   (28.07.04 11:34) [10]
>> обязательно выделять? а каким методом предпочтительнее?
Методом? Спросил бы для начала "каким объектом?"/ 8)


 
Вентилятор   (2004-07-28 11:46) [14]


> 2Вентилятор   (28.07.04 11:35) [11]
>
> > за F1 отдельное спасибо :)
>
> Мог бы и сам нажать.


Ну это я умею слава богу. Но никак не получается у меня реализовать:
var p,c:pchar;
begin
p:="dDd";
CharUpperBuff(@p,3);

messagebox(0,p,"",0);

end.

Выдает "dDd"


 
Вентилятор   (2004-07-28 11:46) [15]


> Fay ©   (28.07.04 11:44) [13]
> 2Вентилятор   (28.07.04 11:34) [10]
> >> обязательно выделять? а каким методом предпочтительнее?
> Методом? Спросил бы для начала "каким объектом?"/ 8)

Хорошо,каким обьектом?


 
Fay ©   (2004-07-28 11:52) [16]

Хреново ты что-то жмёшь 8)
GetMem(p, 16);
FillChar(p^, 15, "ю");
p[15] := #0;
CharUpperBuff(p, 15);
MessageBox(0, p, "", MB_OK);
FreeMem(p);


 
Anatoly Podgoretsky ©   (2004-07-28 11:53) [17]

Не пиши в константу, расположенную в кодовой части, не получится.
И посмотри что за тип такой PChar, лучше не используй пока не научишься работать с указателями и выделяемой памятью, будет больно и обидно.


 
Вентилятор   (2004-07-28 11:59) [18]


> Anatoly Podgoretsky ©   (28.07.04 11:53) [17]

К чему я все это? Я просто хотел отказаться от string , ибо при его использовании в минимальной программе размер файла увеличивается с 9 до 15 кб. Так же как и при использовании GetMem и FreeMem (Fay ©   (28.07.04 11:52) [16])
Ну уперся я в эту идею, но чувствую ничего не получится(((


 
Digitman ©   (2004-07-28 12:06) [19]


> размер файла увеличивается с 9 до 15 кб


и что за блажь ? мизерные до смешногго килобайты на современном носителе (емкостью в сотни Гб !!) экономить ?


> ничего не получится


все получится
не используй никаких модулей кроме Windows - и все получится


 
Вентилятор   (2004-07-28 12:11) [20]


> Digitman ©   (28.07.04 12:06) [19]

Может быть и блажь, не знаю ... ))) Просто интересно


 
Anatoly Podgoretsky ©   (2004-07-28 12:16) [21]

Вентилятор   (28.07.04 11:33) [9]
Да нет все нормально.


 
Digitman ©   (2004-07-28 12:28) [22]


> Вентилятор   (28.07.04 12:11) [20]


> Может быть и блажь, не знаю


а я знаю ... блажь - и ничто иное


> Просто интересно


интерес на пустом месте не возникает
если это не блажь, значит у тебя есть какая-то цель, о коей ты старательно умалчиваешь


 
Sandman25 ©   (2004-07-28 12:31) [23]

[22] Digitman ©   (28.07.04 12:28)

Вирус он пишет. Поэтому и умалчивает, и размер важен.


 
Вентилятор   (2004-07-28 12:34) [24]


> Digitman ©   (28.07.04 12:28) [22]


> интерес на пустом месте не возникает
> если это не блажь, значит у тебя есть какая-то цель, о коей
> ты старательно умалчиваешь

Наверное у тебя есть какие то подозрения, которые ты не хочешь озвучить? ;)
p.s. ..до смешного ....


 
Вентилятор   (2004-07-28 12:35) [25]


> Sandman25 ©   (28.07.04 12:31) [23]

озвучил , молодца !

Грустно.


 
Вентилятор   (2004-07-28 12:41) [26]

хотел минимализма. Обозвали вирусописакой. Ну спасибо дорогие господа !


 
Sandman25 ©   (2004-07-28 12:44) [27]

[26] Вентилятор   (28.07.04 12:41)

На ассемблере пишите.


 
Вентилятор   (2004-07-28 12:49) [28]


> Sandman25 ©   (28.07.04 12:44) [27]

хочу на дельфи


 
Fay ©   (2004-07-28 12:51) [29]

Тогда терпи


 
Sandman25 ©   (2004-07-28 12:51) [30]

Но тогда не будет минимализма.


 
Piter ©   (2004-07-28 12:52) [31]

Вентилятор   (28.07.04 11:33) [9]
var p:pchar;
begin
p:="dDd";

но ведь p это вроде переменная? или всетаки константа?


P не переменная и не константа  - это УКАЗАТЕЛЬ. Указывать он может на что угодно. В данном случае это типизированный указатель и указывать он должен на символ. Или если применить к строкам - то указывать он должен на первый символ строки, оканчивающейся нулевым символом #0.
Ты пишешь p:="dDd"; - и указатель P начинает указывать на символ первый символ d в строке. Но область памяти в которой находится эта строка не является динамически выделенной. Это сегмент данных, туда нельзя ничего писать.

Чтобы что-то писать - сначала надо выделить память, например так GetMem(p, 255) - тогда P начнет указывать на первый байт (символ) вновь выделенной памяти, куда может уместиться 254 символа. Вот тогда в ту область памяти можно что-то писать. И не забыть потом освободить память FreeMem

А если говорить еще правильнее - нету в Дельфи случаев когда надо использовать PChar, всегда можно обойтись AnsiString. И пользуйся именно им.


 
Digitman ©   (2004-07-28 12:56) [32]


> преобразовать переменную из более чем 8 символов не очень
> то получилось



> p:="dDd";


гениально !

оказывается, строка "dDd" по последнему постановлению ЦК ВЦСПС состоит из более чем 8-ми символов


 
Вентилятор   (2004-07-28 13:23) [33]

гениально я сам в шоке


 
Digitman ©   (2004-07-28 13:30) [34]


> Вентилятор


в таком случае тебе пора развернуть лыжи в ликбез ... там тебя научат считать до восьми, коль вовремя не научили ... заодно научат и прописной Паскаль-истине, которая гласит, что если идентификатор P типа PChar объявлен тобой в секции VAR, то P отныне являет собою переменную указательного типа ... а вот то на что она указывает в тот или иной ран-тайм-момент, это совершенно иной вопрос



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

Форум: "Основная";
Текущий архив: 2004.08.15;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.032 c
1-1091528706
Alexey Morceleb
2004-08-03 14:25
2004.08.15
Создание элемента управления из dll


1-1091030683
Bloody-Wolf
2004-07-28 20:04
2004.08.15
Определение имени диска


1-1091429169
Eagle8
2004-08-02 10:46
2004.08.15
Хранение данных в ехе


1-1091276543
mikey
2004-07-31 16:22
2004.08.15
Добрый день. Есть список


6-1087152399
Денис
2004-06-13 22:46
2004.08.15
сокс+смтп





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский