Strtochar или зачем нужны указатели
Любой начинающий делфист написав эту процедуру расстроится, когда она не заработает, конечно, можно исправить это положение, написав свой или использовать сторонний модуль с функциями преобразования величин. В принципе, об этом я и хотел написать, как перевести переменную из одного типа в другую.
Для простых вопросов всегда есть готовые решения, нужно их найти, и возможно доработать, сделать современными. Как искать? Я начинаю поиск по всем сайтам клуба, за 2 года накопилось множество интересных статей, тем на форуме и прочее, а также появился инструмент для поиска только по сайтам клуба go.pblog.ru, ищем str to char
По ходу поиска можно почитать статьи, которые либо давно были прочитаны, либо вообще не читались.
www.programmersclub.ru/typepchar/
Вспомнить, что есть удобный справочник — delphibasics.ru/navSystem.php
Почитать про Char
В похожих командах найти нужную информацию, для нас это — PChar Указатель на значение символа (Char), ещё в статье www.programmersclub.ru/typepchar/ мы про него читали что-то.
http://delphibasics.ru/PChar.php — смотрим пример кода, и понимаем, что нас вопрос решён с помощью указателей. Это тоже читаем http://delphibasics.ru/Addr.php, так как в коде используеться функция Addr
Используя указатели мы можем обращаться к любой ячейке в памяти и использовать размещённые там данные.
В данном примере я решил задачу замены русского слова, побуквенно html кодами(коды размещены в строках memo).
procedure TForm1.rusClick(Sender: TObject);
var
i: integer;
s: PChar;
sss: Char;
begin
for i:=1 to length(title.text) do
begin
s:='а';
s:=Addr(title.text);
sss:= s^;
Case sss of
'а' : titlebrowse.Text:=titlebrowse.Text+rusm.Lines[0];
'б' : titlebrowse.Text:=titlebrowse.Text+rusm.Lines[1];
'в' : titlebrowse.Text:=titlebrowse.Text+rusm.Lines[2];
…
else titlebrowse.Text:=titlebrowse.Text+copy(title.text,i,1)
end;
end;
end;
Сорри, но где тут применение PChar? В sss содержится то же самое, что и в title.text[i] и PChar тут не используется. Почему сразу не написать
sss := title.text[i]?
Вообще, для PChar был бы более уместен следующий пример:
var
S: string;
pS: PChar;
begin
S := ‘LOL’;
pS := PChar(S);
while pS^ #0 do
begin
ShowMessage(pS^);
Inc(pS);
end;
end;
В while проглотился знак не равно
sentry, а ты пробовал код использовать прежде чем предлагать такое просто решение?
sss := title.text[i]? так в sss — будет тип string, а нам нужен char для Case sss of…
Alar, title.text — это одна строка, так? Тогда title.text[i] — это i-ый символ строки, то есть тип char. И присваивание sss := title.text[i] волне допустимо. К тому же sss это по-любому объявлено как char, и string там быть не может. А раз забота только для case, то вот компилирующийся и правильно исполняющийся пример:
var
S: string;
I: Integer;
begin
S := Edit1.Text;
for I := 1 to Length(S) do
begin
case S[I] of
‘a’: ShowMessage(‘a’);
‘b’: ShowMessage(‘b’);
end;
end;
PS Без обид, но все-таки прежде чем что-то писать, надо в этом разбираться.
sentry, рад за вас, что вы нашли другую delphi конструкцию для решения поставленной задачи. НО
1) Цель статьи — объяснить зачем нужны указатели.
2) Вы говорите о стринге в delphi, который обрабатывается как AnsiString
читать здесь — http://delphibasics.ru/String.php
Что такое AnsiString в delphi читать здесь — http://delphibasics.ru/AnsiString.php
Я думаю мы друг друга поняли 🙂
Самое распространенное применение указателей — это передача параметров в функции.
Я бы, в свою очередь, всем посоветовал прочитать следующее, чтобы стать гуру в строках 🙂 http://rsdn.ru/article/delphi/dynarrays.xml
Поняли, поняли 🙂
Соглашусь с sentry —-> Самое распространенное применение указателей — это передача параметров в функции. !! и больш, по моему незачем..