Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
2-1263805978
NBAH1990
2010-01-18 12:12
2010.03.21
как найти какой области принадлежит значение?


2-1263562192
fford
2010-01-15 16:29
2010.03.21
вызов функции из потока


1-1243939536
Skyhawk
2009-06-02 14:45
2010.03.21
Верхний регистр


2-1263563053
Pavel
2010-01-15 16:44
2010.03.21
Компонент IdHTTPServer и домашщний каталог


2-1263582604
serhiyiv
2010-01-15 22:10
2010.03.21
TListView и OnCustomDrawItem





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский