Avatar billede mxs Nybegynder
30. november 2004 - 22:17 Der er 14 kommentarer og
1 løsning

Har lidt problemer med at optælle ord

Hey eksperter


Jeg har i længere tid prøvet at lave en tekst editor og jeg er da kommet så langt at jeg nu skal til at lave nogle procedurere som kan hjælpe mig med at optælle alle ordene i det dokument der er åbnet og derefter give resultatet i en ny form, men jeg kan ikke rigtig compile koden pga. at den melder fejl. Jeg forstår det ikke og vil derfor gerne se om i kan hjælpe mig lidt.

Her er min procedurere:

{Nu vil jeg lave nogle procedurer hvor ved jeg kan finde antal ord som er skrevet i mit dokument}
procedure SkipSkilleTegn(var Streng: string);
begin
    while(Length(Streng)>0) and (Streng[1] in SkilleTegn+[' '])
    do Delete(Streng,1,1);
end;


procedure OpsamlOrd(var Streng, NaesteOrd: string);
begin
    NaesteOrd:='';
    while(Length(Streng) > 0) and
                          not(Streng[1] in SkilleTegn+[' ']) do
    begin
        NaesteOrd:=NaesteOrd+Streng[1];
        Delete(Streng,1,1);
    end;

end;


procedure FindOrd(var Streng, NaesteOrd: string);
begin
    NaesteOrd:='';
    if Streng='' then Exit;
    SkipSkilleTegn(Streng);
    if Streng='' then Exit;
    OpsamlOrd(Streng,NaesteOrd);
end;

procedure FindAntalOrd(RichEdit: TRichEdit;var Antal: Integer);
var
  Tekst, Ord: string;

begin
    Antal:=0;
    Tekst:=form1.RichEdit1.Text;
    while Tekst<> '' do
    begin
          FindOrd(Tekst,Ord);
          if Ord <> '' then inc(Antal);
    end;

end;

Fejlen den kommer med er
[Error] Unit1.pas(392): ';' expected but '.' found
[Fatal Error] V6.dpr(6): Could not compile used unit 'Unit1.pas'

Det den hentyder til er denne procedure
procedure TForm2.FormActivate(Sender: TObject);
var
  AntalOrd: Integer;

begin
    FindAntalOrd(Form1.RichEdit1,AntalOrd);
    Form2.Label2.Caption:=inttostr(AntalOrd);

end;
Altså den som skal kalde form2 og sætte resultatet i den. Jeg forstår det ikke :( Håber i kan hjælpe mig lidt!!

På forhånd tak,
Martin Slot
30. november 2004 - 22:26 #1
Hvad står der på Linie 392, hvor fejlen er?
30. november 2004 - 22:29 #2
Eller er det fordi 'ord' er et reserveret ord?
Avatar billede nca Juniormester
30. november 2004 - 23:28 #3
Ord er er reserveret ord. Det er den modsatte funktion af Char.
Avatar billede mxs Nybegynder
01. december 2004 - 17:16 #4
Nu har jeg rettet ord til ordene :) Men den kommer stadig med samme fejl:
[Error] Unit1.pas(385): ';' expected but '.' found

Det henviser til denne linje:
procedure TForm2.FormActivate(Sender: TObject);

Altså til tegnet mellem formactivate og TForm2
01. december 2004 - 23:19 #5
Hvad står der i linien, eller linierne umiddelbart oven over?
Det ser ud som om linien oven over ikke bliver afslukket med et semikolon.
Avatar billede mxs Nybegynder
02. december 2004 - 16:09 #6
I linien ovenover står der det her

procedure TForm2.FormActivate(Sender: TObject);
var
  AntalOrd: Integer;

begin
    FindAntalOrd(Form1.RichEdit1,AntalOrd);
    Form2.Label2.Caption:=inttostr(AntalOrd);

end;

Men jeg kan da ikke se nogen fejl her!!
04. december 2004 - 12:12 #7
Hej mxs
Det jeg mener er, hvad står der i linierne oven over:
procedure TForm2.FormActivate(Sender: TObject);
Altså linier der indeholder kode.
Avatar billede nca Juniormester
04. december 2004 - 12:49 #8
Ikke for at tage glæden fra dig, men her er et eksempel, der kan tælle ord i en RichEdit. Jeg har fundet eksemplet på nettet og rettet det lidt til.
Placer en Richedit, en Button og en Label på en form og så er du kørende med eksemplet.

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls;

type
  TForm1 = class(TForm)
    RichEdit1: TRichEdit;
    Button1: TButton;
    Label1: TLabel;
    procedure Button1Click(Sender: TObject);

  private
    { Private declarations }
      function CountInLine(Str: string): Integer;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  CountWord, i: Integer;
begin
  CountWord:=0;
  with RichEdit1 do
  begin
    for i:=0 to Lines.Count-1 do
      CountWord:=CountWord+CountInLine(Lines.Strings[i]);
  end;
  Label1.Caption:='Word count = '+IntToStr(CountWord);
end;

function TForm1.CountInLine(Str: string): Integer;
var
  Count,Inter: Integer;
  TimeStr,Symbol: string;
begin
  Symbol:='!@#$%^&*()~[]{}":?<>,.|\/*';
  Count:=0;
  while Length(Str)>0 do
  begin
    if Pos(' ',Str)=1 then Delete(Str,1,1)
    else
    begin
      TimeStr:=Copy(Str,1,Pos(' ',Str)-1);
      //Tal skal ikke tælle med som ord
      if TryStrToInt(TimeStr,Inter) then
        Count:=Count-1
      else
        Count:=Count;
      if (Length(TimeStr)=1) and (Pos(TimeStr,Symbol)<>0) then
        Count:=Count-1;
      if TimeStr='' then Str:=''
      else Delete(Str,1,Pos(' ',Str)-1);
      Count:=Count+1;
    end;
  end;
  CountInLine:=Count;
end;

end.
Avatar billede nca Juniormester
10. december 2004 - 09:11 #9
>>mxs
Er du gået i dvale?
Avatar billede mxs Nybegynder
02. januar 2005 - 16:36 #10
Nej... Lang historie, men jeg prøver lige og se om jeg kan få din løsning til at virke :)
Avatar billede mxs Nybegynder
03. januar 2005 - 00:12 #11
Rettet dit eksempel lidt til men jeg får en fejlmelding:
[Error] Unit1.pas(105): Undeclared identifier: 'TryStrToInt'
Avatar billede nca Juniormester
03. januar 2005 - 08:11 #12
Hvilken version af Delphi bruger du?
Avatar billede mxs Nybegynder
03. januar 2005 - 10:42 #13
Borland Delphi 4!
Avatar billede nca Juniormester
03. januar 2005 - 11:06 #14
Prøv at erstatte disse linie

if TryStrToInt(TimeStr,Inter) then
  Count:=Count-1
else
  Count:=Count;

med disse

try
  Inter:=StrToInt(TimeStr);
  Count:=Count-1;
except
  Count:=Count;
end;
Avatar billede mxs Nybegynder
16. december 2008 - 20:49 #15
Er ved at kigge alle mine points igennem, og jeg errindrer faktisk at dit svar, nca ledte mig på rette vej. Har desværre ikke koden længere.
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