Tags:
delphi
Hejsa alle.
Jeg har nogke data, som jeg skal læse fra min comport, dataene er er i kommaformat, jeg vil gerne have n mulighed, for at splitte dataene op, f.eks. i en string list el.lign.
Dataene bliver modtaget som text.
Data ex.
$GPGGA,002239.917,0000.0000,N,00000.0000,E,0,00,50.0,0.0,M,0.0,M,0.0,0000*73
$GPGSA,A,1,,,,,,,,,,,,,50.0,50.0,50.0*05
$GPRMC,002239.917,V,0000.0000,N,00000.0000,E,,,101102,,*12
Med venlig hilsen
Finn Hansen
9 svar postet i denne tråd vises herunder
1 indlæg har modtaget i alt 1 karma
Ved ikke lige om jeg har misforstået dit spørgsmål, men her er et svar:
Har du alle dataerne i en string ?? Isåfald kan du bruge en explode lign funktion. F.eks. som her:
type
TExplodedString = array of String;
function Explode(Text: String; Seperator: String; DiscardNoneText: Boolean = False): TExplodedString;
var
I: Integer;
Tmp: String;
begin
if (Length(Text) or Length(Seperator)) = 0 then Exit;
if Length(Seperator) = 1 then begin
if Copy(Text, Length(Text)-Length(Seperator), Length(Seperator)) <> Seperator then
Text := Text + Seperator + Seperator;
end else begin
if Copy(Text, Length(Text)-Length(Seperator), Length(Seperator)) <> Seperator then
Text := Text + Seperator;
end;
I := 1;
while I < Length(Text) do begin
if Copy(Text, I, Length(Seperator)) = Seperator then begin
if DiscardNoneText then begin
if Tmp <> '' then begin
SetLength(Result, High(Result)+2);
Result[High(Result)] := Tmp;
Tmp := '';
Inc(I, Length(Seperator));
end;
Inc(I);
end else begin
SetLength(Result, High(Result)+2);
Result[High(Result)] := Tmp;
Tmp := '';
Inc(I, Length(Seperator));
end;
end else begin
Tmp := Tmp + Text[I];
Inc(I);
end;
end;
end;
Denne funktion kan tage en string og give dig et array med alle dataerne. Dette kunne f.eks. gøres sådan her:
var
A: array of String;
begin
A := Explode(StrengenMedData, ',');
end;
Alle dataerne vil så ligge i delt ud i arrayet
MH.
The-Freak
Livet er for kort til at kede sig.
[Redigeret d. 16/01-05 21:21:51 af The-Freak]
0
Hej The freak.
Mit ex. viser 3 stk. datalinier.
Ideen er at jeg skal bruge de forskellige datalinier forskelligt, alt efter hvad hvad deres adr. er, så som '$GPGSA'.
Jeg synes dit foreslag ser rigtigt ud, så vidt jeg med mine beskedne evner kan se.
Men hvordan bruger jeg din kode, det er især delen med type jeg ikke helt forstår. jeg har lavet en ny unit med dit kodeforeslag, men jeg får en errorkode der siger Undeclared identifier: 'Explode'
Hvad gør jeg forkert, og hvordan indsætter man kode her ??
Hilsen
Finn
0
Hej The freak.
Mit ex. viser 3 stk. datalinier.
Ideen er at jeg skal bruge de forskellige datalinier forskelligt, alt efter hvad hvad deres adr. er, så som '$GPGSA'.
Jeg synes dit foreslag ser rigtigt ud, så vidt jeg med mine beskedne evner kan se.
Men hvordan bruger jeg din kode, det er især delen med type jeg ikke helt forstår. jeg har lavet en ny unit med dit kodeforeslag, men jeg får en errorkode der siger Undeclared identifier: 'Explode'
Hvad gør jeg forkert, og hvordan indsætter man kode her ??
Hilsen
Finn
Tror at du mangler at erklærere Explode funktionen i din interface del. Alternativt kan du flytte Explode funktionen så den er den første funktion efter Implementation starter.
Typen er kun tilføjet for at kunne returnere en Array of String. Delphi kan som standard ikke bare returnere en Array of String, så der skal en type til for at klare den.
MH.
The-Freak
Livet er for kort til at kede sig.
0
Hej Freak.
Jeg får stadig en error '[Error] Unit1.pas(73): Incompatible types'
hvad hulen gør jeg forkert, min kode ser sådan ud.
Finn
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Edit2: TEdit;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
type
TExplodedString = array of String;
{$R *.dfm}
function Explode(Text: String; Seperator: String; DiscardNoneText: Boolean = False): TExplodedString;
var
I: Integer;
Tmp: String;
begin
if (Length(Text) or Length(Seperator)) = 0 then Exit;
if Length(Seperator) = 1 then begin
if Copy(Text, Length(Text)-Length(Seperator), Length(Seperator)) <> Seperator then
Text := Text + Seperator + Seperator;
end else begin
if Copy(Text, Length(Text)-Length(Seperator), Length(Seperator)) <> Seperator then
Text := Text + Seperator;
end;
I := 1;
while I < Length(Text) do begin
if Copy(Text, I, Length(Seperator)) = Seperator then begin
if DiscardNoneText then begin
if Tmp <> '' then begin
SetLength(Result, High(Result)+2);
Result[High(Result)] := Tmp;
Tmp := '';
Inc(I, Length(Seperator));
end;
Inc(I);
end else begin
SetLength(Result, High(Result)+2);
Result[High(Result)] := Tmp;
Tmp := '';
Inc(I, Length(Seperator));
end;
end else begin
Tmp := Tmp + Text[I];
Inc(I);
end;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
A: array of String;
begin
A := Explode('$GPGGA,002239.917,0000.0000,N,00000.0000,E,0,00,50.0,0.0,M,0.0,M,0.0,0000*73', ',');
end;
end.
0
Lige umiddelbart skal typen smides op i interface'et!
MH.
The-Freak
Livet er for kort til at kede sig.
0
Hej Freak.
Jeg har nu gjort sådan
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
type
TExplodedString = array of String;
Men ved kald af functionen får jeg stadig error [Error] Unit1.pas(72): Incompatible types
mit kald ser sådan ud
procedure TForm1.Button1Click(Sender: TObject);
var
A: array of String;
StrengenMedData: String;
begin
A := Explode('$GPGGA,002239.917,0000.0000,N,00000.0000,E,0,00,50.0,0.0,M,0.0,M,0.0,0000*73', ',');
Jeg ved at jeg er ny, men jeg forstår ikke dette.
Hilsen
Finn
0
...procedure TForm1.Button1Click(Sender: TObject);
var
A: Texplodedstring;
StrengenMedData: String;
begin...
sådan.. din funktion kan ikke godtage en anden type som resultat
Jeppe Johansen
Jeppesoftware@hotmail.com
0
Hejsa begge 2.
Så virker det.
Tak Finn.
0
Hej igen.
Hvorfor kan jeg ikke give points til Jeppe
Finn