Hej. Jeg har et indput med sætningen "GULE ÆRTER MED FLÆSK", samt en variable med hele alfabetet (startende med mellemrum) gemt i OnCreate proceduren.
Det jeg vil, er at når man trykker på button3, vil den løbe ordet igennem i edit3 (standard: "GULE ÆRTER MED FLÆSK"), hvorefter den først vil finde hvor mellemrummene er, og skrive dem i hhv. key[1], key[2] og key[3], og så videre med alfabetet.
procedure TForm1.Button3Click(Sender: TObject); var i,t: integer; begin for i:=1 to length(edit3.text) do begin for t:=1 to length(alfa) do begin if edit3.text[i] = alfa[t] then begin key[i]:=t; end; end; label6.caption:=label6.caption +' '+ inttostr(key[i]); end;
problemet er bare, at der overhovedet ikke kommer noget fornuftigt ud, ligenu står der i min label6:
8 22 13 6 1 28 ...
Lig mærke til 22! Hvordan i alverden kan den skrive 22? Starten skulle lyde noget á la: 5 11 15 14 4 9 ...
Fordi du skriver udelukkende skriver hvert tegns position i alfa, startende fra en ende af. Sagt på en anden måde - du laver intet for at den skal finde mellemrummene først :)
Start din procedure med noget i stil med det her:
i:=Pos(' ',Edit3.Text); while i<>0 do begin Label6.Caption:=Label6.Caption + ' ' + inttostr(i); i:=PosEx(' ',Edit3.Text,i+1); end;
Så skulle den tage positionen på mellemrummene først, og derefter fortsætte som hidtil (jeg går ud fra det er det du vil have, er ikke helt sikker).
Vær dog liiige opmærksom på at jeg på stående fod ikke kan huske om man skal skrive det man vil søge efter før det man skal søge i, og om det er nødvendigt at bruge i+1 som tredje parameter til PosEx, eller om i er nok - jeg ville normalt se efter i dokumentationen, men det har jeg p.t. ikke mulighed for.
Synes godt om
Slettet bruger
23. januar 2007 - 13:32#2
PosEx? Den funktion kender jeg ikke, den brokker sig også når jeg kører programmet?
Nogle gange er I altså lidt hjælpeløse! Hvis du stiller markøren oveni PosEx og trykker <F1> så kommer der hjælpetekst frem der fortæller hvilken unit der skal inkluderes. Det virker sikkert også sådan i D7
I dette tilfælde StrUtils - og i+1 lader til at være nødvendig, så vidt jeg kan se ud fra Borland's kildekode (source\win32\rtl\common\StrUtils.pas). (Og nu må jeg vist hellere prøve at få liv i Document Explorer igen, så jeg kan tilgå min dokumentation.)
Hvis du kan leve med at separatoren er et komma - har kigget i koden og den kan ikke ændres vha. StringList.Delimiter := #32; eller lignende - så vil nedenstående virke.
function TfrmMain.AnalyzeString(aInput: string): string; const Alphabet = ' ABCDEFGHIJKLMNOPQRSTUVWXYZÆØÅ'; var Ch : char; StringList : TStringList; i, j, InputLgd : integer; begin StringList := TStringList.Create; try aInput := AnsiUpperCase(aInput); InputLgd := length(aInput); for i := 1 to length(Alphabet) do begin Ch := Alphabet[i]; for j := 1 to InputLgd do if aInput[j] = Ch then StringList.Add(IntToStr(j)); end; result := StringList.CommaText; finally StringList.Free; end; end;
procedure TForm1.Button3Click(Sender: TObject); var i,t,c: integer; begin c:=1; for i:=1 to length(alfa) do begin for t:=1 to length(edit3.text) do begin if edit3.text[t] = alfa[i] then begin key[c]:=t; label6.caption:=label6.caption +' '+ inttostr(key[c]); inc(c); end; end; end; end;
Og det bliver lidt pænere at se på hvis man fjerne nogle begin-end:
procedure TForm1.Button3Click(Sender: TObject); var i,t,c: integer; begin c:=1; for i:=1 to length(alfa) do for t:=1 to length(edit3.text) do if edit3.text[t] = alfa[i] then begin key[c]:=t; label6.caption:=label6.caption +' '+ inttostr(key[c]); inc(c); end; end;
Her er en løsning hvor PosEx benyttes, den er faktisk 30% hurtigere end min forrige post:
procedure TForm1.Button3Click(Sender: TObject); var i,t,x,c: integer; begin c:=1; for i:=1 to length(alfa) do begin x:=1; t:=PosEx(alfa[i],edit3.Text,x); while t>0 do begin key[c]:=t; x:=t+1; label6.caption:=label6.caption +' '+ inttostr(key[c]); inc(c); t:=PosEx(alfa[i],edit3.Text,x); end; end; end;
Her er en løsning hvor Pos benyttes i stedet for PosEx og den løsning er lidt hurtigere end PosEx metoden, jeg kørte de 3 muligheder x antal gange og fik følgende:
procedure TForm1.Button3Click(Sender: TObject); var i,t,c,x: integer; Temp : string; begin c:=1; for i:=1 to length(alfa) do begin Temp:=edit3.Text; x:=0; t:=Pos(alfa[i],Temp); while t>0 do begin key[c]:=t+x; label6.caption:=label6.caption +' '+ inttostr(key[c]); inc(c); Delete(Temp,t,1); t:=Pos(alfa[i],temp); inc(x); end; end; end;
Jeg testede lige hrc´s løsning og den kørte x gange på under 1 sekund :) så en hel del hurtigere, jeg har nu rettet lidt på løsningen uden pos og løsningen med PosEx således at de er lige så hurtig som hrc´s løsning. PosEx løsningen er en lille smule hurtigere.
procedure TForm1.Button3Click(Sender: TObject); var i,t,c: integer; tekst : string; begin c:=1; tekst:=edit3.Text; for i:=1 to length(alfa) do begin for t:=1 to length(tekst) do if tekst[t] = alfa[i] then begin key[c]:=t; inc(c); end; end; tekst:=''; for i:=1 to length(edit3.Text) do tekst:=tekst +' '+ inttostr(key[i]);
label6.caption:=tekst; end;
procedure TForm1.Button3Click(Sender: TObject); var i,t,x,c: integer; tekst : string; begin c:=1; tekst:=edit3.Text; for i:=1 to length(alfa) do begin x:=1; t:=PosEx(alfa[i],tekst,x); while t>0 do begin key[c]:=t; x:=t+1; inc(c); t:=PosEx(alfa[i],tekst,x); end; end;
tekst:=''; for i:=1 to length(edit3.Text) do tekst:=tekst +' '+ inttostr(key[i]);
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.