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

Вниз

Тип, совместимый и со String и с PChar   Найти похожие ветки 

 
Dr. Genius   (2006-10-21 08:04) [0]

Здравствуйте!

String можно преобразовать в PChar, PChar можно преобразовать в String. А существует ли в Delphi такой тип, совместимый и со String и с PChar без дополнительного преобразования? Мне в частности надо как-то объявить в качестве аргумента функци строку, совместимую с обоими из вышеперечисленных типов (чтобы не было ошибок “Incompatible types: ‘String’ and ‘PChar’”).


 
Loginov Dmitry ©   (2006-10-21 09:24) [1]

function GetLength(const S: string): Integer;
begin
 Result := Length(S);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
 P: PChar;
begin
 P := "Строка";
 ShowMessageFmt("%d", [GetLength(P)]);
end;


 
Virgo_Style ©   (2006-10-21 10:25) [2]

может, overload использовать?


 
Desdechado ©   (2006-10-21 19:14) [3]

Variant


 
Джо ©   (2006-10-21 19:28) [4]

procedure ShowMe (const{или var} S);
begin
 ShowMessage (string(S))
end;

:)


 
@!!ex ©   (2006-10-22 10:06) [5]


> Dr. Genius   (21.10.06 08:04)  


Как тут уже сказали - overload не плохое решение.
Но я почемуто предполагаю, что вы не знаете что это....


Procedure  ProcessString(S:PChar); overload;
Procedure  ProcessString(S:String); overload;

....

Procedure  ProcessString(S:PChar);
begin
 ProcessString(string(S));
end;

Procedure  ProcessString(S:String);
begin
end;


Вариант Джо - тоже вариант.


 
Dr. Genius   (2006-10-22 13:27) [6]

По-моему меня не так поняли.
Как объявить string-переменную в качестве параметра функции так, чтобы не возникало ошибок о несовместимости типов, независимо от того, параметр какого типа (string или PChar) требуется этой функции.

var
 S: string;
begin
 S := "open";
 ShellExecute(Form1.Handle, ProcessString(S), "C:\...", nil, nil, SW_SHOW);

Вариант, предложенный @!!ex не подходит. При выполнении выложенного мной кода возникает ошибка: Incompatible types: "procedure, untyped pointer or untyped parameter" and "PChar".


 
Ketmar ©   (2006-10-22 13:31) [7]

чукча не читатель?


 
sniknik ©   (2006-10-22 14:17) [8]

> По-моему меня не так поняли.
поняли правильно, именно так как написано

даже в уточнении
> Как объявить string-переменную в качестве параметра функции так ...
продолжаешь, хотя в примере скорее угадывается вопрос "как передать в функцию с параметром типа PChar переменную типа string"...


 
@!!ex ©   (2006-10-22 14:28) [9]


> Dr. Genius

походу это вы чего то не так понимаете. ;)


 
Gero ©   (2006-10-22 15:25) [10]

Автор, ты сам хоть знаешь чего хочешь?
Напиши конкретно, зачем тебе это надо, можешь даже код выложить. Если, конечно, он не маркирован грифом «Совершенно секретно».


 
Dr. Genius   (2006-10-25 19:37) [11]

В общем, я пишу программу для защиты строк в исходниках Delphi (наподобие Delphi String Protect, если кто знает). Вкратце принцип работы программы такой: сканируется файл *.pas на наличие в нем строк; далее эти строки заменяются вызовом функции с определенными параметрами для каждой конкретной строки (чтобы exe-файл программы после компиляции не содержал строк в открытом виде). Так вот, эта функция естественно возвращает значение типа String. Поэтому при обработке файла *.pas, если встречаются строки типа PChar, то на их месте ставится эта ф-ия, возвращающая String. Неизбежно возникают ошибки о несовместимости типов (String и PChar). Можно ли избежать этих ошибок?


 
Anatoly Podgoretsky ©   (2006-10-25 19:51) [12]

В файле *.pas нет никаких PChar строк.


 
Loginov Dmitry ©   (2006-10-25 19:51) [13]

Dr. Genius   (25.10.06 19:37) [11]


Брррредддд!


 
Джо ©   (2006-10-25 19:52) [14]

> Так вот, эта функция естественно возвращает значение типа
> String.

Почему бы ей не возвращать string, когда заменяет параметр string и PChar, когда заменяет параметр PChar?


 
Dr. Genius   (2006-10-26 08:10) [15]


> Почему бы ей не возвращать string, когда заменяет параметр
> string и PChar, когда заменяет параметр PChar?


А как тогда узнать, какой параметр заменяется?


 
Сергей М. ©   (2006-10-26 10:54) [16]


> Dr. Genius   (25.10.06 19:37) [11]



> для защиты строк в исходниках Delphi


А причем здесь EXE ?


 
Джо ©   (2006-10-26 12:13) [17]

> [15] Dr. Genius   (26.10.06 08:10)

> А как тогда узнать, какой параметр заменяется?

Ну ты же их заменяешь, кому знать, как не тебе?


 
Плохиш ©   (2006-10-26 13:44) [18]


> (чтобы exe-файл программы после компиляции не содержал строк
> в открытом виде)

Может попробовать писать строки без использования нецензурного сленга, тогда и шифровать ничего не придётся.


 
Плохиш ©   (2006-10-26 14:03) [19]


> Dr. Genius   (26.10.06 08:10) [15]
>
> > Почему бы ей не возвращать string, когда заменяет параметр
>
> > string и PChar, когда заменяет параметр PChar?
>
>
> А как тогда узнать, какой параметр заменяется?

Делфи - это такой язык, в котором все переменные/параметры должны быть описаны до использования. Соответственно сохраняй описания и в нужном месте проверяй по списку тип.


 
Ketmar ©   (2006-10-26 14:30) [20]

>[19] Плохиш(c) 26-Oct-2006, 14:03
>сохраняй описания и в нужном месте проверяй по списку тип.
так это ж парзер писать надо. давайте лучше помолчим. а то появится ещё одна ветка, где будут вопросы о парзере. а автору ещё рановато это делать...


 
Gloomer ©   (2006-10-26 15:45) [21]

>[20] Ketmar ©   (26.10.06 14:30) ну надо же на чем-то учиться...
ИМХО без парсера действительно будет трудно обойтись.
К тому же интересно, как Dr. Genius определяет, что это именно строковая переменная - по одинарным кавычкам? Тогда он забыл еще про некоторые типы переменных, например Char, array of char...


 
Ketmar ©   (2006-10-26 15:46) [22]

>[21] Gloomer(c) 26-Oct-2006, 15:45
да тут вообще подход в корне неверный. например -- автор твёрдо уверен, что после "шифрования" в строках типа PChar не появится #0 посерёдке? %-)



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

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

Наверх




Память: 0.52 MB
Время: 0.062 c
2-1161895101
aleko
2006-10-27 00:38
2006.11.12
сохранение файла в БД


2-1161796894
Rey_Mysterio
2006-10-25 21:21
2006.11.12
TMemo: поиск строки


15-1161497227
*Стажер*
2006-10-22 10:07
2006.11.12
"Защита от дураков"


3-1158065644
NotGooDP
2006-09-12 16:54
2006.11.12
Информация о последней дате редактирования таблицы в MsSQL


2-1161860857
kirillrepin
2006-10-26 15:07
2006.11.12
ListBox