Форум: "Основная";
Текущий архив: 2004.02.06;
Скачать: [xml.tar.bz2];
ВнизПроблема с 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;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.034 c