Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Memo-Feld: Zeile und Buchstabe auslesen (https://www.delphipraxis.net/158298-memo-feld-zeile-und-buchstabe-auslesen.html)

Michelle 12. Feb 2011 15:03

Memo-Feld: Zeile und Buchstabe auslesen
 
Hallo!

Ich hab da mal ein Problem: Ich habe ein Memo-Feld, aus dem ich den k-ten Buchtaben aus der i-ten Zeile auslesen muss.

Mit Memo1.Lines[i] wähle ich die i-te Zeile an, aber wie bekomme ich dann den Buchstaben? Ich wollte schon die Zeile in einen String machen und dann mit String[k] den Buchstaben auslesen, aber eine Memo-Zeile hat bei mir 800 Buchstaben, dass sprengt jeden Sting (TStringlist hat auch nicht funktioniert). Und Memo1.Lines[i][k] hat mir die Fehlermeldung "Zugriffsverletzung auf Adresse ..." serviert.

An dem "kleinem" Problem scheitert gerade mein ganzes Programm! Für Hilfe wäre ich echt dankbar!

Aphton 12. Feb 2011 15:21

AW: Memo-Feld: Zeile und Buchstabe auslesen
 
Lol?
Wieviel RAM hast du?
800 Buchstaben entsprechen 800 Bytes < 1 KB (1024 Bytes)
Ich schätze mal, solange dein RAM > 256mb (Systemanwendung usw eingeschlossen), wirds schon halbswegs in Ordnung sein.
Ansonsten:

Delphi-Quellcode:
var
  i, k: Integer;
  s: String;
begin
{...}
  s := Memo1.Lines[i];
  ShowMessage( s[k] );
{...}
end;
(eh so wie du es beschrieben hast)
Falls weiterhin Fehler auftreten, poste hier die Fehlermeldungen!

s.h.a.r.k 12. Feb 2011 15:23

AW: Memo-Feld: Zeile und Buchstabe auslesen
 
Mal schnell runtergetippt:
Delphi-Quellcode:
function GetMemoChar(const AMemo: TMemo; const ALine: Integer; const AIndex: Integer): Char;
begin
var
  LineNumber : Integer;
  Line : String;
begin
  Result := #0;
  LineNumber := 10;
  if (Memo1.Lines.Count > LineNumber) then
  begin
    Line := Memo1.Lines[0];
    if (AIndex > 0) and (AIndex <= Length(Line)) then
      Result := Line[AIndex];
  end;
end;
Hinweis: AIndex muss 1 oder größer sein, d.h. das erste Zeichen in einem String wird mit dem Index 1, das zweite mit Index 2 etc. angesprochen.

PS: Strings nehmen beliebig viele Zeichen auf.

Michelle 12. Feb 2011 15:59

AW: Memo-Feld: Zeile und Buchstabe auslesen
 
Eigentlich habe ich alles so gemacht, wie ihr es schon beschrieben habt:
Code:
 
 {...}
FormLvl.MemoLoad1.Lines.LoadFromFile('{...}');
for i := 1 to 800 do
begin
  t := FormLvl.MemoLoad1.Lines[i];
  for k := 1 to 120 do
    if t[k] = '0' then Area1[i,k] := false else Area1[i,k] := true;
end;
Area1 ist so definiert:
Code:
  Area1 : Array[0..800,  1..120] of Boolean;
Die Fehlermeldung lautet:
"Im Projekt Midby.exe ist eine Exception der Klasse EAccessViolation aufgetreten. Meldung: 'Zugriffsverletzung bei Adresse 0046B6B6 in Modul 'Midby.exe'. Lesen von Adresse 00000000'. Prozess angehalten. Mit Einzelne Anweisung oder Start fortsetzen."
Wenn die Fehlermeldung erscheint ist die Zeile "if t[k] = 0 ... " blau unterlegt.

Ich versteh das nicht, eigentlich müsste das doch richtig sein, oder?

Bummi 12. Feb 2011 16:21

AW: Memo-Feld: Zeile und Buchstabe auslesen
 
Hat Dein Memo 801 Zeilen, hat jede Zeile 120 Zeichen, hast Du die Bereichsprüfung aktiviert.
Delphi-Quellcode:
For i := 0 to Memo1.Lines.Count - 1 do
..
For k := 1 to Length(t) do
..
und dann muß sichergestellt sein daß auf Dein Array nur innerhalb der gültigen Bereich zugegriffen wird....

Michelle 12. Feb 2011 20:08

AW: Memo-Feld: Zeile und Buchstabe auslesen
 
Wahnsinn, jetzt klappts!! Vielen, vielen Dank, ihr seit super :!:
:-D

arc 12. Feb 2011 20:58

AW: Memo-Feld: Zeile und Buchstabe auslesen
 
Ja, das ist ein häufiges Problem. Einige Felder sind 0 basierend, andere 1 basierend.
Die Memo.Lines sind wie bereits geschrieben 0 basierend und der Index bei einem String 1 basierend.

Deshalb kann man s[length(s)] schreiben, Lines[Lines.Count] aber nicht. Hier muß statt dessen Lines[Lines.Count - 1] hin.

idefix2 14. Feb 2011 14:19

AW: Memo-Feld: Zeile und Buchstabe auslesen
 
Trotzdem ist
Delphi-Quellcode:
if t[k] = '0' then Area1[i,k] := false else Area1[i,k] := true;
ein Unding.

Wie wärs mit
Delphi-Quellcode:
area1[i,k] := t[k]<>'0'
So Riesen boolean arrays kann man im übrigen meistens besser und effizienter durch ein set implementieren:
also set of [1..120] statt array[1..120] of boolean


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