| Autor |
Beitrag |
Unknown
      
Beiträge: 184
Win XP
Delphi 7
|
Verfasst: Fr 11.05.07 20:59
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
      
Beiträge: 56
Win XP / Win Vista
# Delphi 6 Enterprise; # HTML Editor Phase 5; # Ulead Gif Animator 5;
|
Verfasst: 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.
_________________ Sind wir nicht alle ein wenig Newbee???
|
|
Unknown 
      
Beiträge: 184
Win XP
Delphi 7
|
Verfasst: 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.
      
Beiträge: 311
Win Xp Prof
Turbo Delphi 2005
|
Verfasst: Fr 11.05.07 21:19
So vielleicht?
Delphi-Quelltext 1: 2: 3:
| s := Edit1.Text; if s = 'Button1.Click' then Button1.Click; |
_________________ Hardware runs the world, software controls the hardware, code generates software - Have You already coded today?
|
|
muetzenjoe
      
Beiträge: 56
Win XP / Win Vista
# Delphi 6 Enterprise; # HTML Editor Phase 5; # Ulead Gif Animator 5;
|
Verfasst: 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.
_________________ Sind wir nicht alle ein wenig Newbee???
|
|
Unknown 
      
Beiträge: 184
Win XP
Delphi 7
|
Verfasst: 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.
      
Beiträge: 311
Win Xp Prof
Turbo Delphi 2005
|
Verfasst: 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.
_________________ Hardware runs the world, software controls the hardware, code generates software - Have You already coded today?
|
|
Unknown 
      
Beiträge: 184
Win XP
Delphi 7
|
Verfasst: Fr 11.05.07 21:38
|
|
muetzenjoe
      
Beiträge: 56
Win XP / Win Vista
# Delphi 6 Enterprise; # HTML Editor Phase 5; # Ulead Gif Animator 5;
|
Verfasst: Fr 11.05.07 21:48
_________________ Sind wir nicht alle ein wenig Newbee???
|
|
jakobwenzel
      
Beiträge: 1889
Erhaltene Danke: 1
XP home, ubuntu
BDS 2006 Prof
|
Verfasst: Fr 11.05.07 21:52
Du könntest den JvInterpreterProgramm benutzen. Das ist ne Komponente, bei der Quellcode zu LAufzeit interpretiert wird. Da kannste dann deine Prozeduren einmal registrieren und gut is.
Ein Tut gibts auf DGL
_________________ I thought what I'd do was, I'd pretend I was one of those deaf-mutes.
|
|
Lossy eX
      
Beiträge: 1048
Erhaltene Danke: 4
|
Verfasst: 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. 
_________________ Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.
|
|
Sinspin
      
Beiträge: 1337
Erhaltene Danke: 119
Win 10
RIO, CE, Lazarus
|
Verfasst: 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
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. |
_________________ Wir zerstören die Natur und Wälder der Erde. Wir töten wilde Tiere für Trophäen. Wir produzieren Lebewesen als Massenware um sie nach wenigen Monaten zu töten. Warum sollte unser aller Mutter, die Natur, nicht die gleichen Rechte haben?
|
|
Comp-Freak
      
Beiträge: 89
|
Verfasst: 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
      
Beiträge: 2088
|
Verfasst: 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
      
Beiträge: 89
|
Verfasst: 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
      
Beiträge: 2088
|
Verfasst: Sa 12.05.07 05:25
Oh sorry, war mein Fehler  Ich hab mich in deinem Post verlesen.
|
|
GTA-Place
      

Beiträge: 5248
Erhaltene Danke: 2
WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
|
Verfasst: 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.
_________________ "Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)
|
|
the-networker
Hält's aus hier
Beiträge: 1
win 98, win nt, win 2000, win xp
D5 Prof
|
Verfasst: Sa 12.05.07 11:59
Hallo Karlson,
vielleicht hilft Dir das weiter:
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
|
|