Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Vereinfachung von Procedurenaufrufe (https://www.delphipraxis.net/57323-vereinfachung-von-procedurenaufrufe.html)

ferby 19. Nov 2005 10:38


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

JasonDX 19. Nov 2005 11:01

Re: Vereinfachung von Procedurenaufrufe
 
Du könntest dir ein zusätzliches Array of Procedure anlegen, ca. so etwas:
Delphi-Quellcode:
KI_statusList: array['A'..'K'] of Procedure;
Danach musst du die noch einmalig zuweisen:
Delphi-Quellcode:
KI_statusList['A'] := ki_status_a;
KI_statusList['B'] := ki_status_b;
//...
das aufrufen geht dann relativ einfach. Statt dem endlosen case gehts so:
Delphi-Quellcode:
KI_StatusList[KI_Status[1]]();
Das dürfte vielleicht sogar noch schneller sein als das case.

Ich hab jetzt kein Delphi da, also kann ich für die Syntax nicht garantieren, aber das Prinzip dürfte ersichtlich sein ;)

himitsu 19. Nov 2005 12:43

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:
Const KI_statusList: array['A'..'K'] of Procedure =
  (@ki_status_a, @ki_status_b, ..., @ki_status_k);
Und dann ist der Aufruf genauso wie bei Chimaira.

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?

negaH 19. Nov 2005 13:59

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

ferby 19. Nov 2005 14:09

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

himitsu 19. Nov 2005 15:54

Re: Vereinfachung von Procedurenaufrufe
 
Wie gesagt, du hattest ja schon die "optimiertere" Version ... die Lange wäre die mit IFs -.-''

Delphi-Quellcode:
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;
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 ^^


[add]
Noch uneffektiver wäre es ohne die ELSE :shock:
Delphi-Quellcode:
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;
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.

Nightshade 19. Nov 2005 16:12

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.

ferby 19. Nov 2005 16:25

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

Premutos 30. Nov 2005 18:59

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;

Khabarakh 30. Nov 2005 19:24

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:37 Uhr.
Seite 1 von 2  1 2      

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