[Delphi] vaag resultaat bij casten

Pagina: 1
Acties:

  • wasigh
  • Registratie: Januari 2001
  • Niet online

wasigh

wasigh.blogspot.com

Topicstarter
Ik ben met een programma bezig daarvoor heb ik een interface gedefinieerd:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
unit uTTimelineObject;

interface
uses Classes, SysUtils;

type
TTimelineObject = interface
        function play():Integer;
        function getType() : Integer;
        procedure setId(id : Integer);
        function getId() : Integer;

end;
implementation
end.


Daarnaast heb ik een TSlide unit(class?) die deze interface implementeerd:
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
unit uTSlide;

interface
uses SysUtils, Classes, Controls, ExtCtrls, uTTransition, uTTimelineObject, Dialogs;

type
  TSlide = class(TComponent, TTimelineObject)

  private
    FImage: TImage;
    iImageId : Integer;
    FTransition: TTransition;
    FDuration: Integer;
    procedure SetImage(AImage: TImage);
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    function Play() : Integer;
    function getType(): Integer;
    procedure setId(id : Integer);
    function getId() : Integer;
  published
    property Image: TImage read FImage write SetImage;
    property Transition: TTransition read FTransition write FTransition;
    property Duration: Integer read FDuration write FDuration;
  end;


Nu heb ik gemerkt dat ik bij casten vage resultaten krijg. Bij de volgende codesnippet: (TSound implemeert ook de TTimelineObject interface)
code:
1
2
3
4
5
6
7
8
9
10
11
12
slide.setId(5);
    imageList.Add(image);



    timeLineEvent := TTimelineEvent.Create(slide, 100 * i);

    ShowMessage('in PLAYerMain: ' + intToStr(timeLineEvent.getTimelineObject.getId));
    ShowMessage('in PLAYerMain: na cast ' + intToStr(TSlide(timeLineEvent.getTimelineObject).getId));
    ShowMessage('in PLAYerMain: na cast ' + intToStr(TSound(timeLineEvent.getTimelineObject).getId));
    ShowMessage('in PLAYerMain:  after' +           intToStr(timeLineEvent.getTimelineObject.getId));
    timeLine.addTEvent(timeLineEvent);


Ik zet de id op 5.
Ik krijg de volgende waardes terug:
5, 4302728, 4302728, 5

Ik snap er geen bal van, wat mijn inziens zou hij bij de 2e dezelfde methode aan moeten roepen als bij de eerste. Maar op 1 op andere manier krijg ik een andere waarde terug..

Wat doe ik fout?

Verwijderd

Als ik er vanuit kan gaan dat "timeLineEvent.getTimelineObject" een TTimelineObject interface is

dan is het logisch want dat is alleen de interface van de objecten en niet het object zelf.

Het probleem is nu dat je keihard zegt dat de Interface een Object is (TSound / TSlide) dat gaat helaas niet.

  • wasigh
  • Registratie: Januari 2001
  • Niet online

wasigh

wasigh.blogspot.com

Topicstarter
code:
1
2
3
4
5
6
7
8
9
10
11
constructor TTimelineEvent.Create(timelineObject: TTimelineObject; startTime: Integer);
begin
   //Inherited Create(timelineObject);
   self.startTime := startTime;
   Self.timelineObject := timelineObject;
end;

function TTimelineEvent.getTimelineObject: TTimelineObject;
begin
  Result := timelineObject;
end;


Volgens mij geeft hij een Object terug. namelijk datgene wat ik erin stop.
Hij geeft geen compiler errors, alleen krijg ik @runtime foute waarden terug.

Hoe moet ik dat dan doen?

(in java zou het op deze manier werken, daarom ben ik er vanuit gegaan dat hij nu ook zou werken..)

[ Voor 9% gewijzigd door wasigh op 20-12-2002 14:43 ]


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 22:41

Creepy

Tactical Espionage Splatterer

Wil je je interface gebruiken als abstracte klasse??? Dan kan je ook van je interface een klasse maken en elke function en procedure abstract maken.

code:
1
2
3
4
5
6
type
TTimelineObject = class
        function play:Integer; virtual; abstract;
        function getType : Integer; virtual; abstract;
        procedure setId(id : Integer); virtual; abstract;
        function getId() : Integer; virtuall abstract;

Hoef je ook niet meer van een interface EN een class te overerven, maar alleen van de class zelf. Casten naar deze class is geen probleem.

Misschien dat het ook werkt als je je functions en procedures in je interface virtual maakt (standaard zijn de dat namelijkt NIET!)

[ Voor 18% gewijzigd door Creepy op 20-12-2002 14:55 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Je de namen van interfaces beginnen over het algemeen met een I en niet met een T.

Wat Scoutboy is waar. Je kan je T nooit uit je I terughalen (op een paar vieze trukjes na). Typcasten kan altijd. De compiler zeurt er niet over, maar dat betekend niet dat het ook echt correct is. In dit geval is het gewoon niet correct.

Alleen je I dus gebruiken als je die terugkrijgt en niet typecasten naar een T. Uberhaupt geen I's op die manierr typecasten en liever ook geen T's. Gebruik as of QueryInterface. Als je dan (timeLineEvent.getTimelineObject as TSlide).getId gebruikt zal je ook vriendelijk verteld worden dat dit echt niet gaat. Wat dus ook klopt.

Maar misschien is Creepy's oplossing gewoon genoeg voor jouw. Geen moeilijke dingen met interfaces enzo. Vergeet niet dat Delphi geen Garbage Collection heeft en objecten die je dus zelf maakt met Create moet je dus ook zelf vrijgeven. Als je je object in een interface stopt maak je wel weer gebruik van Garbage Collection binnen Delphi. Als ik jouw was zou ik proberen te voorkomen dat je met Ttjes en Itjes doorelkaar werkt. Dus ok alleen met Ttjes werken of zolveel als mogelijk met Itjes.

We adore chaos because we like to restore order - M.C. Escher


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Over dat casten wil ik nog even wat zeggen.
Delphi:
1
TTable(Form1).FieldByName('Test').AsString := '56';

vind de compiler best, maar ik kan je verzekeren dat het vreselijk mis gaat tijdens het draaien :) Een cast die de compiler goedkeurt is geen verzekering dat het kan en mag...

We adore chaos because we like to restore order - M.C. Escher

Pagina: 1