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 case mit einem in einem String gespeicherten Variablennamen (https://www.delphipraxis.net/143330-case-mit-einem-einem-string-gespeicherten-variablennamen.html)

steenvoortl 13. Nov 2009 13:19


case mit einem in einem String gespeicherten Variablennamen
 
Hallo =)
Ich habe eine kleine Frage... kann man den Quelltext mit einer Prozedur vereinfachen, damit der case-Teil nicht 27-mal geschrieben werden muss?
Habe schon im Forum gesucht, aber nichts gefunden.

Delphi-Quellcode:
with ImCube.Canvas do begin
  case FUL of
    1: Brush.Color := clWhite;
    2: Brush.Color := clYellow;
    3: Brush.Color := clGreen;
    4: Brush.Color := clBlue;
    5: Brush.Color := clRed;
    6: Brush.Color := $000080FF;
  end;
  Rectangle(10, 64, 60, 114);
  //[...] und das jetzt bei 27 Variablen
  case RDR of
    1: Brush.Color := clWhite;
    2: Brush.Color := clYellow;
    3: Brush.Color := clGreen;
    4: Brush.Color := clBlue;
    5: Brush.Color := clRed;
    6: Brush.Color := $000080FF;
  end;
  Polygon([Point(196,128),Point(196,178),Point(214,160),Point(214,110)]);
end;
Ich dachte an so ein Konstrukt:

Delphi-Quellcode:
procedure TForm1.SetColor(Seite: string);
begin
  with ImCube.Canvas do begin
    case Seite of
      1: Brush.Color := clWhite;
      2: Brush.Color := clYellow;
      3: Brush.Color := clGreen;
      4: Brush.Color := clBlue;
      5: Brush.Color := clRed;
      6: Brush.Color := $000080FF;
    end;
  end;
end;
Delphi-Quellcode:
SetColor('FUL');
ImCube.Canvas.Rectangle(10, 64, 60, 114);
//[...]
SetColor('RDR');
ImCube.Canvas.Polygon([Point(196,128),Point(196,178),Point(214,160),Point(214,110)]);
end;
Aber das funktioniert so nicht, weil ich es nicht hinkriege, dass case die Variable ausliest, deren Name in dem String gespeichert ist und nicht versucht, den String selbst auszulesen. :coder2:

Habt ihr irgendwelche Tipps?

Danke im Voraus
steenvoortl

stho 13. Nov 2009 13:21

Re: case mit einem in einem String gespeicherten Variablenna
 
warum machst du keine Function draus?
Als eingabewert kannst du ja einen Integer nehmen und als ausgabe TColor :wink: hoffe ich hab dich richtig verstanden ^^

alleinherrscher 13. Nov 2009 13:23

Re: case mit einem in einem String gespeicherten Variablenna
 
Dein Code funktioniert höchstwahrscheinlich nicht, weil deine Case Struktur (wahrscheinlich) einen String als Variable bekommt und dann auf Integers (1,2,3,4, usw) überprüfen soll...wenn du ein bisschen genauer beschreiben könntest, was du machen willst, gibts bestimmt eine bessere Lösung :)

Uwe Raabe 13. Nov 2009 13:23

Re: case mit einem in einem String gespeicherten Variablenna
 
Manchmal sieht man den Wald vor lauter Bäumen nicht, oder?

Delphi-Quellcode:
procedure TForm1.SetColor(Seite: Integer);
begin
  with ImCube.Canvas do begin
    case Seite of
      1: Brush.Color := clWhite;
      2: Brush.Color := clYellow;
      3: Brush.Color := clGreen;
      4: Brush.Color := clBlue;
      5: Brush.Color := clRed;
      6: Brush.Color := $000080FF;
    end;
  end;
end;
Delphi-Quellcode:
SetColor(FUL);
ImCube.Canvas.Rectangle(10, 64, 60, 114);
//[...]
SetColor(RDR);
ImCube.Canvas.Polygon([Point(196,128),Point(196,178),Point(214,160),Point(214,110)]);

steenvoortl 13. Nov 2009 13:34

Re: case mit einem in einem String gespeicherten Variablenna
 
Jo so gehts...

DANKE! :thumb:

Forlan 13. Nov 2009 13:43

Re: case mit einem in einem String gespeicherten Variablenna
 
Zitat:

Zitat von steenvoortl
Jo so gehts...

DANKE! :thumb:

Hast du auch verstanden warum es so geht? 1,2,3,4.. sind Zahlen, keine Zeichenketten... Und mit Strings + case funktioniert generell so nicht.. Da musst du schonmal einen Blick in die Codelibrary werfen, wenn das so gehen soll.

Gruß

p80286 13. Nov 2009 16:59

Re: case mit einem in einem String gespeicherten Variablenna
 
aus der D7-Hilfe:
Zitat:

case SelektorAusdruck of
caseList1: Anweisung1;
...
caseListn: Anweisungn;
end

... CaseListe muss von einem ordinalen Typ sein, der zum Typ von Selektor kompatibel ist......

patti 13. Nov 2009 17:04

Re: case mit einem in einem String gespeicherten Variablenna
 
Eine andere Möglichkeit wäre es, die Color-Werte als const-array zu hinterlegen und dann per Index darauf zuzugreifen. Beispiel:

Delphi-Quellcode:
const FarbenArray : array[1..6] of TColor = (clWhite, clYellow, clGreen, clBlue, clRed, $000080FF);
Dann kannst du beispielweise so darauf zugreifen:

Delphi-Quellcode:
ImCube.Canvas.Brush.Color := FarbenArray[FUL];
ImCube.Canvas.Rectangle(10, 64, 60, 114);
//[...]
ImCube.Canvas.Brush.Color := FarbenArray[RDR];
ImCube.Canvas.Polygon([Point(196,128),Point(196,178),Point(214,160),Point(214,110)]);
So kannst du dir die zusätzliche Routine (und damit auch das case) sparen ;-)

MFG,
Patti

steenvoortl 13. Nov 2009 17:51

Re: case mit einem in einem String gespeicherten Variablenna
 
Zitat:

Zitat von Forlan
Hast du auch verstanden warum es so geht? 1,2,3,4.. sind Zahlen, keine Zeichenketten... Und mit Strings + case funktioniert generell so nicht.. Da musst du schonmal einen Blick in die Codelibrary werfen, wenn das so gehen soll.

Gruß

Jo hab ich... nur bin ich irgendwie nicht auf die Idee gekommen, direkt den Wert der Variable an den Parameter der Prozedur zu geben, sondern hab irgendwie versucht, den Variablennamen an die Prozedur zu geben und da dann den Wert auszulesen xD

Wie schon richtig gesagt wurde... da hab ich wohl den Wald vor lauter Bäumen nicht gesehen :-D

alzaimar 13. Nov 2009 18:00

Re: case mit einem in einem String gespeicherten Variablenna
 
Wenn Du 27 einzelne Variablen hast, die irgendwie das gleiche (oder etwas ähnliches) darstellen, solltest Du über die Verwendung eines Arrays nachdenken.


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