Entwickler-Ecke
Sonstiges (Delphi) - Kleine Frage: Quelltextverschiebung zur Übersicht, Risiken?
Starido - Sa 24.04.10 13:27
Titel: Kleine Frage: Quelltextverschiebung zur Übersicht, Risiken?
Moinmoin Community habe hier eine kleine Frage, bin noch Anfänger.
Mein eigenes kleines Programm hat die 10.000 Zeilen überboten und nun leidet die Übersicht,
ich habe mich nun entschlossen den Quelltext der einzelnen Button.Clicks in kleinere private proceduren zu packen um noch ein wenig die Übersicht zu behalten.
Beim einen Button zum Beispiel habe ich nun aus 2.000 Zeilen 5 gemacht, sprich die 5 einzelnen proceduren.
Die Frage beeinflusst das i-wie die Flüssigkeit des Programms sollte ich es weiter so machen sprich weiter viele private prozeduren zu erstellen, oder hat es sonst i-welche Risiken?
Es handelt sich beim Programm um ein/e Spiel/Funktion mit sehr vielen repeat/until,if then Funktionen
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| private procedure Menuwechsel; procedure Motorenreperatur; procedure Wetterwechsel; procedure Startreifen; procedure KITanken; ....
procedure THomeF1Manager.AktionClick(Sender: TObject); begin Menuwechsel; Motorenwechsel; Wetterwechsel; Startreifen; KITanken; end; |
mfg Fabian (Starido)
Moderiert von
Gausi: Delphi-Tags hinzugefügt
Gausi - Sa 24.04.10 13:43
Hallo und :welcome: in der Entwickler-Ecke
Was du da vorhast, ist höchstwahrscheinlich eine sehr gute Idee. :zustimm:
Es gibt sogar Leute, die die Ansicht vertreten, dass eine Funktion oder Prozedur nie länger als eine Bildschirmseite sein sollte. Wenn doch, sollte man den Code in Teilfunktionen aufsplitten. Ganz so eng sehe ich das nicht, aber eine Procedure mit 2000 Zeilen ist dann doch etwas zu lang für meinen Geschmack. Und wenn die Aufteilung problemlos möglich ist, dann sollte man das auch tun.
Bei einem Funktionsaufruf gibt es zwar afaik einen kleinen Overhead, der aber in fast allen Fällen zu vernachlässigen ist.
Jakob_Ullmann - Sa 24.04.10 15:06
Ansonsten gibt es dafür aber auch in Delphi das Schlüsselwort inline:
Delphi-Quelltext
1:
| function Irgendwas: Integer; inline; |
bei der Deklaration sollte jegliche Performance-Probleme beheben.
Gausi - Sa 24.04.10 15:13
Ja, aber das sollte man hier wohl kaum anwenden. ;-)
Starido - Sa 24.04.10 15:39
Danke für die schnelle Antwort ergibt sich mir nurnoch ein Problem, dadurch das mein Programm immer größer wurde dauert es nun an die 30 Minuten bis die Schleife einmal durchläuft, gibt es da Tricks wie man das verkürzen könnte auf 10 Minuten wenigstens?
Gausi - Sa 24.04.10 15:44
Das kommt ganz darauf an, was da passiert. Für viele Probleme gibt es schnelle und langsame Algorithmen. Und auch beim Code selbst kann man oft was drehen. Wenn du z.B. viele Application.ProcessMessages in deinem Schleifencode hast, ist das sehr oft eine starke Bremse, oder ungeschickt implementiertes Leeren von großen "TStringList" , oder ...
Mitmischer 1703 - Sa 24.04.10 15:44
Wir können dir da ohne Code nicht helfen. :roll: Aber ich denke bei der erdrückenden Menge Code würde eine Prozedur reichen.
Starido - Sa 24.04.10 15:54
Also es sind c.a 200 if then bedingungen in jeder repeat until schleife die von 1.000.000 bis 0 (Integer)(Extended) geht drin davon hatte ich erst 3 jetzt 2 drin
Das klingt selbst für mich schon sehr bremsend.
der quelltext wäre hier zu posten viel zu lang.
Das Problem ich bekomme es im moment nicht kürzer da sich die anweisung zwar jeweils 20 mal wiederholen und nur die variablen sich ändern, wovon auch c.a. 100 in den jeweiligen schleifen drin sind.
BenBE - Sa 24.04.10 15:59
Mindestens einen Ausschnitt brauchen wir schon.
Aber nach deiner Beschreibung denke ich einmal:
- Arrays
- Keine direkte Arbeit mit der VCL
Starido - Sa 24.04.10 16:03
Dies der größte Teil, der 20 mal in der einen Schleife steht jeweils nur die Zahl hinter den Variablen geändert
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: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110:
| x:=1000000; repeat x:=x-1; ...
if ZU3 = X then begin if Aktion.Caption = 'Rennen!' then begin if Z3 = 1 then begin EgMemo.Lines.Add('Motorschaden'); Renninfo.Lines.Add(''+(F3)+' hat einen Motorschaden'); DNF3:=1; M3:=5000; end; if DNF3 = 0 then begin if ZF3 > 5 then begin ReMemo.Lines.Add(''+(F3)+''); Tankstops.Lines.Add(''+floattostr(TA3)+''); if XY = 0 then begin XY:=XY+1; ZX:=ZU3; EgMemo.Lines.Add(''+floattostr(ZU3)+''); end else begin ZE3:=ZX-ZU3; ZE3:=ZE3/1000; EgMemo.Lines.Add('+'+floattostr(ZE3)+''); end; if RV2=0 then begin Reifen.Lines.Add('B'); end; if RV2=1 then begin Reifen.Lines.Add('M'); end; end; if ZF3 = 0 then begin Renninfo.Lines.Add('Runde '+floattostr(RU)+' - '+(F3)+' bleibt im Kiesbett stecken, das Rennen ist für ihn beendet'); DNF3:=1; ZF3:=100; end; if ZF3 = 1 then begin Renninfo.Lines.Add('Runde '+floattostr(RU)+' - '+(F3)+' kollidiert, sein Frontflügel ist ab'); ZU3:=ZU3-25000; TA3:=TA3+1; ZF3:=100; end; if ZF3 = 2 then begin Renninfo.Lines.Add('Runde '+floattostr(RU)+' - '+(F3)+' hat sich gedreht'); ZU3:=ZU3-5000; ZF3:=100; end; if ZF3 = 3 then begin Renninfo.Lines.Add('Runde '+floattostr(RU)+' - '+(F3)+' berührt seinen Vordermann, beide rutschen von der Strecke'); ZU3:=ZU3-2500; ZF3:=100; end; if ZF3 > 3 then begin if ZF3 < 6 then begin Renninfo.Lines.Add('Runde '+floattostr(RU)+' - '+(F3)+' war kurz neben der Strecke'); ZU3:=ZU3-1000; ZF3:=100; end; end; if Y=1 then begin P3:=P3+PR1; GS3:=GS3+1; end; if Y=2 then begin P3:=P3+PR2; if ZU3 > 10 then begin if TeamS = 1 then begin DominS:=DominS+1; end; end; end; if Y=3 then begin P3:=P3+PR3; end; if Y=4 then begin P3:=P3+PR4; end; if Y=5 then begin P3:=P3+PR5; end; if Y=6 then begin P3:=P3+PR6; end; if Y=7 then begin P3:=P3+PR7; end; if Y=8 then begin P3:=P3+PR8; end; if Y=9 then begin P3:=P3+PR9; end; if Y=10 then begin P3:=P3+PR10; end; if Aktion.Visible = False then begin if Y < 11 then begin STR3:=STR3+11-Y; end; end; Y:=Y+1; end; end; end; ...
until x=0 |
Moderiert von
Gausi: Delphi-Tags hinzugefügt
Gausi - Sa 24.04.10 16:03
Da stellt sich dann die Frage: Muss das 1.000.000 bis 0 wirklich sein? Was willst du damit erreichen? Was soll dein Code machen? Dann kann man evtl. darüber nachdenken, wie man das mit anderen Mitteln erreicht.
Primitives Beispiel: Zahlen sortieren. Man kann alle Permutationen durchprobieren, bis die Zahlen sortiert sind (ich nenne das Verfahren einfach mal "optimiertes Bogosort" :mrgreen:). Daran rechnet dein Programm dann meinetwegen zwei Stunden. Nimmst du Bubblesort, dauert das noch 5 Minuten. Und wenn du Quicksort nimmst, sind die Zahlen in Nullkommanix sortiert (meistens jedenfalls).
Mitmischer 1703 - Sa 24.04.10 16:03
Wie sind denn deine if-Abfragen aufgebaut?
Edit: okay, ich schaus mir grad an
1. Ich würde keine Schleife von 10000000 bis 0 durchzählen, sondern mir ein privates Feld FRaceStopped definieren und dann mit
while not FRaceStopped arbeiten. Sobald der User das Rennen beenden will, setzt du FRaceStopped auf true.
2. Was bedeuten deine Variablen? Benutze am beste etwas längere Namen, die dafür aussagekräftiger sind (oder Kommentare)
3. Kann man PR3..PR10 nicht durch ein Array ausdrücken?
4. Und hier:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7:
| if Y=3 then begin P3:=P3+PR3; end; if Y=4 then begin P3:=P3+PR4; [...] end; |
kannst du auch mit case arbeiten!
5. Benutze doch für jeden Wagen ein eigenes Objekt. Dann kannst du mit einem array of car arbeiten.
Beispiel:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| type TParts = set of (pFrontflügel, pMotor...); class TCar = class private FSpeed : Word; FDead : Boolean; FParts : TParts; [...] end; |
Gausi - Sa 24.04.10 16:11
Kleine Offtopic-Frage: Sieht der gesamte Code so aus? Mehrere 100 oder gar 1000 Zeilen in der Art?
Respekt, dass du da noch durchsteigst. :shock:
Was mir so auf Anhieb auffällt: Schau dir mal case...of an. Damit kannst du dir schonmal eine ganze Reihe Ifs sparen. Generell würde ich aber sagen: Schmeiß dein Konzept über den Haufen und versuche, das mal etwas zu sortieren. Stichwort Objekt-orientiertes Programmieren. Dürfte hier angebracht sein. ;-)
BenBE - Sa 24.04.10 16:15
Also anhand deiness Beispiels würde ich schon einmal stark zur Nutzung von Arrays tendieren. Statt also 20 Variablen ZU1 bis ZU20 zu haben, hast Du eine Variable ZU und kannst auf die 20 Werte dann mit ZU[i] zugreifen, wobei i dein Index auf das Array ist.
Gleiches geht z.B. auch für die Variablen P[i], PR[i], ... Im Falle von PR können dann die Abfragen sogar entfallen, da du einfach P[i] := P[i] + PR[Y]; machen kannst.
Bzgl. des Memo's ggf. ein Tipp: Das Updaten der VCL kann sehr lange dauern. Daher sollte man Änderungen an VCL-Komponenten dieser immer ankündigen, so dass diese insgesamt neugezeichnet werden. Bei einem Memo geht das mit TMemo.Lines.BeginUpdate; und TMemo.Lines.EndUpdate; I.d.R. bringt das schon mal einiges an Performance, wenn regelmäßige Änderungen stattfinden UND man durch diese Anweisungen Änderungen wirklich bündelt..
Starido - Sa 24.04.10 16:16
Die Variablen sind abkürzungen, PR=Punkte zu Reglement,F=Fahrer,Z=Zeit,ZE=ZEitgesammt,ZU=ZeitUnterschied,B=Benzin
schaue mir jetzt erstmal das case of und die anderen dinge an,
ja mein ganzes Programm ist so aufgebaut, ich wette von den 10.000 Zeilen sind nur 500-1.000 wirklich nötig aber da ich noch neuling bin und die meißten befehle nicht kenne habe ich bisher andere lösungswege gesucht die meißt sehr lang sind.
Also Ich will die Werte sortieren, hab mir alle möglichkeiten ma angesehen, hat meißt nicht geklappt, bin dann auf diese möglichkeit umgestiegen, die werte gehen in den 6 stelligen bereich deswegen von 1.000.000 bis 0.
der Fahrer der den höchsten wert hat durchläuft als erstes, darstellung umrechnung der zeit in rückstand, ermittlung benzin,motorenzustand etc.
Gausi - Sa 24.04.10 16:22
Starido hat folgendes geschrieben : |
Also Ich will die Werte sortieren, hab mir alle möglichkeiten ma angesehen, hat meißt nicht geklappt, bin dann auf diese möglichkeit umgestiegen, die werte gehen in den 6 stelligen bereich deswegen von 1.000.000 bis 0.
der Fahrer der den höchsten wert hat durchläuft als erstes, darstellung umrechnung der zeit in rückstand, ermittlung benzin,motorenzustand etc. |
Heißt das, ich habe mit dem Sortieren einen Treffer gelandet :shock:? Weil du 20 Werte im Bereich von 0 bis 1.000.000 nicht sortieren kannst, testest du alle 1 Million Wertemöglichkeiten durch um dann bei einem "Treffer" eine bestimmte Aktion durchzuführen?
Wow. Das ist Worst-Case-Programmierung in Reinstform. :eyecrazy:
Starido - Sa 24.04.10 16:28
Genau so ist es.
Ich war sehr ungeduldig beim verstehen von Array,Case of, das ichs mir kompliziert gemacht habe da ich i-was machen wollte.
Wie gesagt ich schau mir das jetzt erstma an, das ergebniss zeige ich dann, bei Fragen melde ich mich.
PS:Passiert mir nicht zum ersten mal, Habe auch meine alte Speicherfunktion, jede einzelne Variable einzelnd in ne .txt datei gepackt da ichs anders net verstanden hatte, nur bei mittlerweile knapp 500 variablen ist mir das zu anstrengend, mehr dazu später.
Xion - Sa 24.04.10 16:38
Mal 6 Vorschläge:
:arrow: Kommentare! Ich bin zwar nicht der Meinung, dass eine Funktion mehr Kommentarzeilen haben sollte als Quellcode, aber so ne grobe Beschreibung was da passiert wäre nicht verkehrt. Und wenn es nur ein Wort ist. Besonders bei proceduren, die lange aber nicht verschachtelt sind, kann man prima einzelne Blöcke mit Kommentaren bilden.
z.B.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| [...]
[...]
[...] |
Hilft ungemein.
:arrow: Einrücken. Mitunder auch mal 3-4 Tabs. Damit trenne ich die einzelnen verschachtelten while Ausdrücke mehr von einander ab. In deinem Beispielcode z.B. die Befehle in der If-Anweisung einrücken. Und die If-Anweisung evtl auch nochmal
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| if ZU3 = X then begin if Aktion.Caption = 'Rennen!' then begin if Z3 = 1 then begin EgMemo.Lines.Add('Motorschaden'); Renninfo.Lines.Add(''+(F3)+' hat einen Motorschaden'); DNF3:=1; M3:=5000; end; ... |
:arrow: Andere Units machen. Nenn die Unit z.B. Auto, lagere dort proceduren aus. Du kannst dann (ohne Klasse für den Anfang) schreiben Auto.Auftanken(500); usw. Hilft auch ungemein die dummen (sry) Variablennamen zu ersetzen.
:arrow: Um Variablen zu "packen" kannst du auch ein Record verwenden:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| type TAuto=record Tank: integer; Geschwindigkeit: TPoint; Position: TPoint; end;
var Auto: TAuto; [...] Auto.Tank:=Auto.Tank+500; |
:arrow: Variablennamen: Wenn du viele verschiedene Variablen auf einmal verwendest, dann kürze sie nach möglichkeit nicht so ab ^^ Zur Not hat bei mir ne Variable mal 20 Zeichen, hauptsache ich weiß, was sie bedeutet.
:arrow: Profiversion: Das programm in einzelne Klassen auslagern. Aber Achtung! Das kostet ne Menge Zeit. Ich hab früher in deinem Stil nen Siedler II Clone in 2Wochen geschrieben. Später hab ich dann den Code durch bessere Mittel um 50% gekürzt. Problem war, es waren diverse Bugs drin, die ich niemals wieder gefunden hab. Lag auch daran, dass ich Funktionen MacheDiesUndDasA und MacheDiesUndDasB hatte, und man aus verschiedenen Situationen ne andre Aufrufen musste :mrgreen: Das ist böse. Aber heute, schön sauber mit Klassen, brauch ich deutlich länger für alles. Dafür hab ich seltenst Bugs, die ich nicht schnell lokalisieren kann.
Starido - Sa 24.04.10 17:17
Bevor ich jetzt hier alles falsch mache, habe mich an den arrays versucht und dies ist dabei herausgekommen bei einer funktion die zuvor über 200 Zeilen ging
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:
| procedure TFormel1Manager.Zeitenberechnungen; begin
for i:=1 to 21 do begin if Reifenvertrag[i] = 0 then begin RT[i]:=S2*60; end; if Reifenvertrag[i] = 1 then begin RT[i]:=S1*60; end;
Motor[i]:=Motor[i]-S1*2-random(8); Benzinmenge[i]:=Benzinmenge[i]-3; Zeiten[i]:=Fahrerstaerken[i]+Teamstaerken[i]; RundeGetroffen[i]:=random(12)+11; Zeiten[i]:=Zeiten[i]*RundeGetroffen[i]-Fronteinstellung[i]-Heckeinstellung[i]; Zeiten[i]:=Zeiten[i]-Reifenkompalibität[i]-Benzinmenge[i]-Wettereinfluss[i]; Zufallsereigniss[i]:=random(500);
if Aktion.Caption = 'Rennen!' then begin Zeitunterschied[i]:=Zeitunterschied[i]+Zeiten[i]; end;
if Motor[i] < 1 then begin Zeit[i]:=1; end;
end; end; |
Mitmischer 1703 - Sa 24.04.10 17:33
Xion hat folgendes geschrieben : |
Mal 6 Vorschläge:
:arrow: Kommentare! Ich bin zwar nicht der Meinung, dass eine Funktion mehr Kommentarzeilen haben sollte als Quellcode, aber so ne grobe Beschreibung was da passiert wäre nicht verkehrt. Und wenn es nur ein Wort ist. Besonders bei proceduren, die lange aber nicht verschachtelt sind, kann man prima einzelne Blöcke mit Kommentaren bilden.
z.B.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| [...]
[...]
[...] |
Hilft ungemein. |
Jap.
Xion hat folgendes geschrieben : |
:arrow: Einrücken. Mitunder auch mal 3-4 Tabs. Damit trenne ich die einzelnen verschachtelten while Ausdrücke mehr von einander ab. In deinem Beispielcode z.B. die Befehle in der If-Anweisung einrücken. Und die If-Anweisung evtl auch nochmal
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| if ZU3 = X then begin if Aktion.Caption = 'Rennen!' then begin if Z3 = 1 then begin EgMemo.Lines.Add('Motorschaden'); Renninfo.Lines.Add(''+(F3)+' hat einen Motorschaden'); DNF3:=1; M3:=5000; end; ... | |
Hmm, also ich rücke nicht mit Tab ein, sondern mit einem Leerzeichen. Finde ich lesbarer, ist wohl Geschmackssache.
Xion hat folgendes geschrieben : |
:arrow: Um Variablen zu "packen" kannst du auch ein Record verwenden:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| type TAuto=record Tank: integer; Geschwindigkeit: TPoint; Position: TPoint; end;
var Auto: TAuto; [...] Auto.Tank:=Auto.Tank+500; | |
Öhm... Geschwindigkeit als TPoint? Und ich würde kein Record, sondern eine Klasse benutzen. Damit du Prozeduren (und vor allem Properties z.B. zum Abfangen von negativer Geschwindigkeit) hast, das macht das ganze noch lesbarer und sicherer.
Xion hat folgendes geschrieben : |
| :arrow: Variablennamen: Wenn du viele verschiedene Variablen auf einmal verwendest, dann kürze sie nach möglichkeit nicht so ab ^^ Zur Not hat bei mir ne Variable mal 20 Zeichen, hauptsache ich weiß, was sie bedeutet. |
Bei meinen Variablennamen fehlen manchmal Vokale^^
Xion hat folgendes geschrieben : |
| :arrow: Profiversion: Das programm in einzelne Klassen auslagern. Aber Achtung! Das kostet ne Menge Zeit. Ich hab früher in deinem Stil nen Siedler II Clone in 2Wochen geschrieben. Später hab ich dann den Code durch bessere Mittel um 50% gekürzt. Problem war, es waren diverse Bugs drin, die ich niemals wieder gefunden hab. Lag auch daran, dass ich Funktionen MacheDiesUndDasA und MacheDiesUndDasB hatte, und man aus verschiedenen Situationen ne andre Aufrufen musste :mrgreen: Das ist böse. Aber heute, schön sauber mit Klassen, brauch ich deutlich länger für alles. Dafür hab ich seltenst Bugs, die ich nicht schnell lokalisieren kann. |
Absolut dafür!!! Klassen sind doch das Schöne an Delphi, sonst kannste ja gleich C++ nehmen.
BenBE - Sa 24.04.10 17:45
Starido hat folgendes geschrieben : |
| Bevor ich jetzt hier alles falsch mache, habe mich an den arrays versucht und dies ist dabei herausgekommen bei einer funktion die zuvor über 200 Zeilen ging |
Siehst Du ;-) So einfach kann das sein ;-)
Starido hat folgendes geschrieben : |
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:
| procedure TFormel1Manager.Zeitenberechnungen; begin
for i:=1 to 21 do begin if Reifenvertrag[i] = 0 then begin RT[i]:=S2*60; end;
if Reifenvertrag[i] = 1 then begin RT[i]:=S1*60; end;
Motor[i]:=Motor[i]-S1*2-random(8); Benzinmenge[i]:=Benzinmenge[i]-3; Zeiten[i]:=Fahrerstaerken[i]+Teamstaerken[i]; RundeGetroffen[i]:=random(12)+11; Zeiten[i]:=Zeiten[i]*RundeGetroffen[i]-Fronteinstellung[i]-Heckeinstellung[i]; Zeiten[i]:=Zeiten[i]-Reifenkompalibität[i]-Benzinmenge[i]-Wettereinfluss[i]; Zufallsereigniss[i]:=random(500);
if Aktion.Caption = 'Rennen!' then begin Zeitunterschied[i]:=Zeitunterschied[i]+Zeiten[i]; end;
if Motor[i] < 1 then begin Zeit[i]:=1; end;
end; end; | |
Beachte bei der Einrückung, dass Du nicht nach Anzahl abgeschlossener Blöcke, sondern dern Anzahl offener Blöcke einrückst. Hab das mal für deinen Code kurz umgebaut.
Bliebe aber immer noch die Geschichte mit dem Zugriff auf die VCL: Statt ständig abzufragen
Delphi-Quelltext
1:
| if Aktion.Caption = 'Rennen!' then begin |
solltest Du einmalig am Anfang deiner Prozedur den Wert auslesen:
Delphi-Quelltext
1: 2: 3:
| var GradAmRennen: Boolean;
GradAmRennen = Aktion.Caption = 'Rennen!'; |
Und dann aus
Delphi-Quelltext
1:
| if Aktion.Caption = 'Rennen!' then begin |
ein einfaches
Delphi-Quelltext
1:
| if GradAmRennen then begin |
machen. Hintergrund dabei ist, dass String-Vergleiche extrem langsam sind, während Boolean- und Ganzzahl-Vergleiche in der Regel schneller bearbeitet werden können. Zudem wird beim Zugriff auf Properties (wie der Caption) immer noch eine Methode aufgerufen, was zusätzlich Zeit kostet. Daher möchte man i.d.R. solchen Aufwand so selten wie möglich betreiben und zeitaufwändige Aufrufe aus einer Schleife fernhalten (und stattdessen zwischengespeicherte Ergebnisse nutzen).
Starido - Sa 24.04.10 17:54
Okay ich werde das gleichmal mit einbringen, danke für den tipp,
eine Sache habe ich gerade noch und zwar ein Fehler beim bisher einzigsten String Array
Klasse besitzt keine Standarteigenschaft
Delphi-Quelltext
1:
| TeMemo.Lines.Add('Team: '+(Teamname[i])+''); |
Habe versucht ihm eine eigenschaft zuzuordnen aber habe da glaube ich etwas verwechselt
Delphi-Quelltext
1:
| Teamname := ('Name1','Name2','Name3','Name4','Name5','Name6','Name7','Name8','Name9','Name10',); |
Das ist wohl nicht gemeint.
BenBE - Sa 24.04.10 18:58
Wie hast Du Teamname deklariert?
Die Zuweisung in der Form ist nur für das Initialisieren von Konstanten möglich IIRC. Und selbst dann darf das letzte Komma nicht mitgeschrieben werden.
Außerdem: Möglichst keine unnötigen Klammern in Befehlen schreiben, z.B. bei deiner String-Verkettung. Das irritiert unnötig.
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!