AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi String zerlegen und Teile in Integer umwandeln, AsyncPro
Thema durchsuchen
Ansicht
Themen-Optionen

String zerlegen und Teile in Integer umwandeln, AsyncPro

Ein Thema von Spurius · begonnen am 9. Feb 2006 · letzter Beitrag vom 16. Aug 2006
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von TeronG
TeronG

Registriert seit: 19. Jul 2004
Ort: München
960 Beiträge
 
Delphi 2007 Professional
 
#11

Re: String zerlegen und Teile in Integer umwandeln, AsyncPro

  Alt 9. Feb 2006, 17:04
Zitat von H4ndy:
@TeronG
Danke für die Korrektur - passiert halt wenn mal fix was aussen Kopf schreibt ^^
Hatte mein Delphi eh noch an und grade was eigenes versucht (s.o.) da habich dein code einfach mal getestet ...
so n +/-1 kann einem schon ganz schön zeit kosten ^^ (oder wenn man wie ich mal vergisst dem endgerät zu sagen, daß es dir was schicken soll )

Zitat von Spurius:
also bei einer 3-stelligen Zahl zeigt er 5 als Länge an
Hast du ne Idee wie ich das lösen kann?
welchen code benutzt du denn nun?
evtl. mal die Endposition mit posex(' ',g) suchen.
龍 Der Unterschied zwischen Theorie und Praxis ist in der Praxis größer als in der Theorie.
  Mit Zitat antworten Zitat
Benutzerbild von H4ndy
H4ndy

Registriert seit: 28. Jun 2003
Ort: Chemnitz
515 Beiträge
 
Delphi XE3 Professional
 
#12

Re: String zerlegen und Teile in Integer umwandeln, AsyncPro

  Alt 9. Feb 2006, 17:06
Zitat von Spurius:
[...]Also kann ich doch trim nutzen oder?
Ja, da trim() Leer- als auch jegliche Steuerzeichen entfernt.
(#13 ist das Steuerzeichen für CR (Zeilenumbruch)).

@freak4fun
Man kann ja trim dann auch einzeln auf "VordereZahl" und "HintereZahl" anwenden...
Manuel
  Mit Zitat antworten Zitat
Benutzerbild von TeronG
TeronG

Registriert seit: 19. Jul 2004
Ort: München
960 Beiträge
 
Delphi 2007 Professional
 
#13

Re: String zerlegen und Teile in Integer umwandeln, AsyncPro

  Alt 9. Feb 2006, 17:08
Zitat von Spurius:
also hinten scheint zumindest das Ascii-Zeichen mit der Nummer 13 angehängt zu sein
13 ?? das ist doch das zeichen für Zeilenwechsel oder .. also wenn die IMMER auftauchen kannste ja einfach bei dem length(Input2) nochmal 2 abziehen ... oder ein trim dazwischenschieben.
龍 Der Unterschied zwischen Theorie und Praxis ist in der Praxis größer als in der Theorie.
  Mit Zitat antworten Zitat
Spurius

Registriert seit: 19. Aug 2003
294 Beiträge
 
Delphi 7 Professional
 
#14

Re: String zerlegen und Teile in Integer umwandeln, AsyncPro

  Alt 9. Feb 2006, 17:11
Hallo,
also es geht jetzt, aber nur wenn ich weniger als 7 Zeichen insegamt habe. Also 67:331 ist ok, aber 103:223 nicht, da komt wieder ein Fehler wegen ungültigem Integer.
Delphi-Quellcode:
procedure TForm1.signale;
var i,j,k,nummer_i,wert_i: integer;
    nummer, wert, input2: string;
begin
 input2 := '';
 input2 := trim(input);
 i := 0;
 i := pos(':', input2);
 nummer := copy(input2,1,i - 1);
 wert := copy(input2,i + 1,length(input));
 memo1.Lines.Add(input2);
    nummer_i := strtoint(nummer);
    wert_i := strtoint(wert);
// paintbox1.Canvas.MoveTo(round(arccos((nummer_i-49)*3861/(Wert_i-37)))*8,8*round(arcsin((nummer_i-49)*3861/(Wert_i-37))));
// paintbox1.Canvas.Pixels[round(arccos((nummer_i-49)*3861/(Wert_i-37)))*8,8*round(arcsin((nummer_i-49)*3861/(Wert_i-37)))] := clred;
 memo2.Lines.Add(wert);
end;
  Mit Zitat antworten Zitat
Benutzerbild von TeronG
TeronG

Registriert seit: 19. Jul 2004
Ort: München
960 Beiträge
 
Delphi 2007 Professional
 
#15

Re: String zerlegen und Teile in Integer umwandeln, AsyncPro

  Alt 9. Feb 2006, 17:23
(so auf die schnelle ^^)
Delphi-Quellcode:
 Trim(nummer);
 Trim(wert);
龍 Der Unterschied zwischen Theorie und Praxis ist in der Praxis größer als in der Theorie.
  Mit Zitat antworten Zitat
Benutzerbild von sniper_w
sniper_w

Registriert seit: 12. Dez 2004
Ort: Wien, Österriech
893 Beiträge
 
Delphi 6 Enterprise
 
#16

Re: String zerlegen und Teile in Integer umwandeln, AsyncPro

  Alt 9. Feb 2006, 17:28
Kannst du und ein zu zerlegendes String hier posten?
Katura Haris
Es (ein gutes Wort) ist wie ein guter Baum, dessen Wurzel fest ist und dessen Zweige in den Himmel reichen.
  Mit Zitat antworten Zitat
Spurius

Registriert seit: 19. Aug 2003
294 Beiträge
 
Delphi 7 Professional
 
#17

Re: String zerlegen und Teile in Integer umwandeln, AsyncPro

  Alt 9. Feb 2006, 17:36
Hi,
also das trim(wert), trim(nummer) hat nichts gebracht.
Bsp.string der geht: 99:139
Bsp.string der nicht geht: 100:139

Direkt an einem Terminal empfangen sieht man, dass hinten dran <0D><0A> hängen, und auch wenn mans durch trim durchjagt, bleiben die 13 und die 10 hinten dran hängen.
  Mit Zitat antworten Zitat
Andreas_R

Registriert seit: 5. Apr 2005
Ort: Bremen
14 Beiträge
 
Delphi 2005 Professional
 
#18

Re: String zerlegen und Teile in Integer umwandeln, AsyncPro

  Alt 16. Aug 2006, 21:33
Aber Hallo !

Auch ich empfange Zeichenketten von einer seriellen Schnittstelle (RS232).
Die eingehenden Strings haben folgendes Format:

Beispiel:= '$01RR000 000000023 000000000' + chr(13)

und setzen sich wie folgt zusammen:

Delphi-Quellcode:
$ = Startzeichen des Strings (Dollarzeichen, ASCII 36)
0 = Serial Master Address
1 = Serial Slave Address
RR = "Report Ready" (ein spezielles Kommando)
000 = Speicherort
000000023 = Zählerstand
000000000 = darf ich getrost ignorieren
#13 = Endezeichen des Strings (ASCII 13)
In meiner Anwendung muss ich nun die Zeichen 4 und 5 ('RR') als Zeichenkette interpretieren, damit mein Programm weiß, dass es sich um den Befehl bzw. Zeichenkettentyp "Report Ready" handelt und entsprechend darauf reagieren kann.
Nur bei 'RR' sollen nämlich die Zeichen 15 bis 18 ('0023') in einem Panel angezeigt und ggf. noch zu einem Integer konvertiert werden.

Ein paar Code-Schnipsel:

Delphi-Quellcode:
// *** An der seriellen Schnittstelle liegt ein Empfangsereignis an ***
procedure TForm1.VaComm1RxChar(Sender: TObject; Count: Integer);
var i: integer;
begin
     //Alter Code:
     //r:= VaComm1.ReadText;
     //Memo2.Lines.Text:= Memo2.Lines.Text + r;

     //Neuer Code:
     //Lese Daten von der seriellen Schnittstelle
     r:= VaComm1.ReadText;
     hhALed7.TrueColor:= clYellow;
     for i := 1 to Length(r) do
         case r[i] of
              #10:; // ignorieren
              #13: // Wir warten lediglich auf #13
              begin
                   Memo2.Lines.Add(FMessage);
                   //Jetzt erfolgt die Auswertung des Strings
                   Analyze(FMessage);
                   FMessage := '';
              end;
         else //nicht #10 oder #13
              FMessage := FMessage + r[i];
         end;
     hhALed7.TrueColor:= clLime;
end;


// *** Zählerstand automatisch abfragen (Standard-Intervall 250 ms) ***
procedure TForm1.Timer2Timer(Sender: TObject);
var a: string;
    i: integer;
begin
     if not CheckBox13.Checked then Exit;

     if RefIndex = $FF then HeadAdr:= UpDown1.Position else HeadAdr:= RefIndex;
     StatusBar1.Panels[6].Text:= 'RefIndex: ' + IntToStr(RefIndex) + ' '+
                                 'HeadAdr: ' + IntToStr(HeadAdr);
     StatusBar1.Panels[5].Text:= 'Lese Report von Schreibkopf ' +
                                 IntToStr(HeadAdr) + ' ....';
     w:= '$0' + IntToStr(HeadAdr) + 'RR' + MLD[HeadAdr];
     w:= w + CreateChecksum(w) + #13;
     VaComm1.WriteText(w);
     Memo1.Lines.Add(w);

     // --> erstmal raus hier, Auswertung soll nun über neue Routine erfolgen
     Exit;

     ...
     ...
     ...
end;

// *** Auswertung des empfangenen Strings ***
procedure TForm1.Analyze(Msg: string);
begin
     if Msg[1] = '$then
     begin
          if (Msg[4] = 'R') and (Msg[5] = 'R') then
          begin
               with Memo2.Lines do
               begin
                    if Copy(Strings[Count-1], 4, 2) = 'RRthen
                       Panel7.Caption:= Copy(Strings[Count-1], 15, 4);
                    try
                       Counter[HeadAdr]:= StrToInt(Panel7.Caption);
                    except
                          Counter[HeadAdr]:= 0;
                          Panel7.Caption:= '----';
                    end; //try
               end; //if
          end; //with
     end; //if
end; //procedure
Ich frage mich, ob man die Zugriffe auf die Einzelzeichen des Strings mit Msg[x] sowie die Verwendung der Copy-Funktion nicht etwas etwas eleganter lösen könnte ?

Für die Abfrage der seriellen Schnittstelle verwende ich übrigens die Komponenten Varian Async 32.
Funktionieren sehr gut, ich kann nicht meckern.

So long, wünsche weiterhin stets eine Handbreit StrToInt() ohne Exception ....
Gruß Andreas
Win XP Pro, Delphi 2005 Professional, Intel P4 3,2 GHz, 1 GB RAM, ATi Sapphire Radeon X800XT PE (16 Pipelines), eigenes Fahrrad.
  Mit Zitat antworten Zitat
EDatabaseError

Registriert seit: 11. Mai 2005
Ort: Göppingen
1.238 Beiträge
 
Delphi 2007 Professional
 
#19

Re: String zerlegen und Teile in Integer umwandeln, AsyncPro

  Alt 16. Aug 2006, 22:02
Einwurf:
Das OnRxChar wird ausgeführt sobald was im Buffer ist. Wenn du bspw. "Hallo was geht ab" schickst kommt kann es im onrxchar so rauskommen:
Hallo w
nächstes onrxchar
as geh
nachstes onchar
t ab

Wenn du nun zahlen empfängst ist es das gleiche. Ich hoffe das hilft.

Mfg
Tobi
Tobias
It's not a bug, it's a feature.
  Mit Zitat antworten Zitat
EDatabaseError

Registriert seit: 11. Mai 2005
Ort: Göppingen
1.238 Beiträge
 
Delphi 2007 Professional
 
#20

Re: String zerlegen und Teile in Integer umwandeln, AsyncPro

  Alt 16. Aug 2006, 22:06
Zitat von Spurius:
Hallo,
also bei einer 3-stelligen Zahl zeigt er 5 als Länge an
HyperTerminal Listet die Zahlen untereinander, bei mir sind aber Leerzeilen dazwischen.
Hast du ne Idee wie ich das lösen kann?
1. Zeichen = Ziffer1
2. Zeichen = Ziffer2
3. Zeichen = Ziffer3
4. Zeichen = #13
5. Zeichen = #10

Das 4. und 5. Zeichen ist der angezeigt zeilenumbruch. Den solltest du mit StringReplace wegmachen.



Mfg
Tobi
Tobias
It's not a bug, it's a feature.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:45 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