Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi case of (https://www.delphipraxis.net/35759-case.html)

inst666 11. Dez 2004 14:01


case of
 
hi,
dies ist mein zweiter thread in diesem forum und programmiert hab ich auch noch net viel.
ich bin gerade bei der case of funktion und da haperts auch schon.
Ich hab da ne aufgabe, wonach ich ein Programm erstellen soll welches nach der Eingabe von :
&,%... 'Sonderzeichen'
1..10 'Zahl'
a,e... 'Kleinbuchstabe'
A,B... 'GrossBuchstabe' ausgbit.
Mein erster Versuch sag wie folgt aus :

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TZeichen = class(TForm)
    ein: TEdit;
    Label1: TLabel;
    Button1: TButton;
    Label2: TLabel;
    aus: TEdit;
    Button2: TButton;
    procedure Button2Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Zeichen: TZeichen;

implementation

{$R *.dfm}

procedure TZeichen.Button2Click(Sender: TObject);
begin
close;
end;

procedure TZeichen.Button1Click(Sender: TObject);

var zeichen, fehler :integer;
    ok :boolean;

begin

   val ( ein.text, zeichen, fehler ) ;
   ok := (fehler=0) ;

    if ok then

      begin

        case zeichen of
        A..Z :       ausgabe := 'Buchstabe' ;
        a..z :       ausgabe := 'Kleinbuchstabe';
        1..10 :      ausgabe := 'Zahl' ;
        '§','$','%' : ausgabe := 'Sonderzeichen';
        end;

        aus.Text := ausgabe ;

      end;

end;

end.
Vll kann mir ja jmd weiterhelfen.

gmarts 11. Dez 2004 14:07

Re: case of
 
Hi,
Guck mal, du hast die Variable ZEICHEN als Integer deklariert und fragst ab, ob sie Buchstaben enthält.


[Edit]Unsinn entfernt[/Edit]


Nimm dir eine ASCII-Tabelle zur Hilfe und schaue mal nach, welche Werte z.B. die Großbuchstaben haben....das sollte dir weiterhelfen.

MfG GM

malo 11. Dez 2004 14:12

Re: case of
 
1. Das ist kein gemeinschaftsprojekt, das du planst. Das gehört in ein anderes Forum (eins der Delphi-Foren oben)

2. Zu deinem Problem:

Groß-und Kleinbuchstaben unterscheidet Delphi so nicht ;)

Was hälst du von dem Code:

Delphi-Quellcode:
var
  Form1: TForm1;
  a : integer = 0;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin
  a := a+1; //a wird immer um 1 erhöht
  case a of
    1: ShowMessage ('a = 1'); // wenn a = 1 ist kommt diese Message
    2: ShowMessage ('a = 2'); // gleiches, nur hier ist a = 2
    3: begin
          ShowMessage ('a = 3'); // gleiches wenn a = 3 ist
          a := 0; // a wird auf 0 zurückgesetzt. Beim nächsten Klick ist es also 1
       end;
    end; // case-Anwendungen werden mit einem end beendet
end;
Dieses Beispiel braucht nur einen Button und sollte das ganze verständlich machen :)

Deine unit halte ich nämlich für etwas überkompliziert für einen Anfänger, der nur case lernen will ;)

gmarts 11. Dez 2004 14:17

Re: case of
 
Ach ja, den AsciiWert eines Zeichens bekommst du nicht mit Val, sondern mir Ord.

inst666 11. Dez 2004 14:39

Re: case of
 
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);

  var ch :char;
      aus :string[30];

begin

  case ch of
  '"','§','$','%' : aus := 'Sonderzeichen' ;
  end;

  edit2.Text := aus ;

end;

end.
ich habs auf die sonderzeichen beschraenkt. ich hab ch als char deklariert aber nun gibt er mir einfach nichts aus, :/

edit: und wie funktioniert so eine angabe mit ord ?

gmarts 11. Dez 2004 14:46

Re: case of
 
Case verlangt einen Ordinalen Typen!

Delphi-Quellcode:
case Ord(Buchstabe) of  {hier Asciiwert des Zeichens zurückgeben lassen}
111..123: bla bla; {hier prüfen, ob asciiwert in einem bestimmten Bereich steht(Sonderzeichen, Großbuchstaben, etc) ...siehe AsciiTabelle}
end;

bzw. hier ein einfaches Beispiel :
Delphi-Quellcode:
procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
case ord(key) of
100..200: showmessage('ein Zeichen aus 100 bis 200 gedrückt....');
32: showmessage('Leertaste gedrückt');
end;
end;

alcaeus 11. Dez 2004 15:06

Re: case of
 
Hallo inst666,

erstens musst du nicht jedes Mal die Komplette Unit posten, die relevante Prozedur/Funktion reicht eigentlich aus.
Nun zu deinem ersten Code:
Delphi-Quellcode:
procedure TZeichen.Button1Click(Sender: TObject);
var zeichen, fehler :integer;
    ok :boolean;
begin
   val ( ein.text, zeichen, fehler ) ;
   ok := (fehler=0) ;
    if ok then

      begin

        case zeichen of
        A..Z :       ausgabe := 'Buchstabe' ;
        a..z :       ausgabe := 'Kleinbuchstabe';
        1..10 :      ausgabe := 'Zahl' ;
        '§','$','%' : ausgabe := 'Sonderzeichen';
        end;
        aus.Text := ausgabe ;
      end;
end;
Du versuchst hier, den Text der im Edit "ein" eingegeben wurde, in eine Zahl umzuwandeln. Nachdem du aber auch mit der Eingabe von Buchstaben rechnest, wird fehler jedes Mal ungleich 0 sein.

Es geht aber viel einfacher:
Delphi-Quellcode:
procedure TZeichen.Button1Click(Sender: TObject);
var
  ausgabe: String;
begin
  if Length(ein.Text) = 0 then //Wenn kein Text eingegeben wurde, geben wir eine Fehlermeldung aus
    ausgabe := 'Kein Text eingegeben!'
  else //sonst sehen wir nach was los ist
  begin
    case ein.Text[1] of //im Moment interessiert uns nur das erste Zeichen
      'A'..'Z': ausgabe := 'Grossbuchstabe';
      'a'..'z': ausgabe := 'Kleinbuchstabe';
      '0'..'9': ausgabe := 'Ziffer';
      else
        ausgabe := 'Sonderzeichen';
    end;
  end;
  ShowMessage(ausgabe); //wir geben den Text aus
end;
In der Case-Abfrage fragen wir ab, ob es sich um einen Grossbuchstaben, einen Kleinbuchstaben oder eine Ziffer handelt. Dabei darf zwischen den Hochkommas immer nur ein Zeichen vorkommen. Der else-Zweig tritt ein, falls keine der vorherigen Bedingungen wahr sind. Wir nehmen in dem Fall an, dass es sich um ein Sonderzeichen handelt. Ich hoffe der Code verdeutlicht die Verwendung von case ein bisschen..

Greetz
alcaeus

DP-Maintenance 11. Dez 2004 15:07

DP-Maintenance
 
Dieses Thema wurde von "Christian Seehase" von "Projekte" nach "Sonstige Fragen zu Delphi" verschoben.
Es geht nicht um ein Projekt.

gmarts 11. Dez 2004 15:11

Re: case of
 
Ups.... :oops:

Alcaeus hat natürlich recht ...char ist auch nen Ordinaler Typ.

*imbodenversink*

malo 11. Dez 2004 15:47

Re: case of
 
@alcaeus: Die Variable "Ausgabe" und die letzte Zeile kann man sich im Grunde sparen, wenn man's gleich so macht:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  if Length(ein.Text) = 0 then //Wenn kein Text eingegeben wurde, geben wir eine Fehlermeldung aus
    ShowMessage('Kein Text eingegeben!')
  else //sonst sehen wir nach was los ist
  begin
    case ein.Text[1] of //im Moment interessiert uns nur das erste Zeichen
      'A'..'Z': ShowMessage('Grossbuchstabe');
      'a'..'z': ShowMessage('Kleinbuchstabe');
      '0'..'9': ShowMessage('Ziffer');
      else
         ShowMessage('Sonderzeichen');
    end;
  end;
end;
Edit: hab alle "Edit1" 's durch "ein" 's ersetzt... hatte ich bei mir anders zum testen, ohne den Namen des Editfelds ändern zu müssen ;)

alcaeus 11. Dez 2004 16:13

Re: case of
 
Hi malo,

Zitat:

Zitat von malo
@alcaeus: Die Variable "Ausgabe" und die letzte Zeile kann man sich im Grunde sparen, wenn man's gleich so macht:

das ist mir auch klar :roll:
Mir ging es darum, seinen Code ohne groessere Aenderungen zum Laufen zu bringen ;)

Greetz
alcaeus

inst666 11. Dez 2004 16:25

Re: case of
 
erstmal vielen dank!!
eine frage hab ich allerdings noch, kann man die case of funktion ueberpruefen lassen ob jmd in ein.text z.b. 'rot' eingibt ?
case .. of
'rot' : color := clRed ;
z.b. ??

alcaeus 11. Dez 2004 16:30

Re: case of
 
Nein, das geht nicht.
String ist nicht ein ordinaler Typ. Du musst also bei Stringabfragen immer mit if arbeiten:
Delphi-Quellcode:
if Farbe = 'Rot' then
  Color := clRed
else if Farbe = 'Gelb' then
  Color := clYellow
else if ...
Greetz
alcaeus

Nikolas 11. Dez 2004 16:31

Re: case of
 
Nein, wie schon gesagt erwartet Case of einen ordinalen Typ wie integer oder Byte. Ein String kannst du damit nicht auswerten, da musst du if benutzen.

inst666 11. Dez 2004 16:33

Re: case of
 
das hab ich mir auch gedacht, allerdings steht inner delphi hilfe folgendes:

case mycolor of
red: X := 1
green : X := 2
...
end;

variablen stehn aber auch nicht dabei nur das was ich gerade geschriebne hab :/

fkerber 11. Dez 2004 16:43

Re: case of
 
Hi!

Kannst du mal den ganzen Auszug posten?
Das da kommt mir sehr komisch vor.


Ciao Frederic

alcaeus 11. Dez 2004 17:10

Re: case of
 
Hi inst666,

der Abschnitt lautet zwar wirklich so
Delphi-Quellcode:
case MyColor of
  Red: X := 1;
  Green: X := 2;
  Blue: X := 3;
  Yellow, Orange, Black: X := 0;
end;
aber wie du siehst, kann es sich nicht um einen String handeln, da die ' fehlen.

Wenn du dir aber noch folgendes dazudenkst, dann stimmt der Code wieder:

Delphi-Quellcode:
type
  MyColors = (Black, Blue, Green, Orange, Red, Yellow);
//...
var
  MyColor: MyColors;
//...
//Hier kommt die case-Abfrage
Es funktioniert aber auch, wenn MyColor als Integer definiert ist, und Red, Green usw. als Konstanten deklariert sind.
Dies alles ändert aber nichts an der Tatsache, dass bei case nur ordinale Typen verwendet werden können. Alle Float- und String-Typen gehören da einfach mal nicht dazu, da kann man nichts ändern.

Greetz
alcaeus

fkerber 11. Dez 2004 17:12

Re: case of
 
Hi!

Axo, das war getrickst. Naja, dann ist klar. Hatte nicht an die '' gedacht.


Ciao Frederic

Nikolas 11. Dez 2004 17:13

Re: case of
 
Ganz umständlich, aber so wie verlangt, wäre doch eigentlich der Weg, den String in seiner Bit-Darstellung zu nehmen, das als Zahl zu lesen und mit der dann zu arbeiten. :P

// Nur eben schlecht zu warten...


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