AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Wie wird aus einem String eine Anweisung?
Thema durchsuchen
Ansicht
Themen-Optionen

Wie wird aus einem String eine Anweisung?

Ein Thema von Sel2012 · begonnen am 25. Aug 2015 · letzter Beitrag vom 27. Aug 2015
Antwort Antwort
Seite 1 von 3  1 23      
Sel2012

Registriert seit: 6. Jun 2015
Ort: 31535
103 Beiträge
 
Delphi XE5 Professional
 
#1

Wie wird aus einem String eine Anweisung?

  Alt 25. Aug 2015, 05:15
Hallo liebe Spezialisten,
ich möchte mit FireMonkeyMobile eine variable Anzahl von Kreisen darstellen.
Natürlich kann ich für jede Situation mit ButtonXClick jeden gewünschten Kreis einzeln mit visible ansprechen (Siehe script 1).
Delphi-Quellcode:
procedure TForm4.Button1Click(Sender: TObject);
begin
 circle2a.visible:=false;
 circle3a.visible:=false;
 circle4a.visible:=false;
 circle5a.visible:=false;
 circle6a.visible:=false;
 circle7a.visible:=false;
 circle8a.visible:=false;
 circle9a.visible:=false;
 circle10a.visible:=false;
 circle1a.visible:=true;
end;

procedure TForm4.Button2Click(Sender: TObject);
begin
 circle3a.visible:=false;
 circle4a.visible:=false;
 circle5a.visible:=false;
 circle6a.visible:=false;
 circle7a.visible:=false;
 circle8a.visible:=false;
 circle9a.visible:=false;
 circle10a.visible:=false;
 circle1a.visible:=true;
 circle2a.visible:=true;
end;
Eleganter und flexibler müsste das aber wie folgt gehen:

Delphi-Quellcode:
procedure TForm4.Button11Click(Sender: TObject);
var i,erg:integer;
kurz:array[1..10] of string;

begin
  i:=1;
erg:=9;
repeat
kurz[i]:= ('circle'+inttostr(i)+'a.visible:=true;');
 Application.ProcessMessages;
sleep(1000); //zum Verfolgen der "automatisierten" Befehlszeilen
label4.Text:= kurz[i];
inc(i);
until i=erg+1;

{circle10a.visible:=false;
circle1a.visible:=true;
circle2a.visible:=true;
circle3a.visible:=true;
circle4a.visible:=true;
circle5a.visible:=true;
circle6a.visible:=true;
circle7a.visible:=true;
circle8a.visible:=true;
circle9a.visible:=true; }


end;
Im Label werden die Befehlszeilen aus dem vorherigen Code alle 1:1 abgebildet. Die Strings sehen optisch genauso aus wie
die Befehlszeilen (von Hand geschrieben). Wie mache ich nun aus den Strings Anweisungszeilen?

'kurz[i];' funktioniert jedenfalls nicht.
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.270 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Wie wird aus einem String eine Anweisung?

  Alt 25. Aug 2015, 05:22
Hallo,
FindComponent benutzen?

Heiko
Heiko
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Wie wird aus einem String eine Anweisung?

  Alt 25. Aug 2015, 05:24
Entweder die Circles in einem Array verwalten oder sich zur Laufzeit Referenzen auf die Objekte holen, in der VCL würde man das mit FindComponent bzw. FindControl machen.
Markus Kinzler
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#4

AW: Wie wird aus einem String eine Anweisung?

  Alt 25. Aug 2015, 06:47
Wenn ich zur Laufzeit Controls erzeuge, werde ich sie mit Sicherheit nicht hinterher mühselig mit 'FindComponent' suchen, sondern mir eher merken.

Und wenn ich sonst Controls bzw. Komponenten verwalten will, dann habe ich ihren Bezeichnernamen und kann den direkt ansprechen. Und wenn ich eine Gruppe von Controls erreichen will, dann kopiere ich mir die Referenzen in ein Array.

FindComponent ist genauso überflüssig wie 'with'. Und eigentlich genauso 'böse' (*). Also lasst doch endlich mal den Tipp mit diesem FindComponent.

(*) Wenn ich den Namen der Komponente ändere, funktioniert mein Programm nicht mehr.
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.429 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Wie wird aus einem String eine Anweisung?

  Alt 25. Aug 2015, 08:20
Erstellt man die Komponenten zur Laufzeit selbst, ist ein Array sicher die beste Lösung.
Andernfalls bietet sich auch diese Alternative an:
Delphi-Quellcode:
function TForm4.GetCircle(AIndex: Integer): TShape;
begin
  case AIndex of
    1: Result := circle1a;
    2: Result := circle2a;
    3: Result := circle3a;
    4: Result := circle4a;
    5: Result := circle5a;
    6: Result := circle6a;
    7: Result := circle7a;
    8: Result := circle8a;
    9: Result := circle9a;
   10: Result := circle10a;
  else Result := nil; // oder Exception auslösen
  end;
end;

procedure TForm4.SetCircleVisible(ACount: Integer);
var
  i: Integer;
begin
  for i := 1 to 10 do
  begin
    GetCircle(i).Visible := (i <= ACount);
  end;
end;

Geändert von Blup (25. Aug 2015 um 08:24 Uhr)
  Mit Zitat antworten Zitat
RoadR69

Registriert seit: 7. Nov 2013
17 Beiträge
 
Delphi 10 Seattle Professional
 
#6

AW: Wie wird aus einem String eine Anweisung?

  Alt 25. Aug 2015, 08:28
(*) Wenn ich den Namen der Komponente ändere, funktioniert mein Programm nicht mehr.
Ist für mich nicht wirklich das KO-Kriterium dafür. Aber der Würgereiz ist doch kaum zu unterdrücken, wenn man bedenkt, dass man ein schnelles, sichereres, elegantes Pointer-Merken durch ein String-Suchgewühl ersetzt ...
  Mit Zitat antworten Zitat
Sel2012

Registriert seit: 6. Jun 2015
Ort: 31535
103 Beiträge
 
Delphi XE5 Professional
 
#7

AW: Wie wird aus einem String eine Anweisung?

  Alt 25. Aug 2015, 10:22
Erstellt man die Komponenten zur Laufzeit selbst, ist ein Array sicher die beste Lösung.
Andernfalls bietet sich auch diese Alternative an:
Delphi-Quellcode:
function TForm4.GetCircle(AIndex: Integer): TShape;
begin
  case AIndex of
    1: Result := circle1a;
    2: Result := circle2a;
  ...
...
   10: Result := circle10a;
  else Result := nil; // oder Exception auslösen
  end;
end;

procedure TForm4.SetCircleVisible(ACount: Integer);
var
  i: Integer;
begin
  for i := 1 to 10 do
  begin
    GetCircle(i).Visible := (i <= ACount);
  end;
end;
Hallo Blup, vielend Dank für den Vorschlag. Hast du ihn getestet? Bei mir bleibt nämlich das alte Problem, dass ein String ein
String bleibt und keine Anweisung wird. Als optische Darstellung, z.B. im Label, etc. ist das kein Problem. Aber ich benötige ja eine Anweisung.
  Mit Zitat antworten Zitat
Benutzerbild von baumina
baumina

Registriert seit: 5. Mai 2008
Ort: Oberschwaben
1.275 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Wie wird aus einem String eine Anweisung?

  Alt 25. Aug 2015, 10:26
Nur Interpreter können zur Laufzeit erzeugte Kommandozeilen verarbeiten. Du arbeitest mit einem Compiler, deswegen musst du hier einen anderen Weg gehen.

EDIT: Blup hat in seinem Beispiel keine Strings, deswegen müsste das so schon funktionieren.
Hinter dir gehts abwärts und vor dir steil bergauf ! (Wolfgang Ambros)

Geändert von baumina (25. Aug 2015 um 10:32 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.126 Beiträge
 
Delphi 10.3 Rio
 
#9

AW: Wie wird aus einem String eine Anweisung?

  Alt 25. Aug 2015, 10:37
Abgesehen vom "<=" Fehler

Bei mir bleibt nämlich das alte Problem, dass ein String ein String bleibt und keine Anweisung wird. Als optische Darstellung, z.B. im Label, etc. ist das kein Problem. Aber ich benötige ja eine Anweisung.
Wovon redest Du? Du wolltest doch "nur" Kreis ein- und ausblenden. Wo ist den da ein String?
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.733 Beiträge
 
Delphi 6 Enterprise
 
#10

AW: Wie wird aus einem String eine Anweisung?

  Alt 25. Aug 2015, 10:49
Zitat:
kurz[i]:= ('circle'+inttostr(i)+'a.visible:=true;')
Er hat nicht den Namen einer Komponente im String, wo er dann die Komponente such um einen Befehl auszuführen. Er baut den ganzen Befehl in einen String ein und möchte den dann ausführen:

sString:='circle4a.visible:=true';
FühreBefehlAus(sString);

Nur das das nicht funktionieren wird. Deswegen nochmal Blups-Variante anschauen.
Ralph
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:15 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz