AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

nonVCL: Suchen

Ein Thema von Alexander · begonnen am 9. Feb 2003 · letzter Beitrag vom 8. Sep 2006
Antwort Antwort
Seite 1 von 2  1 2      
Alexander

Registriert seit: 28. Aug 2002
Ort: Oldenburg
3.513 Beiträge
 
Turbo Delphi für .NET
 
#1

nonVCL: Suchen

  Alt 9. Feb 2003, 10:03
Hi Leute,
ich bin jetzt auch auf dem nonVCL-Trip und programmier gerade einen einfachen Notepad-Clone, bin auch schon fast fertig.
Jetzt bin ich gerade dabei eine Suchfunktion zu erstellen. Den Dialog habe ich schon hinbekommen. Doch wie bekomme ich den eingegebenen Suchstring heraus?
Delphi-Quellcode:
function searchdlg(wnd : hwnd):Boolean;
var
  szFindWhat : PChar;
begin
  finddlg.lStructSize := sizeof(finddlg);
  finddlg.hwndOwner := wnd;
  finddlg.lpstrFindWhat := szFindWhat;
  finddlg.wFindWhatLen := 80;
  finddlg.Flags := 0;

  FindText(finddlg);
end;
so erstelle ich mir den Suchen-Dialog. Und wie geht es weiter`?
Alexander
  Mit Zitat antworten Zitat
CalganX

Registriert seit: 21. Jul 2002
Ort: Bonn
5.403 Beiträge
 
Turbo Delphi für Win32
 
#2
  Alt 9. Feb 2003, 10:34
Hast du dir bereits Luckies Notepade-Clon angesehen? Wenn ich mich recht entsinne steht es da drin..

Chris
  Mit Zitat antworten Zitat
Alexander

Registriert seit: 28. Aug 2002
Ort: Oldenburg
3.513 Beiträge
 
Turbo Delphi für .NET
 
#3
  Alt 9. Feb 2003, 13:17
bisher noch nicht, ich wollte eigentlich auch alles mehr oder weniger selber machen und nicht nur abschreiben...
Könnt ihr mir nicht mal kurz sagen wie ich den eingegebenen Suchstring herausfinde?
Alexander
  Mit Zitat antworten Zitat
MathiasSimmack
(Gast)

n/a Beiträge
 
#4
  Alt 9. Feb 2003, 14:08
Das geht eben leider nicht kurz. Sorry, alex. Ich spreche aus Erfahrung. Außerdem brauchst du dann kein Multi-Line-Edit sondern ein RichEdit, weil nur das, IMHO, das Suchen von Text unterstützt.

Ansonsten schaue mal ins PSDK zum Thema RichEdit. Da müsste das auch drin stehen. Und der Dialog dürfte ein Standarddialog sein, sollte also auch im PSDK aufgeführt sein.
  Mit Zitat antworten Zitat
Alexander

Registriert seit: 28. Aug 2002
Ort: Oldenburg
3.513 Beiträge
 
Turbo Delphi für .NET
 
#5
  Alt 9. Feb 2003, 14:19
dialog usw. habe ich ja schon selber herausgefunden. ICh will ja nur wissen, was der USer im Dialog eingegeben hat. Weißt du da vielleicht was?
Alexander
  Mit Zitat antworten Zitat
MathiasSimmack
(Gast)

n/a Beiträge
 
#6
  Alt 9. Feb 2003, 14:42
@Luckie: Mal ´ne Frage; hattest du noch was an deinem Editor gemacht? Ich habe nämlich bei mir auf der Platte nur eine Version gefunden, die zwar suchen konnte aber nur in Richtung Textende. Das Suchen zum Anfang hin klappte nicht.

Ich habe das Problem jetzt gelöst. Wo is´n der Smiley mit der Wand?

< ------------ >

Also, alex, zuerst die Vorarbeit:
Delphi-Quellcode:
// RichEdit 2.0 erzeugen
hEdit := CreateWindowEx(WS_EX_CLIENTEDGE,'RichEdit20A',nil,
  ...);
RichEdit20 := (hEdit <> 0);

// hat nicht geklappt, dann RichEdit 1.0 erzeugen
if(not RichEdit20) then
  hEdit := CreateWindowEx(WS_EX_CLIENTEDGE,'RICHEDIT',nil,
  ...);
Die Bool-Variable "RichEdit20" ist global, weil sie noch anderweitig benutzt wird! In Luckies Programm wird dann beim Suchen die Prozedur "Find" aufgerufen. Sollte kein RichEdit 2.0 erzeugt worden sein, wird das Feld mit der Suchrichtung versteckt:
Delphi-Quellcode:
var
  fnd : TFindReplace;
  FindStr : array[0..4096]of Char;
  FindLen : DWORD = SizeOf(FindStr) - 1;
  FindTextMsgId : UINT;

procedure Find(hWnd: THandle; hWndEdit: Thandle);
const
  sFlag : array[boolean]of cardinal =
    (FR_HIDEUPDOWN,FR_DOWN);
begin
  fnd.lStructSize := sizeof(TFindReplace);
  fnd.hWndOwner := hWnd;
  fnd.Flags := sFlag[RichEdit20];
  fnd.lpstrFindWhat := FindStr;
  fnd.wFindWhatLen := FindLen;

  FindTextMsgId := RegisterWindowMessage(FINDMSGSTRING);

  CommDlg.FindText(fnd);
end;
Hm, etwas blöd zu erklären, aber ... Dieser Teil steckt in der WNDPROC deines Fensters drin. Da es sich aber bei der Nachricht um keine Konstante handelt, kannst du sie nicht mit case-of abfragen. Deswegen so:
Delphi-Quellcode:
// Suchfunktion, by NicoDE
if(uMsg = FindTextMsgId) and (FindTextMsgId <> 0) then begin
  FindParam := PFindReplace(lp);
  if(FindParam.Flags and FR_DIALOGTERM = FR_DIALOGTERM) then begin
    hWndDlg := 0;
  end else if(FindParam.Flags and FR_FINDNEXT = FR_FINDNEXT) then
    SearchText(FindParam.hWndOwner, FindParam.lpstrFindWhat,
      (FindParam.Flags and FR_DOWN = FR_DOWN) or not RichEdit20,
      FindParam.Flags and FR_MATCHCASE = FR_MATCHCASE,
      FindParam.Flags and FR_WHOLEWORD = FR_WHOLEWORD);

      Result := false;
  end
Das "or not RichEdit20" habe ich eingefügt, damit -beim RichEdit 1.0- die Suchrichtung auf das Textende (Abwärts) festgelegt wird. Vergisst man das, wird genau einmal gesucht.

So, auf die Weise wird also die Prozedur "SearchText" aufgerufen, die letztlich den gesuchten Text im RichEdit markiert:
Delphi-Quellcode:
procedure SearchText(wnd: HWND; Text: pchar; Down, Sense, Whole: Bool);
var
  REdit : HWND;
  Flags : integer;
  FindRec : TFindText;
  FindPos : integer;
  ErrMsg : array[0..4096]of Char;
begin
  REdit := GetDlgItem(wnd,IDC_EDIT);

  if(REdit <> 0) then begin
    SendMessage(REdit,EM_EXGETSEL,0,LPARAM(@FindRec.chrg));

    if(not Down) then FindRec.chrg.cpMin := FindRec.chrg.cpMax - 1
      else FindRec.chrg.cpMin := FindRec.chrg.cpMax;
    FindRec.chrg.cpMax := -1;
    FindRec.lpstrText := Text;

    Flags := 0;
    if(Down) then Flags := FR_DOWN;
    if(Sense) then Flags := Flags or FR_MATCHCASE;
    if(Whole) then Flags := Flags or FR_WHOLEWORD;

    FindPos := SendMessage(REdit,EM_FINDTEXT,
      Flags,LPARAM(@FindRec));

    if(FindPos > 0) then begin
      FindRec.chrg.cpMin := FindPos;
      FindRec.chrg.cpMax := FindPos + lstrLen(Text);
      SendMessage(REdit,EM_EXSETSEL,0,LPARAM(@FindRec.chrg));
    end else begin
      lstrcpy(ErrMsg,pchar('"' + Text + '"'));
      lstrcat(ErrMsg,CANNOT_FINDTEXT);
      MessageBox(wnd,ErrMsg,APPNAME,MB_ICONINFORMATION);
    end;
  end;
end;
Die Zeile
if(not Down) then ... behebt das am Anfang angesprochene Problem mit der Suche in Richtung Textanfang. Jetzt sucht das Ding wie wild. @alex: Falls was unklar ist, frag einfach. Okay?

btw: Die Suchfunktion ist, IMHO, übrigens komplett von NicoDE. Wir woll´n uns ja nicht mit fremden Federn schmücken.
  Mit Zitat antworten Zitat
Alexander

Registriert seit: 28. Aug 2002
Ort: Oldenburg
3.513 Beiträge
 
Turbo Delphi für .NET
 
#7
  Alt 9. Feb 2003, 16:14
vielen Dank,
das ist ja sogar mehr als ich wollte,....ich wollt ja eigentlich nur den Suchstring haben, aber nun gut, nochmals vielen Dank
Ich werde es mir wohl erst morgen ankucken können
Alexander
  Mit Zitat antworten Zitat
MathiasSimmack
(Gast)

n/a Beiträge
 
#8
  Alt 9. Feb 2003, 17:07
Also, ich muss ehrlicherweise sagen, dass ich mich bisher nicht groß mit der Suchenfunktion beschäftigt habe. Aber ich sitze gerade dran und habe noch ein paar Dinge gefunden, die man verbessern kann.

Meine o.g. Vorschläge waren mehr oder weniger nur so aus dem Stegreif. Ich bin gerade dabei, etwas dazu zu schreiben. Und wenn Luckie will, dann schicke ich ihm das für eine evtl. Veröffentlichung auf seiner HP zu. Es interessiert vielleicht noch mehr Leute.

Bin gleich fertig.
Nur noch ein bisschen Formulieren, damit´s schön klingt.
  Mit Zitat antworten Zitat
MathiasSimmack
(Gast)

n/a Beiträge
 
#9
  Alt 10. Feb 2003, 07:44
@alex: Luckie hat freundlicherweise den Beitrag auf seiner Seite freigeschaltet. So muss man nicht bis zum nächsten Tut-Update warten. Ich denke, diese zweite Variante ist auch etwas optimaler und geht ein klitze auf die Warum's und Wie's ein.

Gruß.
  Mit Zitat antworten Zitat
Alexander

Registriert seit: 28. Aug 2002
Ort: Oldenburg
3.513 Beiträge
 
Turbo Delphi für .NET
 
#10
  Alt 10. Feb 2003, 16:44
vielen Dank...
Ist würklich nett...
Alexander
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:36 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz