Главная страница
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.009 c
4-1198661890
MultIfleX
2007-12-26 12:38
2010.03.21
События в ноуте


2-1263609315
Делфиец
2010-01-16 05:35
2010.03.21
Есть ли метод оперделения какой контрол в фокусе


15-1262156174
12
2009-12-30 09:56
2010.03.21
Можно ли как-то управлять кэшем mssql server?


2-1263407163
Sunktor
2010-01-13 21:26
2010.03.21
Как установить компонент с расширением pas в CodeGear Delphi 2009


1-1244548514
Валигози
2009-06-09 15:55
2010.03.21
Как прикрутить к своему приложению "7z.dll"?