Toon posts:

[Delphi] Component & Icon

Pagina: 1
Acties:
  • 191 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Ik ben begonnen met het maken van een component in Delphi, namelijk eentje om 'msn-stijl' popups te laten zien net boven de tray, maar ik stuit op een probleem bij het maken van dit component.

Ik zal maar even de meeste simpele voorbeeldcode geven waarbij het al fout gaat. Ik draai dit in Delphi 6 op Windows XP.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
unit MSNPopUp;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics;

type
  TMSNPopUp = class(TComponent)
  private
    { Private declarations }
    FIcon: TIcon;
  protected
    { Protected declarations }
  public
    { Public declarations }
  published
    { Published declarations }
    property Icon: TIcon read FIcon write FIcon;
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('Custom', [TMSNPopUp]);
end;

end.

Bij het installeren van deze .pas file als component, komt deze keurig op de 'Custom'-page te staan. Ik kan hem ook op een form zetten, maar bij het instellen van de Icon-property gaat het flink fout. Dan komen er schermpjes met fouten zoals 'Access violation at address... Read of address'.

Terwijl, wanneer ik naar source kijk van andere componenten, die wel werken, niet echt veel verschil zie, behalve dan dat er soms een procedure wordt gebruikt voor het instellen van het Icon, mbv FIcon.Assign(Value) bijvoorbeeld, maar dat gaf hier hetzelfde resultaat.

Iemand een idee, of ervaring met het maken van zoiets ?

Verwijderd

Ik heb zelf wel eens dat probleem gehad met een bijna leeg component. Stond alleen een published integer in (op zich niet nuttig, maar was debug werk).
Enige mogelijkheid om de boel bij mij te laten werken was: component deïnstalleren en library rebuilden, en daarna het component weer te installeren.

Delphi gaat toch niet helemaal lekker om met custom components :(

Verwijderd

maar bij het instellen van de Icon-property gaat het flink fout
Hoe stel je die in dan? Als je dit component gaat gebruiken is er nog geen TIcon object aanwezig, die moet je eerst maken. Of je moet 'm maken in de create van het component.

Als je de bovenstaande code gebruikt zul je altijd eerst een TIcon object moeten maken voordat je de property gaat aanspreken:
code:
1
myobject.Icon:=TIcon.create;

AV's (Access Violations) komen in 99% van de gevallen omdat je een 'object aanspreekt' wat nog niet gecreate is.

Verwijderd

Topicstarter
Op zaterdag 01 december 2001 23:30 schreef hezik het volgende:

[..]

Hoe stel je die in dan? Als je dit component gaat gebruiken is er nog geen TIcon object aanwezig, die moet je eerst maken. Of je moet 'm maken in de create van het component.

Als je de bovenstaande code gebruikt zul je altijd eerst een TIcon object moeten maken voordat je de property gaat aanspreken:
code:
1
myobject.Icon:=TIcon.create;

AV's (Access Violations) komen in 99% van de gevallen omdat je een 'object aanspreekt' wat nog niet gecreate is.
Bedankt! Stom dat ik hier niet aan gedacht had, maar dit was ook de eerste keer dat ik wat met componenten probeerde. Voor degenen die het ooit nog willen weten, het moet dus zo:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
unit MSNPopUp;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics;

type
  TMSNPopUp = class(TComponent)
  private
    { Private declarations }
    FIcon: TIcon;

    procedure SetIcon(Value: TIcon);
  protected
    { Protected declarations }
  public
    { Public declarations }
  published
    { Published declarations }
    property Icon: TIcon read FIcon write SetIcon;

    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('Custom', [TMSNPopUp]);
end;

constructor TMSNPopUp.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FIcon := TIcon.Create;
end;

destructor TMSNPopUp.Destroy;
begin
  FIcon.Free;
  inherited Destroy;
end;

procedure TMSNPopUp.SetIcon(Value: TIcon);
begin
  FIcon.Assign(Value)
end;

end.