Главная страница
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.022 c
3-1092742537
Эдик Дятлов
2004-08-17 15:35
2004.09.12
Как получить подключенных пользователей в базе SQL Anywhere


9-1084564663
stud2
2004-05-14 23:57
2004.09.12
Подскажете пожалуйста, где можно найти описание игр шашки и шахма


1-1093489221
SNV-Soft
2004-08-26 07:00
2004.09.12
Компонент "Линейка"


3-1092810273
Belkova
2004-08-18 10:24
2004.09.12
Мастера Delphi! Подскажите, пожалуйста. В приложении из разных


1-1093843958
Vilkkkka
2004-08-30 09:32
2004.09.12
Что это за файлы с расширением .dcp ?