Главная страница
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.014 c
2-1263500664
Inna21
2010-01-14 23:24
2010.03.21
Запрос на нескольких DBF


15-1262035823
Юрий
2009-12-29 00:30
2010.03.21
С днем рождения ! 29 декабря 2009 вторник


2-1263543792
tonich
2010-01-15 11:23
2010.03.21
USB


2-1263378348
legion25
2010-01-13 13:25
2010.03.21
Вычисление суммы ряда с точностью ε


2-1263924681
Б
2010-01-19 21:11
2010.03.21
Сколько различных символов содержит строка.