Top / Programming / Ruby / Ruby GUIライブラリ / Apollo / Apolloでメモ帳作成(4)開いて保存できるだけのメモ帳

Apolloでメモ帳作成(4)

Apolloでメモ帳を作成します。

Apolloチュートリアルを参考にしました。

開いて保存できるだけのメモ帳

複数行テキストコントロールを追加する

標準の複数行テキストコントロールPhi::Memoよりも高機能なPhi拡張ライブラリPhi::Editorを使用します。

alignプロパティにPhi::AL_CLIENTを設定すると、コントロールは親のクライアント領域いっぱいにコントロールのサイズが変更されます。

editor = Phi::Editor.new(self, :editor1, '')
editor.align = Phi::AL_CLIENT
editor.lines.clear
editor.modified = false

[新規]メニュー

editorの内容をクリアします。

#メニュー[ファイル]-[新規]
menu_new.on_click = proc do
  editor.lines.clear
  @filename = ''
end

[開く]メニュー

ファイルを開くダイアログはPhi::OpenDialogを使用します。

#メニュー[ファイル]-[開く]
menu_open.on_click = proc do
  dlg = Phi::OpenDialog.new
  dlg.filter = 'テキスト文書(*.txt)|*.txt|Rubyスクリプト(*.rb)|*.rb|すべてのファイル(*.*)|*|'
  if dlg.execute
    editor.lines.load(dlg.file_name)
    @filename = dlg.file_name
  end
end

[保存]メニュー

#メニュー[ファイル]-[保存]
menu_save.on_click = proc do
  if @filename != ''
    editor1.lines.save(@filename)
  else
    saveas() #名前を付けて保存
  end
end

[名前を付けて保存]メニュー

#メニュー[ファイル]-[名前を付けて保存]
menu_saveas.on_click = proc do
  saveas() #名前を付けて保存
end

#名前を付けて保存
def saveas
  dlg = Phi::SaveDialog.new
  dlg.filter = 'テキスト文書(*.txt)|*.txt|Rubyスクリプト(*.rb)|*.rb|すべてのファイル(*.*)|*|'
  if dlg.execute
    editor1.lines.save(dlg.file_name)
    @filename = dlg.file_name
  end
end

ここまでのソースコード

#!ruby -Ks

require 'phi'
require 'dialogs' #Phi.message_dlg
require 'editor' #Phi::Editor

class MemoForm < Phi::Form
  def initialize(*arg)
    super
    @filename = '' #表示中ののファイル名
    #メニュー
    Phi.new_menu(self, :menu1, [
      menu_file = Phi.new_item('ファイル(&F)', '', :mi_file).add(
        menu_new = Phi.new_item('新規(&N)', 'CTRL+N', :mi_new),
        menu_open = Phi.new_item('開く(&O)', 'CTRL+O', :mi_open),
        menu_save = Phi.new_item('保存(&S)', 'CTRL+S', :mi_save),
        menu_saveas = Phi.new_item('名前を付けて保存(&A)', '', :mi_save),
        Phi.new_line,
        menu_exit = Phi.new_item('終了(&X)', '', :mi_exit)
      ),
      menu_help = Phi.new_item('ヘルプ(&H)', '', :mi_help).add(
        menu_about = Phi.new_item('memoについて', '', :mi_about)
      )
    ])

    #複数行テキストコントロール
    editor = Phi::Editor.new(self, :editor1, '')
    editor.align = Phi::AL_CLIENT
    editor.lines.clear
    editor.margin.left = 0

    #メニュー[ファイル]-[新規]
    menu_new.on_click = proc do
      editor.lines.clear
      @filename = ''
    end
    #メニュー[ファイル]-[開く]
    menu_open.on_click = proc do
      dlg = Phi::OpenDialog.new
      dlg.filter = 'テキスト文書(*.txt)|*.txt|Rubyスクリプト(*.rb)|*.rb|すべてのファイル(*.*)|*|'
      if dlg.execute
        editor.lines.load(dlg.file_name)
        @filename = dlg.file_name
      end
    end
    #メニュー[ファイル]-[保存]
    menu_save.on_click = proc do
      if @filename != ''
        editor1.lines.save(@filename)
      else
        saveas() #名前を付けて保存
      end
    end
    #メニュー[ファイル]-[名前を付けて保存]
    menu_saveas.on_click = proc do
      saveas() #名前を付けて保存
    end
    #メニュー[ファイル]-[閉じる]
    menu_exit.on_click = proc do
      self.close
    end
    #メニュー[ヘルプ]-[memoについて]
    menu_about.on_click = proc do
      Phi.message_dlg('簡単なテキストエディタ')
    end
  end
  #名前を付けて保存
  def saveas
    dlg = Phi::SaveDialog.new
    dlg.filter = 'テキスト文書(*.txt)|*.txt|Rubyスクリプト(*.rb)|*.rb|すべてのファイル(*.*)|*|'
    if dlg.execute
      editor1.lines.save(dlg.file_name)
      @filename = dlg.file_name
    end
  end
end

form = MemoForm.new(:form1, 'memo')
form.show
Phi.mainloop

更新履歴