![]() |
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! |
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:
(eh so wie du es beschrieben hast)
var
i, k: Integer; s: String; begin {...} s := Memo1.Lines[i]; ShowMessage( s[k] ); {...} end; Falls weiterhin Fehler auftreten, poste hier die Fehlermeldungen! |
AW: Memo-Feld: Zeile und Buchstabe auslesen
Mal schnell runtergetippt:
Delphi-Quellcode:
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.
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; PS: Strings nehmen beliebig viele Zeichen auf. |
AW: Memo-Feld: Zeile und Buchstabe auslesen
Eigentlich habe ich alles so gemacht, wie ihr es schon beschrieben habt:
Code:
Area1 ist so definiert:{...} 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;
Code:
Die Fehlermeldung lautet:
Area1 : Array[0..800, 1..120] of Boolean;
"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? |
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:
und dann muß sichergestellt sein daß auf Dein Array nur innerhalb der gültigen Bereich zugegriffen wird....
For i := 0 to Memo1.Lines.Count - 1 do
.. For k := 1 to Length(t) do .. |
AW: Memo-Feld: Zeile und Buchstabe auslesen
Wahnsinn, jetzt klappts!! Vielen, vielen Dank, ihr seit super :!:
:-D |
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. |
AW: Memo-Feld: Zeile und Buchstabe auslesen
Trotzdem ist
Delphi-Quellcode:
ein Unding.
if t[k] = '0' then Area1[i,k] := false else Area1[i,k] := true;
Wie wärs mit
Delphi-Quellcode:
So Riesen boolean arrays kann man im übrigen meistens besser und effizienter durch ein set implementieren:
area1[i,k] := t[k]<>'0'
also set of [1..120] statt array[1..120] of boolean |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:17 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