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

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

C++ 2 Delphi [D5, WinXP]


dumb ©   (2002-12-04 01:09:00) 

Пожалуйста,

Помогите перевести кусок С++ в Delphi. Я избалован Delphi и незнаю кто тут кому сколько памяти должен. Спасбио.


...
CString strOutFile;
DoSomething(strOutFile.GetBuffer(255));
strOutFile.ReleaseBuffer();
...


Fantasist   (2002-12-04 07:02:00) [1]


> strOutFile.GetBuffer(255) возвращает указатель на array
> of CHAR, заполняя его из поля класса


Тут не столь важно, как это устроенно внутри. Копирование происходит не всегда, но главное - возвращается указатель на внутренний буффер.


> а 255 - максимальный размер буфера.


Минимальный.



> strOutFile := Copy(strOutFile, 1, Pos(#0, strOutFile) -
> 1);


А это зачем? Копируем себя в самого себя? Если зарание размер не известен, но точно известно, что DoSomething поставит 0 в конце строки, то можно так:


var
strOutFile: string;
p:^Cardinal;
..
SetLength(strOutFile, 255);
DoSomething(pointer(strOutFile));
p:=Pointer(Integer(strOutFile)-4);
p^:=Pos(#0,strOutFile)-1;


dumb   (2002-12-04 01:39:00) [2]

скорее всего, наоборот


wam   (2002-12-04 01:34:00) [3]

StrCopy & StrPCopy


dumb   (2002-12-04 01:32:00) [4]

да блин... что же со мной! вот нормальный код для размышления без всякого мусора:

var strOutFile: string
..
SetLength(strOutFile, 255);
DoSomething(strOutFile);
strOutFile := Copy(strOutFile, 1, Pos(#0, strOutFile) - 1);


dumb   (2002-12-04 01:30:00) [5]

Ой.. извините, погнал.


var strOutFile: string
..
SetLength(OutFile, 255);
DoSomething(strOutFile, i);
strOutFile := Copy(strOutFile, 1, Pos(#0, strOutFile) - 1);





wam   (2002-12-04 01:30:00) [6]

Поправка
strOutFile.GetBuffer(255) возвращает указатель на array of CHAR, заполняя его из поля класса, а 255 - максимальный размер буфера.
В С функция работает с буфером как с массивом символов.
При вызове из Delphi 3 и выше будет преобразование в этот массив.
Если неизвестен механизм функции, надежнее преобразовать string в array of CHAR признак конца строки - chr(0).
strOutFile.ReleaseBuffer() записывает из буфера в поле класса


dumb   (2002-12-04 01:28:00) [7]

первое, что приходит в голову (и работает)


var strOutFile: string
..

DoSomething(strOutFile, i);
strOutFile := Copy(strOutFile, 1, SmartPos(#0, strOutFile) - 1);

но можно ли красивее?


wam   (2002-12-04 01:21:00) [8]

var
strOutFile: string;

procedureDoSomething(var str: string);

DoSomething(strOutFile);

strOutFile.GetBuffer(255) возвращает указатель на arrayof PCHAR
strOutFile.ReleaseBuffer() записывает из буфера в поле класса


PVOzerski   (2002-12-04 01:18:00) [9]

И как такое переводить, не зная устройства С++-ного класса CString? :^(
а формально-то всё просто:
...
var
strOutFile:CString;
...
begin
...
DoSomething(strOutFile.GetBuffer(255));
strOutFile.ReleaseBuffer;
...
Только вот толку-то с такого перевода?


Наверх

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