AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Verständnisfrage

Ein Thema von Lernnix · begonnen am 31. Aug 2005 · letzter Beitrag vom 31. Aug 2005
Antwort Antwort
Lernnix

Registriert seit: 10. Feb 2005
Ort: Mainz
15 Beiträge
 
Delphi 5 Professional
 
#1

Verständnisfrage

  Alt 31. Aug 2005, 17:16
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
  Mit Zitat antworten Zitat
Benutzerbild von GuenterS
GuenterS

Registriert seit: 3. Mai 2004
Ort: Österreich > Bad Vöslau
760 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: Verständnisfrage

  Alt 31. Aug 2005, 17:52
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.
Günter
Pünktlichkeit ist die Fähigkeit vorherzusagen um wieviel sich der Andere verspäten wird.
  Mit Zitat antworten Zitat
Lernnix

Registriert seit: 10. Feb 2005
Ort: Mainz
15 Beiträge
 
Delphi 5 Professional
 
#3

Re: Verständnisfrage

  Alt 31. Aug 2005, 19:27
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 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
  Mit Zitat antworten Zitat
Benutzerbild von GuenterS
GuenterS

Registriert seit: 3. Mai 2004
Ort: Österreich > Bad Vöslau
760 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: Verständnisfrage

  Alt 31. Aug 2005, 20:57
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;
Günter
Pünktlichkeit ist die Fähigkeit vorherzusagen um wieviel sich der Andere verspäten wird.
  Mit Zitat antworten Zitat
31. Aug 2005, 21:54
Dieses Thema wurde von "Christian Seehase" von "Klatsch und Tratsch" nach "Sonstige Fragen zu Delphi" verschoben.
Ist ein Delphi-Problem
Antwort Antwort


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 10:22 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