Autor Beitrag
Unknown
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 184

Win XP
Delphi 7
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 56

Win XP / Win Vista
# Delphi 6 Enterprise; # HTML Editor Phase 5; # Ulead Gif Animator 5;
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 184

Win XP
Delphi 7
BeitragVerfasst: Fr 11.05.07 21:15 
Nein , du hast mich vll falsch verstanden es soll ungefähr so aussehen
ausblenden Delphi-Quelltext
1:
2:
3:
4:
var s:string
begin
s:=Edit1.caption;
//Und dann irgendwie Do Procedure (s) oder so
Christian V.
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 311

Win Xp Prof
Turbo Delphi 2005
BeitragVerfasst: Fr 11.05.07 21:19 
So vielleicht?
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 56

Win XP / Win Vista
# Delphi 6 Enterprise; # HTML Editor Phase 5; # Ulead Gif Animator 5;
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 184

Win XP
Delphi 7
BeitragVerfasst: Fr 11.05.07 21:27 
Nein ich wollte da anders versuchen
ausblenden 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.
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 311

Win Xp Prof
Turbo Delphi 2005
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 184

Win XP
Delphi 7
BeitragVerfasst: Fr 11.05.07 21:38 
na ok trotzdem thx
muetzenjoe
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 56

Win XP / Win Vista
# Delphi 6 Enterprise; # HTML Editor Phase 5; # Ulead Gif Animator 5;
BeitragVerfasst: Fr 11.05.07 21:48 
user profile iconUnknown hat folgendes geschrieben:
Nein ich wollte da anders versuchen
ausblenden 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!

_________________
Sind wir nicht alle ein wenig Newbee???
jakobwenzel
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1889
Erhaltene Danke: 1

XP home, ubuntu
BDS 2006 Prof
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1048
Erhaltene Danke: 4



BeitragVerfasst: 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.
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1337
Erhaltene Danke: 119

Win 10
RIO, CE, Lazarus
BeitragVerfasst: 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
ausblenden volle Höhe 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
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 89



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 2088



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 89



BeitragVerfasst: Sa 12.05.07 03:43 
user profile iconKarlson 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
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 2088



BeitragVerfasst: Sa 12.05.07 05:25 
Oh sorry, war mein Fehler :gruebel: Ich hab mich in deinem Post verlesen.
GTA-Place
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
EE-Regisseur
Beiträge: 5248
Erhaltene Danke: 2

WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
BeitragVerfasst: 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
BeitragVerfasst: Sa 12.05.07 11:59 
Hallo Karlson,
vielleicht hilft Dir das weiter:
ausblenden volle Höhe 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;

////////////////////// Aufruf  ///////////////////////////////
// zb. i:= fo(1);


end.


Gruß Uwe