Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2004.03.14;
Скачать: [xml.tar.bz2];

Вниз

PWideChar   Найти похожие ветки 

 
LOX   (2004-01-03 16:40) [0]

А как перевести например Edit1.text в PWideChar.
PWideChar(Edit1.text) - неполучается!


 
jack128   (2004-01-03 16:47) [1]

Никогда не догодаешься..
StringToWideChar


 
LOX   (2004-01-04 11:14) [2]

Не хочет работать.
делаю так:
var p:PWideChar;
begin
StringToWideChar(Edit1.text,p,Edit1.setstart);


 
Плохиш_   (2004-01-04 11:49) [3]

Всё прекрасно работает, как в хелпе и описано

procedure TForm1.Button1Click(Sender: TObject);
var
p: PWideChar;
len: Integer;
begin
p := GetMemory(Length(Edit1.text)+1);
StringToWideChar(Edit1.text,p,Length(Edit1.text)+1);
ShowMessage(p);
FreeMem(p);
end;


 
Бином Ньютоныч   (2004-01-04 12:23) [4]

Плохиш_ (04.01.04 11:49) [3]
Плохие советы даешь


 
Jack128   (2004-01-04 14:22) [5]

дельфей под рукой нету, но помоему синтаксис такой
var
w: PWideChar;
begin
w := AllocMem(Length(Edit1.Text) * SizeOf(WideChar));
try
StringToWideChar(Edit1.Text, w, Length(Edit1.Text));
...
finally
FreeMem(w);
end;
end;


 
LOX   (2004-01-04 16:35) [6]

Jack128
Получается пустая строка.


 
Jack128   (2004-01-04 18:27) [7]


> LOX © (04.01.04 16:35) [6]

Не знаю. Может чего с синтаксисом напутал... Сам мозгами по раскинь то. Не стыдно самому то? Это ж даже не иконку в "туда где часики" запихнуть ;-) (надеюсь не обидешся)


 
Игорь Шевченко   (2004-01-04 18:42) [8]

var
NameBuffer : array[0..255] of WideChar;
DriveDevice : String;
UsName : TUNICODE_STRING;
begin
DriveDevice := "\Device\Harddisk"+IntToStr(DriveNo);
RtlInitUnicodeString(UsName,
StringToWideChar(DriveDevice, NameBuffer,
SizeOf(NameBuffer)));
......
end;


 
jack128   (2004-01-04 22:11) [9]

вот пример для динамического распределения памяти
procedure TForm1.Button1Click(Sender: TObject);
var
w: PWideChar;
begin
w := AllocMem((Length(Edit1.Text) + 1) * SizeOf(WideChar));
try
Caption := StringToWideChar(Edit1.Text, w, Length(Edit1.Text) + 1);
finally
FreeMem(w);
end;
end;


> StringToWideChar(DriveDevice, NameBuffer,
> SizeOf(NameBuffer));
ИМХО, правильнее было бы так StringToWideChar(DriveDevice, NameBuffer, SizeOf(NameBuffer) div SizeOf(WideChar));


 
Игорь Шевченко   (2004-01-04 22:29) [10]

jack128 © (04.01.04 22:11)

Согласен, разумеется. У функции MultiByteToWideChar, которая в итоге вызывается, размер буфера именно в WideChar"ах меряется.


 
nikkie   (2004-01-04 22:57) [11]

PWideChar(WideString(s))


 
jack128   (2004-01-04 23:17) [12]


> nikkie © (04.01.04 22:57) [11]

Конструкция рабочая, но я не вполне понимаю, КАК она работает :-)
Не могли бы объяснить, когда освобождает память из под WideString(w)??


 
jack128   (2004-01-04 23:19) [13]


> nikkie © (04.01.04 22:57) [11]

Конструкция рабочая, но я не вполне понимаю, КАК она работает :-)
Не могли бы объяснить, когда освобождает память из под WideString(w)??


 
Игорь Шевченко   (2004-01-05 00:54) [14]

jack128 © (04.01.04 23:19)

> Не могли бы объяснить, когда освобождает память из под WideString(w)??


Когда переменная выходит из области видимости


 
jack128   (2004-01-05 09:17) [15]

какая? w? - всего лишь указатель, с чего бы этот Delphi подчищала за ним память?


 
jack128   (2004-01-05 09:24) [16]


> память из под WideString(w)??
WideString(s) - я, конечно, это имел ввиду.


 
Игорь Шевченко   (2004-01-05 10:00) [17]

jack128 © (05.01.04 09:17)

View|CPU


 
nikkie   (2004-01-05 15:49) [18]

>jack128
для преобразования типа WideString(s) компилятор создает WideString-переменную в стеке. память из под нее освобождается, соответственно, когда происходит выход из соответствующей процедуры/функции


 
jack128   (2004-01-05 23:30) [19]


> nikkie © (05.01.04 15:49) [18]


var
w: PWideChar;

procedure TForm1.FormCreate(Sender: TObject);
var
s: string;
begin
s := StringOfChar("A", 10);
w := PWideChar(WideString(s));
Caption := w;
end; // Память из под WideString(s) уже осводилась? Тогда w - "битый" указатель ??

procedure TForm1.Button1Click(Sender: TObject);
begin
PWideChar(PChar(w) + SizeOf(WideChar))^ := "B"; // Тогда на этой строке должна быть AV, но ошибок нету. Почему?
Caption := w;
end;


 
nikkie   (2004-01-06 00:40) [20]

>Память из под WideString(s) уже осводилась?
да

>Тогда w - "битый" указатель ??
w указатель на некоторую область памяти. совершенно нормальное значение, но вот что там по этому адресу находится - никто поручиться не может.

например, у меня при нажатии на Button1 заголовок меняется на "ABCDEFGH".
procedure TForm1.Button1Click(Sender: TObject);
var
e: WideString;
begin
e := "ABCDEFGH";
Caption := w;
end;


 
jack128   (2004-01-06 01:07) [21]


> w указатель на некоторую область памяти.
Любой указатель (кроме nil"а) указывает на некоторую область памяти ;-)
Под "битым" указателем, я имел в виду, что он указывает на еще не распределенную область памяти (или наоборот уже освобожденную)

Во всяком случае можно сделать вывод, что мой код из поста [19] - некоректный, так как обращается к участку памяти, в котором может быть "мусор". Собственно этоо я и хотел уточнить. Спасибо



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

Форум: "WinAPI";
Текущий архив: 2004.03.14;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.012 c
1-43543
satron
2004-02-27 19:01
2004.03.14
подскажите компонент


4-43964
xoluay
2003-12-28 20:45
2004.03.14
директория


1-43503
YurikGl
2004-02-28 22:14
2004.03.14
Acrobat шрифты


3-43387
ceval
2004-02-14 12:26
2004.03.14
программа с использыванием dbf файлов


4-43957
rimd
2004-01-05 14:37
2004.03.14
CreateThread





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский