Delphi/400開発ノウハウお教えします 「メニュー」開発のテクニック

Similar documents
知って得する!現役ヘルプデスクが答えるDelphiテクニカルエッセンス 9.0

Delphi/400開発ノウハウお教えします 情報を守ろう!安全性を高めたWebシステムの構築

知って得する!現役ヘルプデスクが答えるDelphiテクニカルエッセンス 8.0

Microsoft Word - Writing Windows Installer's DLL.doc

改訂履歴 日付バージョン記載ページ改訂内容 V2.1 - 初版を発行しました V3.1 P5 ドキュメントラベルが新規追加された事を追記 P7 P8 新しくなったラベルのツリー表示説明を追記 新しくなったラベルの作成 削除操作を追記 P9 ラベルのグループ

WebReportCafe

改訂履歴

目次 目次 はじめに ライセンスに関して 作成の流れ デザイン作成 基本的なデザイン手順...4 テンプレートの作成...4 デザイン方法...5 機能 サンプルのテンプレートを作成する...6 作成するデザインにつ

作成するアプリ 本書は 楽々 Web データベースで 一覧アプリ を作成する方法を説明します 以下のような Excel ファイルの一覧表を題材に 楽々 Web データベースに Excel ファイルを読み込ん でアプリを作成し 使用するまで を説明します 課題管理表.xlsx タイトル詳細 内容対応優

FastReportを活用した電子帳票作成テクニック

AppsWF ワークフロー設定ガイド Ver.1.1 株式会社オプロ

PowerPoint Presentation

本書は INpMac v2.20(intime 5.2 INplc 3 Windows7/8/8.1に対応 ) の内容を元に記載しています Microsoft Windows Visual Studio は 米国 Microsoft Corporation の米国及びその他の国における登録商標です

テクニカルセミナーベストセレクション

LINE WORKS セットアップガイド目次 管理者画面へのログイン... 2 ドメイン所有権の確認... 3 操作手順... 3 組織の登録 / 編集 / 削除... 7 組織を個別に追加 ( マニュアル操作による登録 )... 7 組織を一括追加 (XLS ファイルによる一括登録 )... 9

開発者が知りたい実践プログラミングテクニック! ~明日から使えるテクニック集~

PowerPoint プレゼンテーション

FastReportへの効率的な帳票レイアウトコンバート

概要 ABAP 開発者が SAP システム内の SAP ソースまたは SAP ディクショナリーオブジェクトを変更しようとすると 2 つのアクセスキーを入力するよう求められます 1 特定のユーザーを開発者として登録する開発者キー このキーは一度だけ入力します 2 SAP ソースまたは SAP ディクシ

【rakumoソーシャルスケジューラー】管理者マニュアル<Lightning UI版>

スクールCOBOL2002

クイックマニュアル(利用者編)

チャレンジ!dbExpress接続

JC/400でWebAPI活用 Google Chart APIでグラフを作成しよう!

Microsoft Word - ModelAnalys操作マニュアル_

JACi400のご紹介~RPGとHTMLで簡単Web化~

desknet's NEO 初期設定マニュアル

外周部だけ矩形配列

PowerPoint プレゼンテーション

新バージョンDelphi/400 XE7ご紹介 - マルチデバイスデザイナ機能で開発効率アップ! -

ことばを覚える

POWER EGG2.0 Ver2.8 スタートアップガイド ~Webデータベース 応用編~

Microsoft PowerPoint - T4OOマニュアル_admin管理者_ pptx

. 起動 目次 P.. ログイン 画面 P.. メニュー 画面 P.. POS 開示 _ 指定店舗 アイテム別 期間合計 画面 ( レポート A) P. 5. POS 開示 _ 店舗別 指定アイテム 期間合計 画面 ( レポート B) ----

目 次 1. はじめに ソフトの起動と終了 環境設定 発助 SMS ファイルの操作 電話番号設定 運用条件 回線情報 SMS 送信の開始と停止 ファイル出力... 16

サイボウズ Office 10「リンク集」

サイボウズ Office「リンク集」

PowerPoint プレゼンテーション

2. メンバー管理 2.1 管理者権限 2.2 組織の登録 2.3 役職の登録 2.4 メンバーの登録 2.5 共有アドレス帳 2.6 グループの管理

目次 1 はじめに 利用条件 動作環境 アドインのインストール アドインの操作方法 アドインの実行 Excel CSV の出力 テンプレートの作成 編集 テンプレートのレイアウト変更 特記

Microsoft Word - データ保管サービス操作マニュアル(第二版).docx

intra-mart Accel Collaboration — ファイルライブラリ ユーザ操作ガイド   第5版  

目次 1. ログイン 報告 ユーザ 病院 使用場所 通知先 材料データベース... 7 ご注意ください...12 JAN コードから材料データを返します マネージャーの情報変更 報告 CS

知って得する!現役ヘルプデスクが答えるDelphiテクニカルエッセンス

intra-mart Accel Collaboration — ファイルライブラリ ユーザ操作ガイド   第3版  

intra-mart Accel Collaboration — ファイルライブラリ 管理者操作ガイド   第6版  

yukarik

10th Developer Camp - B5

スクールCOBOL2002

intra-mart Accel Platform — IM-共通マスタ スマートフォン拡張プログラミングガイド   初版  

シラバス操作説明書

第 章 システムの概要 WebBase とは 利用環境 ブラウザ操作時の留意事項... 3 第 章 基本操作 ログインとログアウト ポータル画面の構成... 5 第 3 章 メッセージ メッセージを受信する... 6 第

Section1_入力用テンプレートの作成

Oracle BI Publisherを利用したレポートの作成

Works Mobile セットアップガイド 目次 管理者画面へのログイン... 1 ドメイン所有権の確認... 2 操作手順... 2 組織の登録 / 編集 / 削除... 6 組織を個別に追加 ( マニュアル操作による登録 )... 6 組織を一括追加 (XLS ファイルによる一括登録 )...

( 目次 ) 1. はじめに 開発環境の準備 仮想ディレクトリーの作成 ASP.NET のWeb アプリケーション開発環境準備 データベースの作成 データベースの追加 テーブルの作成

PowerPoint プレゼンテーション

JOCAR操作マニュアル アウダセブン連動

Microsoft Office Visioによる 施設管理について

目次 はじめに 1サーバ作成 2 初期設定 3 利用スタート 付録 Page.2

セットアップガイド ( 管理者向け ) (1.3 版 ) KDDI 株式会社

1. WebShare(HTML5 版 ) 編 1.1. ログイン / ログアウト ログイン 1 WebShare の URL にアクセスします xxxxx 部分は会社様によって異なります xxxxx 2 ユーザー名 パ

アクセス許可を設定する画面が開いたら グループ名またはユーザー名 欄から Everyone を選択し Everyone のアクセス許可 欄で フルコントロール の 許可 にチェックを付け このフォルダへのアクセスを許可します 設定後は OK を押して終了します 2. フォルダへのアクセス許可を設定す

スライド 1

サイボウズ Office 8 リンク集マニュアル

CONTENTS マニュアルの表記... S01-02_01 1.DataNature Smart 全体概要図... S01-02_11 2. 基本操作... S01-02_ ジョブの作成... S01-02_21 加工条件設定... S01-02_21 Step1: 処理対象データの指

VR-CIP ACR/ex 4.1. ビークル分析重複率集計 160 ACR/ex 調査回設定画面 機能説明 3 調査回選択 分析対象の調査回を選択します 設定 > ボタンを押下すると 指定した調査回が確定されます この場合 調査回のオフィシャル有効が分母になります 3 次画面へ遷移 地区 > ボタ

印刷アプリケーションマニュアル

ステップアップ! モバイルアプリケーション開発

FileExplorer for ASP.NET Web Forms

Delphi/400 テクニック公開 Windows7に最適化した アプリ開発・運用テクニック

Handbook_Studio_ja

Webコンポーネントのカスタマイズ入門

Delphi/400を利用したはじめてのWeb開発

スーパー英語アカデミック版Ver.2

Microsoft PowerPoint - Borland C++ Compilerの使用方法(v1.1).ppt [互換モード]

Delphi/400 テクニック公開 Delphi/400開発 ~ パフォーマンス向上テクニック ~

Rational Roseモデルの移行 マニュアル

Microsoft PowerPoint - T4OOマニュアル_初期設定用_ pptx

チュートリアル Part 2 の概要 チュートリアル Part 2 では サンプルデータのマニホールドブロックを使用して ilogic で Excel スプレッドシートと関連付けて マニホールドブロックの各形状や部品番号に関するルールを作成 実行して ilogic のルールに基づいて Excel ス

Delphi/400で本格Webアプリ開発

Transcription:

セッション No.2 Delphi/400 開発ノウハウお教えします メニュー 開発のテクニック 株式会社ミガロ. システム事業部プロジェクト推進室 小杉智昭

アジェンダ メニュー の種類と基本的な作成方法 メニュー 開発テクニックのご紹介 1メンテナンス性を考慮したメニュー押下制御 2ツリー形式で動的に作成するメニュー 3 使い勝手を向上させるメニュー アプリケーション開発スタイルに応じた メニュー 開発 まとめ

メニュー の種類と基本的な作成方法

メニュー 画面 CUI と GUI IBM i(as/400) の メニュー 画面 (CUI 画面 ) 80 24 の制限のため 機能番号を入力して 実行する方式が一般的 Delphi/400 の メニュー 画面 (GUI 画面 ) ボタン配置形式 ツリー形式等 GUI の特性を生かした多彩なメニューが作成可能 IBM i(as/400) の メニュー Delphi/400 の メニュー

Delphi/400 での代表的な 2 つの メニュー 形式 ボタン配置形式 画面上に機能ボタンを配置する方式 レイアウト作成が容易 機能数が多い場合 メインメニュー サブメニューと画面展開するような構成が多い ツリー形式 ツリー構造に機能 ( ノード ) を配置する方式 展開 / 折り畳み等が容易で 一画面で全体像が表現しやすい メンテナンスが容易

ボタン配置形式メニューの作成手順 STEP1 フォームのレイアウトを作成する STEP2 TBitBtn をフォームの任意の場所に追加し 各プロパティを設定する < プロパティ例 > Caption : ボタン表面の任意の説明文 Glyph : 任意のアイコン画像 Name : 命名規則にしたがった名前 TabOrder : ボタンのタブ順

ボタン配置形式メニューの作成手順 STEP3 TBitBtn のイベントを実装する (OnClick イベント等 ) procedure TfrmMenu.BitBtn1Click(Sender: TObject); begin frminputest := TfrmInputEst.Create(Self); try // 見積登録画面を表示 frminputest.showmodal; finally // 画面の終了 frminputest.release; end; end; 1 画面の生成 2 画面の表示 3 画面の破棄

ボタン配置形式の実行イメージ 見積登録 ボタンをクリック

ツリー形式メニューの作成手順 STEP1 フォームのレイアウトを作成する STEP2 TTreeView をフォーム上の任意の場所に配置し 項目の設定を行う <TTreeView> 新規作成現在のノードと同じ階層にノードを追加する サブアイテムの作成選択しているノードの下の階層にノードを追加する

ツリー形式メニューの作成手順 STEP3 OnDblClick のイベントを実装する procedure TfrmMenu.TreeView1DblClick(Sender: TObject); var stext: String; // 選択機能アイテム文字列 begin stext := TreeView1.Selected.Text; // 選択行文字列取得 // 画面遷移 if stext = 見積登録 ' then begin frminputest := TfrmInputEst.Create(Self); try // 見積登録画面を表示 frminputest.showmodal; finally // 画面の終了 frminputest.release; end; end else if stext = 見積書出力 ' then 1 画面の生成 2 画面の表示 3 画面の破棄

ツリー形式の実行イメージ 見積登録 をダブルクリック

開発テクニック 1 メンテナンス性を考慮したメニュー押下制御

担当者の権限によるメニューの制御 各業務担当者の権限により 使用できるメニューを制限するにはどうすればよいか? 営業担当者 出荷担当者 営業担当者が使用可能 出荷担当者が使用可能 各担当者毎に個別に割り当てられた権限をもとに 機能ボタンの制御を行えばよい ( 使用できないボタンは グレイアウト ( 押下不可 ) にする )

担当者の権限取得方法 営業担当者 出荷担当者 等 それぞれの役割に応じて使用できるボタンを制御する 担当者マスタ ユーザー ID パスワードユーザータイプ KOSUGI PASSWORD 1 OZAKI MIGARO 1 YOSHIWARA RAD 2 HATANAKA SUSUMU 2 実現方針 指定したユーザー ID よりユーザータイプを取得して 各機能ボタンの押下可否を動的に指定する ユーザータイプ 1 : 営業担当者 2 : 出荷担当者

3 つの処理タイミング 処理 1 画面起動時 処理 3 ログアウト処理時 ログイン前の為全てのボタンを押下不可とする 再び全てのボタンを押下不可とする 処理 2 ログイン処理時 ユーザータイプに応じて使用可能なボタンのみ押下可能とする

TBitBtn のみで押下制御を実現する場合 ボタン押下制御の実装例 処理 1 処理 3 画面起動時 ログアウト処理時 procedure TfrmMenu.FormShow(Sender: TObject); begin // 全機能ボタンを使用不可とする btnentryest.enabled := False; btnreferest.enabled := False; btnprintest.enabled := False; btnentryship.enabled := False; btnrefership.enabled := False; btnreferplan.enabled := False; end; 処理 2 ログイン処理時 procedure TfrmMenu.btnLoginClick(Sender: TObject); begin ~~ ( ログイン処理 ) ~~ // 営業担当者使用可能ボタン btnentryest.enabled := (FUSERTYP = 1 ); btnreferest.enabled := (FUSERTYP = 1 ); btnprintest.enabled := (FUSERTYP = 1 ); // 出荷担当者使用可能ボタン btnentryship.enabled := (FUSERTYP = 2 ); btnrefership.enabled := (FUSERTYP = 2 ); btnreferplan.enabled := (FUSERTYP = 2 ); end; FUSERTYP : ログインユーザーのユーザータイプを保持 1 : 営業担当者 2 : 出荷担当者 それぞれの処理タイミング毎に 個別に Enabled プロパティを設定するロジックを記述しなければならない

機能ボタンの押下制御をシンプルに処理できないか? 画面の状態を一元管理することができる TAction を使用すると押下制御を一括制御することができる! アクション (TAction) コンポーネント 画面上で使用する処理 ( アクション ) を一元管理するためのコンポーネント OnUpdate イベントを使うことで どのイベント発生時も適用されるルールを記述できる 例 ) ログインボタンの制御 < 従来の考え方 > ログインボタンの OnClick イベントログインボタンを使用不可 ログアウトボタンの OnClick イベントログインボタンを使用可 < アクションを使った考え方 > アクションの OnUpdate イベントログインされていれば使用不可

アクション (TAction) 概念図 ボタンに直接設定する場合 ボタンに表題や画像などプロパティを直接セット ボタン (TBitBtn) アクションに表題や画像などプロパティをセット アクションを使用する場合 アクションリストの設定 画面 関連付け ボタンにアクションを割り当てる アクション (TAction)

アクション (TAction) の作成手順 STEP1 TActionList をフォームに貼り付ける [ ツールパレット ] [Standard] カテゴリ [TActionList] を選択 STEP2 TActionList に新しいアクション (TAction) を追加する アクションリストコンポーネント右クリックより [ アクションリストの設定 ] を選択 [ アクションリストの設定 ] 画面で 新規アクション ボタンを押下 新規アクションボタン

アクション (TAction) の作成手順 STEP3 プロパティ ( 設定 ) の定義 Caption : 表題となる文字列 ImageIndex : アイコン画像のインデックス Name : アクションに付与する名前 STEP4 イベント ( 動作 ) の実装 OnExecute : 実行した時の処理を記述 (Button の OnClick に相当 ) procedure TfrmMenu.acEST_InputExecute(Sender: TObject); begin frminputest:= TfrmInputEst.Create(Self); try // 見積登録画面を表示 frminputest.showmodal; finally // 画面の終了 frminputest.release; end; end;

アクション (TAction) の作成手順 STEP5 ボタンコンポーネントにアクションを割当 ボタンコンポーネントの Action プロパティに値を設定 Action プロパティ アクションで定義したプロパティ イベントが TBitBtn に適用される 初期状態のボタンにアクションを割り当てる

アクション (TAction) を使用した押下制御 アクションのイベント OnUpdate : 待ち受け時の処理を記述 ( アクションの有効 / 無効等を定義 ) 見積業務の各アクションを複数選択 procedure TfrmSampleMenu.acESTUpdate(Sender: TObject); begin // ユーザータイプ =1( 営業 ) のみ使用可能 (Sender as TAction).Enabled := (FUSERTYP = '1'); end; FUSERTYP ( ユーザータイプ ) が 1 となっている間は アクションが有効そうでない場合は アクションが無効

アクション (TAction) を使用した押下制御 OnUpdate イベントの動作イメージ 処理 1 画面起動時 FUSERTYP = ( アクション無効 ) 処理 2 ログイン時 FUSERTYP = 1 ( アクション有効 ) 処理 3 ログアウト時 FUSERTYP = ( アクション無効 ) OnUpdate イベントに制御を記述することで FUSERTYP( ユーザータイプ ) の値変化に連動したボタンの押下制御が可能になる ( 処理タイミング毎の個別ボタン制御が不要となる )

参考 OnUpdate イベント以外にアクション (TAction) を使うメリット ボタンの割り当てを変えるだけで機能の変更が可能 アクションの割り当てを変更 ひとつのアクションを複数のボタンに割り当てることが可能 メニューアイテム (TMenuItem) ツールボタン (TToolButton) ボタン (TBitBtn) 関連付け 関連付け 関連付け アクション (TAction)

開発テクニック 2 ツリー形式で動的に作成するメニュー

動的 に作成するメニュー ツリー形式では メニューを 動的 に作成することができる ボタン形式の場合 ツリー形式の場合 営業担当者の場合 出荷担当者の場合

ツリー形式メニューの動的な作成手順 静的に作成するメニュー (P.9 でご紹介 ) アイテム ( ツリー全体 )= Items プロパティ 新規作成 よりノードを追加 サブアイテムの作成 よりノード ( 子 ) を追加する 動的に作成するメニュー 新規作成 = Add メソッドによってノードを追加 Add メソッド サブアイテムの作成 = AddChild メソッドにて選択ノードにノード ( 子 ) を追加 AddChild メソッド

ツリー形式メニューの動的な作成手順 ログオン時にユーザータイプを取得し メニュー項目を作成する実装例 procedure TForm1.bbtnLogInClick(Sender: TObject); var trootnode: TTreeNode; // 最上位のノード tparentnode: TTreeNode; // メニューカテゴリーのノード tchildnode: TTreeNode; // メニューのノード Begin // 担当者マスター存在チェックし ユーザータイプを取得 FUSERTYP := FieldByName('UTUTYP').AsString; with tvmenu.items do begin // 基本のメニューを設定 trootnode := Add(nil, 業務メニュー ); trootnode.imageindex := 5; trootnode.selectedindex := 5; // ユーザータイプ=1( 営業 ) のみ見積業務メニューを追加 if FUSERTYP = '1' then begin tparentnode := AddChild(tRootNode, 見積業務 ); tparentnode.imageindex := 5; tparentnode.selectedindex := 5; tchildnode := AddChild(tParentNode, 見積登録 ); ノード追加ロジック 条件に応じてノードを追加する 追加しないをコントロールする

ツリー形式メニューの実行 ログインするユーザータイプによって... 表示されるメニューの内容が違う

開発テクニック 3 使い勝手を向上させるメニュー

使い勝手を向上させるメニュー 使い勝手を向上させるために 個人毎にメニューをカスタマイズできないか? A 氏の画面 共通メニュー < 営業担当者 A 氏の要望 > 敏腕営業の私は受注伝票出力をよく使う B 氏の画面 < 営業部門管理者 B 氏の要望 > 受注登録なんて めったに使わない 状況分析が私の仕事だ

使い勝手を向上させるメニュー ユーザー毎のメニューの並び順を CSV ファイルで管理する 1 画面を起動する 個人別メニューファイル ログインユーザー用の CSV ファイルを読み込みメニュー内容を作成する 2 並び替える 個人別メニューファイル 3 画面を終了する メニュー内容を CSV ファイルに書き出し 保存する

使い勝手を向上させるメニュー TTreeView でメニュー項目を並び替える (2) 1 DragMode プロパティ ドラッグを開始できるようにする 2 OnDragOver イベント ドロップ可能か判定する 3 OnDragDrop イベント 選択したメニュー項目を挿入 選択したメニュー項目を削除

使い勝手を向上させるメニュー ツリー形式のドラッグ & ドロップに必要なプロパティ イベント (2) OnDragOver イベント procedure TfrmSampleMenu.tvMenuDragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean); begin if (tvmenu.selected.text = cmain) or (tvmenu.selected.text = cparent01) then begin // メニューカテゴリーの場合 ドロップ不可 Accept := False; end else with tvmenu do begin // 移動前のノードの位置の場合 ドロップ不可 2 ドロップ可能判定ロジック OnDragOver イベント内にて Accept=True とすることでドロップ可能になる Accept := (Source is TTreeView) and (Selected <> GetNodeAt(X, Y)); end; end; 1 プロパティ設定 DragMode= dmautomatic

使い勝手を向上させるメニュー ツリー形式のドラッグ & ドロップに必要なプロパティ イベント (2) OnDragDrop イベント procedure TfrmSampleMenu.tvMenuDragDrop(Sender, Source: TObject; X, Y: Integer); var tselectnode: TTreeNode; // 選択ノード tinsertnode: TTreeNode; // 追加先ノード taddnode: TTreeNode; begin with TreeView1 do begin Items.BeginUpdate; try // 選択ノードを挿入 taddnode := Items.Insert(tInsertNode, tselectnode.text); taddnode.selected := True; // 追加ノードを選択状態にする // 選択ノードを削除 tselectnode.delete; finally Items.EndUpdate; end; end; end; Items プロパティの設定時は BeginUpdate~ EndUpdate で描画を止める 3 ドロップ時のロジック選択していたノードを挿入してから 移動前のノードを削除することで入れ替えを実現する

使い勝手を向上させるメニュー 参考 ツリー形式の内容を CSV ファイルより設定する方法 <CSV の設定例 > カンマ区切り 改行で1レコードを定義 1 列目 : ノード ( 親 ) の順序 2 列目 : ノード ( 子 ) の順序 ( 2 行目が 000 であればカテゴリーを表す ) 3 列目 : 機能タイトル 4 列目 : アイコンの画像インデックス 5 列目 : 選択時の画像インデックス

使い勝手を向上させるメニュー 参考 ツリー形式の内容を CSV ファイルより設定する方法 (1) var sdirpath, sfilename: String; // CSVファイルのファイル情報 slcsvfile: TStringList; // CSVファイル読込用 slitem: TStringList; // メニュー項目取得用 icsvrow: Integer; begin // CSVファイルよりメニュー内容を取得 slcsvfile := TStringList.Create; try // CSVファイルのパス情報 sdirpath := ExtractFilePath(Application.ExeName); sfilename := ccsvfile; // CSVファイル設定 slcsvfile.loadfromfile(sdirpath + sfilename); ~~~ 次ページ メニュー追加処理 として解説 ~~~ end; finally // TStringList 開放 slitem.free; slcsvfile.free; end; end; TStringList を利用している為 LoadFromFile メソッドで 容易に CSV ファイルを文字列情報として取り込める

使い勝手を向上させるメニュー 参考 ツリー形式の内容を CSV ファイルより設定する方法 (1) { メニュー追加処理 } // CSVファイルを最後まで読み込む for icsvrow := 0 to slcsvfile.count -1 do begin // メニュー項目取得用 TStringListをクリア slitem.clear; // 1 行読み込み slitem.commatext := slcsvfile.strings[icsvrow]; // メニュー ID2='000' の場合 メニューカテゴリーとする if slitem[cid2] = '000' then begin // 追加 :AddChildメソッド(P.22でご紹介) tparentnode := AddChild(tRootNode, slitem[cpgnm]); tparentnode.imageindex := StrToIntDef(slItem[cIIDX], -1); end; CSV ファイルの行数分のループ処理 該当行をカンマ区切りとして保持する

使い勝手を向上させるメニュー 参考 ツリー形式の内容を CSV ファイルに保存する方法 (3) var sdirpath, sfilename: String; // CSVファイルの保存先ファイル情報 slcsvfile: TStringList; // CSVファイル出力用 sid1, sid2: String; // CSVファイル列用変数 i, k: Integer; begin try ~~~ 次ページ メニュー内容取得処理 として解説 ~~~ // CSVファイルの保存先ファイル情報 sdirpath := ExtractFilePath(Application.ExeName); sfilename := ccsvfile; // CSVファイル出力 if slcsvfile.text <> '' then slcsvfile.savetofile(sdirpath + sfilename); finally // TStringList 開放 slcsvfile.free; end; end; TStringList を利用している為 SaveToFile メソッドで CSV ファイルとして保存できる

使い勝手を向上させるメニュー 参考 ツリー形式の内容を CSV ファイルに保存する方法 (3) { メニュー内容取得処理 } with tvmenu do begin // CSV ファイルにメニュー内容を出力 for i := 0 to Items[0].Count - 1 do begin // メニューカテゴリーの場合 sid1 := FormatCurr('000', i + 1); sid2 := '000'; slcsvfile.add(sid1 + ',' + sid2 + ',' + Items[0][i].Text + ',' + IntToStr(Items[0][0].ImageIndex)); // メニューカテゴリーに紐付く ノードの情報 ツリー内容のノード ( 親 ) 数分のループ処理 for k := 0 to Items[0][i].Count - 1 do begin sid2 := FormatCurr('000', k + 1); slcsvfile.add(sid1 + ',' + sid2 + ',' + Items[0][i][k].Text + ',' + IntToStr(Items[0][i][k].ImageIndex)); end; end; end; ツリー内容のノード ( 親 ) に紐付くノード ( 子 ) 数分のループ処理

アプリケーション開発スタイルに応じた メニュー 開発

アプリケーション開発スタイルに応じた メニュー 開発 アプリケーション開発スタイルの種類 1 全ての機能を 1 つの EXE にする A) 処理毎に起動するプログラムを指定 2 メニューと各機能を分割する B) 各機能を EXE にし 機能毎に EXE を呼び出す C) 各機能を DLL 化し 機能毎に DLL を呼び出す

各開発スタイルの構成イメージ プロセス プログラム (A) 全ての機能を1つのEXEにする機能 A 処理 A-1 処理 A-2 同一プロセス 同一セッションで全ての機能を処理できる EXE メニュー 機能 B 処理 B-1 処理 B-2 軽微な修正や機能追加でも 関連しない全ての機能を含めて EXE の再作成が必要になる (B) 機能毎に EXE に分ける メニュー EXE EXE EXE 機能 A 機能 B 処理 A-1 処理 B-1 処理 A-2 処理 B-2 各機能ごとプロセス及びセッションが分かれてしまう 軽微な修正や機能追加に対して 関連する機能のみ EXE の再作成をすればよい (C) 機能毎に DLL に分ける メニュー EXE DLL DLL 機能 A 機能 B 処理 A-1 処理 B-1 処理 A-2 処理 B-2 同一プロセス 同一セッションで全ての機能を処理できる 軽微な修正や機能追加に対して 関連する機能のみ DLL の再作成をすればよい

各開発スタイルの特徴のまとめ 項目 開発難易度 メリット デメリット (A) 全ての機能を 1 つの EXE にする 易しい 同一 EXE に全ての機能が含まれるため 画面展開等の開発がしやすい 同一プロセス 同一セッションで全ての機能を処理できる 軽微な修正や機能追加でも 全ての機能を含む EXE の再作成が必要になる 機能が増えてくると EXE のサイズが増える (B) 機能毎に EXE に分ける 軽微な修正や機能追加には 関連する機能のみ EXE を再作成すれば良い 機能が増えても 個別の EXE サイズは抑えられる (EXE 全体のサイズは増えてしまう ) 画面展開時に ログイン情報等を実行時引数で渡す等の考慮が必要になる プロセスが分かれるため セッションが分かれてしまう (C) 機能毎に DLL に分ける 難しい 同一プロセス 同一セッションで全ての機能を処理できる 軽微な修正や機能追加には 関連する機能のみ DLL を再作成すれば良い 機能が増えても 個別の DLL サイズは抑えられる (DLL 全体のサイズは増えてしまう ) DLL 独自の開発手法の考慮が必要になる 開発時のデバッグ方法が EXE とは異なる EXE と異なり DLL 単独での実行ができない

参考 メニュー画面から EXE を呼び出す方法 EXE 間の情報受け渡しをどうするか? 実行時引数を使用する方法例 ) ユーザー ID= TESTUSER を受け渡す C: Projects TEC010.exe TESTUSER Menu.exe メニュー TEC010.exe 処理 A 呼出元 ボタン押下時に edtuser の入力値を TEC010.exe に実行時引数として呼び出す場合 procedure TfrmSampleMenu.btnCallExeClick(Sender: TObject); begin // 実行ファイルとして機能分割されたプログラムを呼び出します ShellExecute(Handle, // 自身のハンドル open, // 関連付けで開く PChar( TEC010.exe ), // 実行ファイル名 PChar(edtUser.Text), // 実行時引数 ( ユーザID) PChar(ExtractFileDir(Application.ExeName)), // 作業ディレクトリ SW_SHOWNORMAL); // 位置 サイズ end; 複数のパラメータを付与する場合は 空白で区切る

参考 メニュー画面から EXE を呼び出す方法 EXE 間の情報受け渡しをどうするか? 実行時引数を使用する方法例 ) ユーザー ID= TESTUSER を受け渡す C: Projects TEC010.exe TESTUSER 呼出先 画面起動時に 実行時引数を stuser にセットする場合 procedure TfrmDividedSampleExe.FormCreate(Sender: TObject); begin // ユーザIDをクリアする stuser.caption := ''; // 実行時引数が 1 つ以上あるか if ParamCount >= 1 then begin // 1 つ目の実行時引数をユーザ ID として表示します stuser.caption := ParamStr(1); end; end; ParamCount : 実行時引数がセットされた数 ParamStr : 実行時引数にセットされた文字列を取得 複数のパラメータを受け取る場合は ParamStr(2) ParamStr(3) とする

参考 メニュー画面から DLL を呼び出す方法 DLL プロジェクトの作成方法 [ ファイル ] [ 新規作成 ] [ その他 ] [ ダイナミックリンクライブラリ ] を選択

参考 メニュー画面から DLL を呼び出す方法 呼出先 DLL 側にあらかじめ呼び出すための手続き 関数を準備 library DividedSampleDLL; uses SysUtils, Classes, FDividedSampleDLL in 'FDividedSampleDLL.pas' {frmdividedsampledll}; フォームユニットのソース exports ShowForm; プロジェクトソース 外部から呼び出したい関数 手続きは exports の下に全て宣言する var frmdividedsampledll: TfrmDividedSampleDLL; procedure ShowForm(pcUSER: PChar); stdcall; implementation {$R *.dfm} procedure ShowForm(pcUSER: PChar); begin // 機能分割サンプルフォームを作成 表示します frmdividedsampledll := TfrmDividedSampleDLL.Create(nil); frmdividedsampledll.edtuser.text := pcuser; frmdividedsampledll.showmodal; frmdividedsampledll.free; end;

参考 メニュー画面から DLL を呼び出す方法 呼出元 DLL の手続き 関数を実行時に取得 実行 procedure TfrmSampleMenu.btnCallDLLClick(Sender: TObject); var DLLHandle: THandle; DLLFnc: procedure (pcuser: PChar); stdcall; begin // DLLを動的にロードする DLLHandle := LoadLibrary('DividedSampleDLL.dll'); // ロード失敗時は処理を行わない if DLLHandle = 0 then Exit; // DLL の ShowForm 手続きのアドレスを取得する DLLFnc := GetProcAddress(DLLHandle, 'ShowForm'); // 手続きのアドレスが取得できたら手続きを呼び出す if Assigned(DLLFnc) then DLLFnc(PChar(edtUSER.Text)); // 使い終わった DLL をアンロードする FreeLibrary(DLLHandle); end;

参考 メニュー画面から EXE や DLL を呼び出す 実行イメージ

参考 メニュー画面から DLL を呼び出す方法 DLL プログラムの作り方 呼び出し方の詳しい説明は 2011 年の第 9 回テクニカルセミナー 知って得する! 現役ヘルプデスクが答える Delphi テクニカルエッセンス 9.0 をご参照ください ミガロ. ホームページ メンテナンス専用 ページより 資料がダウンロードができます URL=http://www.migaro.co.jp/

まとめ

まとめ メニュー の種類と基本的な作成方法 ボタン配置形式の作成手順 ツリー形式の作成手順 開発テクニックのご紹介 TAction を使用した権限制御 ツリー形式での動的なメニュー作成手順 ツリー形式でのカスタマイズ方法 アプリケーション開発スタイルに応じた メニュー 開発 アプリケーション開発スタイル毎の特徴 機能毎の EXE を作成し メニュー画面から EXE を呼び出す方法 機能毎の DLL を作成し メニュー画面から DLL を呼び出す方法

ご清聴ありがとうございました