マンガでよめる痔のこと・薬のこと

http://www.geocities.jp/asumaroyuumaro/program/t …

上記の頁を参考に次のようにしているのですがうまくいきません

pos_cur := RichEdit2.Perform(EM_LINEINDEX, UINT(-1), 0);
何か勘違いしていますか?

質問者からの補足コメント

  • 回答ありがとうございます。

    >カーソル位置の何を取得したいんですか?
    カーソル位置データ(何文字目かでも、何バイト目かでもOKです)です。

    pos_cur := RichEdit2.Perform(EM_LINEINDEX, UINT(-1), 0);
    Label19.Caption := IntToStr(pos_cur);
    確認のため、上記のようにLabelに表示しているのですが、0になります。

    No.1の回答に寄せられた補足コメントです。 補足日時:2015/05/02 05:08
  • 今はRichEditコンポーネントの動作確認段階で、FormにRichEdit(テキスト入力済み)、Buttonを置き、マウスでRichEditのカーソルを移動させ、buttonでその時の位置を取得するようにしています。

    また、
    pos_cur := RichEdit2.Perform(EM_LINEINDEX, UINT(-1), 0);
    の前に
    RichEdit2.SetFocus;
    を置いても同じです。

      補足日時:2015/05/02 08:22

A 回答 (1件)

RichEdit2.Perform(EM_LINEINDEX, UINT(-1), 0)


これは、提示されたサイトにも書いてあるように、カーソルがある行の先頭文字がテキスト全体の最初から何文字目になるかを返します。

カーソル位置の何を取得したいんですか?
それが分からないと、「何か勘違いしていますか?」と訊かれてもこたえようがありません。
この回答への補足あり
    • good
    • 0
この回答へのお礼

ありがとうございます。
http://afsoft.jp/program/del2010/p11_056.html
にあるCaretPosプロパティを使って
pos_cur := RichEdit2.CaretPos.X;
とすればうまくいくようです。
お手数をおかけして申し訳ありませんでした。

お礼日時:2015/05/02 11:08

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QDelphiのRichEditで任意の行の文字を変えたいのですが

Delphi XE5 Starterを使っています。

カーソルのある行の文字色を変えるには
RichEdit1.SelStart :=5; // 開始位置
RichEdit1.SelLength := 10;// 長さ
RichEdit1.SelAttributes.Color := clRed;
でできることはわかったのですが、複数行ある場合、行を指定する方法がわかりません。
RichEdit1.ActiveLineNo は読出しのみですし、...

どうすればよろしいんでしょうか?

Aベストアンサー

>カーソルのある行の文字色を変えるには
>RichEdit1.SelStart :=5; // 開始位置

SelStartは、テキスト全体の最初からの文字数を表しています。カーソルのある行ではありません。


カーソルのある行の文字色を変えたいなら、
RichEdit1.SelStart := RichEdit1.Perform(EM_LINEINDEX, UINT(-1), 0) + 5;

3行目の文字色を変えたいなら、
RichEdit1.SelStart := RichEdit1.Perform(EM_LINEINDEX, UINT(2), 0) + 5;

というようにSelStartを設定します。

QDelphiでキー入力を投げたい

ゲームコントローラに対応していないソフトウェアを、コントローラに対応させるべくプログラムを組んでいます。
Delphiのプログラムでコントローラからの入力を受け取り、該当するウインドウにメッセージを送信すればこの仕組みが実現できると考えたのです。

まず、以下の関数を記述しました。

function CallBackTest(WH: HWND; LP: LParam): BOOL stdcall;
var
Buff: array [0..255] of Char;
begin
if IsWindowVisible(WH) then
if GetWindowText(WH, Buff, 255) <> 0 then
TListBox(LP).Items.AddObject(Buff, Pointer(WH));
Result := True;
end;

次に、ListBoxを用意して、以下を実行しました。
EnumWindows(@CallBackTest, Longint(ListBox1));
ListBoxには実行中のウインドウタイトルが表示されます。そこで、目的のウインドウ名を選択して

for i := 0 to (ListBox1.Items.Count - 1) do
if ListBox1.Selected[i] then
PostMessage(hwnd(listbox1.Items[i]), WM_KEYDOWN, 入力キー名, 0);
end;

こんな感じで投げられるかな?と思ったのですが、悲しいほど無反応。
なにか根本的にやり方を間違えているのでしょうか・・・?

ゲームコントローラに対応していないソフトウェアを、コントローラに対応させるべくプログラムを組んでいます。
Delphiのプログラムでコントローラからの入力を受け取り、該当するウインドウにメッセージを送信すればこの仕組みが実現できると考えたのです。

まず、以下の関数を記述しました。

function CallBackTest(WH: HWND; LP: LParam): BOOL stdcall;
var
Buff: array [0..255] of Char;
begin
if IsWindowVisible(WH) then
if GetWindowText(WH, Buff, 255) <> 0 then
TListBox...続きを読む

Aベストアンサー

コードを試しました。WindowハンドルをAddObjectで記憶していますので下記は修正しました。

【修正前】PostMessage(hwnd(listbox1.Items[i]), WM_KEYDOWN, 入力キー名, 0);
【修正後】PostMessage(hwnd(listbox1.Items.Objects[i]), WM_KEYDOWN, {入力キー名} 48, 0);

この修正を加えたら、秀丸エディタには文字0を入力できました。しかし、メモ帳やワードパッドには入力できませんでした。

ウィンドウとメッセージについて調べて試す必要があると思います。EnumWindowsはトップレベルのウィンドウしか探しません。目的のアプリケーションがトップレベルのウィンドウにWM_KEYDOWNを送って反応するものかどうか。子ウィンドウあるいは別のメッセージにしたらどうか、フォーカスをあてたらどうか、など。

Qdelphi でのコード上でTab を入力。

delphiで、コード上からString変数などに、Tabを入力する方法を教えてもらえませんか?

Javaでは確か \t とかだったと思うのですが。。。

また、よろしければ多言語でのバックスラッシュコード(?改行の\nなど)に対応するものがdelphiに存在するのかも教えてください。

Aベストアンサー

Delphi6での場合。

#数字 でASCIIコードを記述します。
数字の所は16進数も使えます。

タブ(10進数): 'abc'#9'def'
タブ(16進数): 'abc'#$9'def'

改行(10進数): 'Line 1'#13#10'Line 2'
改行(16進数): 'Line 1'#$d#$a'Line 2'


こんな感じだったと思います。

C言語やJavaのような、\t みたいな記述は無かったと思います。

文字列中に'(シングルクオート)を入れる場合も、\' ではなく、
二つ重ねて '' だし。(この点ではVBに似てるかな)

Q[delphi] 変数を利用してコンポーネント名指定したいのですが、可能でしょうか?

表題の件、どなたか教えてください。
「可能」か「不可能」かの情報や代替案でもありがたいです。

※delphi6 enterprise版を使用しています。

質問
コンポーネント名の指定に変数は使えるのでしょうか?
例えば、labelコンポーネントを複数設置しそのlabel名の末尾を数字にする(label1,2,3・・・)。何かの処理の際に、for文で変数を送り(i=1,2,3・・・)、label名+変数.captionなどという形で指定することはできるでしょうか?


ラベル名 label1 label2 label3 を設置

ボタンクリック時などに、
var
i : integer;

for i := 1 to 3 do
begin
  label(i).caption := inttostr(i) ;
end;

よろしくお願いします。

Aベストアンサー

そのような目的にはFindComponentが使えます。

for i := 1 to 3 do
begin
TLabel(FindComponent('Label'+InttoStr(i))).Caption:=InttoStr(i);
end;

Qdelphiにて 文字列の最後の改行を取り除く

S :=TStringList.Create;
で読みこんだテキスト S.Textの文字列の末尾に一個もしくは複数個の改行#13#10があった場合に取り除きたいのですが、
その方法がいまいちよくわかりません。

ずばり方法、アドバイス、tipsのサイトなど、
教えていただけないでしょうか?

Aベストアンサー

こんにちは、honiyonです。

 すいません、質問を見落としていました。
 そうしますと、以下のような処理になるでしょうか。

function HOGE(S:string):string;
var
i : integer;
begin
for i:=length(S) downto 1 do begin
if not (S[i] in [#13,#10]) then break;
end;
Result := LeftStr(S, i);
end;

テストしていないので不具合あるかも知れませんが、だいたいこんな感じだと思います。

Qデルファイ TabControl タブの追加

ターボデルファイです。

TabControlをフォームに置いたのですが、デフォルトはタブ1枚でみたいで、タブの追加はどうするのでしょか?
ヘルプファイルには、個別のタブは「TabPage オブジェクト」とありますが、これがどこにあるかわかりません。
「TabControl の主要プロパティは TabPages 」ともありますが、これもどこにあるのか、見当たりません。

Aベストアンサー

タブの切り替えで各タブページごとに載せるコンポーネントを替えるには、
TabControlではなく、多分その横にあるPageControlを使います。
PageControlをフォーム上に配置して右クリックするとメニューで新規のタブシートコンポーネントが作れます。
あとは、この各タブシートに好きなコンポーネントを載せていけば良いわけです。

QDelphiでクラスをオブジェクト化する時に使うコンストラクタの引数について

Delphi初心者です。

例えば
procedure TForm1.Button1Click(Sender: TObject);
var
child:TParent;
begin
child:=Tchild.create 又は child:=Tchild.create(self)
child.free
end;

このselfの意味がよくわかりません。selfがないとコンパイルできないときもあり、逆にあるとコンパイルできない時もあるのですが理由が解りません。どなたかご教示くださいませんか?

Aベストアンサー

>selfがないとコンパイルできないときもあり、逆にあるとコンパイルできない時もあるのですが理由が解りません。

TChildのコンストラクタがどのようになっているかによって違います。
constructor TChild.Create(AOwner: TComponent);
となっているならselfが必要だし、
constructor TChild.Create;
となっているなら引数は不要です。

コンストラクタの定義によっては、selfではなく他の引数が必要な場合もあります。

ちなみに、提示されたコードのselfは、TForm1のオブジェクトです(TButton1ではない)。

Qお願いです!!

こんにちは。
DELPHIで教えていただきたいことがあるのですが、
文字列の中にシングルクォーテーションをいれたいのですが、
エスケープシーケンス記号をわすれましたっ!!!
どなたかご存知のかた、教えてください!!

<例>
MOJIRET := select * from ABC WHERE FIELD1 = ''' + HENSUB + ''';
のように使いたいのですが・・・

Aベストアンサー

こんにちは。

「シングルクォーテーション」でいいのでしょうか?
例はSQLみたいですが、(BDEならダブルクォーテーションマークですが、)

シングルであれば「FIELD1 = ' + Chr(39) + ';」
としてどうですかねぇ?

(実験していません。)

QBorland Database Engine エラー?

あるソフトをインストールしていると、最後に
「Borland Database Engine の初期化中にエラーが発生しました(エラー$2108)」
と表示され、うまくいきません。対処方法を教えてください。

Aベストアンサー

Borland Database Engineを使ったソフトの開発をしています。
そのソフトはBDE(Borland Database Engine)というデータベースソフトを使っています。そのソフトをインストールすると、自動的にインストールされる場合もありますが、別途BDEをインストールする必要がある場合もあります。BDEはインストールされていますか?インストールされているか調べるには、コントロールパネルに「BDE Administrator」というアイコンがあるかどうかで、ある程度判断できます。アイコンがあれば、インストールされたことがあるということです。アイコンがなければ、ソフトの作成者からBDEを入手しインストールする必要があります。すでにインストールされているとしたら、何らかの原因でBDEが削除されている等のことが考えられます。その場合は再インストールしてください。

QDelphiのマルチスレッドの割り込み処理について

Delphiのマルチスレッドの割り込み処理について教えて欲しいのですが、ファイルをスレッドオブジェクトで作成して
クラス名.Execute関数内でSynchronizeメソッドを使用しています。
本にはSynchronizeメソッドは「渡したメソッドが実行され終了するまで待ちます」と書いてあり、テストプログラムを作成してもそうでした。ということはSynchronizeメソッドは普通の関数と一緒のような気がしてしまうのですが、違うのでしょうか?
Procedure MyThread.Execute
begin
Synchronize(AAA); AAAの処理が終了するまで待機している
end;
Procedure TmyThread.AAA;
begin
'したい処理'
end;

Aベストアンサー

実際にプログラムを作って試した訳ではありません。見当違いでしたらすみません。

BDS2006のヘルプを見たところ、SynchronizeメソッドはDelphiの中で唯一つしかないメインVCLのスレッドを使うための方法です。すなわちスレッド間の競合の問題を「簡単に」解決する方法です。

ですから、'したい処理' 全体をSynchronizeで呼び出すのではなく、基本的には 'したい処理' はExecute内に書き、その中の競合する部分だけを切り出してSynchronizeで呼び出すようにします。

例えば、DelphiのDemoフォルダ下にあるThreadsプログラムは、PaintBoxを書き換える処理だけを切り出してSynchronizeで呼び出しています。配列に関しては各スレッドで独立しているため勝手に書き換えています。

また、競合を回避するには、TCriticalSectionクラスを使う方法もあります。'したい処理' はExecute内に書き、その中の競合する部分だけをEnter-Leaveではさむようにします。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング