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

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

Вставка строки в PChar [D7, WinXP]


HydraMarat ©   (2004-08-26 15:00:00) 

Знаю, вопрос может показаться тупым, но я ничего не нашел через "Поиск"...

Как вставить в PChar? Причем указатель естественно нельзя изменять

P1 = 'I Mercedes';
P2 = 'love';
надо получить 'I love Mercedes'.

Че то не доходит до меня. Есть ли встроенная функция? Или всякими там Realloc'ами мудиться?...

Спасибо.


Yuri-7   (2004-08-27 23:24:00) [1]

p1:='I Mersedes';
p2:='love';
p1:=Pchar(Copy(String(p1),1,2)+ String(p2)+' '+Copy(String(p1),3,8));


HydraMarat   (2004-08-27 19:07:00) [2]

Я, конечно, извиняюсь, что поднимаю вопрос, но может кто-нибудь что-нибудь еще скажет... ОООчень надо!

Или забить? Может все-таки со string'ами работать? Реально ли они тормознее PChar?


HydraMarat   (2004-08-27 10:42:00) [3]

Тьфу! Надо же было не StrNew, а StrAlloc:

function StrAlloc(Size: Cardinal): PChar;
begin
 Inc(Size, SizeOf(Cardinal));
 GetMem(Result, Size);
 Cardinal(Pointer(Result)^) := Size;
 Inc(Result, SizeOf(Cardinal));
end;


HydraMarat   (2004-08-27 10:37:00) [4]

Я вот тут подумал, если StrNew выглядет следующим образом:

function StrNew(const Str: PChar): PChar;
var
 Size: Cardinal;
begin
 if Str = nil then Result := nil else
 begin
   Size := StrLen(Str) + 1;
   Result := StrMove(StrAlloc(Size), Str, Size);
 end;
end;

то может можно написать следующее:

procedure StrRealloc(var Str: PChar; Size: Cardinal);
begin
 if Str <> nil then
 begin
   Dec(Str, SizeOf(Cardinal));
   ReallocMem(Str, Size);
   Cardinal(Pointer(Str)^) := Size;
   Inc(Str, SizeOf(Cardinal));
 end;
end;

Однако, почему-то не работает. Для одной переменной все OK, а когда повторно вызываю, то снова возникает исключение. Почему же? Объясните, пожалуйста.


Amoeba   (2004-08-26 15:42:00) [5]

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

> clickmaker ©   (26.08.04 15:05) [2]


HydraMarat   (2004-08-26 15:25:00) [6]

Хочешь сказать, что данные, записанные ранее через StrNew, сами освободятся из памяти?


Уток   (2004-08-26 15:20:00) [7]

Семен- самое разумное предложил:
если Result :PAnsiChar; и st1,st2:string;

 Result:=pointer(st1+st2+#0);


HydraMarat   (2004-08-26 15:14:00) [8]

А неизмениться ли тогда значение указателя в поле? Не потеряю ли я данные, ранее завязанные за ним?

Суть в том, что объект А создает строку через StrNew, он же ее и разрушает через StrDispose. А вот работает с ней другой объект, который занимается и вставкой в том числе. Я пробовал через StrMove, но тогда на StrDispose возникает EAccessViolation.


Семен Сорокин   (2004-08-26 15:07:00) [9]

работай со string'ами, а результат переводи в PChar если нужно.


HydraMarat   (2004-08-26 15:06:00) [10]

Так Insert вроде только со string'ами. А мне бы хотелось чисто на PChar'ном уровне.


clickmaker   (2004-08-26 15:05:00) [11]

Insert()

> Причем указатель естественно нельзя изменять

тогда надо заранее резервировать место для возможных вставок


HydraMarat   (2004-08-26 15:02:00) [12]

Еще интересно: если я ранее проинициализированному через StrNew полю присвою какое-то выражение типа PChar, то измениться ли значение указателя? Или же компилятор сделает так, что изменяться только данные?


Наверх

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