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

Вниз

Вставка строки в PChar   Найти похожие ветки 

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

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

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

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

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

Спасибо.


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

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


 
clickmaker ©   (2004-08-26 15:05) [2]

Insert()

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

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


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

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


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

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


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

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

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


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

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

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


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

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


 
Amoeba ©   (2004-08-26 15:42) [8]

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

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


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

Я вот тут подумал, если 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, а когда повторно вызываю, то снова возникает исключение. Почему же? Объясните, пожалуйста.


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

Тьфу! Надо же было не 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 19:07) [11]

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

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


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

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



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

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

Наверх




Память: 0.49 MB
Время: 0.023 c
4-1091154478
Zer0
2004-07-30 06:27
2004.09.12
Работа с палитрой в консольном приложении


4-1091081974
shvez_igor
2004-07-29 10:19
2004.09.12
Управления Фотошопом в програме на Делфи


10-1015848534
m.r. sender
2002-03-11 15:08
2004.09.12
CORBA через модем


1-1093422580
happyandry
2004-08-25 12:29
2004.09.12
Дельфи - > Excel (свойства ячеек)


1-1093366696
mouse_web
2004-08-24 20:58
2004.09.12
Как отобразить MEMO поля в QuickReport ?