![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вставка строки в 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, то измениться ли значение указателя? Или же компилятор сделает так, что изменяться только данные?