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

Вниз

указатель на пременную 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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.011 c
1-1242287326
SPeller
2009-05-14 11:48
2010.03.21
А можно ли в дельфи импортировать функции, написанные на C++?


15-1262280863
Kerk
2009-12-31 20:34
2010.03.21
А где можно сделать онлайн плейлист и слушать?


15-1262338995
dr_creigan
2010-01-01 12:43
2010.03.21
Ядра процессоров


2-1263479756
0990
2010-01-14 17:35
2010.03.21
Модальные формы


6-1214573401
Галинка
2008-06-27 17:30
2010.03.21
как передать строку в сокет?