Форум: "Начинающим";
Текущий архив: 2010.03.21;
Скачать: [xml.tar.bz2];
Внизуказатель на пременную THighlihter Найти похожие ветки
← →
HRustBB (2010-01-16 23:58) [0]Имеется переменная типа THighlihter
type
THighlihter = record
Bg:TColor;
Fg:TColor;
Style:TFontStyles;
при попытке поместить указатель на переменную в поле объекта формы(фрейма):
Form8.PHPCommentAttr1.data:=pointer(setting.phpCommentAttr);
возникает ошибка invalid typecast
вот класс формы:
type
TPHPCommentAttr = class(TFrame)
Edit1: TEdit;
Edit2: TEdit;
Button1: TButton;
Button2: TButton;
GroupBox1: TGroupBox;
CheckBox1: TCheckBox;
CheckBox2: TCheckBox;
CheckBox3: TCheckBox;
CheckBox4: TCheckBox;
ColorDialog1: TColorDialog;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure MyRepaint(optionName:THighlihter);
private
{ Private declarations }
public
{ Public declarations }
data: Pointer;
end;
как сделать чтоб ошибки не было?
← →
Джо © (2010-01-17 00:04) [1]Откуда же мы знаем, какой тип имеет ваше Form8.PHPCommentAttr1.data?
> как сделать чтоб ошибки не было?
Очевидно, присваивать значение нужного типа. Или тайпкастить к нему (при совместимости).
← →
Джо © (2010-01-17 00:08) [2]Если Data имеет тип Pointer, то тогда так:
Form8.PHPCommentAttr1.data := @some_record
← →
HRustBB (2010-01-17 00:15) [3]ладно, теперь нужно получить значение переменной по этому указателю. Пишу так:
procedure TPHPCommentAttr.Button2Click(Sender: TObject);
var f: THighlihter;
begin
f:=THighlihter(data);
end;
и опять invalid typecast
также необходимо присвоить (изменить) значение переменной по этому указателю.
← →
HRustBB (2010-01-17 00:43) [4]в делфи вобще возможно работать с указателями на record
← →
Anatoly Podgoretsky © (2010-01-17 00:47) [5]> HRustBB (17.01.2010 00:43:04) [4]
Вообще на что угодно.
← →
HRustBB (2010-01-17 00:49) [6]а моя проблемма решаема?
← →
Джо © (2010-01-17 00:52) [7]Используйте типизированный указатель.
type
PHighlihter = ^THighlihter;
← →
Anatoly Podgoretsky © (2010-01-17 00:56) [8]Решаема, типизированый указатель, а преобразовать многобайтный record в указатель невозможно, у них же размер разный.
← →
Германн © (2010-01-17 01:10) [9]
> Джо © (17.01.10 00:52) [7]
>
> Используйте типизированный указатель.
>
> type
> PHighlihter = ^THighlihter;
>
Старый добрый TurboPascal.
Примеры написанные для него до сих пор часто используют троешники, "нарывшие код в интернете". Но используют не понимая сути.
← →
Джо © (2010-01-17 03:44) [10]Примерно так это будет выглядеть:
type
THighlihter = record
Bg: TColor;
Fg: TColor;
Style: TFontStyles;
end;
PHighlihter = ^THighlihter;
...
var
P: PHighlihter;
...
//Выделяем память для хранения записи
GetMem (P, SizeOf(THighlihter));
// Заполняем поля:
P^.Bg := clRed;
...
// Сохраняем ссылку:
BlaBla.Data := P;
Взад значение получаем так:PHighlihter(Data)^.Bg
Но! Необходимо предусмотреть механизм освобождения памяти, занятой под запись, то есть, не забыть сделать FreeMem (BlaBla.Data), когда эти данные уже не нужны.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2010.03.21;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.004 c