![]() |
Vereinfachung von Procedurenaufrufe
Hallo,
Ich habe ein Frage, und zwar ob dieser Quelltext vereinfacht bzw. kürzer geschrieben werden kann:
Delphi-Quellcode:
case ki_status[1] of
'0': ki_status_0; 'A': ki_status_A; 'B': ki_status_B; 'C': ki_status_C; 'D': ki_status_D; 'E': ki_status_E; 'F': ki_status_F; 'G': ki_status_G; 'H': ki_status_H; 'I': ki_status_I; 'J': ki_status_J; 'K': ki_status_K; end; ki_status:string ki_status_0 bis ki_status_K sind proceduren; ferby |
Re: Vereinfachung von Procedurenaufrufe
Du könntest dir ein zusätzliches Array of Procedure anlegen, ca. so etwas:
Delphi-Quellcode:
Danach musst du die noch einmalig zuweisen:
KI_statusList: array['A'..'K'] of Procedure;
Delphi-Quellcode:
das aufrufen geht dann relativ einfach. Statt dem endlosen case gehts so:
KI_statusList['A'] := ki_status_a;
KI_statusList['B'] := ki_status_b; //...
Delphi-Quellcode:
Das dürfte vielleicht sogar noch schneller sein als das case.
KI_StatusList[KI_Status[1]]();
Ich hab jetzt kein Delphi da, also kann ich für die Syntax nicht garantieren, aber das Prinzip dürfte ersichtlich sein ;) |
Re: Vereinfachung von Procedurenaufrufe
Das zuweisen kann man sich auch vereinfachen, obwohl es mit dem Case in codetechnischer Hinsicht schon optimal ist.
Dises global (also außerhalb der Prozedur, eventuell direkt davor) definieren, dann kannst du das Array direkt vordefinieren.
Delphi-Quellcode:
Und dann ist der Aufruf genauso wie bei Chimaira.
Const KI_statusList: array['A'..'K'] of Procedure =
(@ki_status_a, @ki_status_b, ..., @ki_status_k);
Delphi-Quellcode:
KI_StatusList[KI_Status[1]]();
Es kann auch sein, daß es ohne das @ geht, aber bei der Definition/Zuweisung in das Array muß in Cimairas version doch eigentlich das @ davor? |
Re: Vereinfachung von Procedurenaufrufe
Es gibt bei den beiden Lösungen aber einen wichtigen Unterschied zu beachten.
Würde in ki_status[1] zb. 'x' drinnenstehen so hat das bei der CASE Auswertung KEINERLEI Konsequenzen. Bei den anderen Lösungen greift man dann aber ausserhalb des deklarierten Arrays[] zu und springt somit an einer Addresse die undefinierten Code enthält, dies führt zwangsläufig zum Abkack. Gruß Hagen |
Re: Vereinfachung von Procedurenaufrufe
Hi,
ich lass es einfach so wie es ist, ich dachte es gibt da eine ganz einfache, ungefährliche möglichkeit... was soll's, sind halt 5 Zeilen mehr code da. Danke für eure Lösungen, ich bleib aber lieber trotzdem bei meiner langen Variante, Ferby |
Re: Vereinfachung von Procedurenaufrufe
Wie gesagt, du hattest ja schon die "optimiertere" Version ... die Lange wäre die mit IFs -.-''
Delphi-Quellcode:
Obwohl die lange Variante bei meiner Schreibweise noch 2 Zeilen einsparren würde, aber es wäre halt vom kompilieren Code mehr und auch noch ein kleines bissl uneflektiv ^^
If ki_status[1] = '0' Then ki_status_0
Else If ki_status[1] = 'A' Then ki_status_A Else If ki_status[1] = 'B' Then ki_status_B ... Else If ki_status[1] = 'J' Then ki_status_J Else If ki_status[1] = 'K' Then ki_status_K; [add] Noch uneffektiver wäre es ohne die ELSE :shock:
Delphi-Quellcode:
Dann würden ja immer alle IFs ausgewertet werden, wärend bei der Verwendung von ELSE wenigstens die IFs, nach dem Ausgeführen einer Prozedur, nicht ausgewertet werden.
If ki_status[1] = '0' Then ki_status_0;
If ki_status[1] = 'A' Then ki_status_A; If ki_status[1] = 'B' Then ki_status_B; ... If ki_status[1] = 'J' Then ki_status_J; If ki_status[1] = 'K' Then ki_status_K; |
Re: Vereinfachung von Procedurenaufrufe
Die optimalste Version wäre erstmal zu wissen, was du in den vielen Prozeduren machst, und ob man das nicht zu einer Procedure verbessern / optimieren könnte.
|
Re: Vereinfachung von Procedurenaufrufe
Hallo,
die Proceduren könnten alle auch in einer stehen, ich habe es aus übersichtsgründen auf mehrere proceduren aufgeteilt. Ferby |
Re: Vereinfachung von Procedurenaufrufe
gibt es eine möglichkeit so etwas auch für functionen bzw. proceduren mit paramter nzw. rückgabewerten zu realiseren ?
bsp:
Code:
procedure dwijhdio(sqw:string);
begin showmeesage(sqw); end; |
Re: Vereinfachung von Procedurenaufrufe
Meinst du Chimairas Version? Dort musst du nur den Prozedurenzeigertyp ändern:
Delphi-Quellcode:
[...] of procedure(sqw: string);
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:56 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz