Форум: "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