ポップアップでEditに文字を書く込むには


ピタゴラスの定理  2008-03-26 23:10:53  No: 30251

こんにちは  ピタゴラスの定理です
また教えて頂きたく質問します。

あるEditに特定の分類された言葉を入れたく、
Popupを使うのが1つの案と思われますが
クリックした文字を取得するには
どの様にコードを書けば宜しいでしょうか
又動的にアイテム追加する方法も御指示下さい。
上記以外によい別案が有りましたら
ご指導願います。

尚会社の仕事が忙しくなりそうですので、
レスが遅くなると思いますが宜しくお願いいたします。

例)入力したい文字
    小学校−××小学校
          −○○小学校
                ・
                ・
    高等学校−◇◇学校
            −◎◎学校
                ・
                ・
    ××××−
    ××××−

procedure TForm1.LabeledEdit4MouseMove(Sender: TObject; Shift: TShiftState;X, Y: Integer);
begin

PopupMenu1.Popup(LabeledEdit4.ClientOrigin.X+70,
                 LabeledEdit4.ClientOrigin.Y + LabeledEdit4.Height);

//ShowMessage(PopupMenu1.Items.Caption);
  ↑これでは所得出来ませんでした
end;


deldel  2008-03-26 23:19:14  No: 30252

PopupMenuのクリックイベントで取得では?


ピタゴラスの定理  2008-03-26 23:25:44  No: 30253

deldel様  早々のレス有り難うございます。

>PopupMenuのクリックイベントで取得では?
ですが、全てのアイテムのクリックイベントに
コードを書かなくてはいけないのでしょうか。
もう少しスマートは方法は無いのでしょうか?

引き続き宜しくお願いいたします。


ぬこ  2008-03-27 00:12:06  No: 30254

直接の回答ではありませんが

https://www.petitmonte.com/bbs/answers?question_id=4231

igyさんの 2006/09/19(火) 13:10:53 のコメント参照


ピタゴラスの定理  2008-03-27 01:33:25  No: 30255

ぬこ様  レス有り難うございます

私欲を出しまして、最終的に下記の様な事がにしたいのですが、
まず未定義の識別子:'Self'で怒られました。
他にも間違えが有るかと思いますが
ご指導のほどお願いいたします。

//http://www.moonlight.gr.jp/~el/delphi/news/00000010.html
//TMenuItemをCreateしてPopupMenuにAddします。

procedure PopupItem_Add(Sender: TObject);
var
   newMenuItem: TMenuItem;
begin
   newMenuItem := TMenuItem.Create(Self); //メニュー項目作成
   newMenuItem.Caption := 'New';          //Caption設定
   newMenuItem.OnClick := MenuItem1Click; //OnClickイベントを関連づけ
   PopupMenu1.Items.Add(NewMenuItem);     //PopupMenu1に追加
end;

 procedure TForm1.MenuItem1Click(Sender: TObject);
begin
  Form1.LabeledEdit4.Text := PopupMenu1.newMenuItem.Caption;
end;

(*
procedure TForm1.hhhh1Click(Sender: TObject);
begin
   Form1.LabeledEdit4.Text := PopupMenu1.Items.Caption;
end;
*)

procedure TForm1.LabeledEdit4MouseMove(Sender: TObject; Shift: TShiftState;
  X, Y: Integer);
begin
PopupItem_Add   //とりあえずここでAdd

PopupMenu1.Popup(LabeledEdit4.ClientOrigin.X+70,
                 LabeledEdit4.ClientOrigin.Y + LabeledEdit4.Height);
end;


ぬこ  2008-03-27 02:16:51  No: 30256

Self の意味わかってる?
PopupMenu1 も、未定義の識別子にならない?

PopupItem_Addを、Form1のメソッドにすること。

type
  TForm1 = class(TForm)
  private
    { Private 宣言 }
  public
    procedure PopupItem_Add(Sender: TObject);
   end;

procedure TForm1.PopupItem_Add(Sender: TObject);
var
  〜


ピタゴラスの定理  2008-03-27 02:59:41  No: 30257

ぬこ様  レス有り難うございます

>Self の意味わかってる?
自分自身と言う事と認識しています
それ以上は解りません。

ぬこ さんの通り下記に宣言しても
解消されません

 public
    { Public 宣言 }
    procedure PopupItem_Add(Sender: TObject);
    procedure MenuItem1Click(Sender: TObject);
  end;


igy  2008-03-27 06:37:10  No: 30258

>解消されません

具体的には、コンパイル時にどのようなエラーが表示するのですか?

ぬこ さんがと書かれているように

>procedure TForm1.PopupItem_Add(Sender: TObject);

TForm1. を  PopupItem_Add の前に付けてますか?


ピタゴラスの定理  2008-03-27 08:02:09  No: 30259

igy 様  レス有り難うございます

>TForm1. を  PopupItem_Add の前に付けてますか?
はい付けてませんでした。付けることによって前え進みました
そこで次のエラーが出ました

procedure TForm1.LabeledEdit4MouseMove(Sender: TObject;
          Shift: TShiftState;X, Y: Integer);
begin
Form1.PopupItem_Add   //とりあえずここでAdd

PopupMenu1.Popup(LabeledEdit4.ClientOrigin.X+70,
                 LabeledEdit4.ClientOrigin.Y + LabeledEdit4.Height);
end;

※beginのところで、識別子の多重定義'TForm1.LabeledEdit4MouseMove'
とエラーがでます。私には見当が付きません。
どなたかご指導下さい。


ピタゴラスの定理  2008-03-27 08:18:01  No: 30260

自己レスです

すいません上記のエラーは判りました。
二重にコードを書いていました。

まだエラーが出る様ですので、改めて質問させて
頂きます。


Fusa  2008-03-27 18:18:50  No: 30261

こんにちは

ひとつは
PopupItem_Addという処理を
TForm1に持たせるか、持たせないか

ということを理解されると
一段階レベルアップすると思います。

もう一つは
(Sender: TObject)は必ず付けなければならない
ものでもないので適宜選んでください。

もうひとつは
procedure TForm1.MenuItem1Click(Sender: TObject);
begin
  Form1.LabeledEdit4.Text := PopupMenu1.newMenuItem.Caption;
end;
この場合のForm1はSelfと同じなので
  Self.LabeledEdit4.Text := ...
とするか、Selfを省略する方が綺麗なコードになります。

SelfやSenderについてより調べると上達しますよ。
がんばってください。


ピタゴラスの定理  2008-03-27 21:28:12  No: 30262

Fusa様  暖かいお言葉有り難うございます。

ここ1週間ぐらい、会社の方が
忙しくなりましたので、検証及び試行錯誤の
作業はその後となります。
とりあえずはお礼のレスといたします。


もにゃ  2008-03-27 23:46:39  No: 30263

とりあえず、
使ってるコンポーネントを教えてもらえませんか?
標準&非DBコンポーネントならお答えします。


ピタゴラスの定理  2008-03-28 21:18:00  No: 30264

もにゃ様へ

>とりあえず、
>使ってるコンポーネントを教えてもらえませんか?

(あるEditに)→標準LabeleEdit

とりあえずの返事です
これで宜しいでしょうか


もにゃ  2008-03-29 02:09:17  No: 30265

会話のやり取りをみると、入門書を読むところから始めた方がいい気がします。self,Sender等は基本事項ですので入門書を読んで理解してください。
コンポーネントについても標準LabeleEditなんてものは存在しません。
技術系のBBSで会話をするなら正しい用語を使ってくださいね。
厳しいかもしれませんが、ここである程度以上の回答をしている人たちは、例外なく入門書かヘルプを読んでいると思います。
今回の例は上の人たちが言っていることの実現方法の一例です。
書き方しだいで応用範囲はいくらでも広くなります。

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Menus, StdCtrls;

type
  TForm1 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Label7: TLabel;
    Label8: TLabel;
    Label9: TLabel;
    PopupMenu1: TPopupMenu;
    test1: TMenuItem;        //PopupMenu1の子
    procedure FormCreate(Sender: TObject);
  private
    { Private 宣言 }
    procedure LabelContextPopup(Sender: TObject; MousePos: TPoint;
      var Handled: Boolean);
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
  i:Integer;
  aLabel:TLabel;
begin
  for i:=1 to 9 do
  begin
    //オブジェクトインスペクタで貼り付けたラベルを探す
    aLabel:=TLabel(FindComponent('Label'+IntToStr(i)));
    //各オブジェクトにパラメータを設定
    aLabel.PopupMenu := PopupMenu1;  //同じpopupを割り当てる(必ずしも同じ必要は無い)
    aLabel.Caption:=FloatToStr(Random);
    //各オブジェクトにイベントを設定
    aLabel.OnContextPopup:= LabelContextPopup;
  end;
end;

procedure TForm1.LabelContextPopup(Sender: TObject; MousePos: TPoint;
  var Handled: Boolean);
begin
  //送り主(TLabel)に登録されたPopupMenuの子のcaption =
  //送り主(TLabel)のCaptionという意味
  TLabel(Sender).PopupMenu.Items[0].Caption:=TLabel(Sender).Caption;
end;

end.


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加