Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   case of "anstatt constanten - Variablen einsetzen (https://www.delphipraxis.net/204868-case-anstatt-constanten-variablen-einsetzen.html)

1967Schorsch 8. Jul 2020 14:59

case of "anstatt constanten - Variablen einsetzen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo zusammen,
ich nutze Delphi 6 und bin eher der unbedarfte Programm Nutzer.

Für meinen vor Jahren entwickelten Bordcomputer Adapter für eine Audi 80 Cabrio TDI und nun frisch für einen Audi 100 TDI (fast mit H-Kennzeichen) möchte die Abstimmung, des Adapters auf das Fahrzeug, komfortabler gestalten. Dazu habe ich eine Software geschrieben die zwei Zeilen der Eprom Daten des AVR Microcontrollers verändern und wieder in den AVR zurückschreiben kann.

Da die Daten für den Audi 100 noch nicht wirklich festliegen möchte ich die Stammdaten ( liegen zur Laufzeit "dezimal" in den unteren 32 Editfelder der Software) in die Simulation einbinden. Jedes einzelen der 32 Editfelder ist über den Spinbutton unterhalb zwischen 1 und 254 veränderbar.

Für die Simulation des Verbrauchswertes habe ich zunächst den Eingang der Einspritzpumpenwerte als integer Wert eingebunden. Über eine case of hole ich mit verschieden Stützwerte der Berechnung.

Nun kommt mein Problem: die Werte in der case of sind ja Constanten und die möchte ich aber entsprechend der Werte in den Editfeldern 32-64 verändern.
Einbinden der Variablen funktioniert nicht..... mit If then else möchte ich nicht arbeiten... und so die Frage was gibt es noch für Möglichkeiten die Werte der Editfelder entsprechend dem ESP integer Wert auszulesen. Habe schon mal was über eine Lockup Tabelle gelesen komm da aber nicht weiter.


Ich bin für jeden Hinweis Dankbar, hier noch die case of mit den Werte. Die Werte liegen auch in einem Array.

DANKE !!!


Zitat:

// function ESPwerte aus der Case select Tabelleauslesen
function ESPwerte(ESP : integer ):integer ;
var
i, EZ :Integer;

begin
i := ESP;

case i of
0: // 0-7=>0
begin
EZ:= 0;
end;
1: // 8-15=>8
begin
EZ:= 0;
end;
2: // 16-23=>16
begin
EZ:= 0;
end;
3: // 24-31=>24
begin
EZ:= 0;
end;
4: // 32-39=>32
begin
EZ:= 0;
end;
5: // 40-47=>40
begin
EZ:= 0;
end;
6: // 48-55=>47
begin
EZ:= 0;
end;
7: // 56-63=>54
begin
EZ:= 3;
end;
8: //64-71=>61
begin
EZ:= 11;
end;
9: //72-79=>68
begin
EZ:= 20;
end;
10: // 80-87
begin
EZ:= 30;
end;
11: //88 - 95 => 79
begin
EZ:= 41;
end;
12: //96 - 103 => 83
begin
EZ:= 53;
end;
13: //104 - 111
begin
EZ:= 66;
end;
14: //112 - 119
begin
EZ:= 80;
end;
15: //120 - 127
begin
EZ:= 94;
end;
16: //128 - 135
begin
EZ:= 108;
end;
17: //136 - 143
begin
EZ:= 122;
end;
18: //144 - 151
begin
EZ:= 135;
end;
19: //152 - 159
begin
EZ:= 148;
end;
20: //160 - 167
begin
EZ:= 159;
end;
21: //168 - 175
begin
EZ:= 170;
end;
22: //176 - 183
begin
EZ:= 179;
end;
23:
begin
EZ:= 187;
end;
24:
begin
EZ:= 193;
end;
25:
begin
EZ:= 198;
end;
26:
begin
EZ:= 202;
end;
27:
begin
EZ:= 205;
end;
28:
begin
EZ:= 207;
end;
29:
begin
EZ:= 208;
end;

else
begin
EZ:= 208;
// ShowMessage ('ESP hier ende ');
end;
end; // Sehr Wichtig: Das End von Case!

result :=EZ;
end;

Benmik 8. Jul 2020 15:09

AW: case of "anstatt constanten - Variablen einsetzen
 
Delphi-Quellcode:
Case i of
  00..07: EZ := 0;
  08..15: EZ := 8;
  ...
  else EZ := 208;
end;

stahli 8. Jul 2020 15:26

AW: case of "anstatt constanten - Variablen einsetzen
 
So ganz genau kann ich Dein Problem nicht nachvollziehen. Wenn Du nicht direkt eine hilfreiche Antwort erhältst, könntest Du vielleicht mal noch abstrakter fragen (ohne zu viele Details zu der Anwendung selbst).

Grundsätzlich finde ich mit "if ... then ... Exit(X);" zu arbeiten nicht verkehrt.

Also etwa:

Delphi-Quellcode:
function Check(const Value: Integer): Integer;
begin
  Result := -1;

  if InRange(Value, 0, 9) then
    Exit(1);
  if InRange(Value, 10, 19) then
    Exit(2);
end;
Das ist variabler als mit case und auch nicht unübersichtlicher.

stifflersmom 8. Jul 2020 16:47

AW: case of "anstatt constanten - Variablen einsetzen
 
Zitat:

Zitat von stahli (Beitrag 1469129)
Grundsätzlich finde ich mit "if ... then ... Exit(X);" zu arbeiten nicht verkehrt.

Also etwa:

Delphi-Quellcode:
function Check(const Value: Integer): Integer;
begin
  Result := -1;

  if InRange(Value, 0, 9) then
    Exit(1);
  if InRange(Value, 10, 19) then
    Exit(2);
end;
Das ist variabler als mit case und auch nicht unübersichtlicher.

Da bin ich ganz bei Dir.
Aber es müsste doch, in diesem Anwendungsfall, mit
Code:
Result := 208;
beginnen

Benmik 8. Jul 2020 16:57

AW: case of "anstatt constanten - Variablen einsetzen
 
Zitat:

Zitat von stahli (Beitrag 1469129)
Das ist variabler als mit case und auch nicht unübersichtlicher.

Ich finde die Case-Anordnung deutlich übersichtlicher und inwiefern ist das variabler (bzw. braucht man hier Variabilität)? Aber es stimmt, so ganz schlau wird man aus dem vorhandenen Code nicht. Aber er scheint in jedem Fall zu einer Case-Konstruktion zu passen. Der Code wird in jedem Fall schon mal deutlich kürzer, wenn man die unnötigen
Delphi-Quellcode:
begin ... end;
weglässt.

bcvs 8. Jul 2020 17:13

AW: case of "anstatt constanten - Variablen einsetzen
 
Der OP wollte aber ein "Case" mit Variablen statt Konstanten. Das gibt es nicht, also bleibt nur
Delphi-Quellcode:
if .. then .. exit
oder
Delphi-Quellcode:
if .. else if

Benmik 8. Jul 2020 18:22

AW: case of "anstatt constanten - Variablen einsetzen
 
Richtig, aber braucht er tatsächlich auch Variablen?

Amateurprofi 8. Jul 2020 23:39

AW: case of "anstatt constanten - Variablen einsetzen
 
Zitat:

Zitat von 1967Schorsch (Beitrag 1469117)
Habe schon mal was über eine Lockup Tabelle gelesen komm da aber nicht weiter.


Delphi-Quellcode:
function ESPwerte(ESP : integer ):integer ;
const
   EZ:Array[0..29] of Integer=
      (0,0,0,0,0,0,0,3,11,20,30,41,53,66,80,94,108,122,135,148,159,170,179,187,
       193,198,202,205,207,208);
begin
   if ESP<0 then raise Exception.Create('ESP ist negativ');
   Result:=EZ[Min(ESP,29)];
end;
Zitat:

Zitat von 1967Schorsch (Beitrag 1469117)
Nun kommt mein Problem: die Werte in der case of sind ja Constanten und die möchte ich aber entsprechend der Werte in den Editfeldern 32-64 verändern.

Das hab ich nicht verstanden.

1967Schorsch 9. Jul 2020 06:28

AW: case of "anstatt constanten - Variablen einsetzen
 
Hallo und guten Morgen,
vielen dank für die Zahlreichen Antworten.

Ich versuche nochmal mein Problem zu beschreiben.

Für die simulierte Verbrauchberechnung benötige ich unter anderem als Eingangsgrößen die Zahlenreihe wie sie in den Editfeldern der unteren Reihe (33-64) drin stehen. Im angehängten Bild ist die Zahlenreihe leider schon verändert sonst wäre es vlt. deutlicher geworden. So ist der Inhalt von Edit33 Feld eben auch der Inhalt vom ersten Eintrag in der case of Auswahl (Edit34 = 2. Eintrag in case of usw.).
Ich möchte also... wenn sich der Wert im Edit33 Feld ändert sich auch der Wert in der Berechnung mit ändert. Sodas sich dynamisch mit der Veränderung der Eidtfelder 33-64 auch die Werte für die Berechnung mit ändern.
Dazu hatte ich gedacht den Inhalt der Editfelder 33-64 in Variablen zwischenzuspeichern und über die case of Auswahl variabel in meine Berechnung mit einzubinden.

Zitat:

Zitat von bcvs (Beitrag 1469139)
Der OP wollte aber ein "Case" mit Variablen statt Konstanten. Das gibt es nicht, also bleibt nur
Delphi-Quellcode:
if .. then .. exit
oder
Delphi-Quellcode:
if .. else if

Wie aber schon bemerkt wurde geht das nicht und so suche ich nach einer Alternative.

Die Möglichkeit mit der Funktion inRange finde ich auch interessant komme da als Dummy aber in Delhi 6 nicht weiter.

Amateurprofi 9. Jul 2020 10:22

AW: case of "anstatt constanten - Variablen einsetzen
 
Zitat:

Zitat von 1967Schorsch (Beitrag 1469167)
Hallo und guten Morgen,
vielen dank für die Zahlreichen Antworten.

Ich versuche nochmal mein Problem zu beschreiben.

Für die simulierte Verbrauchberechnung benötige ich unter anderem als Eingangsgrößen die Zahlenreihe wie sie in den Editfeldern der unteren Reihe (33-64) drin stehen. Im angehängten Bild ist die Zahlenreihe leider schon verändert sonst wäre es vlt. deutlicher geworden. So ist der Inhalt von Edit33 Feld eben auch der Inhalt vom ersten Eintrag in der case of Auswahl (Edit34 = 2. Eintrag in case of usw.).
Ich möchte also... wenn sich der Wert im Edit33 Feld ändert sich auch der Wert in der Berechnung mit ändert. Sodas sich dynamisch mit der Veränderung der Eidtfelder 33-64 auch die Werte für die Berechnung mit ändern.
Dazu hatte ich gedacht den Inhalt der Editfelder 33-64 in Variablen zwischenzuspeichern und über die case of Auswahl variabel in meine Berechnung mit einzubinden.

Zitat:

Zitat von bcvs (Beitrag 1469139)
Der OP wollte aber ein "Case" mit Variablen statt Konstanten. Das gibt es nicht, also bleibt nur
Delphi-Quellcode:
if .. then .. exit
oder
Delphi-Quellcode:
if .. else if

Wie aber schon bemerkt wurde geht das nicht und so suche ich nach einer Alternative.

Die Möglichkeit mit der Funktion inRange finde ich auch interessant komme da als Dummy aber in Delhi 6 nicht weiter.

Ich würde das so machen

Im TForm:
EZValues:Array[33..64] of Integer;

Für alle Edits ein OnChange definieren (Bei allen dasselbe)

Um im OnChange zu prüfen, welches Edit geändert wurde sehe ich 3 Möglichkeiten

1) Über den Namen des Edits

2) Über die Tag-Properties der Edits (bei allen Edits im Tag die Nummer des Edits speichern)

3) Über ein Array of TEdit
Hierfür
In TForm:
Edits:Array of TEdit;

Im FormCreate alle Edits in ein Array stellen.

Delphi-Quellcode:
procedure TForm.FormCreate;
procedure CreateEditsArray(const EB:array of TEdit)
var I:Integer;
begin
   SetLength(Edits,Length(EB));
   For I:=0 to High(EB) do
      Edits[I] := EB[I]
end;
begin
   CreateEditsArray([Edit33, Edit34, …, Edit63])
end;
Im EditChange
Delphi-Quellcode:
TForm.EditChange(Sender : TObject)
var I, ID : Integer;
begin
   // Je nachdem wie du die Edits identifizierst
   ID:= // aus TEdit(Sender).Name ableiten
   Oder ID := TEdit(Sender).Tag;
   Oder
   For I := 0 to High(Edits) do
      If Edits[I] = Sender then begin
         ID := I + 33; // +33, weil in Edits[0] das Edit33 steht
         Break;
      end;
   EZValues[ID] := StrToInt(TEdit(Sender).Text);
   // Jetzt kannst du die aktuellen Werte der Edits aus EZValues[x] holen
end;
Hab das nur auf die Schnelle so hingetippt - nicht getestet.


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:16 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