Форум: "Начинающим";
Текущий архив: 2006.11.12;
Скачать: [xml.tar.bz2];
ВнизТип, совместимый и со 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;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.052 c