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

Вниз

Раз и навсегда избавиться от вопроса STR-->PCHAR.   Найти похожие ветки 

 
Alexander Panov ©   (2005-05-17 11:46) [0]

Для преобразования String в PChar и обратно самое простое - воспользоваться нижеописанными функциями:


function StringToPChar(s: String): PChar;
var
  i: Integer;
begin
  ReallocMem(Result, Length(s));
  for i := 1 to Length(s) do
  begin
    Result[i-1] :- s[i];
  end;
end;

function PCharToString(s: PChar): String;
var
  i: Integer;
begin
  i := 0;
  while s[i]<>#0 do
  begin
    SetLength(Result, i+1);
    Result[i+1] := s[i];
  end;
end;


 
Андрей Жук ©   (2005-05-17 11:49) [1]

А что за оператор :-? :)


 
vidiv ©   (2005-05-17 11:49) [2]

function StringToPChar(s: String): PChar;
begin
 getmem(Result, Length(s));
 strpcopy(Result, s);
end;

function PCharToString(s: PChar): String;
begin
 Result := strpas(s);
end;


А так сложнее?


 
Prohodil Mimo ©   (2005-05-17 11:52) [3]

А разве нет функции PChar() ?


 
blackman ©   (2005-05-17 11:53) [4]

>Prohodil Mimo ©   (17.05.05 11:52) [3]
Слишком сложно :)))


 
DiamondShark ©   (2005-05-17 11:54) [5]

Чепуха какая-то...


 
Bronco ©   (2005-05-17 11:56) [6]

Кода маловато, на зачОте не примут ;-)


 
Prohodil Mimo ©   (2005-05-17 11:58) [7]

Bronco ©   (17.05.05 11:56) [6]

Тогда предлагаю побитовый перенос, а не побайтовый, как в [0] :o)


 
Игорь Шевченко ©   (2005-05-17 11:58) [8]

Согласен с [5]


 
Alexander Panov ©   (2005-05-17 11:59) [9]

vidiv ©   (17.05.05 11:49) [2]

Значительно сложнее;)

Игорь Шевченко ©   (17.05.05 11:58) [8]
Согласен с [5]


Неее...
Ты просто не понял суперкода в [0].


 
Calm ©   (2005-05-17 12:02) [10]

я, признаться, тоже не понял :(


 
DiamondShark ©   (2005-05-17 12:06) [11]


function StringToPChar(s: String): PChar;
var
 i: Integer;
begin
 ReallocMem(Result, Length(s));

Что, вот прямо так и реалок? А резалт, типа, изначально барабашкой иницализирован...

 for i := 1 to Length(s) do
 begin
   Result[i-1] :- s[i];
 end;
end;

Сильно. StrPLCopy объявлен некошерным.

Я так понял, основная идея -- распределить память под PChar и отвязаться от управляемого времени жизни строки. Угадал?

function StringToPChar(s: String): PChar;
begin
 GetMem(Result, Length(s)+1); // кстати, таки +1
 StrLCopy(Result, PChar(s), Length(s));
end;

Как бы ещё пользователей этой функции приучить FreeMem вызывать...


function PCharToString(s: PChar): String;

PChar прекрасно присваивается стрингу обычным оператором присваивания.

ЗЫ
Поцсмотрел на календарь.
Нет, всё-таки, 17 мая...


 
Vovchik_A ©   (2005-05-17 12:10) [12]

2DiamondShark ©   (17.05.05 12:06) [11]

>Как бы ещё пользователей этой функции приучить FreeMem вызывать...

5 баллов :)


 
TUser ©   (2005-05-17 12:10) [13]

А где пост "Обсуждение закрыто"?


 
Bronco ©   (2005-05-17 12:14) [14]

Это еще ничего, цветочки :-)
Для тех кто не в курсе, вот что лежит у нас в кладовке, в разделе "Прочее"

IncDay   dmi     05.01.03 20:21
При создании бухгалтерской программы я столкнулся с
необходимостью изменить значение даты (класс TDateTime) путем добавления количества дней. Но в Delphi готовой функции не оказалось. Просмотрев в Delphi7 исходный текст функции IncMonth (добавление месяцев к дате), я решил создать функцию IncDay (добавление дней к дате).
Если у кого-то возникла подобная проблема, готов поделиться "исходником".


Сами исходники почему-то уже давно не скачиваются, но я их успел в свое время лицезреть, это тихий ужас...


 
DiamondShark ©   (2005-05-17 12:15) [15]

Да, всю мощь второй функции с первого взгляда не разглядел.
;)


 
Alexander Panov ©   (2005-05-17 12:31) [16]

DiamondShark ©   (17.05.05 12:15) [15]
Да, всю мощь второй функции с первого взгляда не разглядел.


-)))

Мда. Теперь желающие научиться преобразовывать String в PChar должны разобрать обе функции, исправить ошибки, и пользоваться исключительно ими для преобразований.


 
Johnmen ©   (2005-05-17 12:33) [17]

>Alexander Panov ©   (17.05.05 11:46)  

У тебя слишком чёрный юмор.


 
blackman ©   (2005-05-17 12:36) [18]

>Alexander Panov ©   (17.05.05 12:31) [16]
Не наказывайте так строго. Мы больше не будем :)


 
AlexKniga ©   (2005-05-17 12:39) [19]

Как-то в кладовке лежала незабываемая функция под название толи NextDay, толи AddDay, точно не помню. Фунция прибавляла к дате TDataTime, переданной первым параметром, целое число дней (второй параметр).
У кого сохранилось сие творение вышлите, плиз, на мыло в анкете.


 
AlexKniga ©   (2005-05-17 12:41) [20]

Пока я писал свой пост, Bronco привел название той функции IncDay.
У кого сохранились исходники, выложите плиз.


 
Bronco ©   (2005-05-17 13:02) [21]


> AlexKniga ©   (17.05.05 12:41) [20]


> У кого сохранились исходники, выложите плиз.

Угу, я б тоже не прочь сейчас взглянуть на тот шедевр :-))


 
1008 ©   (2005-05-17 13:12) [22]

Alexander Panov ©  (17.05.05 11:46)

А это ШТАТНЫХ средств мало?


 
Nous Mellon ©   (2005-05-17 13:31) [23]


> Result[i-1] :- s[i];

Это неправильно. Правильно так Result[i-1] :-) s[i];
Вторую тоже долго рассматривал...


 
Alexander Panov ©   (2005-05-17 13:33) [24]

1008 ©   (17.05.05 13:12) [22]
А это ШТАТНЫХ средств мало?


так штатные средства, к сожалению, невозможно запомнить. -(

А эти функции нужно записать в отдельный юнит, положить в корневой каталог с проектами и просто ссылаться на него при необходимости.


 
1008 ©   (2005-05-17 13:48) [25]

Alexander Panov ©  (17.05.05 13:33) [24]

var
s:string;
p:pchar;
begin
...
p:=pchar(s);
...
s:=p;

Я только что опыть провёл, после прочитаного. Работает.
Порылся в Тейксера Пачеко, на 77 стр. (это для дельфи 5) сказано, что после использования AnsiString как PChar (как параметр в WinAPI функциях и процедурах) необходимо вызывать функцию: RealizeLength


 
Alexander Panov ©   (2005-05-17 13:51) [26]

1008 ©   (17.05.05 13:48) [25]
s:=p;


Опять же, к сожалению, немногие смогут запомнить такой громоздкий синтаксис-(


 
Ega23 ©   (2005-05-17 13:53) [27]

var
s:string;
p:pchar;
begin
...
p:=pchar(s);
...
s:=p;
Я только что опыть провёл, после прочитаного. Работает.

Ржал долго.
Фтопку.


 
1008 ©   (2005-05-17 13:54) [28]

Удалено модератором
Примечание: Научись себя вести


 
AlexKniga ©   (2005-05-17 14:04) [29]

1008
Не тормози. Хоть сегодня и не 1 апреля, но к шуткам будь готов всегда.


 
Danilka ©   (2005-05-18 12:11) [30]

Кстати. В модуле Sysutils есть интересная ф-я в тему: StrPas.
:)


 
AlexKniga ©   (2005-05-18 12:59) [31]

Bronco
IncDay найдена! См. http://delphimaster.net/view/14-1116403029/


 
Bronco ©   (2005-05-18 14:25) [32]


> AlexKniga ©   (18.05.05 12:59) [31]
> Bronco
> IncDay найдена!

Да, спасибо. Уже распечатал и повесил на стенку :-)))



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

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

Наверх




Память: 0.54 MB
Время: 0.043 c
8-1108654118
Sun
2005-02-17 18:28
2005.06.06
DXImageList


11-1098741069
dan
2004-10-26 01:51
2005.06.06
edit box without frame


8-1108810484
avlan
2005-02-19 13:54
2005.06.06
Инструмент "Спрей"


14-1116511845
Alexander Panov
2005-05-19 18:10
2005.06.06
Кто прав, кто не прав? (О суде над офицерами ГРУ)


14-1116585377
DSKalugin
2005-05-20 14:36
2005.06.06
Замучала отправка отчета об ошибках в WinXP