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

Вниз

Работает в рантайме, но не хочет в дизайнтайме   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.046 c
15-1139205330
Ega23
2006-02-06 08:55
2006.02.26
С Днём рождения! 6 февраля


2-1139661270
Хинт
2006-02-11 15:34
2006.02.26
Выравнивание в TLabel


2-1139833368
Делфёст
2006-02-13 15:22
2006.02.26
Шифровка поля


15-1139292051
Ega23
2006-02-07 09:00
2006.02.26
С Днём рождения! 7 февраля


6-1131535027
Святослав
2005-11-09 14:17
2006.02.26
Нахождение в сети Интернет "Родственных" приложений !!!