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

Вниз

Раз и навсегда избавиться от вопроса 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.57 MB
Время: 0.015 c
14-1115131999
Sniper-Max
2005-05-03 18:53
2005.06.06
Виснет установка 98 ME виндов прям на запуске setup? Помогите!!!


8-1108712654
tradakad
2005-02-18 10:44
2005.06.06
работа с видео файлом


5-1086130651
Vinil
2004-06-02 02:57
2005.06.06
Как ограничить Memo ?


14-1116314868
blackman
2005-05-17 11:27
2005.06.06
О Москве


3-1115113694
kyn66
2005-05-03 13:48
2005.06.06
Как добавить ключевой столбец в существующую таблицу Access ?





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