Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-16326
denisWW
2004-01-25 10:47
2004.02.06
Как получить список обьетов принадлежащих известному обьекту?


1-16453
pegas
2004-01-28 05:56
2004.02.06
форма в dll


8-16521
sergn
2003-10-02 21:25
2004.02.06
Зеркальный вывод текста


3-16125
Witcher
2004-01-15 16:03
2004.02.06
Как сконвертировать базу данных DBF в MDB (Access)?


1-16327
Вован_
2004-01-25 10:37
2004.02.06
Как отловить время простоя пользователя?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский