Results 1 to 8 of 8

Thread: Event toevoegenaan class

  1. #1

    Event toevoegenaan class

    Hi allemaal,

    ik heb een class:
    Code:
    type
      TParticle = class
      Color: TColor;
      Size: Double;
      Visible: boolean;
      Xpos: Integer;
      Ypos: Integer;
      Speed: Integer;
      Rectangle: TRect;
      procedure Draw;
      procedure Wander(Direction:Integer);
     end;
    Deze gebruik ik in een lus om een aantal rectangles op het canvas te tekenen en deze interacteren met elkaar. Maar ik zou graag een OnMouseOver willen toevoegen aan de TRect zodat ik bepaalde eigenschappen kan laten zien als de muis op een bepaalde rectangle staat. Onduidelijk hoe ik dat doe.

    Kan iemand mij op weg helpen?

    Alvast hartelijk bedankt.

    [edit]
    Of moet ik eerst een subclass maken van TRect en daar de event aan hangen en deze aanroepen in de TParticle class?


    ps ben nieuw hier... eerste post.
    Last edited by Bodevinaat; 15-Sep-22 at 13:00. Reason: nader inzicht...

  2. #2
    Senior Member Wok's Avatar
    Join Date
    Dec 2002
    Location
    Alkmaar
    Posts
    2,085
    Welkom ...

    In welke Delphi werk jij op dit moment?

    hier vind je de nodige info Creating_Components

    gr. Peter
    10.4.2, Delphi2010, of Lazarus 2.2.0

  3. #3
    Je kan deze class zo schrijven:
    Delphi Code:
    1. TDirection = (dirUp, dirDown, dirLeft, dirRight);
    2.  
    3. TParticle = class
    4. private
    5.     FColor      : TColor;
    6.     FSize       : Double;
    7.     FVisible    : boolean;
    8.     FXpos       : Integer;
    9.     FYpos       : Integer;
    10.     FSpeed      : Integer;
    11.     FRectangle  : TRect;
    12. public
    13.     constructor Create; virtual;
    14.  
    15.     procedure Draw;
    16.     procedure Wander(const Direction: TDirection);
    17.  
    18.     function MouseInParticle(const MouseX: Integer; const MouseY: Integer) : Boolean;
    19. published
    20.     property Color: TColor read FColor write FColor;
    21.     property Size: Double read FSize write FSize;
    22.     property Visible: Boolean read FVisible write FVisible;
    23.     property XPos: Integer read FXPos write FXPos;
    24.     property YPos: Integer read FYPos write FYPos;
    25.     property Speed: Integer read FSpeed write FSpeed;
    26.     property Rectangle: TRect read FRectangle write FRectangle;
    27. end;
    28.  
    29. function TParticle.MouseInParticle(const MouseX: Integer; const MouseY: Integer) : Boolean;
    30. begin
    31.     Result := PtInRect(Rectangle, Point(MouseX, MouseY));
    32. end;

    Je kan dan gewoon je particle aanspreken en daarop een MouseInParticle aanroepen met de huidige muis positie. Verder zie ik te weinig code om je echt te kunnen verder helpen, zonder te weten wat je exact wilt bereiken. Als je echt een event wilt, dan moet je een component maken waar je een muis interactie op kan hebben..

  4. #4
    Community edition 10.4

  5. #5
    Hey! Dat is een cursus in het klein . Ik zie dat je van de properties getters/setters gemaakt hebt? Is dat nodig? Ik verander in runtime gewoon de value in de property. Hoe roep ik ze dan aan in jouw code?

    De code is ruwweg:

    Ik maak in een lus 200 TParticles aan met een vaste waarde op sommige properties en een random waarde in andere (X,Y)
    Dan vraag ik aan de nieuwe particle om zichzelf te tekenen (Draw) en ik plaats de Tparticle in een array type TParticle.

    Met een timer loop ik opnieuw door de array en kijk hoe de waarden zich verhouden en of er collisions zijn tussen de particles. Met method Wander geef ik ze een richting. Dan call ik Draw() weer
    Ik ben van plan om het aantal properties uit te breiden met 'Attractiveness', 'Hungry' etc. zodat bepaalde particles voorkeuren krijgen voor bepaalde andere particles... etc. Het lijkt


    Stukje code:

    Code:
    procedure TraverseParticleArray(PArray: Array of TParticle);
    var
    	I, J: integer;
    	Mouse: TMouse;
    	MouseCoord : TPoint;
    begin
    //	MainForm.Canvas.Brush.Color := clBlack;
    //	MainForm.Canvas.FillRect(MainForm.Canvas.ClipRect);
      MainForm.ListBox1.Clear;
    	for I := 0 to Length(PArray)-1 do
    		for J := 0 to Length(PArray)-1 do
    		If PArray[I] = PArray[J] then
    			Continue
    		else
          if ParticleCollision(PArray[I].Rectangle, Parray[J].Rectangle) then
    			begin
    				MainForm.ListBox1.Items.add(I.ToString + '-' + J.ToString);
    				{if we want to show the overlap
    				MainForm.Canvas.Brush.Color := clRed;
    				MainForm.Canvas.FillRect(OverlapRectangle); }
    
    				{shows the colliding objects in red}
    				ParticleArray[I].Size := ParticleArray[I].Size * 1.01;
    				ParticleArray[J].Size := ParticleArray[J].Size * 1.01;
            ParticleArray[I].Speed := ParticleArray[I].Speed * 2;
            ParticleArray[I].Speed := ParticleArray[I].Speed * 2;
    				ParticleArray[I].Color := clRed;
    				ParticleArray[J].Color := clRed;
    				ParticleArray[I].Draw;
    				ParticleArray[J].Draw;
    				//ParticleArray[J].Visible := False;
    				If Mouse.CursorPos = Point(ParticleArray[I].Xpos, ParticleArray[I].YPos) then
            	MainForm.Label3.Caption := 'Current ID: ' + I.ToString;
    			end;
    end;
    Nu we toch bezig zijn: Ik moet na elke iteratie het Canvas weer schoonmaken om de oude particles te wissen... dat geeft wel flicker. Is daar nog een oplossing voor?

    Veel dank.

    Sander

  6. #6
    Nodig? Nee hoor, maar als je events wilt gaan gebruiken kan je in de setter een event aanroepen met de change.. Het aanroepen blijft gelijk; dus particle.size blijft gelijk, Delphi gebruikt gewoon de getter/setter in plaats van direct op de variable/property te schrijven.
    Ik zou zelf de array of particle een type maken:
    Delphi Code:
    1. type
    2.   TParticleArray = Array of TParticle;
    3.   PArray: ^TParticleArray;
    en je Array van naam veranderen, de P wordt veelal gebruikt voor Pointer en is hier wat misleidend

    Je kan in plaats van direct te tekenen op je canvas, tekenen op een bitmap en die gebruiken als buffer. Dan teken je gewoon de hele bitmap ineens op je canvas en roep je een invalidate aan, zo voorkom je de flicker omdat het tekenen op de canvas door windows geregeld word (invalidate geeft gewoon aan dat er een hertekening nodig is, en je kan dus 10x invalidate aanroepen wat resulteert in 1x tekenen op de canvas). Je mag me anders gerust een bericht sturen, als je wilt schrijf ik je class even uit eventueel met een kleine demo voor het gebufferd tekenen

  7. #7
    Hi,
    Ik had je een PM gestuurd.

    Sander

  8. #8
    Had je terug gestuurd hoor

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •