掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
コード補完の実装を実現するには? (ID:43270)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
monnaさん、ポップアップリストビュー、わざわざありがとうございますm(__)m。 色々と参考にしてみます。 こちらでも、まだバグありですが、何とか動作確認までいけました。 試作で作った即席コード補完です。 色々と勉強になった次第です^^。 以下、こちらの試作版ソースです。 リッチエディット、パネル上にラインエディットとリストボックスを配置し、 マウスカーソル位置にパネルが「.」で出現します。 procedure TForm1.RichEdit1KeyPress(Sender: TObject; var Key: Char); var fs,s,findItem:string; i,i1,i2,ans1,ans2,loop:integer; sary:array[0..50] of string; sset:array[0..14] of string; begin sset[0] := '.'; sset[1] := ','; sset[2] := '['; sset[3] := ']'; sset[4] := '+'; sset[5] := '-'; sset[6] := '/'; sset[7] := ' '; sset[8] := '^'; sset[9] := '\'; sset[10] := '!'; sset[11] := '&'; sset[12] := '%'; sset[13] := '#'; sset[14] := '|'; //リストボックスを表示 with form1.listbox1 do begin if key = char(46) then begin panel1.Visible := true; form1.ActiveControl := edit1; items.Clear; panel1.left := mx;//マウス座標を代入 panel1.top := my; tag := 1; end; //もし、リストボックスが表示されたなら if panel1.visible = true then begin listbox1.Items.Clear; loop := 0; //単語区切り文字を検出して、単語切り取りポイントを記録 while 14 > loop do begin i := 0; //メモを一行ずつ、AnsiPosで検索 while form1.RichEdit1.Lines.Count > i do begin i1 := 0; ans1 := ansipos(sset[loop],form1.RichEdit1.Lines[i]); //ヒットした単語を全て登録 if ans1 <> -1 then begin fs := form1.RichEdit1.Lines[i]; //リストに登録 //単語を抽出、結合 findItem := ''; while ans1 > i1 do begin sary[i1] := fs[i1]; findItem := findItem + sary[i1]; i1 := i1 + 1; end; i1 := 0; //もし、リストが重複してなければ登録 if -1 = form1.ListBox1.Items.IndexOf(findItem) then begin listbox1.Items.Add('');//一覧表示後、再登録している。初期化の必要あり while ans1 > i1 do begin sary[i1] := fs[i1]; listbox1.Items[i] := listbox1.Items[i] + sary[i1]; if -1 <> ansipos(edit1.Text,form1.RichEdit1.Lines[i]) then begin //ここに、検索アルゴリズムを加える。 // end else begin end; i1 := i1 + 1; end; end; tag := 0; s := ''; end; i := i + 1; end; loop := loop + 1; end; end; //もし、リターンキー又はエスケープが押されたならば、キャンセル if (key = char(27)) or (key = char(13)) then begin items.Clear; panel1.visible := false; exit; end; end; listbox1.Items.SaveToFile( ExtractFilePath( Paramstr(0) ) + 'list.txt' ); end; procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char); var i,i1:integer; begin i := 0; listbox1.Items.LoadFromFile( ExtractFilePath( Paramstr(0) ) + 'list.txt' ); while listbox1.Items.Count > i do begin i1 := ansipos(key,listbox1.Items[i]); if i1 <> 0 then begin i := i + 1; end else begin listbox1.Items.Delete(i); end; //if key = char(8) then end; if (key = char(27)) or (key = char(13)) then begin listbox1.items.Clear; panel1.visible := false; exit; end; end;
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.