Форум: "Компоненты";
Текущий архив: 2006.02.26;
Скачать: [xml.tar.bz2];
Вниз
Работает в рантайме, но не хочет в дизайнтайме Найти похожие ветки
← →
TStas © (2005-09-03 20:18) [0]Писал компонент, потомок TGraphicControl"а. В runTime все отлично работает, тестовая программа все свойства и т. д. изменяет и все нормально. Там он создается в OnCreate формы. Стал устанавливать. Установился, при компиляции пакета глюков нет. Кладу на форму - ошибка по адресу 000000000.
Даже мыслей нет, ну что это может быть. :(
← →
Турист (2005-09-03 20:59) [1]>Даже мыслей нет, ну что это может быть. :(
procedure TForm1.Button1Click(Sender: TObject);
var
P: procedure;
begin
@P := nil;
P
end;
← →
Наиль © (2005-09-03 22:27) [2]Поясню высказывание Туриста.
"Ошибка по адресу 000000000" происходит тогда, когда твой компонент пытается вызвать не инициализированое событие. Другими словами твоему событию присвоеное значение nil, а не какая-нибудь процедура.
Достаточно посмотреть на твой списокproperty OnXXX
и тебе самому должно стать понятно кто из них виноват.
Как правило, ошибки в дизайнтайме возникаю при задании Парента.
Вот тебе два ориентира, и не забудь рассказать как исправил ошибку.
← →
Юрий Зотов © (2005-09-04 03:29) [3]> TStas © (03.09.05 20:18)
> Даже мыслей нет, ну что это может быть.
Аналогично. А чтобы появились хотя бы предположения, нужно для начала посмотреть на объявление класса компонента.
← →
TStas © (2005-09-04 20:20) [4]Вот объявление класса без реализации, события могут быть назначены, но не назначались пока
type TShadowOffset = 1..10;
type
TStRunningString = class(TGraphicControl)
private
{ Private declarations }
FX:Integer; //Текущее положение
Fdx:Integer; //Сдвиг
FBmp:TBitMap; //Битмап, на котором все и нарисовано
FText:String; //Сам текст
FTextWidth:Integer; //Ширина текста
FDirection:Boolean; //Направление, куда бежит
FColor:TColor; //Цвет фона
FTimer:TTimer; //Таймер, который тикает
FSpeed:Byte; //Скорость px/s
FFont:Tfont;
FOnBeforeTextChange:TOnBeforeTextChange;
FOnTextChange:TNotifyEvent;
FOnRun, FOnStop:TNotifyEvent;
FShadowOffset:TShadowOffset;
FDropShadow: Boolean;
FShadowColor:TColor;
FControlByClick:Boolean;
FPopupMenu: TPopupMenu;
FHasPopupMenu: Boolean;
procedure SetBmp;
procedure SetColor(Value:Tcolor);
procedure Move(Sender:TObject);
procedure SetText(const Value: String);
procedure SetSpeed(Value: Byte);
function GetIsRunning: Boolean;
procedure setIsRunning(const Value: Boolean);
procedure SetDirection(const Value: Boolean);
procedure SetFont(const Value: TFont);
procedure SetDropShadow(const Value: Boolean);
procedure SetShadowColor(const Value: TColor);
procedure SetShadowOffset(const Value: TShadowOffset);
procedure SetLongText(const Value: TStrings);
procedure SetControlByClick(const Value: Boolean);
procedure CreateMenu;
procedure CopyText(Sender:TObject);
procedure GoBack(Sender:TObject);
procedure SetHasPopupMenu(const Value: Boolean);
procedure SetFileOfText(const Value: TFileName);
protected
{ Protected declarations }
procedure Resize; Override;
procedure Click; Override;
public
{ Public declarations }
constructor Create(AOwner:TComponent); Override;
destructor destroy; Override;
procedure LoadTextFromFile(const Path:String);
published
{ Published declarations }
property Text:String read FText write SetText;
property Speed:Byte read FSpeed write SetSpeed default 30;
property IsRunning:Boolean read GetIsRunning write SetIsRunning default true;
property RunToLeft:Boolean read FDirection write SetDirection default true;
property Color:TColor read FColor write SetColor default clBtnFace;
property Font:TFont read FFont write SetFont;
property DropShadow:Boolean read FDropShadow write SetDropShadow;
property ShadowOffset:TShadowOffset read FShadowOffset write SetShadowOffset default 2;
property ShadowColor:TColor read FShadowColor write SetShadowColor default clGray;
property LongText:TStrings write SetLongText;
property ControlByClick:Boolean read FControlByClick write SetControlByClick default false;
property HasPopupMenu:Boolean read FHasPopupMenu write SetHasPopupMenu;
property Align;
{Публикуемые события}
{унаследованные}
property OnClick;
property OnDblClick;
property OnMouseDown;
property OnMouseMove;
property OnMouseUp;
{Свои}
property OnBeforeTextChange:TOnBeforeTextChange read FOnBeforeTextChange write FOnBeforeTextChange;
property OnTextChange:TNotifyEvent read FOnTextChange write FOnTextChange;
property OnRun:TNotifyEvent read FOnRun write FOnRun;
property OnStop:TNotifyEvent read FOnStop write FOnStop;
property FileOfText:TFileName write SetFileOfText;
end;
А вот конструктор
constructor TStRunningString.Create(AOwner: TComponent);
begin
inherited;
FBmp:=TBitmap.Create;
FFont:=TFont.Create;
FBmp.Canvas.Font:=FFont;
Ftext:="Running String";
FDirection:=true;
FColor:=clBtnFace;
FShadowOffset:=2; //Сдвиг тени по умолчанию
FShadowColor:=ClGray; //Цвет тени по умолчанию
ControlByClick:=false; //Задание по умолчанию
Ftimer:=TTimer.Create(self);
Ftimer.Enabled:=false; //Останавливаю пока таймер, чтобы не гюканул
Width:=100;
SetBmp; //Устанавливаю все параметры текста
Ftimer.Interval:=100;
Speed:=30;
FTimer.OnTimer:=Move;
FTimer.Enabled:=true; //И запускаю его
end;
Принцип работы: В SetBmp содается битмап, на который нужным образом выведен нужный текст. По тиканью таймера копируется нужный кусок канвы внутренныего битмапа. Получается, что она бежит попиксельно
← →
TStas © (2005-09-04 20:25) [5]>Наиль
С радостью расскажу, если исправлю. А с parent"ом странно. Я его нигде не указывал. Но когда писал Первую бегущую строчку, только дочку метки, там ведь тоже не указывался parent, а не одного глюка не было
← →
Турист (2005-09-04 21:26) [6]>TStas ©
Ошибка здесь
property LongText:TStrings write SetLongText;
- не определен "метод" чтения published свойства
← →
TStas © (2005-09-04 21:37) [7]>Турист
Вот спасибо. Надо вообще это свойство выкинуть
← →
TStas © (2005-09-04 22:18) [8]>Турист
Спасибо огромное. Вот что значит специалист настоящий. :)
А как сделать, чтобы на ней, как на любом компонете, писалось ее гордое имя? Ведь в конструкторе его не получишь, там имени еще нет. Может, плохо Фаронова читаю? Надо SetName перекрывать,наверно?
← →
Турист (2005-09-05 21:29) [9]>TStas © (04.09.05 22:18) [8]
Добавить в конструкторе ControlStyle := ControlStyle + [csSetCaption] ?
← →
TStas © (2005-09-06 19:28) [10]>Турист
Даже этого делать не пришлось. Замечательно перекрылось СетНайм и бежит с новым именем в Дизайн тайме, что и требовалось.
← →
Турист (2005-09-06 22:43) [11]
procedure TControl.SetName(const Value: TComponentName);
var
ChangeText: Boolean;
begin
ChangeText := (csSetCaption in ControlStyle) and
not (csLoading in ComponentState) and (Name = Text) and
((Owner = nil) or not (Owner is TControl) or
not (csLoading in TControl(Owner).ComponentState));
inherited SetName(Value);
if ChangeText then Text := Value;
end;
← →
jack128 © (2005-09-07 00:55) [12]TStas © (04.09.05 20:20) [4]
property Color:TColor read FColor write SetColor default clBtnFace;
property Font:TFont read FFont write SetFont;
property Text:String read FText write SetText;
Все эти свойства тоже выкинуть, вместо них использовать наследуемые от TControl свойства..
← →
TStas © (2005-09-07 19:09) [13]>jack128
Спасибо. Не совсем выкинуть, а опубликовать просто
Страницы: 1 вся ветка
Форум: "Компоненты";
Текущий архив: 2006.02.26;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.045 c