Avatar billede frifoed Nybegynder
01. april 2000 - 18:32 Der er 12 kommentarer og
1 løsning

Kommasortering

Hej hvordan sorterer man efter komma? F.eks. hvis en string indeholder : 'Din, Nisse' Her skal man så have din og nisse ud hver for sig.
Avatar billede pellelil Nybegynder
01. april 2000 - 19:33 #1
Nedenstående klare din "opgave", dog har jeg ikke lavet noget "fejl check" hvis nu "," (komma) står som det aller første eller sidste tegn.

procedure StrSplit(szStr : String; VAR szStr1, szStr2 : String)
var
  iPos : Integer;
begin
  iPos := Pos(',', szStr);
  if iPos > 0 then begin
    szStr1 := Copy(szStr, 1, iPos-1);
    szStr2 := Copy(szStr, iPos+1, Length(szStr) - (iPos+1));
  end else begin
    szStr1 := szStr;
    szStr2 := '';
  end;
end;
Avatar billede frifoed Nybegynder
01. april 2000 - 20:18 #2
Jeg skulle egentlig bruge 3 outputs, kan du klare den?
Avatar billede lrj Nybegynder
01. april 2000 - 21:06 #3
frifoed - har ikke lige giddet sætte mig helt ind i koden, men kan du ikke bare:

strsplit(origstr,str1,str2);  //hiver den første ud
strsplit(str2,str2,str3);    //hiver 2. og 3. streng ud
Avatar billede frifoed Nybegynder
01. april 2000 - 21:29 #4
Det virker ikke hvis jeg bruger: 'den,rare,nisse' bliver outputtet: "den rare nis" her mangler altså bogstaver! Pointene er dine hvis du kan modificere koden så den passer :-)
Avatar billede sjensen Nybegynder
02. april 2000 - 01:03 #5
frifoed,

her er en meget lettere metode:

put en listbox på din form (skjule den evt. hvis du ikke vil se den).

Sæt Listbox1.commatext := 'den,rara,nisse';  eller
listbox1.commatext := streng; hvis streng indeholder teksten "den, rara, nisse"

Herefter vil listbox1.items.count indeholde antallet af ord adskilt af kommaer og et simpelt loop kan give dig hver enkelt ord, som (hvis du ser listboksen) er listet på hver sin linie:

den
rare
nisse

for i := 0 to listbox1.items.count -1 do
begin
  showmessage(listbox1.items[i]);
end;

Hvis du ydermere sætter listboksens "sorted" property til true bliver de enkelte linier sorteret i forhold til hinanden:

den
rare
nisse

bliver til

den
nisse
rare

let og elefant !!
Avatar billede sjensen Nybegynder
02. april 2000 - 01:07 #6
..øh,

en lille fejl: det er listbox1.items.commatext du skal bruge og du kan også bruge tstrings:

var s : tstrings;
    i : integer;
begin
  s := tstrings.create;
  s.commatext := din_text;
  for i := 0 to s.count -1 do showmessage(s[i]);
  s.free;
end;

det giver det samme
Avatar billede pellelil Nybegynder
02. april 2000 - 07:44 #7
Hvad så med ?

function GetStrElement(var szStr : String) : String;
var
  iPos : Integer;
begin
  iPos := Pos(',', szStr);
  if iPos <> 0 then begin
    Result:=System.Copy(szStr, 1, iPos-1);
    System.Delete(szStr, 1 , iPos);
  end else begin
    Result := szStr;
    szStr := '';
  end;
end;

Denne funktion fjerner kun 1 ord af gangen fra din streng (og skulle ikke "spise" nogen ekstra tegn). Hvis du bag efter vil sortere de enkelte strenge så vil en sorteres liste (TStrings) være oplagt.


Avatar billede psv Nybegynder
02. april 2000 - 09:29 #8
Nedenstående stump kode er en generel løsning på spørgsmålet:

Stik den en streng du vil have delt op (AStr), et skilletegn eller streng (Delimiter) og den liste af strenge du vil have resultatet i. Husk selv at create så vel som free'e den liste du bruger som parameter... Med mindre du stikker den .Items fra en listbox eller lign.

procedure Unscrunch(const AStr: string; Delimiter: string; AList: TStrings);
var
  APos : Integer;
  WStr : string;
begin
  WStr := AStr;
  with AList do
  begin
    if Count > 0 then
      Clear;
    APos := Pos(Delimiter, WStr);
    while APos > 0 do begin
      Add(Copy(WStr, 1, APos-1));
      System.Delete(WStr, 1, APos-1 + Length(Delimiter));
      APos := Pos(Delimiter, WStr);
    end;
    Add(WStr);
  end;
end;
Avatar billede psv Nybegynder
04. april 2000 - 08:13 #9
Hallo frifoed... Er du der?
Avatar billede frifoed Nybegynder
05. april 2000 - 18:01 #10
Godt du vækkede mig PSV men jeg har ligget med 39,3 i feber :-( Angående de forskellige koder så kan jeg sgu ikke lige overskue dem. Jeres forslag med tstrings og listbox's forstår jeg ikke helt da jeg gerne skulle have outputtet i tre forskellige strings og ikke i en tabel. Den første kode som pellelil kom med var helt perfekt med mangler bare tre outputs istedet for to! Kan i ikke omskrive den til tre outputs?
Avatar billede psv Nybegynder
05. april 2000 - 19:09 #11
Oki, vi laver lige proceduren om så den returnerer resultatet i 3 strings, Str1, Str2 og Str3.

Dvs: 'Nisse,Hat,Bil' bliver til "Nisse", "Hat", og "Bil"

Er der flere kommaer bliver resten af teksten bare skåret væk...

procedure Unscrunch(const AStr: string; Delimiter: string;
                    var Str1, Str2, Str3: string);
var
  APos  : Integer;
  WStr  : string;
  AList : TStringList;
begin
  AList := TStringList.Create;
  try
    WStr := AStr;
    with AList do
    begin
      APos := Pos(Delimiter, WStr);
      while APos > 0 do begin
        Add(Copy(WStr, 1, APos-1));
        System.Delete(WStr, 1, APos-1 + Length(Delimiter));
        APos := Pos(Delimiter, WStr);
      end;
      Add(WStr);
    end;
    Str1 := '';
    Str2 := '';
    Str3 := '';
    if AList.Count > 0 then
      Str1 := AList[0];
    if AList.Count > 1 then
      Str2 := AList[1];
    if AList.Count > 2 then
      Str3 := AList[2];
  finally
    AList.Free;
  end;
end;
Avatar billede psv Nybegynder
05. april 2000 - 19:11 #12
Skrammelinterface... Det æder mine ''''er :-)
Avatar billede frifoed Nybegynder
05. april 2000 - 19:46 #13
Den er perfekt! Tak for hjælpen allesammen :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester