Announcement

Collapse
No announcement yet.

EAccessViolation

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • EAccessViolation

    Was bedeutet die Fehlermeldung: Zugriffsverletzung bei Adresse 00428FAB ?
    Hier der Quelltext: (der Fehler tritt am Anfang der IF-Abfrage auf)

    procedure TForm1.BitBtn1Click(Sender: TObject);

    var
    s,vor,genau,nach:string;
    a,i,y:integer;

    begin
    MemoLaenge;
    form1.memo2.clear;
    For y:=0 to Zeilen do
    Begin
    s:=Form1.memo1.lines[y];
    a:=length(s);
    i:=1;
    repeat
    if s[i]='ä' then
    Begin
    Vor:=Copy(S,1,i-1);
    genau:='ae';
    Nach:=copy (S,(i+1),(a-1));
    S:=vor+genau+nach;
    a:=a+1;
    end;
    if s[i]='ö' then
    Begin
    Vor:=Copy(S,1,i-1);
    genau:='oe';
    Nach:=copy (S,(i+1),(a-1));
    S:=vor+genau+nach;
    a:=a+1;
    end;
    if s[i]='ü' then
    Begin
    Vor:=Copy(S,1,i-1);
    genau:='ue';
    Nach:=copy (S,(i+1),(a-1));
    S:=vor+genau+nach;
    a:=a+1;
    end;
    if s[i]='ß' then
    Begin
    Vor:=Copy(S,1,i-1);
    genau:='ss';
    Nach:=copy (S,(i+1),(a-1));
    S:=vor+genau+nach;
    a:=a+1;
    end;
    i:=i+1;
    until i=a;
    form1.memo2.lines.add(s);
    end;

  • #2
    Hallo,<p>
    Die Routine soll offenbar Umlaute umwandeln.
    Warum es genau zu deon oben beschriebenen Fehler kommt kann ich dir leider nicht sagen, da du nur Teile des Quellcodes geschrieben hast. Allerdings sind mir gleich ein paar mögliche (?) Logikfehler aufgefallen:<p>
    - Du schreibst bei der Schleife: "<b>For y:= 0 to Zeilen do Begin</b>" ... Leider sehe ich nirgends wo du die Variable Zeilen setzt. Da die erste Zeile "<b>Lines[0]</b>" ist, ist die letzte "<b>Lines[Count - 1]</b>" also, die Zeilenanzahl - 1 !!!<p>
    - Wenn eine Zeile leer ist, springt der Computer trotzdem in deine <b>repeat</b>-Schleife. In dieser Schleife greifst du automatisch aufs erste Zeichen zu, das erzeugt natürlich in diesem Fall eine Fehlermeldung. Außerdem wäre die Länge der Zeile (Variable <b>a</b>) 0, und der Zeichenzähler (Variable <b>i</b>) beginnt bei 1, das würde also zu einer Endlosschleife führen. Verwende statt dessen lieber eine <b>while</b>-Schleife.<p><hr>
    Außerdem leidet die Performance und die Übersichtlichkeit etwas unter dieser Algorithmus, ich würde das eher wie folgt schreiben:<p>

    <code><pre>
    <font face="Courier New"><font color="#000080"><b>procedure</b></font> TForm1<font color="#FF0000">.</font>Button1Click<font color="#FF0000">(</font>Sender<font color="#FF0000">:</font> TObject<font color="#FF0000">)</font><font color="#FF0000">;</font>
    <font color="#000080"><b>begin</b></font>
    Memo2<font color="#FF0000">.</font>Text <font color="#FF0000">:=</font> UmlauteUmwandeln<font color="#FF0000">(</font>Memo1<font color="#FF0000">.</font>Text<font color="#FF0000">)</font><font color="#FF0000">;</font>
    <font color="#000080"><b>end</b></font><font color="#FF0000">;</font>
    <br>
    <font color="#008000"><i>//------------------------------------------------------------------------------</i></font>
    <br>
    <font color="#008000"><i>// Wandelt in den &Uuml;bergebenen Ausgangstext die Umlaute um, und liefert als Result</i></font>
    <font color="#008000"><i>// diesen Text zur&Uuml;ck.</i></font>
    <font color="#000080"><b>function</b></font> TForm1<font color="#FF0000">.</font>UmlauteUmwandeln<font color="#FF0000">(</font>Ausgangstext<font color="#FF0000">:</font> <font color="#000080"><b>string</b></font><font color="#FF0000">)</font><font color="#FF0000">:</font> <font color="#000080"><b>string</b></font><font color="#FF0000">;</font>
    <font color="#000080"><b>var</b></font>
    i<font color="#FF0000">:</font> Integer<font color="#FF0000">;</font>
    <font color="#000080"><b>begin</b></font>
    Result <font color="#FF0000">:=</font> <b>''</b><font color="#FF0000">;</font> <font color="#008000"><i>// &lt;- zur Sicherheit bei Strings Result löschen</i></font>
    <font color="#000080"><b>for</b></font> i <font color="#FF0000">:=</font> 1 <font color="#000080"><b>to</b></font> Length<font color="#FF0000">(</font>Ausgangstext<font color="#FF0000">)</font> <font color="#000080"><b>do</b></font>
    <font color="#000080"><b>case</b></font> Ausgangstext<font color="#FF0000">[</font>i<font color="#FF0000">]</font> <font color="#000080"><b>of</b></font>
    <b>'ä'</b><font color="#FF0000">:</font> Result <font color="#FF0000">:=</font> Result <font color="#FF0000">+</font> <b>'ae'</b><font color="#FF0000">;</font>
    <b>'ö'</b><font color="#FF0000">:</font> Result <font color="#FF0000">:=</font> Result <font color="#FF0000">+</font> <b>'oe'</b><font color="#FF0000">;</font>
    <b>'&Uuml;'</b><font color="#FF0000">:</font> Result <font color="#FF0000">:=</font> Result <font color="#FF0000">+</font> <b>'ue'</b><font color="#FF0000">;</font>
    <b>'ß'</b><font color="#FF0000">:</font> Result <font color="#FF0000">:=</font> Result <font color="#FF0000">+</font> <b>'ss'</b><font color="#FF0000">;</font>
    <font color="#000080"><b>else</b></font> <font color="#008000"><i>// normaler Buchstabe?</i></font>
    Result <font color="#FF0000">:=</font> Result <font color="#FF0000">+</font> AusgangsText<font color="#FF0000&quot

    Comment


    • #3
      <p>
      Bei der <b>"UmlauteUmwandeln"</b> handelt es sich um eine lokale Funktion. So wäre das Programm wesentlich schneller und übersichtlicher *herummecker* *g*. Hier noch ein paar Programmiertips:<p>
      - Wenn Du auf Sachen (Objekte, Eigenschaften, Methoden, Ereignisse) von Formular innerhalb einer Formualroutine zugreifst, musst du nicht mehr unbedingt dass "Form1." dazuschreiben.<p>
      Statt <b>"s:=Form1.memo1.lines[y];"</b> reicht also <b>"s:=Memo1.Lines[y]"</b>.<p>
      - Fasse lange Funktionen die du vielleicht später wieder mal brauchen könntest, lieber in einer eigenen Funktion zusammen, anstatt sie ins Ereignis zu pressen.<p>
      - Versuche längere Variablennamen zu nehmen *tadel*, also nicht a oder y oder so was. Ausnahme sind vielleicht for-Schleifenvariablen wie "i" und (oder "x" und "y" für Koordinaten).<p>
      - Ab und zu ein Kommentar kann auch nicht schaden....<p>
      - Für deine Funktion eignet sich die Text-Eigenschaft besser wie Lines. Dadurch hast du Zugriff auf den ganzen Text. Außerdem müssen beim Aufruf von Lines ein paar Hintergrundberechnungen durchgeführt werden, wodurch der Aufruf von Text ein wenig schneller ist.<p>
      - Anstatt Memo2 am Anfang zu löschen "form1.memo2.clear;" und später den text zu setzen "form1.memo2.lines.add(s)" kannst du gleich schreiben "memo2.Text := s;", der ältere evtl. vorhandene Text wird dabei automatisch gelöscht.<p>
      - Wenn u eine Varibale um einen bestimmten Wert erhöhten oder erniedrigen willst, verwende am besten die <b>Inc</b> oder <b>Dec</b>-Funktion. Der Compiler kann diese Funktion speziell optimieren, und daher ist z.B. "Inc(a);" schneller als "a := a + 1;"...<p>
      - Ach ja, wahrscheinlich musst du noch die Grossbuchstaben-Umlaute in deinem Quellcode ‚Ä', ‚Ö', ‚Ü' einbauen, aber das dürfte kein Problem sein....<p>
      - Hm, noch ein Tipp: Wenn du im Forum Quellcodes schreibst dann ist es besser wenn du den <b>PRE</b>-Html-Befehl verwendest, dadurch bleiben Zeilenumbrüche im Quellcode erhalten. Noch besser geht es mit den Gexperts, die du dir unter http://www.gexperts.org/ gratis downloaden kannst, du kannst dann Quellcode automatisch mit den richtigen farben als Html-Code exportieren.<p>
      <p>
      Hm, so genug gemeckert, das Ersetzen von Textteilen mit reinen Delphi ohne Zusatzunits ist etwas schwierig, ich weiß, hab mich selber lang damit herumgeschlagen, ansonsten passt der Quellcode *g*,<p>
      viel spaß noch beim Delphi-Programmieren,<br>
      Gruß,
      der neunmalkluge Bernhard *g

      Comment


      • #4
        Diese scheiss Längenbegrenzung....... jetzt hat sie mir den Rest des Codes oben abgeschnitten..... deshalb hier noch mal die der Quellcode komplett:<p>
        <code><pre>
        <font face="Courier New"><font color="#000080"><b>procedure</b></font> TForm1<font color="#FF0000">.</font>Button1Click<font color="#FF0000">(</font>Sender<font color="#FF0000">:</font> TObject<font color="#FF0000">)</font><font color="#FF0000">;</font>
        <font color="#000080"><b>begin</b></font>
        Memo2<font color="#FF0000">.</font>Text <font color="#FF0000">:=</font> UmlauteUmwandeln<font color="#FF0000">(</font>Memo1<font color="#FF0000">.</font>Text<font color="#FF0000">)</font><font color="#FF0000">;</font>
        <font color="#000080"><b>end</b></font><font color="#FF0000">;</font>
        <br>
        <font color="#008000"><i>//------------------------------------------------------------------------------</i></font>
        <br>
        <font color="#008000"><i>// Wandelt in den &Uuml;bergebenen Ausgangstext die Umlaute um, und liefert als Result</i></font>
        <font color="#008000"><i>// diesen Text zur&Uuml;ck.</i></font>
        <font color="#000080"><b>function</b></font> TForm1<font color="#FF0000">.</font>UmlauteUmwandeln<font color="#FF0000">(</font>Ausgangstext<font color="#FF0000">:</font> <font color="#000080"><b>string</b></font><font color="#FF0000">)</font><font color="#FF0000">:</font> <font color="#000080"><b>string</b></font><font color="#FF0000">;</font>
        <font color="#000080"><b>var</b></font>
        i<font color="#FF0000">:</font> Integer<font color="#FF0000">;</font>
        <font color="#000080"><b>begin</b></font>
        Result <font color="#FF0000">:=</font> <b>''</b><font color="#FF0000">;</font> <font color="#008000"><i>// &lt;- zur Sicherheit bei Strings Result löschen</i></font>
        <font color="#000080"><b>for</b></font> i <font color="#FF0000">:=</font> 1 <font color="#000080"><b>to</b></font> Length<font color="#FF0000">(</font>Ausgangstext<font color="#FF0000">)</font> <font color="#000080"><b>do</b></font>
        <font color="#000080"><b>case</b></font> Ausgangstext<font color="#FF0000">[</font>i<font color="#FF0000">]</font> <font color="#000080"><b>of</b></font>
        <b>'ä'</b><font color="#FF0000">:</font> Result <font color="#FF0000">:=</font> Result <font color="#FF0000">+</font> <b>'ae'</b><font color="#FF0000">;</font>
        <b>'ö'</b><font color="#FF0000">:</font> Result <font color="#FF0000">:=</font> Result <font color="#FF0000">+</font> <b>'oe'</b><font color="#FF0000">;</font>
        <b>'&Uuml;'</b><font color="#FF0000">:</font> Result <font color="#FF0000">:=</font> Result <font color="#FF0000">+</font> <b>'ue'</b><font color="#FF0000">;</font>
        <b>'ß'</b><font color="#FF0000">:</font> Result <font color="#FF0000">:=</font> Result <font color="#FF0000">+</font> <b>'ss'</b><font color="#FF0000">;</font>
        <font color="#000080"><b>else</b></font> <font color="#008000"><i>// normaler Buchstabe?</i></font>
        Result <font color="#FF0000">:=</font> Result <font color="#FF0000">+</font> AusgangsText<font color="#FF0000">[</font>i<font color="#FF0000">]</font>
        <font color="#000080"><b>end</b></font><font color="#FF0000">;</font> <font color="#008000"><i>// End Case</i></font>
        <font color="#000080"><b>end</b></font><font color="#FF0000">;</font></font>
        </pre></code&gt

        Comment

        Working...
        X