Avatar billede futterama Nybegynder
14. december 2004 - 14:08 Der er 9 kommentarer og
1 løsning

Hente komponents navn og bruge den til at finde variabel

Hej,

Jeg har en OnMouseDown event som jeg gerne vil bruge ved flere forskellige komponenters OnMouseDown event.
Event'en skal sætte en variabel hvis navn svarer til den komponent som udløste event'en:

  public
    { Public declarations }
    b_MyCompMouseDown: Boolean; //Variablen som skal sættes

procedure TForm1.MyMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  'b_' + (Sender as TShape).Name + 'MouseDown' := True; //Mousebutton is pressed
end;

MyComp er komponenten som udløste event'en (en TShape).

Kan I følge mig? :-)
Avatar billede tolderlund Nybegynder
14. december 2004 - 15:15 #1
Uha da for noget grimt noget du har gang i!
Men det kan lade sig gøre, du skal bruge RTTI for at gøre det.
  public
    { Public declarations }
    b_MyCompMouseDown: Boolean; //Variablen som skal sættes
  published
    property pub_b_MyCompMouseDown: Boolean read b_MyCompMouseDown write b_MyCompMouseDown;
  end;

implementation

procedure TForm1.MyCompMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  varname: string;
  varvalue: Boolean;
begin
  varname := 'pub_b_' + (Sender as TShape).Name + 'MouseDown';
  varvalue := GetPropValue(Self, varname);
  varvalue := not varvalue; // skift mellem false/true
  SetPropValue(Self, varname, varvalue);
  if b_MyCompMouseDown then
    ShowMessage('True')
  else
    ShowMessage('False');
end;
Avatar billede tolderlund Nybegynder
14. december 2004 - 15:16 #2
Jeg glemte lige: Husk at tilføje TypInfo i uses.
Avatar billede delphi Nybegynder
14. december 2004 - 21:37 #3
Med mindre du har et specielt formål med absolut at anvende RTTI (RunTime Type Information) for at finde ud af hven der sendte din event, så mener jeg at du er inde på et vildspor. 

Det kan IMHO gøres meget simplere.  Nedenstående kode viser to måder at bestemme hvilket component der udløste eventen vha. af componentens properties.  Første metode benytter Name (som du selv er inde på).  Anden metode benytter propertien TAG - Jeg ved ikke om du kender Tag, men det er en integer property som alle TComponent (og deraf nedarvede) besidder.  Tag har ingen forud defineret betydning og er beregnet til fx. ID som i dette eksempel.

procedure TForm1.Shape1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  // Metode 1: Benyt component name property
  If (Sender As TComponent).Name = 'Shape1' Then
    ShowMessage('Shape1 mousedown.');

  // Metode 2: Benyt Tag property - fordel: Du kan bruge en nem case struktur!
  Case (Sender As TComponent).Tag Of
    1: Label1.Caption := 'Shape1 pressed';
    2: Label1.Caption := 'Shape2 pressed';
    3: Label1.Caption := 'Shape3 pressed';
  Else
    Label1.Caption := 'Some other component pressed.';
  End;
end;


Selvfølgelig kan du også bare skrive:

  If Sender=Shape1      Then <Shape1 action>
  Else If Sender=Shape2 Then <Shape2 action>
  Else If Sender=Shape3 Then <Shape3 action>
  Else If Sender=Shape4 Then <Shape4 action>;
Avatar billede futterama Nybegynder
15. december 2004 - 09:28 #4
Det er godt nok besværligt. Jeg tror bare jeg laver de if'er jeg skal bruge, og så henter navnet fra komponenten som aktiverede event'en. Det er trods alt kun 4 if'er.
Avatar billede tolderlund Nybegynder
15. december 2004 - 15:01 #5
Tak fordi jeg måtte bruge tid på at hjælpe dig uden at få noget for det ...
Avatar billede delphi Nybegynder
15. december 2004 - 16:36 #6
Er der nogen grund til at du afviste mit svar.  Det ser da ud til at jeg til allersidst lige netop beskrev den løsning du vælger. 
  Du stiller et spørgsmål, får brugbare svar og belønner så ikke med point hvor dette er pågrævet for tilsidst at tildele alle point'ne til dig selv.  Dette svarer til at byde på en online auktion for bare at springe fra når man har vundet budet.
  Det du får ud af det, er at der er meget lille vilje fra min side til at besvare dine spørgsmål i fremtiden.  gro op og lær at opføre dig ordentligt!
Avatar billede futterama Nybegynder
16. december 2004 - 07:32 #7
Jeg brugte ikke jeres svar, skal I så have point alligevel? Jeg troede at I eksperter var ligeglade med pointene, men hvis jeg tager fejl vil jeg da hjertens gerne give jer jeres 30 point hver! Men det tillader systemet vel ikke...
Avatar billede delphi Nybegynder
16. december 2004 - 10:48 #8
Din valgte løsning:
> Jeg tror bare jeg laver de if'er jeg skal bruge, og så
> henter navnet fra komponenten som aktiverede event'en.
> Det er trods alt kun 4 if'er.

Mit forslag:
> If (Sender As TComponent).Name = 'Shape1' Then
>    ShowMessage('Shape1 mousedown.');

Hvor er forskellen?  Det er ikke pointene der drejer sig om - det er princippet.  Det drejer sig om, at du skal anerkende, at andre gør en inmdsats for at hjælpe dig.  At gå i angreb ved at skrive "Jeg troede at I eksperter var ligeglade med pointene, men hvis jeg tager fejl vil jeg da hjertens gerne give jer jeres 30 point hver! Men det tillader systemet vel ikke..." viser i mine øjne bare at du er umoden og uansvarlig.
Avatar billede futterama Nybegynder
16. december 2004 - 13:52 #9
Sikke du kan skælde ud, det handler om at ville hjælpe andre, hvis du ikke vil hjælpe, så lad være med at komme her!

Det I skrev, fik mig kun til at indse at jeg ikke havde brug for hjælp.

Mht. angreb, så var det jer der startede med at angribe mig, så drop det. Brug hellere din tid på at hjælpe andre, end at kalde mig umoden og uansvarlig, det får du intet ud af.
Avatar billede futterama Nybegynder
16. december 2004 - 14:17 #10
Well, jeg vil gerne lige komme med en kommentar her:

Jeg har vist haft en forkert opfattelse af hvornår man uddeler point og hvornår man tager dem igen.

Jeg har til nu ment at jeg giver point hvis det folk har kommet med har hjulpet mig til at lave det program jeg nu er igang med. Dvs. hvis jeg ikke bruger det folk foreslår, så jeg ingen grund til at give point.
Jeg kan se at det er en forkert opfattelse af hvordan det foregår herinde (det er vel egentlig meget egoistisk af mig).
Man deler point til dem som har kommet med et korrekt svar, uanset om man bruger det eller ej. Og det vil jeg gøre fremover.

Jeg vil gerne undskylde til både tolderlund og delphi for min opførsel, det kom fra et forkert synspunkt for pointgivningen.

Jeg vil gerne indrømme at I hjalp mig, det er slet ikke det, I hjalp mig måske ikke direkte med mit program, men I hjalp mig til at se at min egen metode var ok. Og det fortjener jo ligeså meget tak som hvis jeg brugte jeres kodeeksempler i mit program.

Jeg kunne ikke forstå jeres udbrud da jeg tog pointene igen - jeg har heller ikke svaret meget herinde, så jeg kunne ikke se det fra jeres synspunkt fra start, men det kan jeg nu.

Så undskyld til tolderlund og delphi for min grove og egoistiske opførsel. Og tak for hjælpen også da. Hvis systemet tilladte det ville jeg acceptere jeres svar som bevis på at jeg takker for jeres indsats.

Jeg håber til trods for denne misforståelse og opførsel fra min side at I vil hjælpe en anden gang. Nu ved jeg bedre :-)
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