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

Вниз

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 вся ветка

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

Наверх




Память: 0.51 MB
Время: 0.018 c
4-43970
DenisWW
2004-01-08 16:37
2004.03.14
Прилипание формы


1-43639
Тимохов
2004-03-02 12:37
2004.03.14
Ищу процедуру из группы Finalize+Initialize


1-43659
TUser
2004-03-03 20:27
2004.03.14
Synchronize


7-43926
KIE
2003-12-22 13:54
2004.03.14
Работа с модемом


1-43519
Vitaly_old
2004-02-28 10:34
2004.03.14
vmesto_russkix_bukv_znaki_voprosov