AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein case of "anstatt constanten - Variablen einsetzen

case of "anstatt constanten - Variablen einsetzen

Ein Thema von 1967Schorsch · begonnen am 8. Jul 2020 · letzter Beitrag vom 9. Jul 2020
Antwort Antwort
1967Schorsch

Registriert seit: 28. Feb 2020
Ort: Dinslaken
8 Beiträge
 
Delphi 6 Enterprise
 
#1

case of "anstatt constanten - Variablen einsetzen

  Alt 8. Jul 2020, 15:59
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;
Miniaturansicht angehängter Grafiken
tabelle-edit-tchart.jpg  
Georg
  Mit Zitat antworten Zitat
Benmik

Registriert seit: 11. Apr 2009
532 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: case of "anstatt constanten - Variablen einsetzen

  Alt 8. Jul 2020, 16:09
Delphi-Quellcode:
Case i of
  00..07: EZ := 0;
  08..15: EZ := 8;
  ...
  else EZ := 208;
end;
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.336 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: case of "anstatt constanten - Variablen einsetzen

  Alt 8. Jul 2020, 16:26
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.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)

Geändert von stahli ( 8. Jul 2020 um 16:28 Uhr) Grund: Huch, kein roter Kasten. Wenn das von den Werten her so reicht, dann natürlich Benmiks Vorschlag!
  Mit Zitat antworten Zitat
stifflersmom

Registriert seit: 8. Dez 2005
Ort: 24994 Holt
370 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#4

AW: case of "anstatt constanten - Variablen einsetzen

  Alt 8. Jul 2020, 17:47
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
  Mit Zitat antworten Zitat
Benmik

Registriert seit: 11. Apr 2009
532 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: case of "anstatt constanten - Variablen einsetzen

  Alt 8. Jul 2020, 17:57
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 begin ... end; weglässt.
  Mit Zitat antworten Zitat
bcvs

Registriert seit: 16. Jun 2011
664 Beiträge
 
Delphi 12 Athens
 
#6

AW: case of "anstatt constanten - Variablen einsetzen

  Alt 8. Jul 2020, 18:13
Der OP wollte aber ein "Case" mit Variablen statt Konstanten. Das gibt es nicht, also bleibt nur
if .. then .. exit oder if .. else if
  Mit Zitat antworten Zitat
Benmik

Registriert seit: 11. Apr 2009
532 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: case of "anstatt constanten - Variablen einsetzen

  Alt 8. Jul 2020, 19:22
Richtig, aber braucht er tatsächlich auch Variablen?
  Mit Zitat antworten Zitat
Amateurprofi

Registriert seit: 17. Nov 2005
Ort: Hamburg
1.039 Beiträge
 
Delphi XE2 Professional
 
#8

AW: case of "anstatt constanten - Variablen einsetzen

  Alt 9. Jul 2020, 00:39
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;
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.
Gruß, Klaus
Die Titanic wurde von Profis gebaut,
die Arche Noah von einem Amateur.
... Und dieser Beitrag vom Amateurprofi....
  Mit Zitat antworten Zitat
1967Schorsch

Registriert seit: 28. Feb 2020
Ort: Dinslaken
8 Beiträge
 
Delphi 6 Enterprise
 
#9

AW: case of "anstatt constanten - Variablen einsetzen

  Alt 9. Jul 2020, 07:28
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.

Der OP wollte aber ein "Case" mit Variablen statt Konstanten. Das gibt es nicht, also bleibt nur
if .. then .. exit oder 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.
Georg
  Mit Zitat antworten Zitat
Amateurprofi

Registriert seit: 17. Nov 2005
Ort: Hamburg
1.039 Beiträge
 
Delphi XE2 Professional
 
#10

AW: case of "anstatt constanten - Variablen einsetzen

  Alt 9. Jul 2020, 11:22
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.

Der OP wollte aber ein "Case" mit Variablen statt Konstanten. Das gibt es nicht, also bleibt nur
if .. then .. exit oder 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.
Gruß, Klaus
Die Titanic wurde von Profis gebaut,
die Arche Noah von einem Amateur.
... Und dieser Beitrag vom Amateurprofi....
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 08:18 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