Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Verständnisfrage (https://www.delphipraxis.net/52629-verstaendnisfrage.html)

Lernnix 31. Aug 2005 17:16


Verständnisfrage
 
Hallo!

Ich beschäftige mich grad mit der Übungsaufgabe der folgenden Webseite:

http://www.plauener.de/lessing/delphi/dpue120.htm

Dazu habe ich folgende Lösung erarbeitet, die leider noch Fehler hat, deren Ursache ich nicht verstehe. Hier der Quelltext:

Delphi-Quellcode:
unit main;

interface

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

type
  TForm1 = class(TForm)
    edString: TEdit;   //Die Eingabezeile mit der zu manipulierenden Zeichenkette
    edStelle: TEdit;   //Angabe einer Zeichenposition für die Manipulationen gemäß Aufgabe
    edZeichen: TEdit;  //Angabe Zeichen, das in der Zeichenkette gesucht, gelöscht... wird
    edLen: TEdit;      //Länge der zu manipulierenden Zeichenkette in edString
    edCount: TEdit;    //Anzahl der Zeichen v. edZeichen.Text in edString.Text
    Label1: TLabel;
    Label2: TLabel;    //Die Labels dienen der Beschriftung der Eingabezelen
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel; //Dann kommen versch. Buttons zur Manipulation der Zeichenkette
    btnOhneErstes: TButton;    //Erstes Zeichen löschen
    btnOhneLetztes: TButton;   //Letztes Zeichen löschen
    btnLoescheStelle: TButton; //Zeichen an Position StrToInt(edStelle.Text) löschen
    btnEinfg: TButton;         //Zeichen an Position StrToInt(edStelle.Text) einfügen
    btnAllesGross: TButton;               //Zeichen steht in edZeichen.Text
    btnAllesKlein: TButton;    //Alles groß/klein dürfte klar sein
    btnAnzahlZeichen: TButton; //Anzahl der Vorkommen des edZeichen.Text in edString.Text
    btnEntfZeichen: TButton;   //Alle Zeichen in edString.Text = edZeichen.Text -> raus
    btnUmkehr: TButton;        //edString.Text rückwärts
    RadioGroup1: TRadioGroup;  //Palindrom? <Otto? -> JA> <Karre? NEIN>
    procedure edStringChange(Sender: TObject); //Bei Änderung Exception ==> WARUM???
    procedure FormCreate(Sender: TObject);
    procedure btnLoescheStelleClick(Sender: TObject); //Die Event-Handler
    procedure btnOhneLetztesClick(Sender: TObject);
    procedure btnOhneErstesClick(Sender: TObject);
    procedure btnEinfgClick(Sender: TObject);
    procedure btnAllesGrossClick(Sender: TObject);
    procedure btnAllesKleinClick(Sender: TObject);
    procedure btnAnzahlZeichenClick(Sender: TObject);
    procedure btnEntfZeichenClick(Sender: TObject);
    procedure btnUmkehrClick(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
    function CountOfChar(ch: char): Integer;
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

function TForm1.CountOfChar(ch: char): Integer;
var CCount,i: Integer;
begin
   Result := 0;
   for i := 1 to Length(edString.Text) do
   if edString.Text[i] = ch then inc(CCount);
   Result := CCount;
end;

procedure TForm1.edStringChange(Sender: TObject);
begin
   edLen.Text  := IntToStr(Length(edString.Text));
   edCount.Text := IntToStr(CountOfChar(edZeichen.Text[1]))
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
   edString.Text := 'Rallye';
   edStelle.Text := '';
   edZeichen.Text := '';
   edLen.Text := '';
   edCount.Text := '';
end;

procedure TForm1.btnLoescheStelleClick(Sender: TObject);
var NewString: String;
begin
   if edStelle.Text = '' then
   begin
     ShowMessage('Bitte zuerst Stellenzahl eingeben!');
     Exit;
   end;
   NewString := edString.Text;
   System.Delete(NewString,StrToInt(edStelle.Text),1);
   edString.Text := NewString;
end;

procedure TForm1.btnOhneLetztesClick(Sender: TObject);
var NewString: String;
begin
   NewString := edString.Text;
   Delete(NewString,Length(edString.Text),1);
   edString.Text := NewString;
end;

procedure TForm1.btnOhneErstesClick(Sender: TObject);
var NewString: String;
begin
   NewString := edString.Text;
   Delete(NewString,1,1);
   edString.Text := NewString;
end;

procedure TForm1.btnEinfgClick(Sender: TObject);
var NewString: String;
begin
   NewString := edString.Text;
   Insert(edZeichen.Text,NewString,StrToInt(edStelle.Text));
   edString.Text := NewString;
end;

procedure TForm1.btnAllesGrossClick(Sender: TObject);
begin
   edString.Text := UpperCase(edString.Text);
end;

procedure TForm1.btnAllesKleinClick(Sender: TObject);
begin
   edString.Text := LowerCase(edString.Text);
end;

procedure TForm1.btnAnzahlZeichenClick(Sender: TObject);
begin
   edCount.Text := IntToStr(CountOfChar(edZeichen.Text[1]))
end;

procedure TForm1.btnEntfZeichenClick(Sender: TObject);
var i: Integer; NewString: String;
begin
   NewString := edString.Text;
   for i:=1 to Length(NewString) do
     if edString.Text[i] = edZeichen.Text[1] then
     begin
       Delete(NewString,i,1);
     end;
   edString.Text := NewString;
end;

procedure TForm1.btnUmkehrClick(Sender: TObject);
var temp: string;
    idx: Integer;
begin
   for idx := Length(edString.Text) downto 1 do
    temp := temp + edString.Text[idx];
end;

end.
Wenn ich edZeichen.Text oder edStelle.Text nicht ausgefüllt habe kriege ich ne Zugriffsverletzung. Wenn ich auf das Textfeld einer dieser Eingabezeilen zugreifen will, ohne dass da was drin steht, sehe ich die Zugriffsverletzung ja ein. ABER ich erhalte auch bei btnUmkehrClick(Sender) eine Zugriffsverletzung, wenn eins der o.g. Felder leer ist. Warum ist das so? Wenn edZeichen.Text und EdStelle.Text korrekt ausgefüllt sind, kommt keine Exception.
Auch wenn ich in edString.Text den Eingabetext verändere tritt die Exception unter gleichen Bedingungen auf. Sonst funktioniert das Prog wie erwartet. (außer Palindrom, weil noch nicht implementiert)

In FormCreate bestimme ich dass edString.Text bei Programmstart mit dem Wort 'Rallye' vorbelegt ist. Die anderen Eingabefelder sind zunächst leer.

Wer kann mir die Ursache erklären.

Lernnix

GuenterS 31. Aug 2005 17:52

Re: Verständnisfrage
 
Naja weil du downto 1 machst ... wenn was drinsteht auch richtig nur, wenn nix drinsteht ist 1 zuviel... also einfach vorher ne if abfrage auf <> '' machen.



und in
procedure TForm1.edStringChange(Sender: TObject);
begin
edLen.Text := IntToStr(Length(edString.Text));
edCount.Text := IntToStr(CountOfChar(edZeichen.Text[1]))
end;
greifst Du auf das 1 Zeichen in edZeichen.Text zu, wenns leer ist, wars auch da eins zuviel... bzw. dann nicht drauf zu greifen. Leerer String ist nunmal leer. Auch da würd ich ne if <> '' davor machen und im else zweig edCount.Text auf '0' setzen.

bzw. was soll eigentlich CountOfChar(edZeichen.Text[1]) bringen? Was wäre gegen Length(edZeichen.text) einzuwenden, dann bräuchtest auch keine Abfrage auf <> '' an der stelle.

Lernnix 31. Aug 2005 19:27

Re: Verständnisfrage
 
Hallo GuenterS!

Danke, für die schnelle Hilfe. Die IF Abfrage löst das Problem. Falls edZeichen.Text leer, dann schreib ich eben ne '0' in edCount.Text. PROBLEM GELÖST!!!!!!!!

Zitat:

Zitat von GuenterS
was soll eigentlich CountOfChar(edZeichen.Text[1]) bringen? Was wäre gegen Length(edZeichen.text) einzuwenden, dann bräuchtest auch keine Abfrage auf <> '' an der stelle.

in edZeichen.Text steht ein einzelnes Zeichen, dessen Vorkommen in edString.Text gezählt werden soll oder mit EntfZeichenClick(Sender) zu löschen sind. So war die Aufgabenstellung auf der Internetseite.

CountOfChar(edZeichen.Text[1]) zählt die Anzahl der Zeichen in edString.Text, die mit edZeichen.Text[1] übereinstimmen. CountOfChar() ist eine Methode meiner Form. So krigt die Funktion den Parameter edString.Text implizit übergeben, als Variable, definiert in der Form.

Es grüßt

Lernnix

GuenterS 31. Aug 2005 20:57

Re: Verständnisfrage
 
Die Anzahl könntest Du auch so kriegen... und vielleicht hast Du es ja auch so

Delphi-Quellcode:
function MyCountOfChar(aStr: string; aChar: char):integer;
begin
   Result := length(aStr) - length(StringReplace(aStr, aChar, '', [rfReplaceAll]));
end;

DP-Maintenance 31. Aug 2005 21:54

DP-Maintenance
 
Dieses Thema wurde von "Christian Seehase" von "Klatsch und Tratsch" nach "Sonstige Fragen zu Delphi" verschoben.
Ist ein Delphi-Problem


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