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

Вниз

Проблема с record в property   Найти похожие ветки 

 
Sash1   (2004-01-27 10:52) [0]

Уважаемые мастера помогите найти грабли.
Ситуация такая:
Есть свой компонент. Ему надо создать property такого вида:
mycomponent.button[i].Caption
Glyth

Я пробоваля сделать это так:

type
TButtonProp= record
Caption: TCaption;
Glyph : TBitmap;
end;
TButtonProp1= TButtonProp;

TButtonPanel = class(TPanel)
private
procedure SetButtonProp(Index: Shortint;AButton: TButtonProp1);
function GetButtonProp(Index: Shortint): TButtonProp1;
public
property Button[Index: Shortint]: TButtonProp1 read GetButtonProp write SetButtonProp;
end;

function TButtonPanel.GetButtonProp(Index: Shortint): TButtonProp1;
var mbtn: TSpeedButton;
begin
mbtn:=ButtonList.Items[Index];
Result.Caption:=mbtn.Caption;
Result.Glyph:=mbtn.Glyph;
end;

procedure TButtonPanel.SetButtonProp(Index: Shortint; AButton: TButtonProp1);
var mbtn: TSpeedButton;
begin
mbtn:=ButtonList.Items[Index];
mbtn.Caption:=AButton.Caption;
mbtn.Glyph:=AButton.Glyph;
end;

Читается свойство отлично, все как и задумано.
Form1.Сaption:=ButtonPanel1.Button[0].Caption
А вот изменить значение не получается.
ButtonPanel1.Button[0].Caption:="aaaa";
Компилятор пишет ошибку: Left side cannot be assigned to

Но если я делаю так:
var mbp: TButtonProp1

mbp.caption:="aaaa";
ButtonPanel1.Button[0]:=mbp;
То все прозодит нормально, но так не удобно.

Как все-таки заставить напрямую менять значения ?

Как я понял что-то не так с процедурой SetButtonProp
Но как ее можно еще описать или как сделать по другому я не нашел :(


 
Тимохов ©   (2004-01-27 10:55) [1]


> Компилятор пишет ошибку: Left side cannot be assigned to

Смирись...


 
Skier ©   (2004-01-27 11:01) [2]

Я тоже на это нарывался...Солидарен с [1] :)


 
icWasya ©   (2004-01-27 11:07) [3]

перепиши так

TButtonPanel = class(TPanel)
private
procedure SetButtonCaption(Index: Shortint;const ACaption: String);
procedure SetButtonGlyph(Index: Shortint;const AGlyph : TBitmap);
function GetButtonProp(Index: Shortint): TButtonProp1;
public
property Button[Index: Shortint]: TButtonProp1 read GetButtonProp;
property ButtonCaption[Index: Shortint]: String Write SetButtonCaption;
property ButtonGlyph[Index: Shortint]: TBitmap Write SetButtonCaption;

end;


 
Тимохов ©   (2004-01-27 11:22) [4]

Можешь еще функцию сделать типа как RECT:

function BUTTON_PROP(Caption: TCaption; Glyph : TBitmap): TButtonProp;
begin
result.caption := caption;
result.glyph := glyph;
end;


 
Sash1   (2004-01-27 11:29) [5]

Но как оно тогда реализовано в Самой Дельфе ?
DBGrid1.Columns.Items[i].font
например ?


 
Тимохов ©   (2004-01-27 11:30) [6]

То класс...


 
Sash1   (2004-01-27 11:42) [7]

Я пробовал тоже описать класс, но у меня что-то не вышло,
при выполнении вылетаю с ошибкой.

Как я понял мне надо где-то этот класс инициализировать, а вот где и как я не понял.

Если не трудно дайте небольшой пример.


 
Тимохов ©   (2004-01-27 11:42) [8]

Ошибка вылета нужна...


 
Тимохов ©   (2004-01-27 11:54) [9]

Что за ошибка то у тебя вылетает?


 
Sash1   (2004-01-27 12:56) [10]

Ошибка вылетает такая:
Project xxxx raised exception class EAccesViolation with message "zzzzzz".
Process stopped.

А сделатьь пытаюсь я так.

TButtonProp1= class
private
FCaption: TCaption;
FGlyph : TBitmap;
public
property Caption: TCaption read FCaption write FCaption;
property Glyth: TBitmap read FGlyph write FGlyph;
end;

Дальше все как и было.

Что-то делаю не так, но не поцйму что, по идее я должен где-то инициализировать свой класс, а может и нет


 
Плохиш_   (2004-01-27 13:09) [11]

А создавать это:

FCaption: TCaption;
FGlyph : TBitmap;

за тебя Пушкин должен


 
Sash1   (2004-01-27 13:14) [12]

В смысле ?
Это стандарнтые типы, их вроде создавать не надо


 
Плохиш_   (2004-01-27 13:24) [13]


> Sash1 (27.01.04 13:14) [12]
> В смысле ?
> Это стандарнтые типы, их вроде создавать не надо

Книжка "Делфи для чайников"


 
Тимохов ©   (2004-01-27 13:34) [14]


> FCaption: TCaption;
> FGlyph : TBitmap;

Инициализировать надо. Это классы. Create для них как минимум вызвать надо.


 
Sash1   (2004-01-27 13:39) [15]

И где его вызывать надо ?
Даже если я заменяю TCaption на String и убираю FGlyph ситуация не меняется.


 
Sash1   (2004-01-27 15:13) [16]

Кстати, если tcaption это класс, тогда как понять это ????
Controls
TCaption = type string;


 
Тимохов ©   (2004-01-27 15:17) [17]

TBitmap - точно класс.
TCaption я перепутал с TControl (зрение не в дугу).
Значит TCaption просто строка.

Во-превых, надо TBitmap инициализировать.
Во-вторых, сам элемент, класс TButtonProp (я так понимаю ты его теперь классом сделал) также надо иницилизировать.


 
Sash1   (2004-01-27 15:39) [18]

Дык вот меня и интересует где и как мне его проинициализировать
Чтобы я мог обращаться напрямую к свойствам класса
т.е. вот так: ButtonPanel1.Button[i].Caption:="aaa";
а не так:

var asd : TButtonProp1;

asd:=TButtonProp1.create;
asd.caption:="aaa";
ButtonPanel1.Button[i]:=asd;


 
Sash1   (2004-01-27 15:52) [19]

Уточню: инициалищировать мой класс а не Tbitmap


 
Skier ©   (2004-01-27 15:56) [20]


> Кстати, если tcaption это класс, тогда как понять это ????

TCaption это не класс, а строковый тип .
Объявлен как тип только лишь для нужд Инстпектора Объектов.


 
Тимохов ©   (2004-01-27 16:03) [21]

Сюшай сюды.
Если где ошибусь (синтаксически) сам поправишь.

type
TButtonProp = class
public constructor Create();
public destructor Destroy(); override;
public BM: TBitmap;
public procedure Assign(const aSource: TButtonProp);
end;

TMyClass = class
public constructor Create();
public destructor Destroy(); override;
private fButtons: TList;
private function fGetButton(const aI: Integer): TButtonProp;
private procedure fSetButton(const aI: Integer; const aValue: TButtonProp);
public property Buttons[const aI: Integer]: TButtonProp read fGetButton write fSetButton;
public function Count(): Integer;
public procedure AddButton(const aValue: TButtonProp);
end;

constructor TButtonProp.Create();
begin
inherited;
BM := TBitmap.Create();
end;

destructor TButtonProp.Destroy();
begin
BM.Free();
inherited;
end;

procedure TButtonProp.Assign(const aSource: TButtonProp);
begin
BM.Assign(aSource.BM);
end;

constructor TMyClass.Create();
begin
inherited;
fButtons := TList.Create();
end;

destructor TMyClass.Destroy();
var
kI: Integer;
begin
if fButtons <> nil
then for kI := 0 to fButtons.Count-1 do TButtonProp(fButtons[kI]).Free();
fButtons.Free();
inherited;
end;

function TMyClass.fGetButton(const aI: Integer): TButtonProp;
begin
Assert((aI >= 0) and (aI <= fButtons.Count-1));
Result := TButtonProp(fButtons[aI]);
end;

procedure TMyClass.fSetButton(const aI: Integer; const aValue: TButtonProp);
begin
Assert((aI >= 0) and (aI <= fButtons.Count-1));
Assert((aI >= 0) and (aI <= fButtons.Count-1));
TButtonProp(fButtons[aI]).Assign(aValue);
end;

function TMyClass.Count: Integer;
begin
Result := fButtons.Count;
end;

procedure TMyClass.AddButton(const aValue: TButtonProp);
var
kBP: TButtonProp;
begin
kBP := TButtonProp.Create();
try
kBP.Assign(aValue);
fButtons.Add(kBP);
except
kBP.Free();
raise
end;
end;


 
Sandman25 ©   (2004-01-27 16:03) [22]

[20] Skier © (27.01.04 15:56)

Я бы сказал, он объявлен как уникальный тип. Даже без Инспектора он остался бы типом.


 
Skier ©   (2004-01-27 16:11) [23]

>Sandman25 © (27.01.04 16:03) [22]
Так я же написал
> строковый тип

Что ещё нужно ?


 
Sandman25 ©   (2004-01-27 16:24) [24]

[23] Skier © (27.01.04 16:11)

Нужно "Объявлен как тип только лишь для нужд Инстпектора Объектов"
заменить на "Объявлен со словом type после знака "=" только лишь для нужд Инстпектора Объектов". Чтобы избежать двусмысленности.
type T1 = type string;
type T2 = string;
Иначе из Вашего раннего поста следует, что T1 является типом, а T2 - нет.
Без обид.


 
Th   (2004-01-27 16:56) [25]

C точки зрения ООп все предложенные методы не совсем красивы. я бы сделал так:

TBitmapProp = class (TBitmap)
private
FCaption: TCaption;

procedure SetCaption(v: TCaption);
published
property Caption: TCaption read FCaption write SetCaption
end;

а потом в TButtonPanel объявить свойство Button: TButtonProp


 
Тимохов ©   (2004-01-27 17:00) [26]

TButtonPanel - это что?


 
Sash1   (2004-01-27 17:07) [27]

Спасибо огромное, теперь полностью разобрался :)


 
Sash1   (2004-01-27 17:07) [28]

TButtonPanel - Это наследник TPanel


 
Th   (2004-01-27 17:10) [29]

2 Тимохов:
посмотрите внимательнее, код из первого поста в топике.


 
Тимохов ©   (2004-01-27 17:11) [30]


> 2 Тимохов:
> посмотрите внимательнее, код из первого поста в топике.

А-а-а. Точно. :(( забыл уже



Страницы: 1 вся ветка

Текущий архив: 2004.02.06;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.02 c
7-16773
ps
2003-11-14 16:42
2004.02.06
Вопрос по девайсам установленным в системе


4-16817
d_oleg
2003-11-28 12:23
2004.02.06
Get Application Title


8-16526
Chlavik
2003-09-30 19:50
2004.02.06
Чёрное:=CoolFunc(Белое); // у кого есть алгоритм?


3-16184
Sam Stone
2004-01-13 17:46
2004.02.06
DBNavigator


1-16478
Sphinx
2004-01-26 12:04
2004.02.06
Ресурсы в dll