Avatar billede hasan Nybegynder
02. april 2004 - 12:53 Der er 2 kommentarer og
1 løsning

brug en memo som synedit?

Har brug for noget hjælp, jeg kan ikke installer synedit så jeg prøver at bruge en memo istedet og det virker da også noget af vejen.

her er min kode:

function TForm1.FindTitle : string;
var
i : integer;
start, stop : TPoint;
kode : string;
begin
for i := 0 to memo1.Lines.Count - 1 do
  begin
  kode := memo1.Lines;
  if Pos('<title>', lowercase(kode)) > 0 then
  begin
      start.X := Pos('<title>', lowercase(kode))+7;
      start.Y := i+1;
  end;
  if Pos('</title>', Lowercase(kode)) > 0 then
    begin
    stop.X := Pos('</title>', lowercase(kode));
    stop.Y := i+1;
  end;
end;
//Editor.BlockBegin := Start;
//Editor.BlockEnd := Stop;
  result := memo1.SelText;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
edit1.Text := FindTitle;
end;
Avatar billede hrc Mester
02. april 2004 - 14:09 #1
Der er flere ting der er galt med dit eksempel:

begin

// Brug Memo1.Lines.Text i stedet og få hele teksten ud i een streng
for i := 0 to memo1.Lines.Count - 1 do begin

  // lowercase her i stedet for at gøre det to gange nedenfor. Desuden kalder du    // Memo1.Lines uden indeks Lines[i]
  kode := memo1.Lines;

  // Gem pos i en variabel i stedet for at pos'e to gange for hver token
  if Pos('<title>', lowercase(kode)) > 0 then begin
    // Ikke nødv. hvis du bare læser een streng som foreslået ovenfor
    start.X := Pos('<title>', lowercase(kode))+7;
    start.Y := i+1;
  end;
  if Pos('</title>', Lowercase(kode)) > 0 then
    begin
    stop.X := Pos('</title>', lowercase(kode));
    stop.Y := i+1;
  end;
end;
  result := memo1.SelText; // Tjaa, ikke kønt...
end;

Nedenstående virker. Bemærk at jeg bruger konstanter i stedet for at skrive <title> to gange og risikere at jeg staver forkert. Desuden lægger jeg ikke bare 7 til p1, men tager længden af startsegmentet. En meget mere sikker og effektiv funktion er resultatet.
const
  StartTitle = '<title>';
  StopTitle = '</title>';

function TForm1.FindTitle : string;
var
  lgd, p1,p2 : integer;
  Kode : string;
begin
  result := ''; lgd := length(StartTitle);
  Kode := lowercase(memo1.Lines.Text);
  p1 := Pos(StartTitle,Kode);
  p2 := Pos(StopTitle,Kode);
  if (p1 > 0) and (p2 > p1) then
    result := copy(memo1.Lines.Text,p1+lgd,p2-p1-lgd);
end;
Avatar billede hasan Nybegynder
02. april 2004 - 14:32 #2
hehe der var mange fejl

det virker, TAK
Avatar billede hrc Mester
02. april 2004 - 16:55 #3
Der var enkelte fejl, men det jeg slog ned på var, at koden var ineffektiv.

Her var det ret udtalt idet du havde 4 kald til "pos" hvor kun det halve var nødvendigt. Det samme gjalt den CPU-tunge LowerCase som blev kørt to gange.
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