![]() |
Verständnisfrage
Hallo!
Ich beschäftige mich grad mit der Übungsaufgabe der folgenden Webseite: ![]() Dazu habe ich folgende Lösung erarbeitet, die leider noch Fehler hat, deren Ursache ich nicht verstehe. Hier der Quelltext:
Delphi-Quellcode:
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.
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. 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 |
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. |
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:
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 |
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
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 01:37 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz