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

Вниз

PChar:=String   Найти похожие ветки 

 
GTAID   (2006-08-17 20:07) [0]

Как присвоить String к PChar?
Хелп!
Как сделать в обратную сторону я знаю: String:=StrPas(PChar)


 
DevilDevil ©   (2006-08-17 20:10) [1]

Pchar := Pchar(String);

> Как присвоить
преобразовать


 
GTAID   (2006-08-17 20:29) [2]

Спасибо, DevilDevil.


 
Ketmar ©   (2006-08-17 20:31) [3]

во-первых, достаточно s := stirng(pcharptr);
во-вторых: а память выделять, самоубийцы? %-)


 
Чапаев ©   (2006-08-17 20:35) [4]

> а память выделять, самоубийцы?

Флёнов, сэр!


 
begin...end ©   (2006-08-17 20:36) [5]

> Ketmar ©   (17.08.06 20:31) [3]
> во-первых, достаточно s := stirng(pcharptr);

Я бы даже сказал, что достаточно s := pcharptr.
:o)


 
Ketmar ©   (2006-08-17 20:39) [6]

> [4] Чапаев ©   (17.08.06 20:35)
поймать бы его толпой камрадов в тёмном переулке... %-)

> [5] begin...end ©   (17.08.06 20:36)
ну да. это уже издержки моего стиля. %-)


 
DiamondShark ©   (2006-08-18 10:38) [7]

А что не так с памятью? Просто помнить, что валидность такого пчара равна времени жизни строки.


 
Ketmar ©   (2006-08-18 11:14) [8]

> [7] DiamondShark ©   (18.08.06 10:38)
ты думаешь, будут помнить? сильно сомневаюсь. а то ещё полезут менять строку через указатель... или сменят символ в строке и удивятся, увидев AV... нафиг-нафиг.


 
Ega23 ©   (2006-08-18 11:54) [9]

Самое прикольное, когда начинаешь такую прикастовку строки к PChar делать для передачи PChar в dll.
Узнаёшь много интересного о PChar, String, их взаимодействии и т.п.  :о)


 
Ketmar ©   (2006-08-18 11:55) [10]

> [9] Ega23 ©   (18.08.06 11:54)
если DLL строку не меняет -- то всё легально. %-)


 
Ega23 ©   (2006-08-18 11:58) [11]


> если DLL строку не меняет -- то всё легально. %-)


А если меняет? Да ещё и callback"ом в приложение возвращает что-то?
Вот тут и сказывается вред Delphi, если подходить к нему как к бутонокидательству.


 
Ketmar ©   (2006-08-18 12:01) [12]

> [11] Ega23 ©   (18.08.06 11:58)
это не "вред Delphi", это вред лени. %-)


 
Ega23 ©   (2006-08-18 12:41) [13]


> это не "вред Delphi", это вред лени. %-)


Просто Delphi вкупе с Флёновыми развращает. Не учит пониманию простых вещей.
Точнее, не простых, а основополагающих.


 
Ketmar ©   (2006-08-18 13:01) [14]

> [13] Ega23 ©   (18.08.06 12:41)
хм. а Delphi и не обязана ничему учить... %-)


 
DevilDevil ©   (2006-08-18 16:19) [15]

> [3]-[14]

Прямо обкакали, можно сказать.


 
Ega23 ©   (2006-08-18 16:23) [16]


> Прямо обкакали, можно сказать.


Не совсем. Обкакывается иначе. Как - могу объяснить по мылу. Нефиг форум засорять физиологическими подробностями функционирования человеческого организма.


 
DevilDevil ©   (2006-08-18 16:30) [17]

Вы вместо флуда, объяснили бы сами человеку, какие трудности следует ожидать, что за "звери" такие: pchar и string. А то целых 15 неинформативных постов...


 
Loginov Dmitry ©   (2006-08-18 16:40) [18]

> Как присвоить String к PChar?


Полагаю, что уже имеется готовый буфер для копирования в него строки (иначе, зачем нужны такие пляски), причем буфер находится в другом модуле, подгруженном в одно адресное пространство с вашей программой. Известна также длина этого буфера. Тогда можно так сделать:

Len := Min(S, BufSize - 1);
Move(S[1], PCharBuf^, Len);
PCharBuf[Len] := #0;


 
DevilDevil ©   (2006-08-18 16:45) [19]

> иначе, зачем нужны такие пляски

например в такой ситуации:

procedure ShowError(Text : string);
begin
 MessageBox(GetActiveWindow, pchar(Text), "Error:", MB_ICONERROR);
end;


 
Ega23 ©   (2006-08-18 16:54) [20]


> DevilDevil ©   (18.08.06 16:45) [19]


Если бы внимательно почитал "неинформативные посты", то ты бы понял, что простое преобразование прокатывает далеко не всегда.


 
Loginov Dmitry ©   (2006-08-18 17:09) [21]

> например в такой ситуации:
>
> procedure ShowError(Text : string);
> begin
> MessageBox(GetActiveWindow, pchar(Text), "Error:", MB_ICONERROR)
> ;
> end;


Это совершенно иная ситуация. Тут нет никакого присваивания String к PChar. Здесь просто-напросто приведение типов.


 
DevilDevil ©   (2006-08-18 17:24) [22]

> Loginov Dmitry ©   (18.08.06 17:09) [21]

procedure ShowError(Text : string);
var
 Mes : pchar;
begin
 Mes := pchar(Text);
 MessageBox(GetActiveWindow, Mes, "Error:", MB_ICONERROR)
end;

Дело в том что автор топика скорее всего только начал изучать Дельфи; он даже вопрос грамотно задать не смог. Да и не удивительно: он же и не думал, что с преобразованиями pchar <--> string может быть столько мороки

> Ega23 ©   (18.08.06 16:54) [20]

Если бы не забивал мозги извращениями типа PVariant^, то может ты бы понял, что в БОЛЬШИНСТВЕ Api-вызовов как раз "простое преобразование" и требуется

P.S. нет, ну привяжутся же к ерунде, вместо того чтобы реально человеку советом помочь. Вот дотошные...


 
MBo ©   (2006-08-18 17:27) [23]

http://www.delphikingdom.ru/asp/viewitem.asp?catalogid=1206


 
DevilDevil ©   (2006-08-18 17:33) [24]

> MBo ©   (18.08.06 17:27) [23]

Единствеенный рулёзный человек!


 
Ketmar ©   (2006-08-18 18:24) [25]

> [22] DevilDevil ©   (18.08.06 17:24)
если автор "не думал", то это только его проблемы. авось в дальнейшем будет сначала думать.


 
Loginov Dmitry ©   (2006-08-18 18:33) [26]

> Mes := pchar(Text);


Хе... Автоматически выделяется память и в нее копируется содержимое Text.
А зачем так сделали, не ясно. Вдруг я хочу в Mes просто запомнить указатель на данные строки Text.

Сколько же еще фичей зашито в PChar?


 
Loginov Dmitry ©   (2006-08-18 18:37) [27]

Причем, если будет так

procedure ShowError(const Text : string);

то копирования не будет, а присвоится только указатель, как и ожидалось.


 
Loginov Dmitry ©   (2006-08-18 18:43) [28]

За одно проверил, что если строка передается так

procedure ShowError(Text : string);

то происходит предварительно создание копии данной строки.

Поэтому директирой const пренебрегать не следует.


 
begin...end ©   (2006-08-18 18:46) [29]

> DevilDevil ©   (18.08.06 16:19) [15]

А можно пояснить, кого, например, я обкакал в посте [5]? Аж интересно.

> Loginov Dmitry ©   (18.08.06 18:33) [26]

> Хе... Автоматически выделяется память и в нее копируется
> содержимое Text.

Что за чушь?


 
Loginov Dmitry ©   (2006-08-18 18:49) [30]

> Что за чушь?


Проверь. Удивишься!


 
Ega23 ©   (2006-08-18 18:50) [31]


> Если бы не забивал мозги извращениями типа PVariant^, то
> может ты бы понял, что в БОЛЬШИНСТВЕ Api-вызовов как раз
> "простое преобразование" и требуется


Между прочим, посмотрев на остальные подобные функции, пришёл к выводу, что передачей значения через var-параметр там не обойтись.
Так что - мимо тазика, любезный.


 
begin...end ©   (2006-08-18 18:53) [32]

> Loginov Dmitry ©   (18.08.06 18:49) [30]

Проверил. Не удивился. Как я и ожидал, при выполнении указанного присваивания выделения памяти не происходит. Что я делаю не так?


 
Ketmar ©   (2006-08-18 18:56) [33]

> [29] begin...end ©   (18.08.06 18:46)
вполне верю. в свое время в каких-то Delphi смотрел на код, генерируемый SetCOnsoleTitle(PChar(s)) -- был очень удивлён. делалась копия s, это передавалось винеж, потом копию убивали.


 
Ketmar ©   (2006-08-18 18:56) [34]

пардон за опечатки. тяпница, вечер...


 
Loginov Dmitry ©   (2006-08-18 20:16) [35]

> Что я делаю не так?


А что делаешь так?

В общем, посмотри такой код:


procedure ShowError(Text : string);
var
 Mes : pchar;
begin
 Mes := pchar(Text);

 ShowMessageFmt("Память строки: %d  Новый буфер: %d",
   [Integer(@Text[1]), Integer(Mes)]);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
 S: string;
begin
 S := "BlaBlaBla";
 ShowError(S);
end;


Здесь память для Mes выделяется. Выделяется она даже в случае использования директивы var. Исключение - const


 
begin...end ©   (2006-08-18 20:45) [36]

> Loginov Dmitry ©   (18.08.06 20:16) [35]

> [Integer(@Text[1]), Integer(Mes)]

Заменить на [Integer(Text), Integer(Mes)]. Скомпилировать. Запустить. Удивиться.


 
Loginov Dmitry ©   (2006-08-18 21:10) [37]

После [23] я уже ничему ни удивляюсь. Фишку усек вроде: при обращении к Text[1] происходит вызов UniqueString.

MBo, за ссылку спасиба! Можно век программить, и не узнать таких подробностей о строках.


 
begin...end ©   (2006-08-18 21:20) [38]

> Loginov Dmitry ©   (18.08.06 21:10) [37]

> После [23] я уже ничему ни удивляюсь.

А я, ей-богу, не перестаю удивляться. Людям, которые в форуме для начинающих выдают свои заблуждения за истину.


 
Loginov Dmitry ©   (2006-08-18 21:20) [39]

Тогда получается, что мое утверждение в [28] верно только при обращении Integer(@Text[1]). То есть при Integer(Text) копирование строки при передаче в подпрограмму не выполняется, увеличивается только счетчик ссылок.


 
DiamondShark ©   (2006-08-18 22:27) [40]


> Ega23 ©   (18.08.06 18:50) [31]

Не верю.


 
DevilDevil ©   (2006-08-22 15:18) [41]

А мне вот интересно следующее:

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


 
Anatoly Podgoretsky ©   (2006-08-22 15:27) [42]

DiamondShark ©   (18.08.06 10:38) [7]
Короче, до времени ее изменения.


 
Anatoly Podgoretsky ©   (2006-08-22 15:29) [43]

Loginov Dmitry ©   (18.08.06 17:09) [21]
Я бы поостерегся говорить о приведении по отношению к PChar(Text) - это совсем не так.


 
Anatoly Podgoretsky ©   (2006-08-22 15:30) [44]

Loginov Dmitry ©   (18.08.06 18:33) [26]
Это вообще бред.


 
Anatoly Podgoretsky ©   (2006-08-22 15:32) [45]

DevilDevil ©   (22.08.06 15:18) [41]
С чего бы.


 
Ega23 ©   (2006-08-22 16:05) [46]


> DiamondShark ©   (18.08.06 22:27) [40]
>
>
> > Ega23 ©   (18.08.06 18:50) [31]
>
> Не верю.
>


Всё просто. Это диалог изменения свойств объекта. Создаётся динамически. Изменения "принимаются" по нажатию кнопки.

 TLookupComboPropertyFrame = class(TFrame, IPropertyFrame)
   DBLookupCombobox: TDBLookupComboboxEh;
   lbText: TLabel;
   adsData: TADODataSet;
   dsData: TDataSource;
 private
   FTarget: PVariant;
   FDebug: Boolean;
   { Private declarations }
 public
   class function init(tgt: PVariant; text : string;dlg : TPropertiesForm) : TLookupComboPropertyFrame;

   procedure refreshData; // Called to bring data from object to controls.
   procedure applyData;   // Called to bring data from controls to object.
   procedure rejectData;  // called to cancel changes.
   function  get_frame : TFrame;

   property frame  : TFrame  read get_frame;
   property target : PVariant    read FTarget write FTarget;
   property Debug : Boolean Read FDebug Write FDebug;
 end;

implementation

{$R *.DFM}

{ TLookupComboPropertyFrame }

//*****************************************************************************

procedure TLookupComboPropertyFrame.applyData;
begin
 FTarget^:=DBLookupCombobox.KeyValue;
 //FTarget^:=adsData.FieldByName(DBLookupCombobox.KeyField).AsInteger;
end;

//*****************************************************************************

function TLookupComboPropertyFrame.get_frame: TFrame;
begin
 Result:=Self;
end;

//*****************************************************************************

class function TLookupComboPropertyFrame.init(tgt: PVariant; text: string;
 dlg: TPropertiesForm): TLookupComboPropertyFrame;
var
 frm : TLookupComboPropertyFrame;
begin
 frm      := TLookupComboPropertyFrame.Create(dlg);
 frm.Name := "C" + IntToStr(Random(2000000000));

 frm.FTarget         := tgt;
 frm.lbText.Caption  := text;

 dlg.addFrame(frm);

 Result := frm;
end;

//*****************************************************************************

procedure TLookupComboPropertyFrame.refreshData;
begin
 try
   DBLookupCombobox.KeyValue:=FTarget^;
 except

 end;
end;

//*****************************************************************************

procedure TLookupComboPropertyFrame.rejectData;
begin
 refreshData;
end;

//*****************************************************************************


FTarget - и есть адрес, по которому надо внести изменения. А, соответственно, на init я этот адрес и задаю.


 
DevilDevil ©   (2006-08-22 18:32) [47]


> Anatoly Podgoretsky ©   (22.08.06 15:32) [45]
>
> DevilDevil ©   (22.08.06 15:18) [41]
> С чего бы.


Ну смотри, у меня есть динамический массив строк, размерности 3. Каждый элемент - условно говоря указатель на какую-то область динамической памяти:
StrArr[0] := "STR 0";
StrArr[1] := "STR 1";
StrArr[2] := "STR 2";


Если я уменьшу размерность этого массива, то освободится только память под указатель, а "деструктора" строки не поизойдёт; поэтому и утечка памяти... Длят того чтобы этого не происходило, я должен перед уменьшением размерности массива "обнулить" освобождаемые строки:
StrArr[1] := "";
StrArr[2] := "";
SetLength(StrArr, 1);


Я не прав?


 
Anatoly Podgoretsky ©   (2006-08-22 18:48) [48]

Еще раз повторяю с чего бы, у тебя ошибка где то в другом месте.


 
begin...end ©   (2006-08-22 20:31) [49]

> DevilDevil ©   (22.08.06 18:32) [47]

> Если я уменьшу размерность этого массива...

В процессе выполнения программы Вы не можете изменить размерность массива (ни статического, ни динамического) -- она постоянна, и в данном случае равна 1. То, о чём Вы говорите, называется размером, а не размерностью.

> то освободится только память под указатель, а "деструктора"
> строки не поизойдёт

Вы ошибаетесь. При уменьшении размера массива, состоящего из длинных строк, счётчик ссылок удаляемых из массива строк уменьшится на 1, и если после этого окажется, что он равен 0, то память, занимаемая телами этих строк, освободится автоматически. Такова особенность типов с управляемым временем жизни, к которым относятся и длинные строки (AnsiString).

Если бы речь шла о массиве простых указателей, содержащих адреса участков памяти, выделенных Вами с помощью, скажем, GetMem, то Вы были бы правы -- перед уменьшением размера массива следовало бы вызвать FreeMem для каждого удаляемого элемента.

P.S. Так как насчёт [29]? За словеса отвечать будем, или как?


 
ronyn   (2006-08-23 00:17) [50]


> Просто Delphi вкупе с Флёновыми развращает. Не учит пониманию
> простых вещей.
> Точнее, не простых, а основополагающих.

Почему бы это. Кто что имеет против Флёнова?


 
Злой   (2006-08-23 00:18) [51]

> begin...end ©   (22.08.06 20:31) [49]
Такова особенность типов с управляемым временем жизни, к которым относятся и длинные строки (AnsiString).


Благодарю. А где можно поподробнее почитать о типах с управляемым временем жизни?

> P.S. Так как насчёт [29]? За словеса отвечать будем, или как?

begin...end ©   (18.08.06 18:46) [29]
> DevilDevil ©   (18.08.06 16:19) [15]
А можно пояснить, кого, например, я обкакал в посте [5]? Аж интересно.


Естественно, к Вам моя реплика не имеет ни какого отношения


 
DevilDevil ©   (2006-08-23 00:19) [52]

Это я, - забыл ник сменить



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

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

Наверх




Память: 0.61 MB
Время: 0.197 c
6-1145948639
Archon7th
2006-04-25 11:03
2006.09.10
Что лучше использовать для игрового сервера в ~100 пользователей


2-1155798124
Chort
2006-08-17 11:02
2006.09.10
закрепленее - в Excel


15-1156081068
vain
2006-08-20 17:37
2006.09.10
Я нормальный или нет?


15-1155559967
Desdechado
2006-08-14 16:52
2006.09.10
Странные случаи из жизни


15-1155573637
qqqqqqq
2006-08-14 20:40
2006.09.10
Кто разбирается в ОС (Unix,Linux)? Какой Linux посоветуете?