Avatar billede valbjorn Nybegynder
22. november 2001 - 00:15 Der er 7 kommentarer og
2 løsninger

Lave sine egne componenter!

Når man Lave sine egne componenter. hvis man fra koden ændre en property kalder man så den procedure som Sætter Fvariblen...

Håber der er nogne der for står.?

mvh Nikolaj
Avatar billede morten_s Nybegynder
22. november 2001 - 08:08 #1
Sådan her plejer jeg at gøre

unit Loop;

interface

uses
  SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
  Forms, Dialogs;

type
  TLoopState = Boolean;
  TLoop = class(TGraphicControl)
  private
    FLoopState: TLoopState;
    procedure MouseMove(var m:twmmouse) ; message wm_MouseMove;
    procedure MouseLDown(var m:twmmouse) ; message wm_LButtonDown;
    procedure MouseLUp(var m:TWMmouse); message wm_LButtonUp;
    procedure MouseLDBlClk(var m:twmmouse); message wm_LButtonDBlClk;
    procedure MouseRDown(var m:twmmouse) ; message wm_RButtonDown;
    procedure MouseRUp(var m:twmmouse) ; message wm_RButtonUp;
    procedure SetLoopState(Value : TLoopState);
  protected
    { Protected declarations }
  public
    { Public declarations }
    constructor Create(AOwner: TComponent); override;
    destructor  Destroy; override;
  published
    { Published declarations }
    property LoopState: TLoopState read FLoopState write SetLoopState;
    end;

procedure Register;

implementation

uses
  tpLoop;
var
  oldypos, oldxpos : Integer;
 

procedure TLoop.SetLoopState(Value: TLoopState);
begin
  if FLoopState <> Value then
  begin
    FLoopState := Value;
  Invalidate;
    if Value = True then
      Inc(LoopCount);
    if LoopCount < 10 then
      LoopCountLabel.Caption := \'0\'+IntToStr(LoopCount)
    else
      LoopCountLabel.Caption := IntToStr(LoopCount);
    LoopCountLabel.Invalidate;
  end;
end;
Avatar billede valbjorn Nybegynder
22. november 2001 - 08:55 #2
morten_s>>

OK det hjalp på et andet problem.
MEN når jeg fra koden vil ændre componentets property f.eks

Loop1.Loopstate:= True;

Kalder delphi så Tloop.SetLoopstate? eller ændre den bare værdien??

Altså er Tloop.SetLoopstate noget der kun kaldes når man ændre værdien fra object inspekteren??

Nikolaj
Avatar billede morten_s Nybegynder
22. november 2001 - 08:56 #3
Nej den kaldes også når programmet kører
Avatar billede pellelil Nybegynder
22. november 2001 - 08:57 #4
valbjorn> Jeg læser dit spørgsmål, som du vil vide om kan blot ændre Propertien direkte eller om man kalder den procedure der gør det?

Det rigtigste vil altid være at ændre \"Propertien\", da dette sikre at programmet \"gør det rigtige\" hvis programmøren af den ene eller anden årsag skulle finde på at ændre i componentet (således den kalder en anden methode).

Ydermere så er det \"rigtige\" også at programmør der har lavet componentet skjuler de \"interne\" Get- og Set- methoder således disse ikke er synlige uden for classen (i så fald kan du kun ændre propertien).

Hvis du kigger på morten_s\'s eksempel kan du se at methoden SetLoopState er oprettet i componentets \"private\"-sektion. Dette sikre som nævnt at SetLoopState ikke dikrekte kan kaldes uden for objectet. Ligeledes så er \"variablen\" FLoopState også i private-sektionen, så er derimod NØDT TIL at ændre på propertien LoopState (dette er \"den rigtige møde\").

Som du bemærkt så anvender methoden SetLoopState direkte variablen FLoopState. Dette er den nødt til. Hvis den i stedet forsøgte at sætte propertien LoopState ville du have et problem, for hver gang man ændre LoopState kalder den FLoopState (dead-end-loop).
Avatar billede valbjorn Nybegynder
22. november 2001 - 12:55 #5
pellelil>
Ja ok det meste vidste jeg. det var bare hvad der triggede den SetLoopState. Ville vide hvis man skrev validerings kode i SetLoopState hvornår ville den så blive kørt.

Men du svarede også en del andet så lidt point til dig.

Nu må jeg se om jeg kan finde ud af det...

Nikolaj
Avatar billede pellelil Nybegynder
22. november 2001 - 13:06 #6
valbjorn> Som jeg også skrev (pakket \"lidt\" ind) så var jeg i tvivl om hvad problemet egentlig var, og for at pensle det ud så det nedenstående linie (fra morten_s\'s eksempel) der \"gør tricket\"

<SNIP>
property LoopState: TLoopState read FLoopState write SetLoopState; 
</SNIP>

Her fortæller du at HVER ENESTE GANG du vil læse værdien af property\'en LoopState så viser den indholdet af FLoopState og HVER ENESTE GANG du sætter propery\'en LoopState så kalder den methoden SetLoopState. Det sker således både fra ObjectInspectoren og RunTime.
Avatar billede pellelil Nybegynder
22. november 2001 - 13:12 #7
Lige et lille tillæg: Hvis du i din SetLoopState ønsker at test om den er kaldt \"fra ObjectInspectoren\" (kaldt mens du \"designer\" din applikation kan du gøre via:  if (csDesigning in ComponentState) then ...
Avatar billede valbjorn Nybegynder
22. november 2001 - 13:15 #8
pellelil> ih smart....tak for hjælpen du er da lidt klog :)

Avatar billede pellelil Nybegynder
22. november 2001 - 13:18 #9
Fedte-røv  ;-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester