Delphi-PRAXiS
Seite 2 von 3     12 3      

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)

mkinzler 22. Aug 2007 22:32

Re: String mit Hilfe einer Schleife zerteilen und auslesen
 
Normalerweise sagt der Compiler, wo genau der Fehler auftritt

cRayZo 22. Aug 2007 22:45

Re: String mit Hilfe einer Schleife zerteilen und auslesen
 
meinst du mit compiler das, was vor dem starten der Anwendung den code checkt?
wenn ja, dann kann ich dir sagen, dass da überhaupt kein Fehler kommt.

erst wenn ich die Zahlen konvertieren will, gibts ein Problem. Die ersten Zahlengruppen konvertiert er brav in buchstaben, aber nach dem 30ten oder so nicht mehr. liegt das vll an einer maximalkapazität von reihen in einer stringlist? ich weiß ja nicht, aber vll könnte es sowas in der art sein?

hier mal als beispiel:

wenn ich diesen string in buchstaben umwandeln will:
Code:
0;207:3|8;108:20|2;1342:67|3;339:16|3;2019:42|0;2397:47|0;1260:84|0;116:29|9;189:36|7;1543:32|6;5802:84|
7;1597:30|1;2177:32|4;1660:24|8;1304:27|4;718:14|8;1772:28|7;5051:97|4;4668:88|
(was nichts anderes heißt als Test Code TEST CODE)

dann tritt schon der fehler auf.

Hawkeye219 22. Aug 2007 22:55

Re: String mit Hilfe einer Schleife zerteilen und auslesen
 
Hallo,

die Fehlerursache ist wahrscheinlich der falsche Endwert deiner Schleife:

Delphi-Quellcode:
// for i2:=1 to trunc(length(x)) do begin
for i2 := 1 to Length(numbers) div 3 do begin
Gruß Hawkeye

grenzgaenger 22. Aug 2007 23:34

Re: String mit Hilfe einer Schleife zerteilen und auslesen
 
wo liegt das Problem?

das hier funktioniert problemlos ..
Delphi-Quellcode:
program Project1;
{$APPTYPE CONSOLE}

uses
  SysUtils;

const
 cs = '0;207:3|8;108:20|2;1342:67|3;339:16|3;2019:42|0;2397:47|'
    + '0;1260:84|0;116:29|9;189:36|7;1543:32|6;5802:84|7;1597:3'
    + '0|1;2177:32|4;1660:24|8;1304:27|4;718:14|8;1772:28|7;505'
    + '1:97|4;4668:88|';

var
 i: integer;
 s: string;
 wert,j: integer;
 dele: set of char = [';',':','|'];
begin
 s := '';
 for I := 1 to length(cs) do
 begin
  if cs[i] in dele then
  begin
   val(s,wert,j);
   if j=0 then
   begin
    s := '';
    writeln('Integer: ', wert);
   end;
  end
  else
  begin
   s := s + cs[i];
  end;
 end;
 readln;
end.
aber wenn wir keinen code von dir haben, können wir nur raten... und meine kristallkugel hab ich leider vergessen ... :-(

cRayZo 23. Aug 2007 08:36

Re: String mit Hilfe einer Schleife zerteilen und auslesen
 
bin grade nichzt zu hause, ich schick euch von mir aus den ganzen code.
soll ich euch auch den Code für die verschlüsselung schicken? das wird dann halt nur nen ziemlich langer post, weil ich das alles mit realtiv wenig befehlen gemacht hab, weil ich noch nicht so skilled in delphi bin.
das von dir Hawkeye219 probier ich mal aus, könnte echt das Problem sein, thx


Nachtrag:
Okay hier jetzt die ganze umkonvertierung von den Zeichen zur Zahl...
Code:
Var
buffer:                string;
Zufall1, ZUfall2:      integer;
i, buffer2:            integer;
CodeVar:               integer;
begin
try CodeVar:= strtoint(Codex.Text); except showmessage('Code ist keine Zahl'); end;
Geheimcodeform.GeheimcodeText.Text:='';

for i:=1 to length(OriginalText.Text) do begin
        buffer:=Originaltext.Text[i];
        Zufall1:=random(10);
        Zufall2:=random(100);

     //Konvertierungstabelle
        if buffer='a' then Buffer2:=1 else if buffer='b' then Buffer2:=2 else if buffer='c' then Buffer2:=3 else
        if buffer='d' then Buffer2:=4 else if buffer='e' then Buffer2:=5 else if buffer='f' then Buffer2:=6 else
        if buffer='g' then Buffer2:=7 else if buffer='h' then Buffer2:=8 else if buffer='i' then Buffer2:=9 else
        if buffer='j' then Buffer2:=10 else if buffer='k' then Buffer2:=11 else if buffer='l' then buffer2:=12 else
        if buffer='m' then Buffer2:=13 else if buffer='n' then Buffer2:=14 else if buffer='o' then buffer2:=15 else
        if buffer='p' then Buffer2:=16 else if buffer='q' then Buffer2:=17 else if buffer='<' then Buffer2:=18 else
        if buffer='r' then Buffer2:=19 else if buffer='s' then Buffer2:=20 else if buffer='t' then Buffer2:=21 else
        if buffer='u' then Buffer2:=22 else if buffer='v' then Buffer2:=23 else if buffer='w' then Buffer2:=24 else
        if buffer='x' then Buffer2:=25 else if buffer='y' then Buffer2:=26 else if buffer='z' then Buffer2:=27 else
        if buffer='!' then Buffer2:=28 else if buffer='"' then Buffer2:=29 else if buffer='§' then Buffer2:=30 else
        if buffer='$' then Buffer2:=31 else if buffer='%' then Buffer2:=32 else if buffer='&' then Buffer2:=33 else
        if buffer='/' then Buffer2:=34 else if buffer='(' then Buffer2:=35 else if buffer=')' then Buffer2:=36 else
        if buffer='=' then Buffer2:=37 else if buffer='?' then Buffer2:=38 else if buffer='*' then Buffer2:=39 else
        if buffer='+' then Buffer2:=40 else if buffer='#' then Buffer2:=41 else if buffer='-' then Buffer2:=42 else
        if buffer='_' then Buffer2:=43 else if buffer=':' then Buffer2:=44 else if buffer='.' then Buffer2:=45 else
        if buffer=',' then Buffer2:=46 else if buffer=';' then Buffer2:=47 else if buffer=' ' then Buffer2:=48 else
        if buffer='A' then Buffer2:=49 else if buffer='B' then Buffer2:=50 else if buffer='C' then Buffer2:=51 else
        if buffer='D' then Buffer2:=52 else if buffer='E' then Buffer2:=53 else if buffer='F' then Buffer2:=54 else
        if buffer='G' then Buffer2:=55 else if buffer='H' then Buffer2:=56 else if buffer='I' then Buffer2:=57 else
        if buffer='J' then Buffer2:=58 else if buffer='K' then Buffer2:=59 else if buffer='L' then buffer2:=60 else
        if buffer='M' then Buffer2:=61 else if buffer='N' then Buffer2:=62 else if buffer='O' then buffer2:=63 else
        if buffer='P' then Buffer2:=64 else if buffer='Q' then Buffer2:=65 else if buffer='>' then Buffer2:=66 else
        if buffer='R' then Buffer2:=67 else if buffer='S' then Buffer2:=68 else if buffer='T' then Buffer2:=69 else
        if buffer='U' then Buffer2:=70 else if buffer='V' then Buffer2:=71 else if buffer='W' then Buffer2:=72 else
        if buffer='X' then Buffer2:=73 else if buffer='Y' then Buffer2:=74 else if buffer='Z' then Buffer2:=75 else
        buffer2:=0;

        Buffer2:=(buffer2 * Zufall2) + Zufall1;
        Geheimcodeform.GeheimcodeText.Text:=Geheimcodeform.GeheimcodeText.Text + inttostr(Zufall1) + ';' + inttostr(buffer2) + ':' + inttostr(Zufall2) + '|';

        end;

end;

und hier dann die Umkonvertierung vom zaahlenstring zurück in Buchstaben:
Code:
procedure TGeheimcodeForm.BitButtonEntschluesselnClick(Sender: 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 Length(numbers) do begin
  Zahl1:=numbers[Zahl1count];
  Zahl2:=numbers[Zahl2count];
  Zahl3:=numbers[zahl3count];

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

     //Konvervierungstabelle
        if buffer=1 then Buffer2:='a' else if buffer=2 then Buffer2:='b' else if buffer=3 then Buffer2:='c' else
        if buffer=4 then Buffer2:='d' else if buffer=5 then Buffer2:='e' else if buffer=6 then Buffer2:='f' else
        if buffer=7 then Buffer2:='g' else if buffer=8 then Buffer2:='h' else if buffer=9 then Buffer2:='i' else
        if buffer=10 then Buffer2:='j' else if buffer=11 then Buffer2:='k' else if buffer=12 then buffer2:='l' else
        if buffer=13 then Buffer2:='m' else if buffer=14 then Buffer2:='n' else if buffer=15 then buffer2:='o' else
        if buffer=16 then Buffer2:='p' else if buffer=17 then Buffer2:='q' else if buffer=18 then Buffer2:='<' else
        if buffer=19 then Buffer2:='r' else if buffer=20 then Buffer2:='s' else if buffer=21 then Buffer2:='t' else
        if buffer=22 then Buffer2:='u' else if buffer=23 then Buffer2:='v' else if buffer=24 then Buffer2:='w' else
        if buffer=25 then Buffer2:='x' else if buffer=26 then Buffer2:='y' else if buffer=27 then Buffer2:='z' else
        if buffer=28 then Buffer2:='!' else if buffer=29 then Buffer2:='"' else if buffer=30 then Buffer2:='§' else
        if buffer=31 then Buffer2:='$' else if buffer=32 then Buffer2:='%' else if buffer=33 then Buffer2:='&' else
        if buffer=34 then Buffer2:='/' else if buffer=35 then Buffer2:='(' else if buffer=36 then Buffer2:=')' else
        if buffer=37 then Buffer2:='=' else if buffer=38 then Buffer2:='?' else if buffer=39 then Buffer2:='*' else
        if buffer=40 then Buffer2:='+' else if buffer=41 then Buffer2:='#' else if buffer=42 then Buffer2:='-' else
        if buffer=43 then Buffer2:='_' else if buffer=44 then Buffer2:=':' else if buffer=45 then Buffer2:='.' else
        if buffer=46 then Buffer2:=',' else if buffer=47 then Buffer2:=';' else if buffer=48 then Buffer2:=' ' else
        if buffer=49 then Buffer2:='A' else if buffer=50 then Buffer2:='B' else if buffer=51 then Buffer2:='C' else
        if buffer=52 then Buffer2:='D' else if buffer=53 then Buffer2:='E' else if buffer=54 then Buffer2:='F' else
        if buffer=55 then Buffer2:='G' else if buffer=56 then Buffer2:='H' else if buffer=57 then Buffer2:='I' else
        if buffer=58 then Buffer2:='J' else if buffer=59 then Buffer2:='K' else if buffer=60 then buffer2:='L' else
        if buffer=61 then Buffer2:='M' else if buffer=62 then Buffer2:='N' else if buffer=63 then buffer2:='O' else
        if buffer=64 then Buffer2:='P' else if buffer=65 then Buffer2:='Q' else if buffer=66 then Buffer2:='>' else
        if buffer=67 then Buffer2:='R' else if buffer=68 then Buffer2:='S' else if buffer=69 then Buffer2:='T' else
        if buffer=70 then Buffer2:='U' else if buffer=71 then Buffer2:='V' else if buffer=72 then Buffer2:='W' else
        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;

cRayZo 23. Aug 2007 15:48

Re: String mit Hilfe einer Schleife zerteilen und auslesen
 
wie schon gesagt: das Problem liegt beim Konvertieren vom Zahlencode zurück zu den Buchstaben.

Ach ja, zur Vollständiogkeit halber:

Ich arbeite mit 2 Fenstern, einem Original- und einem Geheimcode-Fenster. Beide Fenster haben (um es auf das wesentliche zu beschränken) ein RIchEdit-Feld und einen BitBttn zur konvertierung.

Ich glaube das Problem liegt in der großen schleife, aber ich bin mir nicht sicher.

@ Hawkeye219: danke wegen dem Tip, habs geändert, war aber dann leider doch nciht der Fehler.

Hawkeye219 23. Aug 2007 18:21

Re: String mit Hilfe einer Schleife zerteilen und auslesen
 
Hallo cRayZo,

du mußt schon genau hinsehen:

Zitat:

Zitat von Hawkeye219
Delphi-Quellcode:
for i2 := 1 to Length(numbers) div 3 do begin

Zitat:

Zitat von cRayZo
Delphi-Quellcode:
for i2 := 1 to Length(numbers) do begin

Bemerkst du den Unterschied?

Zu deiner "Konvertierungstabelle":
Wäre es nicht viell einfacher und übersichtlicher, den Zeichenvorrat in einen String zu packen? Dann kannst du mit der Funktion Delphi-Referenz durchsuchenPos nach einem Zeichen suchen und erhältst dessen Position im String oder den Wert 0, falls das gesuchte Zeichen nicht im String enthalten ist. Beim Entschlüsseln kannst du mit einem gültigen Index [1..Length(Zeichenvorrat)] jedes Zeichen aus dem String direkt auslesen.

Gruß Hawkeye

cRayZo 23. Aug 2007 19:16

Re: String mit Hilfe einer Schleife zerteilen und auslesen
 
oh stimmt, ja hab ich übersehen, danke. Ändert an dem Problem aber auch nichts.. :( :( :(

Das mit der stringlist ist ne super idee. kannst du das vll in einem code zeigen, wie du das meinst? weil ich bin noch zu (blöd?) um das dann gleich richtig umzusetzen^^

thx! schonmal

groß cRayZo

cRayZo 25. Aug 2007 09:24

Re: String mit Hilfe einer Schleife zerteilen und auslesen
 
Okay klappt soweit, aber

Pos

berücksichtigt die groß und kleinschreibung nicht. Wie kann man das ändern? Ist nämlich ausschlaggebend

wenn ichs jetzt so mache, damit er groß und kleinschreibung berücksichtig,
Delphi-Quellcode:
buffer:=trunc((Zahl2 - Zahl1)/ Zahl3);
  Konvert:='abcdefghijklmnopq<rstuvwxyz!"§$%&/()=?*+#-_:.,;ABCDEFGHIJKLMNOPQ>RSTUVWXYZ';

  buffer2:=Konvert[buffer];
kommt zumindest noch immer die ungültige gleitkomma operation obwohl die schleife bedeutend kleiner geworden ist.

Ich habde den Fehler mal im COde abgefangen. Der Fehler müsste hier liegen
Zitat:

procedure TGeheimcodeForm.BitButtonEntschluesselnClick(Sende r: TObject);
var
numbers: TIntegerDynArray;
i,i2: Integer;
s: TStrings;
x, buffer2, Konvert: 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
try
s.Add(IntToStr(numbers[i]));
showmessage(s.Text);
s.Free;


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

except begin showmessage('Fehler im ersten Bereich'); break; end; end;

for i2:=1 to Length(numbers) div 3 do begin
Zahl1:=numbers[Zahl1count];
Zahl2:=numbers[Zahl2count];
Zahl3:=numbers[zahl3count];
buffer:=trunc((Zahl2 - Zahl1)/ Zahl3);


buffer:=trunc((Zahl2 - Zahl1)/ Zahl3);
Konvert:='abcdefghijklmnopq<rstuvwxyz!"§$%&/()=?*+#-_:.,;ABCDEFGHIJKLMNOPQ>RSTUVWXYZ';

buffer2:=Konvert[buffer];


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

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

Hawkeye219 25. Aug 2007 10:33

Re: String mit Hilfe einer Schleife zerteilen und auslesen
 
Hallo cRayZo,

keine Sorge, die Funktion Pos beachtet Groß- und Kleinschreibung, auch wenn die Hilfedatei in älteren Delphi-Versionen etwas anderes behauptet.

Den Gleitkommafehler kann ich nicht nachvollziehen. Wie sieht dein aktueller Quelltext aus?

Gruß Hawkeye


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:03 Uhr.
Seite 2 von 3     12 3      

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