Entwickler-Ecke
Sonstiges (Delphi) - Über String Procedure aufrufen
Unknown - Fr 11.05.07 20:59
Titel: Über String Procedure aufrufen
dumme Überschrift, ich weiß...........
Aber erstmal Hallo,
ich wollt wissen ob es geht, wenn man zum Beispiel ein String hat "Button1Click" das er dann die Button1click procedure ausführt....ginge so etwas
thx im vorraus
muetzenjoe - Fr 11.05.07 21:09
wenn es bestimmte strings sind die vorher bekannt sind, könntest du mit einer if oder case anweisung bestimmen was passieren soll, wenn der string einen bestimmten inhalt aufweist.
Unknown - Fr 11.05.07 21:15
Nein , du hast mich vll falsch verstanden es soll ungefähr so aussehen
Delphi-Quelltext
1: 2: 3: 4:
| var s:string begin s:=Edit1.caption; |
Christian V. - Fr 11.05.07 21:19
So vielleicht?
Delphi-Quelltext
1: 2: 3:
| s := Edit1.Text; if s = 'Button1.Click' then Button1.Click; |
muetzenjoe - Fr 11.05.07 21:21
so meinte ich es auch... dann könnte man halt
a:button1.click;
b:form1.close;
c:edit1.clear;
und und und... das halt alles in ne case schachtel legen und asuwerten.
Unknown - Fr 11.05.07 21:27
Nein ich wollte da anders versuchen
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| Procedure Button1.click .... var s :string bagin s:=Edit1.text; Do Procedure(s); oder GOTO Procedure(s); end; |
Ich hab sehr viele Prozeduren und darum möchte ich wissen ob es so geht.....Also ungefähr
wenn nicht mach ich es mit case
Christian V. - Fr 11.05.07 21:31
Ich kann mir nicht vorstellen dass das geht, da diese Prozedurnamen die du siehst nur Abstraktionen sind, die auf eine bestimmte Stelle im Speicher verweisen. Vllt irre ich mich auber auch.
Unknown - Fr 11.05.07 21:38
na ok trotzdem thx
muetzenjoe - Fr 11.05.07 21:48
Unknown hat folgendes geschrieben: |
Nein ich wollte da anders versuchen
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| Procedure Button1.click .... var s :string bagin s:=Edit1.text; Do Procedure(s); oder GOTO Procedure(s); end; |
Ich hab sehr viele Prozeduren und darum möchte ich wissen ob es so geht.....Also ungefähr
wenn nicht mach ich es mit case |
was spricht denn dann dagenen alle proceduren die du da hast in eine case sektion zu schreiben? dann kannst du sie doch durch den inhalt einer edit eingabe ausführen!
Lossy eX - Fr 11.05.07 23:28
Das mit JvInterpreterProgramm ist doch nur ein Skript, oder? Wenn ja wird das von der Ausführgeschwindigkeit nie an richtigen Code herranreichen. Und was mich persönlich an Skripten wahnsinnig macht ist der fehlende Debugger bzw. merkt man Fehler erst zur Laufzeit. ;)
Aber es gibt noch etwas viel Einfacheres. Der entsprechende Mechanismus ist bereits in der Klasse TObject integriert. Folgendes funktioniert problemlos setzt allerdings vorraus, dass du sehr genau weißt von welchem Typen deine Funktion ist. Sonst kracht es gewaltig. Und sie muss eine Methode einer Klasse sein.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| procedure TMainForm.Button1Click(Sender: TObject); begin ShowMessage(MainForm.Caption); end;
procedure TMainForm.FormCreate(Sender: TObject); var A: TNotifyEvent; begin TMethod(A).Code := MethodAddress('Button1Click'); TMethod(A).Data := Self;
if TMethod(A).Code <> nil then A(Self); end; |
Wichtig dabei ist, dass nur Funktion abgefragt werden können die Published sind. Also entweder explizit als Published gekennzeichnet sind oder über der ersten Sichtbarkeitsdefinition stehen.
ABER: Das solltest du nur mit äußerster Vorsicht genießen. An Stellen an denen der Benutzer da so ohne weiteres etwas eingeben kann würde ich das aus Sicherheitsgründen eher nur bedingt benutzen. Eben weil er jede Publishedfunktion der Klasse anspringen kann und du diese Blind aufrufen würdest. Das einzig Sichere wäre eine komplett leere Klasse die nur das im published hat was du brauchst und die Methoden müssen dann alle den selben Typ haben. Damit es nicht zu Verwechselungen kommt.
Falls du Später noch die Funktionen enumerieren möchtest dann wirst du damit allerdings nicht weiter kommen. Das geht nicht. Dann müsstest du einen Manager schreiben bei dem sich all deine Funktionen registrieren. Also Name und der Pointer der Methode (+ Klasse). Das wäre imho sowieso das Sicherste und Praktischste. Allerdings auch das mit am Abstand Aufwändigste von Schreiben her. ;)
Sinspin - Sa 12.05.07 01:14
wenn ich mich recht an meine diplomarbeit erinnere dann geht das eigentlich recht einfach...
ich kann mich zwar nicht mehr erinnern das die proceduren als published deklariert werden mussten, aber nur dann geht es
Delphi-Quelltext
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: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43:
| unit formTest;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type TProcedure = procedure;
type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); procedure Foo; private public end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject); var p: TProcedure; begin p := self.MethodAddress('Foo'); if Assigned(p) then p; end;
procedure TForm1.Foo; begin MessageDlg('Hallo!',mtInformation,mbOKCancel,0); end;
end. |
Comp-Freak - Sa 12.05.07 02:16
@ sinspin: das wollte er doch nicht. er wollte nicht eine if then oder case of abfrage weil er zuviele procedures hat.
Ich glaub er wollte ein string als delphi code ausfuehren. (string'memo1.clear;' und das dann ausfueren.) Ich hab gelesen das es ein weg gibt string in delphi code zu wandeln. Villeich ne neue unit und dan string rein und unit ausfueren?
Karlson - Sa 12.05.07 03:18
@Comp-Freak: Man kann das p := self.MethodAddress('Foo'); doch genausogut in p := self.MethodAddress(edit1.text); umwandeln.
Comp-Freak - Sa 12.05.07 03:43
Karlson hat folgendes geschrieben: |
| @Comp-Freak: Man kann das p := self.MethodAddress('Foo'); doch genausogut in p := self.MethodAddress(edit1.text); umwandeln. |
? sorry aber jezt weiss ich gar nichts mehr :(.
Karlson - Sa 12.05.07 05:25
Oh sorry, war mein Fehler :gruebel: Ich hab mich in deinem Post verlesen.
GTA-Place - Sa 12.05.07 08:56
Nein, er wollte schon die Prozedur aufrufen und nicht z.B. Memo1.Clear, aber wie kommt ihr auf Case? Case funktioniert mit Strings nicht.
the-networker - Sa 12.05.07 11:59
Hallo Karlson,
vielleicht hilft Dir das weiter:
Delphi-Quelltext
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: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53:
| unit KeyFunction;
interface uses Windows,messages;
type TKeySwitchFunction = function: integer of object; TKeyFuncCaller = class(TObject) published function CallFunction(func:string):Integer; Function SwitchKey_1:Integer; end;
implementation
Function TKeyFuncCaller.CallFunction(func:String):Integer; var KeySwitchFunction: TKeySwitchfunction; begin @KeySwitchFunction:=self.MethodAddress(func); result:=KeySwitchFunction; end;
function TKeyFuncCaller.SwitchKey_1:integer; begin ..... Result:=1; end;
end.
unit Irgendwas;
uses KeyFunction ;
interface
function foo (const nr : integer):integer; var KeyFuncCaller : TKeyFuncCaller; begin KeyFuncCaller:=TKeyFuncCaller.create; Result:=KeyFuncCaller.CallFunction('SwitchKey_'+ Inttostr(nr)); FreeAndNil(KeyFuncCaller); end;
end. |
Gruß Uwe
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!