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
- Подробности
- Родительская категория: Работа со строками
- Категория: Преобразования строк из и в другие типы
Страница 2 из 3