Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi String mit Hilfe einer Schleife zerteilen und auslesen (https://www.delphipraxis.net/96765-string-mit-hilfe-einer-schleife-zerteilen-und-auslesen.html)

cRayZo 30. Jul 2007 17:12


String mit Hilfe einer Schleife zerteilen und auslesen
 
Hi ich hab ein Problem beim auslesen eines String. Ich hab hier schon gesuch, aber nichts gefunden.

Das Problem ist folgendes:
ich möchte einen string auslesen, der in etwa so aussieht:

Zahl;Zahl:Zahl|Zahl;Zahl:Zahl| und so weiter

*Zahl* steht für eine beliebig große integer.
jede Zahl ist unterschiedlich



Hier ist der betreffende Teil des Quellcodes:

Zitat:

procedure TGeheimcodeForm.BitButtonEntschluesselnClick(Sende r: TObject);
Var
i,i2,i3,i4, Buffer, buchstabencount, Zahl1, Zahl2, Zahl3 : integer;
Buffer2, ZahlZufall1, ZahlZufall2, Speicher, x1, x2, x3:string;
begin
SPeicher:=Geheimcodetext.Text;
Zahlzufall1:=''; Zahlzufall2:=''; FOrm2.OriginalText.Text:=''; i2:=0; buchstabencount:=0;

for i:=0 to length(Geheimcodetext.text)do
if Geheimcodetext.Text[i]='|' then buchstabencount:=buchstabencount + 1 ;


for i2:=1 to buchstabencount do begin

i:=0;
x1:=(GetWordOfAnsiString1(SPeicher,1));
for i:=0 to length(x1)+1 do begin
delete(SPeicher,1,1); end;
i3:=0;
x2:=(GetWordOfAnsiString2(Speicher,1));
for i3:=0 to length(x3)+1 do begin
delete(SPeicher,1,1); end;
i4:=0;
x3:=(GetWordOfAnsiString3(SPeicher,1));
for i4:=0 to length(x3)+1 do begin
delete(SPeicher,1,1); end;

i:=0; SPeicher:='';

Zahl1:= strtoint(x1); Zahl2:= strtoint(x2); Zahl3:= strtoint(x3);
buffer:= (Zahl2-Zahl1);
buffer:= trunc(buffer/Zahl3);
x1:=''; x2:=''; x3:='';
showmessage(showmessage);
end;
end;

für das auslesen der Wörter hab ich als Funktion folgende benutzt:

Zitat:

Function GetWordOfAnsiString3(Text : string; WordPos : Word): string;
var
p : PChar;
begin
p := PChar(Text);
repeat
Dec(WordPos);
while p^ <> '|' do
begin
if WordPos = 0 then
Result := Result + p^;
Inc(p);
end;
if WordPos = 0 then Exit;
Inc(p);
until p^ = '|';
end;
Ich habe drei dieser Funktionen, jeh eine, die auf ein anderes Zeichen (also ; : | )als Wortende reagiert.
In dem Quelltext oben wird (wenn es klappen würde) erst Zahl1 ausgelesen und in die Variable x1 eingespeichert, dann wird Zahl1 und Trennzeichen gelöscht.
Das gleiche wird dann mit der zweiten und dritten gemacht.
Die drei Zahlen werden dann verrechnet, und diese Zahl ausgegeben. Das wiederholt sich für die nächsten drei zahlen und so weiter.

nur irgendwie klappt das nicht.
entweder hat Delphi ein Problem mit den Trennzeichen und löscht es nicht (fehlermeldung: ;Zahl ist keine integer) oder es kommt eine Fehlermeldung in der nicht mehr als
"
steht


könnt ihr mir helfen? Bittebitte
:hello:

shmia 30. Jul 2007 17:22

Re: String mit Hilfe einer Schleife zerteilen und auslesen
 
Keine Ahnung, weshalb du 3 verschiedene Trennzeichen benutzen möchtest - das ist nicht üblich.
Aber sei's drum, die Strategie sieht so aus:
Der String wird mit dem Trenner "|" in Einzelteile zerlegt und das Ergebnis in einer TStringList gespeichert.
Dafür gibt es fertige Funktionen in der Code-Library SplitstringSplitstring !
Man sollte wirklich die erprobten Funktionen verwenden - Funktionen Marke Eigenbau haben meisten einige Fehler.
Damit ist das Problem reduziert auf das Zerlegen von einfachen Strings dieser Bauart
Code:
Zahl;Zahl:Zahl

cRayZo 30. Jul 2007 17:50

Re: String mit Hilfe einer Schleife zerteilen und auslesen
 
ja, okay, danke schonmal ;)
darauf bin ich gar nicht gekommen. Mit stringlist eig super idee

aber das Hauptproblem ist ja eigentlich trotzdem geblieben.
wie kann ich die drei Zahlen

Zahl1;Zahl2:Zahl3

aus dem string jeweils in drei getrennte Variablen speichern?

SirThornberry 30. Jul 2007 18:23

Re: String mit Hilfe einer Schleife zerteilen und auslesen
 
Delphi-Quellcode:
var
  lCount: Integer;
  lMystr: String;
  lDsts : TStringList;
  lInt1,
  lInt2,
  lInt3 : Integer;
begin
  lMystr := '5;7:9';
  for lCount := 1 to Length(lMyStr) do
    if lMyStr[lCount] in [':', '|'] then
      lMyStr[lCount] := ';';

  lDsts := TStringList.Create();
  splitString(lMyStr, ';', lDsts);
  lInt1 := StrToInt(lDsts.Strings[0]);
  lInt2 := StrToInt(lDsts.Strings[1]);
  lInt3 := StrToInt(lDsts.Strings[2]);
  lDsts.Free;

cRayZo 3. Aug 2007 01:39

Re: String mit Hilfe einer Schleife zerteilen und auslesen
 
Ja erscheint mir alles total logisch!! aber wenn ich das genauso mache behauptet der was von Zugriffsverletzung u so! :wiejetzt:

Könntet ihr bitte mal alles in einen Quellcode schreiben, ich glaube darin liegt das Problem.

also wie man einen String mit (von mir aus vereinfacht)

Zahl1;Zahl2;Zahl3|

in Variablen ausliest
also je Zahl(1,2,3) eine Variable.

Wär riesig nett von euch vielen Dank!! :hello:

alleinherrscher 3. Aug 2007 01:56

Re: String mit Hilfe einer Schleife zerteilen und auslesen
 
Delphi-Quellcode:
var
  lCount: Integer;
  lMystr: String;
  lDsts : TStringList;
  lInt1,
  lInt2,
  lInt3 : Integer;
begin
  lMystr := '5;7:9';
  for lCount := 0 to Length(lMyStr)-1 do
    if lMyStr[lCount] in [':', '|'] then
      lMyStr[lCount] := ';';

  lDsts := TStringList.Create();
  splitString(lMyStr, ';', lDsts);
  lInt1 := StrToInt(lDsts.Strings[0]);
  lInt2 := StrToInt(lDsts.Strings[1]);
  lInt3 := StrToInt(lDsts.Strings[2]);
  lDsts.Free;

SirThornberry 3. Aug 2007 06:10

Re: String mit Hilfe einer Schleife zerteilen und auslesen
 
:shock: Strings beginnen beim Index 1 und nicht bei 0!
Die Zugriffsverletzung muss an etwas anderem liegen. Ich hab es bei mir selbst probiert und es kam keine Zugriffsverletzung. Ich vermute es wurde die hälfte vergessen beim abschreiben.

marabu 3. Aug 2007 07:04

Re: String mit Hilfe einer Schleife zerteilen und auslesen
 
Herzlich willkommen in der Delphi-PRAXiS, cRayZo.

Du könntest die unterschiedlichen Trennzeichen auch dadurch behandeln, dass du deinen String als Liste natürlicher Zahlen betrachtest, die durch nicht-numerische Zeichen voneinander getrennt sind. Die Funktion ExtractNumbers() liefert dir die Zahlen in einem dynamischen Array zurück. Ein Umspeichern in andere Variablen ist eigentlich nicht unbedingt notwendig, da du auf die erste Zahl mit numbers[0] zugreifen kannst:

Delphi-Quellcode:
uses
  Types; // TIntegerDynArray

procedure ExtractNumbers(const s: string; var ida: TIntegerDynArray);
var
  i, n: Integer;
  isNum: Boolean;
begin
  SetLength(ida, 0);
  n := 0;
  isNum := False;
  for i := 1 to Succ(Length(s)) do
  begin
    if (i > Length(s)) and not isNum
      then Break
      else isNum := s[i] in ['0'..'9'];
    if isNum then
      n := n * 10 + Ord(s[i]) - Ord('0')
    else
    begin
      SetLength(ida, Succ(Length(ida)));
      ida[High(ida)] := n;
      n := 0;
    end;
  end;
end;

procedure TDemoForm.ButtonClick(Sender: TObject);
var
  numbers: TIntegerDynArray;
  i: Integer;
  s: TStrings;
begin
  ExtractNumbers(Edit1.Text, numbers);
  s := TStringList.Create;
  for i := Low(numbers) to High(numbers) do
    s.Add(IntToStr(numbers[i]));
  ShowMessage(s.Text);
  s.Free;
end;
Freundliche Grüße vom marabu

alleinherrscher 3. Aug 2007 09:30

Re: String mit Hilfe einer Schleife zerteilen und auslesen
 
Zitat:

Zitat von SirThornberry
:shock: Strings beginnen beim Index 1 und nicht bei 0!
Die Zugriffsverletzung muss an etwas anderem liegen. Ich hab es bei mir selbst probiert und es kam keine Zugriffsverletzung. Ich vermute es wurde die hälfte vergessen beim abschreiben.

Uuups, sorry :oops: Wäre irgendein auch ein Fehler gewesen, den ich dir nicht zugetraut hätte, SirThornberry! :zwinker:

cRayZo 22. Aug 2007 22:29

Re: String mit Hilfe einer Schleife zerteilen und auslesen
 
okay klappt alles soweit, vielen Dank nochmal.

ich hab jetzt weitergearbeitet, stoße jetzt aber auf den Fehler ungültige Gleitkommaoperation

Zitat:

procedure ExtractNumbers(const s: string; var ida: TIntegerDynArray);
var
i, n: Integer;
isNum: Boolean;
begin
SetLength(ida, 0);
n := 0;
isNum := False;
for i := 1 to Succ(Length(s)) do
begin
if (i > Length(s)) and not isNum
then Break
else isNum := s[i] in ['0'..'9'];
if isNum then
n := n * 10 + Ord(s[i]) - Ord('0')
else
begin

SetLength(ida, Succ(Length(ida)));
ida[High(ida)] := n;
n := 0;
end;
end;
end;



procedure TGeheimcodeForm.BitButtonEntschluesselnClick(Sende r: TObject);
var
numbers: TIntegerDynArray;
i,i2: Integer;
s: TStrings;
x, buffer2: string;
Zahl1, Zahl2, Zahl3: integer;
Zahl1count, Zahl2count, Zahl3count, buffer: integer;
begin
Form2.OriginalText.Text:='';
x:=GeheimcodeText.Text;

ExtractNumbers(x, numbers);
s := TStringList.Create;
for i := Low(numbers) to High(numbers) do
s.Add(IntToStr(numbers[i]));
showmessage(s.Text);
s.Free;

-------------------------------------------------------------------------------------------

Zahl1count:=0; Zahl2count:=1; Zahl3count:=2;

for i2:=1 to trunc(length(x)) do begin
Zahl1:=numbers[Zahl1count];
Zahl2:=numbers[Zahl2count];
Zahl3:=numbers[zahl3count];

buffer:=trunc((Zahl2 - Zahl1)/ Zahl3);

//Zahlen in Zeichen konvertieren
if buffer=1 then Buffer2:='a' else if buffer=2 then Buffer2:='b' else if buffer=3 then Buffer2:='c' else
// usw...
if buffer=73 then Buffer2:='X' else if buffer=74 then Buffer2:='Y' else if buffer=75 then Buffer2:='Z' else
buffer2:='?';

Form2.OriginalText.Text:= Form2.OriginalText.Text + Buffer2;

Zahl1count:= Zahl1count+3;
Zahl2count:= Zahl2count+3;
Zahl3count:= Zahl3count+3;
end;
end;


Der Fehler müsste unter der gestrichelten Linie sein.
Die ersten, schät mal so 30 buchstaben wandelt er auch wieder völlig korrekt um, aber danach kommt eben der Fehler..


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:26 Uhr.
Seite 1 von 3  1 23      

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