Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Zugriffsverletzung in Procedure (https://www.delphipraxis.net/8410-zugriffsverletzung-procedure.html)

Meflin 4. Sep 2003 09:16


Zugriffsverletzung in Procedure
 
also ich hab mir mal ne procedure gebastelt, die ein memo mit zufälligen zeichen füllen soll. keine sorge, 100 zeilen dieses codes sind eine case of anweisung! aber die zeile
Delphi-Quellcode:
Buffer.Lines[i] := zeile
verursacht eine zugriffsverletzung. hier nun das ganze script:
Delphi-Quellcode:
procedure create_mem(Memo: TMemo);
var i, zeilen, zeilenlen, x, zeichenr: integer;
zeichen, zeile : string;
Buffer: TMemo;
begin
  randomize;
  zeilen := random(80);
  for i := 1 to zeilen do begin
    zeilenlen := random(50);
    for x := 0 to zeilenlen do begin
      zeichenr := random(98);
      case zeichenr of
        0: zeichen := ' ';
        1: zeichen := ' ';
        2: zeichen := 'a';
        3: zeichen := 'b';
        4: zeichen := 'c';
        5: zeichen := 'd';
        6: zeichen := 'e';
        7: zeichen := 'f';
        8: zeichen := 'g';
        9: zeichen := 'h';
        10:zeichen := 'i';
        11:zeichen := 'j';
        12:zeichen := 'k';
        13:zeichen := 'l';
        14:zeichen := 'm';
        15:zeichen := 'n';
        16:zeichen := 'o';
        17:zeichen := 'p';
        18:zeichen := 'q';
        19:zeichen := 'r';
        20:zeichen := 's';
        21:zeichen := 't';
        22:zeichen := 'u';
        23:zeichen := 'v';
        24:zeichen := 'w';
        25:zeichen := 'x';
        26:zeichen := 'y';
        27:zeichen := 'z';
        28:zeichen := '1';
        29:zeichen := '2';
        30:zeichen := '3';
        31:zeichen := '4';
        32:zeichen := '5';
        33:zeichen := '6';
        34:zeichen := '7';
        35:zeichen := '8';
        36:zeichen := '9';
        37:zeichen := '0';
        38:zeichen := '+';
        39:zeichen := '*';
        40:zeichen := '#';
        41:zeichen := '~';
        42:zeichen := '''';
        43:zeichen := '-';
        44:zeichen := '.';
        45:zeichen := ':';
        46:zeichen := ';';
        47:zeichen := ':';
        48:zeichen := '_';
        49:zeichen := '!';
        50:zeichen := '"';
        51:zeichen := '§';
        52:zeichen := '$';
        53:zeichen := '%';
        54:zeichen := '&';
        55:zeichen := '/';
        56:zeichen := '(';
        57:zeichen := ')';
        58:zeichen := '=';
        59:zeichen := '?';
        60:zeichen := '@';
        61:zeichen := '€';
        62:zeichen := '²';
        63:zeichen := '³';
        64:zeichen := '[';
        65:zeichen := ']';
        66:zeichen := '{';
        67:zeichen := '}';
        68:zeichen := 'ß';
        69:zeichen := '\';
        70:zeichen := '<';
        71:zeichen := '>';
        72:zeichen := '|';
        73:zeichen := 'A';
        74:zeichen := 'B';
        75:zeichen := 'C';
        76:zeichen := 'D';
        77:zeichen := 'E';
        78:zeichen := 'F';
        79:zeichen := 'G';
        80:zeichen := 'H';
        81:zeichen := 'I';
        82:zeichen := 'J';
        83:zeichen := 'K';
        84:zeichen := 'L';
        85:zeichen := 'M';
        86:zeichen := 'N';
        87:zeichen := 'O';
        88:zeichen := 'P';
        89:zeichen := 'Q';
        90:zeichen := 'R';
        91:zeichen := 'S';
        92:zeichen := 'T';
        93:zeichen := 'U';
        94:zeichen := 'V';
        95:zeichen := 'W';
        96:zeichen := 'X';
        97:zeichen := 'Y';
        98:zeichen := 'Z';
      end;
      zeile := zeile + zeichen;
    end;
    Buffer.Lines[i] := zeile;
  end;
  Memo.Text := Buffer.Text;
end;
wieso funzt das nich?

*MFG & THX*

Phoenix 4. Sep 2003 09:19

Re: Zugriffsverletzung in Procedure
 
Nimm anstelle Buffer.Lines[i] := zeile am besten ein Buffer.Lines.Add(zeile);

Und initialisier zeile am Anfang am besten noch mit einem leeren String.

Meflin 4. Sep 2003 09:22

Re: Zugriffsverletzung in Procedure
 
ne... hat nix genützt!

neolithos 4. Sep 2003 09:28

Re: Zugriffsverletzung in Procedure
 
Die Zugriffs Verletzung entsteht da es an der i-ten Position noch keine Zeile gibt.

Und BITTE überdenke dein case n of

0..26: zeichen := char(zeichenr)

Und BITTE nutze ungarische notationen

var i,
iZeilen,
iZeilenLen,
x,
iZeichen : integer;
sZeichen,
sZeile : string;

kann man wesentlich besser lesen.
:wink: dann find ich den Fehler auch besse :wink:

mirage228 4. Sep 2003 09:29

Re: Zugriffsverletzung in Procedure
 
ich würde das memo auch vorher erstellen

Delphi-Quellcode:
Buffer := TMemo.Create(nil);
so solltes gehn

mfG
mirage228

Meflin 4. Sep 2003 09:33

Re: Zugriffsverletzung in Procedure
 
@ mirage hab ich jetzt gemacht, jetzt krieg ich nen fehler
Delphi-Quellcode:
Element " hat kein übvergeordnetes Fenster
...
:coder:

neolithos 4. Sep 2003 09:36

Re: Zugriffsverletzung in Procedure
 
Jetzt seh ich's

Du brauchst kein Memo erstellen sondern es reicht wenn du ein TStringList-Object erstellst...

Meflin 4. Sep 2003 09:39

Re: Zugriffsverletzung in Procedure
 
jetzt krieg ich nen fehler
Delphi-Quellcode:
Listenindex überschreitet das maximum!

mirage228 4. Sep 2003 09:40

Re: Zugriffsverletzung in Procedure
 
dann würde ich anstatt
Delphi-Quellcode:
Buffer := TMemo.Create(nil);
schreiben:
Delphi-Quellcode:
Buffer := TMemo.Create(Application.MainForm);
und dann "Buffer.Name := 'Buffer'";

mfG
mirage228

Meflin 4. Sep 2003 09:44

Re: Zugriffsverletzung in Procedure
 
Delphi-Quellcode:
Element Buffer hat kein übergeordnetes Fenster
...
:freak:

mirage228 4. Sep 2003 09:49

Re: Zugriffsverletzung in Procedure
 
Der Constructor von TMemo erwartet doch nur AOwner: TComponent als Parameter, da müsste "Application.MainForm" klappen. Bei mir klappt das so (D3 Prof.). Hast du buffer auch als TMemo deklariert?

Delphi-Quellcode:
Buffer := TMemo.Create(Application.MainForm);
Buffer.Parent := Application.MainForm;
Buffer.Name := 'Buffer';

neolithos 4. Sep 2003 09:50

Re: Zugriffsverletzung in Procedure
 
Mal ne saubere alternative....

Delphi-Quellcode:
procedure create_mem(Memo: TMemo);
const
  csZeichen : array [0..97] of char = 'ABC zeichen noch eingeben';
var y,
    iZeilen,
    iZeilenLen,
    x : integer;
    sZeile : string;
    lstBuf : TStringList;
begin
  randomize;
  lstBuf := TStringList.Create;
  try
    iZeilen := random(80);
    for y := 1 to iZeilen do
        begin
          iZeilenLen := random(50);
          sZeile := '';
          for x := 0 to iZeilenLen do
              sZeile := sZeile + csZeichen[random(98)];
         lstBuf.Add(sZeile);
       end;
    Memo.Clear;
    Memo.Lines.Assign(lstBuf);
  finally
    lstBuf.Free;
  end;
end;

Meflin 4. Sep 2003 09:54

Re: Zugriffsverletzung in Procedure
 
saubere variante, die genau die gleiche exeption auslöst!

neolithos 4. Sep 2003 09:55

Re: Zugriffsverletzung in Procedure
 
Wart mal kurz ich probier sie mal aus...

Meflin 4. Sep 2003 09:56

Re: Zugriffsverletzung in Procedure
 
@ mirage ok, die exeption is weg. aber jetzt füllt er das memo nur mit Buffer!

mirage228 4. Sep 2003 09:57

Re: Zugriffsverletzung in Procedure
 
ich würde Buffer nach dem createn dann vllt leeren (Buffer.Clear) und dann die Zeilen mit Buffer.Lines.Add(...); hinzufügen, so müsstes gehen.

mfG
mirage228

Meflin 4. Sep 2003 09:59

Re: Zugriffsverletzung in Procedure
 
ich wüst nicht wieso. das is ja schon created!

neolithos 4. Sep 2003 09:59

Re: Zugriffsverletzung in Procedure
 
Getestet und Läuft...

Was übergibst du bei dem Parameter Memo?

Und den csZeichen würde ich vor noch mit Zeichen auffüllen ABC war nur ein Bsp.

Meflin 4. Sep 2003 10:03

Re: Zugriffsverletzung in Procedure
 
ich ruf das so auf:
Delphi-Quellcode:
create_mem(memo1)

neolithos 4. Sep 2003 10:05

Re: Zugriffsverletzung in Procedure
 
Poste mal den Stand der Funktion!

Wie gesagt bei geht es wunderbar.

Meflin 4. Sep 2003 10:06

Re: Zugriffsverletzung in Procedure
 
ok alles klar, hab den fehler gefunden! jetzt funzts!

BIG THX all

neolithos 4. Sep 2003 10:10

Re: Zugriffsverletzung in Procedure
 
Und was war der Fehler?????? :?:

Meflin 4. Sep 2003 10:11

Re: Zugriffsverletzung in Procedure
 
ich hatte das ABC... noch nicht aufgefüllt!


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