プログラマメモ2 - programmer no memo2

ieに右クリックメニューとclipboardData 2010/02/27

IE(Internet Explorer)の右クリックメニュー(コンテクストメニュー)にメニューを追加します。
あわせて呼ばれるプログラム(Javascript)を設定します。

参考



レジストリ経由でメニューを追加します。

以下
REGEDIT4

[HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\MenuExt]
[HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\MenuExt\a]
@="file:///Z:/for_win/research/ieに右クリックメニューとclipboardData/a.html"
"Flags"=dword:00000000a


REGEDIT4
は何やら必須のようですね。

レジストリファイルの解説 - 進め!中級プログラマー

次に実行するjavascriptを書いてあるhtmlファイルの用意
<script language="JavaScript">

// 開かれたコンテクストメニューがあるウィンドウ
var oWindow = window.external.menuArguments;
var oDocument = oWindow.document;
// 選択された部分
var oSelect = oDocument.selection;

// TextRangeCreate
var oSelectRange = oSelect.createRange();
var sNewText = oSelectRange.text;
// 取得した文字列をクリップボードに入れる
clipboardData.setData("Text", oSelectRange.text);

oSelectRange.text = "上書き";

</script>


これでIEを再起動するとメニューの追加されてりいます。呼び出されるjavascriptはその都度呼び出されるので、修整しながら実行がらくですね。

あと、Javascriptでクリップボードに値をコピーします。
IEだとクリップボードのやりとりがClipboardDataを通してできるようです。

(false && false || true) はtrueそれともfalse 2010/02/09

Javaです。Javaに限ったことではないですが。

下記のようなコードがあります。結果はどうなるのでしょうか。

if(false && false || true) {
System.out.println("++++++++++++++++++");
}


考えてください。

考えてください。

考えてください。


答え

++++++++++++++++++が出力されます。


あれ、どうしてそうなるんだっけ。

public class TestFalseAndFalseOrTrue {

public static void main(String[] args) {
a();
}

static void a(){
if(false && false || true) {
System.out.println("++++++++++++++++++");
}
}
}

p2365 2010/02/09

POJです。



自力で解いてないです。。。
ショートコーディング本に紹介されていた問題です。
参考

二点間の距離をもとめるのと、円周をもとめる公式がでてきますね。

実はRuntimeErrorがでて原因がわからずサブミットを何度もしてしまいました。
半径の入力がIntではなく、少数があるというわけでnextDoubleを使って解決。。。

package p2365_shortcoding_book;

import java.util.Scanner;

public class Main {

public static void main(String[] args) {

Scanner scanner = new Scanner(System.in);
int N = scanner.nextInt();
double r = scanner.nextDouble();// 半径
float x1 = scanner.nextFloat();
float y1 = scanner.nextFloat();
float a = x1;
float b = y1;
float sum = 0;
for (int i = 0; i < N - 1; i++) {
float x2 = scanner.nextFloat();
float y2 = scanner.nextFloat();
sum += dist(x2, y2, x1, y1);
x1 = x2;
y1 = y2;
}

sum += dist(a, b, x1, y1);

System.out.printf("%.2f", sum + (r * 2 * Math.PI));
}

static double dist(double x1, double y1, double x2, double y2) {
return Math.sqrt((x2 - x1)*(x2 - x1) + (y2 - y1)*(y2 - y1));
}

}

poj 2039 2010/02/07

久しぶりにpojです。
2039 -- To and Fro
えーと、RATIOが高いもの(誰もが解けるもの...)を選んでます。


package p2039;

import java.io.IOException;
import java.util.Scanner;

public class Main {

public static void main(String[] args) throws IOException {

Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()) {
int c = scanner.nextInt();
if (c == 0)
break;
String line = scanner.next();
char[] cs = line.toCharArray();
for (int i = 0; i < c; i++) {
System.out.print(cs[i]);
boolean b = true;
for (int j = c; j < cs.length; j += c) {
System.out.print(cs[b ? j + (c - (1 + i)) : j + i]);
b = !b;
}
}
System.out.println();

}
}

}

[delphi][練習]タスクトレイに表示、アイコンを右クリックでメニュー表示 2010/02/07

Delphiです。環境はDelphi2010です。

やりたいこと

タスクトレイにアイコンを表示して、右クリックでメニュー表示させる。

です。

グーグルさんで検索していろいろコードを集めてためしてみています。

今回の調べもの中心は、
  • タスクトレイに表示
  • ポップアップメニュー
  • アプリケーションの終了
です。

タスクトレイ関連のコードはここをメインに調べました。
コンポーネントを使わないコードが紹介されています。役に立つ方法だと思います。


ポップアップメニュー関連


アプリケーションの終了


以下コードです。
unit Unit1;

interface

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

type
TForm1 = class(TForm)
PopupMenu1: TPopupMenu;
test1: TMenuItem;
test21: TMenuItem;
test31: TMenuItem;
exit1: TMenuItem;
procedure TaskTrayWndProc(var Msg: TMessage);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure CreateTaskBarIcon();
procedure DeleteTaskBarIcon();
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure MenuItemExitClick(Sender: TObject);

const
WM_MY_TRAYICON = WM_APP + $300; // 適当です

private
{ Private 宣言 }

public
{ Public 宣言 }
end;

var
Form1: TForm1;
hWndTrayIcon: HWND;
uTaskBarRecreate: UINT;

implementation

{$R *.dfm}
(*
以下のコードは、
http://big2.big.or.jp/~osamu/Delphi/Tips/key.cgi?key=0&refresh=1#0207.txt
をいろいろ参考にしています。
*)

(*
タスクトレイに来るWM_MY_TRAYICONメッセージを受信
*)
procedure TForm1.TaskTrayWndProc(var Msg: TMessage);
var
ps: TPoint;
begin
Case Msg.LParam of
WM_LBUTTONDBLCLK:
begin

(*
// 左クリックでフォームを表示する場合
Visible := true;
ShowWindow(Application.Handle, SW_SHOW);
ShowWindow(Application.Handle,SW_RESTORE);
*)
end;
WM_RBUTTONUP:
begin
{ 左クリックと同じコード }
GetCursorPos(ps);
SetForegroundWindow(Handle);
// フォームにポップアップメニューがあるとする
PopupMenu1.Popup(ps.x, ps.y);
PostMessage(Handle, WM_NULL, 0, 0);
end;
else
// タスクバーが移動・再構築された場合に消えたアイコンを再生成
if (Msg.LParam = LongInt(uTaskBarRecreate)) then
CreateTaskBarIcon;
end;
end;

(*
このプログラムではフォームを表示させてないので、つかわれないはず。
*)
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
// WM_QUIT メッセージを受け取る時
if Application.Terminated then
begin
ShowWindow(Application.Handle, SW_HIDE);
Visible := False;
Action := caNone;
end;
end;

(*
フォームが作られるとき
このコード意味がわかってないので、あとで調べるべし
*)
procedure TForm1.FormCreate(Sender: TObject);
begin
// uTaskBarRecrate は TForm1 の private に UINT 型で宣言
// 新しい UtilWindow を作成し、ブロードキャストメッセージのみを受け取らせる
uTaskBarRecreate := RegisterWindowMessage('TaskbarCreated');
// hWndTrayIcon は TForm1 の private に HWND 型で宣言
// メッセージ送信先を指定
hWndTrayIcon := AllocateHWnd(TaskTrayWndProc);


CreateTaskBarIcon;
// フォームを表示させないようにする
ShowWindow(Application.Handle, SW_HIDE);
Application.ShowMainForm := False;
end;

(*
アイコンをトレイに登録−−ここではメインアイコンを使用
*)
procedure TForm1.CreateTaskBarIcon;
var
NotifyData: TNotifyIconData;
begin
with NotifyData do
begin
cbSize := SizeOf(TNotifyIconData);
Wnd := hWndTrayIcon;
uID := 0;
uFlags := NIF_MESSAGE or NIF_ICON or NIF_TIP;
szTip := '右クリックでメニュー表示';
hIcon := Application.Icon.Handle;
uCallbackMessage := WM_MY_TRAYICON; // 独自に定義
end;
Shell_NotifyIcon(NIM_ADD, @NotifyData);
end;

(*
アイコンを削除
*)
procedure TForm1.DeleteTaskBarIcon;
var
NotifyData: TNotifyIconData;
begin
with NotifyData do
begin
cbSize := SizeOf(TNotifyIconData);
Wnd := hWndTrayIcon;
uID := 0;
end;
Shell_NotifyIcon(NIM_DELETE, @NotifyData);
end;

(*
ポップアップメニューのexitでアプリケーションを終了
*)
procedure TForm1.MenuItemExitClick(Sender: TObject);
var
Control: TControl;
begin

(*
//クリックされたメニュー項目のタグにより対応するコントロールのEnableを切り替え
Control := (FindComponent
(Components[(Sender as TMenuItem).Tag].Name) as TControl);
Control.Enabled := not Control.Enabled;
*)
FormDestroy(Sender);
Application.Terminate;
end;

(*
終了した時にトレイのアイコンを削除
この処理を行わないとアイコンが残ってるようにみえる
*)
procedure TForm1.FormDestroy(Sender: TObject);
begin
DeleteTaskBarIcon;
DeallocateHWnd(hWndTrayIcon);
end;

end.

[delphi]コメントアウト 2010/02/07
2010/02/07

本屋にいってもdelphi関連の本って全然ないですね。
最近でた本だと、DELPHI2009HANDBOOK―Delphi最新プログラミングエッセンス - デルファイの時代 - プログラマの本棚ぐらいですかね。

正直、webから得る情報で学習できるのですが、どうも、体系だった本のほうがしっくりきます。


delphiでコメントアウトの仕方は3種類あるようです。

// コメント


{
コメント
}


(*
コメント
*)


参考

[delphi]dproj,groupprojの使い分け 2010/02/06

delphi2010です。

IDEは便利ですが、はじめに学習することが多いです。
これをのりこえられないと、使う気がしなくなるのでふんばって学習中です。

プロジェクトを起動するときは、拡張子がdprojをクリック。
複数のプロジェクトをまとめているのがグループという概念ですが、これはgroupprojという拡張子です。



いまいちアプリケーション規模とプロジェクトのサイズの関係がわからないですが、こまめにプロジェクトをわけて作成したほうがよいかなといまは考えてます。

あたりまえといえばあたりまえですが、プロジェクトが存在するディレクトリパスを変更するとグループプロジェクトからみえなくなります。

グループプロジェクトは、プロジェクトをわけたフォルダのひとつうえの階層に置くというふうにしようかなと考えてます。

あと、プログラムのエントリポイント(main関数)は、dprというファイルにあるようですが、これって、どうやってide上から開くのかしら。直接ファイルをクリックすると開くのだけど。

プロジェクトマネージャ上で、xxxx.exeを選択して「ソースの表示」でいいみたい。



参考
重要なファイルは .dpr .pas .dfm の3つだけです。- Delphi Lesson

[delphi]ExtractFilePath(Application.ExeName) 2010/02/04

勝手がわからないdelphi学習中です。

  • 自分自身(exe)の場所
  • イベントメソッドの追加の仕方

自分自身(exe)の位置は、
ExtractFilePath(Application.ExeName);

でわかります。

イベントでおこるprocedureのキックは、「オブジェクトインスペクタ」を使うのがよいようです。
IDEに作成してもらいそれにたいする実装を行うという感じですね。







unit Unit1;

interface

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

type
TForm1 = class(TForm)
procedure init(Sender: TObject);

private
{ Private 宣言 }
public
{ Public 宣言 }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.init(Sender: TObject);
var
U: UnicodeString;
begin
U := ExtractFilePath(Application.ExeName);
// ok
OutputDebugString(PChar(U));
end;

end.

[delphi]タスクバーのボタンを非表示にする 2010/02/02
2010/02/06

Win用でしか動かさないものをJava + SWTで作成していての悩みは、配布です。
まず、Javaが入っていることを気にしないといけないこと、あとexeを叩くことになれてる人が、jarをクリックしたがるとは思えないい、exe4jとかつかってjarをまとめてexe形式にしても、サイズが大きくなってしまうこと。
ネイティブアプリだと数10Kのものが、javaだとjarを考えずにまとめると、数Mとか。。。。

Delphiでタスクバーに表示させない方法をさがしていて、すぐにみつかるのは、SetWindowLongを使うものですが、いまいちよくわからなくて、他に方法がないかなと、調べていたら、下記の記事ですぐにできました。


 
具体的には、
Application.ShowMainForm := False;


まあ、ほんとはこれからタスクトレイに表示させたいのですが、この方法のあといろいろやらないといけないようですが...


こんな感じでテストコード。

program Project1;

uses
Forms,Windows,
Unit1 in 'Z:\for_win\delphi_proj\@research\タスクトレイ\001\Unit1.pas' {Form1};

{$R *.res}

begin

Application.Initialize;
Application.MainFormOnTaskbar := True;
// この行を追加
Application.ShowMainForm := False;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.