Avatar billede anold Nybegynder
22. september 2004 - 13:23 Der er 7 kommentarer og
1 løsning

Søg box

Davs
Hvorfor virker dette her ikke,
Jeg får fejlen INVALID CLASS TYPECAST i linjen med ****


procedure TFrmEditor.SPFindClick(Sender: TObject);
Var
st : TSearchTypes;
NewPos : Integer;
FindDialog : TFindDialog;

begin
FindDialog := (Sender as TFinddialog); //********************
if FindDialog.Execute then
begin

If FrMatchCase In FindDialog.Options Then
  St := St +[StMatchCase];

If FrWholeWord In FindDialog.Options Then
  St := St +[StWholeWord];

If RichEdit1.SelLength > 0 Then
  RichEdit1.SelStart := RichEdit1.SelStart + 1;

NewPos := RichEdit1.FindText(FindDialog1.FindText, RichEdit1.SelStart,
  Length(RichEdit1.Text), st);

if NewPos <> -1 Then
  Begin
  Setfocus;
  RichEdit1.SelStart := NewPos;
  RichEdit1.SelLength := Length(FindDialog.FindText);
  end
  Else
    Begin
    MessageDlg('Slutningen af filen ' + OpenDialog1.FileName + ' er nået ', mtInformation
      , [mbok],0);
    RichEdit1.SelStart := 0;
    end;
end;
end;
Avatar billede hrc Mester
22. september 2004 - 15:38 #1
Der er både fordele og ulemper ved at bruge (Sender as TEtEllerAndet) - ulempen er her, at man ikke kan se hvem sender er. Jeg er på vej væk fra den praksis efter et par dårlige oplevelser (man har et standpunkt indtil man tager et nyt)

Du kan prøve at sætte en debug-linie ind foran din typecast:

  MessageDlg(Sender.ClassName,mtInformation,[mbOK],0);

Jeg gætter på at det er en knap og ikke FindDialog formen.
Avatar billede anold Nybegynder
22. september 2004 - 19:22 #2
Hej Hrc

Den procedure jeg bruger er en Speedbuttom.click, men det er der vel ikke noget galt i, eller hvad mener du med " Jeg gætter på at det er en knap og ikke FindDialog formen."

Hilsen Anders
Avatar billede anold Nybegynder
23. september 2004 - 06:51 #3
Davs igen

Nu har jeg prøvet at gøre sådan her, og så får jeg ikke fejlen
nu kommer søg box'en fint frem men der sker ikke noget når jeg trykker på knappen søg
her er min nye kode :

procedure TFrmEditor.SPFindClick(Sender: TObject);
begin
  FindDialog1.Execute
end;

procedure TFrmEditor.FindDialog1Find(Sender: TObject);
var
st: TSearchTypes;
newpos: integer;
FindDialog: TFindDialog;
begin
FindDialog := (Sender as TFindDialog);

if frMatchCase in FindDialog.Options then
  st := st+[stMatchCase];

if frWholeWord in FindDialog.Options then
  st := st+[stWholeWord];

if RichEdit1.SelLength > 0 then
  RichEdit1.SelStart := RichEdit1.SelStart + 1;

newpos := RichEdit1.FindText(FindDialog.FindText, RichEdit1.SelStart, Length(RichEdit1.Text), st);

if newpos <> -1 then
  begin
    SetFocus;
    RichEdit1.SelStart := newpos;
    RichEdit1.SelLength := Length(FindDialog.FindText);
  end
else
  begin
    MessageDlg('Slutning af filen er nået',mtInformation,[mbOK],0);
    RichEdit1.SelStart := 0;
  end;

end;
Avatar billede hrc Mester
23. september 2004 - 08:51 #4
Jeg har ikke lige kigget på dit seneste problem, men hvis du forsøger at typecaste en TSpeedButton til en TFindDialog, så vil det give problemer. Det var det jeg refererede til.

I øvrigt: Det er lidt uheldigt at du bruger st som en TSearchTypes. Jeg kan godt se at du bruger initialerne, men det er nærmest en De Facto standard at st = string så derfor kan det være forvirrende.

Hvad gør:

if RichEdit1.SelLength > 0 then
  RichEdit1.SelStart := RichEdit1.SelStart + 1;

Hvis der er markeret en tekst så skal den da ikke incrementere noget, eller hvad?

Umiddelbart (= ikke testet) synes jeg det virker logisk at gøre det således:

with RichEdit1 do
  if SelLength = 0 then
    NewPos := FindText(FindDialog.FindText, 0, length(Text) - 1, st) // Usikker mht. -1 -> test
  else
    NewPos := FindText(FindDialog.FindText, SelStart, SelLength, st);
Avatar billede anold Nybegynder
23. september 2004 - 08:55 #5
Hej Hrc

Jeg tror gerne at der er en smarter måde at gøre det på

kan du lave en rutine der virker ???
evt mod flere points :-)
Avatar billede hrc Mester
23. september 2004 - 12:09 #6
Efter at have brugt lidt tid på det så er det slet ikke så dumt endda. Min version ser sådan ud (reText = RichEdit osv.). Jeg har slået UpDown knapperne fra, idet jeg legede lidt med ReverseString på både tekst og søgestreng, men det blev aldrig homogent og eksemplet blev ødelagt.

procedure TfrmMain.btnSearchClick(Sender: TObject);
begin
  reText.SelStart := 0;
  FindDialog.Execute;
end;

procedure TfrmMain.FindDialogFind(Sender: TObject);
var
  NewPos : Integer;
  SearchSt : string;
  SearchTypes : TSearchTypes;
begin
  SearchTypes := [];
  if FrMatchCase in FindDialog.Options then
    SearchTypes := SearchTypes + [StMatchCase];

  if FrWholeWord in FindDialog.Options then
    SearchTypes := SearchTypes + [StWholeWord];

  SearchSt := FindDialog.FindText;

  with reText do begin
    if not (frFindNext in FindDialog.Options) then
      NewPos := FindText(SearchSt,0,MaxInt,SearchTypes)
    else begin
      SelStart := SelStart + length(FindDialog.FindText);
      NewPos := FindText(SearchSt,SelStart,MaxInt,SearchTypes);
    end;

    if NewPos <> -1 then begin
      Setfocus;
      SelStart := NewPos;
      SelLength := length(SearchSt);
    end
    else if MessageDlg('EOF, start forfra?',mtConfirmation,[mbYes,mbNo],0) = mrYes then
      SelStart := 0;
  end;
end;
Avatar billede anold Nybegynder
23. september 2004 - 13:05 #7
Hej Hrc

Nu har jeg lige prøvet dit forslag men det ser ikke ud til at

procedure TfrmMain.btnSearchClick(Sender: TObject);

kommer ned i

procedure TfrmMain.FindDialogFind(Sender: TObject);

hvad kan det skyldes ??
Avatar billede hrc Mester
23. september 2004 - 14:09 #8
Er de to procedurer koblet op med hhv. knappens OnClick og FindDialogens OnFind events?
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