Many Windows functions claim to want PChar parameters in the documentation, but they are defined as requiring LongInts.

Is this a bug?

 

No, this is where "typecasting" is used. Typecasting allows you to fool the compiler into thinking that one type of variable is of another type for the ultimate in flexibility. The last parameter of the Windows API function SendMessage() is a good example. It is

documented as requiring a long integer, but commonly requires a PChar for some messages (WM_WININICHANGE). Generally, the variable you are typecasting from must be the same size as the variable type you are casting it to. In the SendMessage example, you could typecast a PChar as a longint, since both occupy 4 bytes of memory:

 

Code:

var

s : array[0..64] of char;

begin

StrCopy(S, 'windows');

SendMessage(HWND_BROADCAST, WM_WININICHANGE, 0, LongInt(@S));

end;

Code:

{ **** UBPFD *********** by kladovka.net.ru ****

>> Конвертация PWideChar в String

 

Автор: Gua, Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра., ICQ:141585495, Simferopol

Copyright: Andre .v.d. Merwe

Дата: 18 июля 2002 г.

********************************************** }

 

function PWideToString(pw : PWideChar) : string;

var

p : PChar;

iLen : integer;

begin

iLen := lstrlenw( pw ) + 1;

GetMem( p, iLen );

 

WideCharToMultiByte( CP_ACP, 0, pw, iLen, p, iLen * 2, nil, nil );

 

Result := p;

FreeMem( p, iLen );

end;

Code:

 

{ **** UBPFD *********** by kladovka.net.ru ****

>> Конвертация String в PWideChar

 

Зависимости: ???

Автор: Gua, Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра., ICQ:141585495, Simferopol

Copyright: Andre .v.d. Merwe

Дата: 18 июля 2002 г.

********************************************** }

 

function StringToPWide( sStr: string; var iNewSize: integer ): PWideChar;

var

pw : PWideChar;

iSize : integer;

begin

iSize := Length( sStr ) + 1;

iNewSize := iSize * 2;

 

pw := AllocMem( iNewSize );

 

MultiByteToWideChar( CP_ACP, 0, PChar(sStr), iSize, pw, iNewSize );

 

Result := pw;

end;

 

 

Пример использования:

Code:

procedure TForm1.Button1Click(Sender: TObject);

var

iSize: integer;

begin

ChangeWallpaper(StringToPWide('C:\1.jpg',iSize));

end;

Code:

{ **** UBPFD *********** by delphibase.endimus.com ****

>> Преобразование строки S в набор её чисел,

где каждое число представляет каждый символ строки

 

Получив строку S функция преобразует её в набор чисел, каждое из которых

обозначает код текущего символа, а перед каждым числом располагается символ "#".

Пусть, например, S = 'Hello';

Тогда Result = '#72#101#108#108#111';

 

Зависимости: system

Автор: VID, Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра., ICQ:132234868, Махачкала

Copyright: VID

Дата: 25 апреля 2002 г.

***************************************************** }

 

function StrToAscii(S: string): string;

var

I, X: Integer;

RS: string;

CurChar: string;

begin

Result := '';

if Length(S) = 0then

Exit;

X := 1;

for I := 1to Length(S) do

begin

CurChar := '#' + Inttostr(Ord(S[I]));

Insert(CurChar, RS, X);

X := X + Length(CurChar);

end;

Result := RS;

end;

Code:

{ **** UBPFD *********** by delphibase.endimus ****

>> Преобразование строки с разделителями в StringList.

 

Преобразование строки с разделителями в StringList или наследник TStrings.

Навеяно одноименной процедурой из InfoPower :-)

 

Зависимости: Classes

Автор: Игорь Шевченко, Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра., Москва

Copyright: Игорь Шевченко, Woll2Woll software (original)

Дата: 30 апреля 2002 г.

***************************************************** }

 

procedure StrBreakApart(const S, Delimeter: string; Parts: TStrings);

var

CurPos: integer;

CurStr: string;

begin

Parts.clear;

Parts.BeginUpdate();

try

CurStr := S;

repeat

CurPos := Pos(Delimeter, CurStr);

if (CurPos > 0) then

begin

Parts.Add(Copy(CurStr, 1, Pred(CurPos)));

CurStr := Copy(CurStr, CurPos + Length(Delimeter),

Length(CurStr) - CurPos - Length(Delimeter) + 1);

end

else

Parts.Add(CurStr);

until CurPos = 0;

finally

Parts.EndUpdate();

end;

end;

Пример использования:

 

var

Tmp: StringList;

begin

Tmp := TStringList.Create();

StrBreakApart('Text1<BR>Text2<BR>Text3<BR>Text4', '<BR>', Tmp);

// После вызова Tmp содержит

// Text1

// Text2

// Text3

// Text4

...

Tmp.Free();

end;

 

 


 

Можно сделать значительно проще:

Code:

procedure StrBreakApart(const S, Delimeter: string; Parts: TStrings);

{©Drkb v.3(2007): www.drkb.ru,

®Vit (Vitaly Nevzorov) - Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра.}

begin

Parts.text:=StringReplace(S, Delimeter, #13#10, [rfReplaceAll, rfIgnoreCase]);

end;

 

 

Автор:Vit

Code:

function NumStringToBCD(const inStr: string): string;

function Pack(ch1, ch2: Char): Char;

begin

Assert((ch1 >= '0') and (ch1 <= '9'));

Assert((ch2 >= '0') and (ch2 <= '9'));

{Ord('0') is $30, so we can just use the low nybble of the character

as value.}

Result := Chr((Ord(ch1) and$F) or ((Ord(ch2) and$F) shl4))

end;

var

i: Integer;

begin

if Odd(Length(inStr)) then

Result := NumStringToBCD('0' + instr)

elsebegin

SetLength(Result, Length(inStr) div2);

for i := 1to Length(Result) do

Result[i] := Pack(inStr[2 * i - 1], inStr[2 * i]);

end;

end;

 

procedure TForm1.Button1Click(Sender: TObject);

var

S1, S2: string;

begin

S1 := '15151515151515151515';

S2 := NumStringToBCD(S1);

memo1.lines.add('S1: ' + S1);

memo1.lines.add('Length(S2): ' + IntToStr(Length(S2)));

memo1.lines.add('S2 unpacked again: ' + BCDToNumString(S2));

end;

 

 

 

Взято с сайтаhttps://www.swissdelphicenter.ch/en/tipsindex

Code:

{:Converts Ansi string to Unicode string using specified code page.

@param s Ansi string.

@param codePage Code page to be used in conversion.

@returns Converted wide string.

}

function StringToWideString(const s: AnsiString; codePage: Word): WideString;

var

l: integer;

begin

if s = ''then

Result := ''

else

begin

l := MultiByteToWideChar(codePage, MB_PRECOMPOSED, PChar(@s[1]), - 1, nil, 0);

SetLength(Result, l - 1);

if l > 1then

MultiByteToWideChar(CodePage, MB_PRECOMPOSED, PChar(@s[1]),

- 1, PWideChar(@Result[1]), l - 1);

end;

end; { StringToWideString }

 

 

 

Взято с сайтаhttps://www.swissdelphicenter.ch/en/tipsindex

Code:

const

HKEYNames: array[0..6] ofstring =

('HKEY_CLASSES_ROOT',

'HKEY_CURRENT_USER',

'HKEY_LOCAL_MACHINE',

'HKEY_USERS',

'HKEY_PERFORMANCE_DATA',

'HKEY_CURRENT_CONFIG',

'HKEY_DYN_DATA');

 

function StrToHKEY(const KEY: string): HKEY;

var

i: Byte;

begin

Result := $0;

for i := Low(HKEYNames) to High(HKEYNames) do

begin

if SameText(HKEYNames[i], KEY) then

Result := HKEY_CLASSES_ROOT + i;

end;

end;

 

 

 

 

 

Взято с сайтаhttps://www.swissdelphicenter.ch/en/tipsindex

Code:

{:Converts Unicode string to Ansi string using specified code page.

@param ws Unicode string.

@param codePage Code page to be used in conversion.

@returns Converted ansi string.

}

 

function WideStringToString(const ws: WideString; codePage: Word): AnsiString;

var

l: integer;

begin

if ws = ''then

Result := ''else

begin

l := WideCharToMultiByte(codePage,

WC_COMPOSITECHECK or WC_DISCARDNS or WC_SEPCHARS or WC_DEFAULTCHAR,

@ws[1], - 1, nil, 0, nil, nil);

SetLength(Result, l - 1);

if l > 1then

WideCharToMultiByte(codePage,

WC_COMPOSITECHECK or WC_DISCARDNS or WC_SEPCHARS or WC_DEFAULTCHAR,

@ws[1], - 1, @Result[1], l - 1, nil, nil);

end;

end; { WideStringToString }

 

 

 

 

Взято с сайтаhttps://www.swissdelphicenter.ch/en/tipsindex

Code:

Var S: String;

P: PChar;

 

....

 

P:=PChar(S);

 

 

 

 

Взято изhttps://forum.sources

 


 

Все функции API для работы с текстом используют неудобный тип String, а PChar – быстрее. Преобразовать строку String в PChar очень просто: PChar('It is my string'). Можно использовать то, что PChar – это адрес персого символа строки, заканчивающейся символом #0. И, наконец, еще одно удобство. Delphi воспринимает массив типа Char и как обычную строку, и как строку PChar. Полная совместимость. Эта программа демонстрирует демонстрирует все это.

 

 

Code:

procedure TForm1.Button1Click(Sender: TObject);

var

s: array [0..99] of char;

p: integer;

begin

s := 'Delphi World';

FindWindow(nil, s);

p := pos('lp', s);

Form1.Caption := copy(s, p, Length(s) - p);

end;

 

 

 

https://delphiworld.narod

Code:

function StrToArrays(str, r: string; out Temp: TStrings): Boolean;

var

j: integer;

begin

if temp <> nilthen

begin

temp.Clear;

while str <> ''do

begin

j := Pos(r,str);

if j=0then

j := Length(str) + 1;

temp.Add(Copy(Str,1,j-1));

Delete(Str,1,j+length(r)-1);

end;

Result:=True;

end

else

Result:=False;

end;

 

function ArrayToStr(str: TStrings; r: string): string;

var

i: integer;

begin

Result:='';

if str = nilthen

Exit;

for i := 0to Str.Count-1do

Result := Result + Str.Strings[i] + r;

end;

 

 

 

 

 

Взято с https://delphiworld.narod