14. december 2004 - 14:08Der 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).
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;
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>;
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.
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!
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...
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.
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.
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 :-)
Synes godt om
Ny brugerNybegynder
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.