FormまたはUnitごと保存・読み取りをするには?


ポン  2010-09-21 00:44:20  No: 39199

プログラミング初心者です。
まず、Form上に配置しているコンポーネントなのですが、
・ボタン  ・エディット  ・ラベル  ・ラジオグループ  ・リストボックス
・メモ  ・コンボボックス等を使用しています。

実行上で、ボタン(自分で作った「保存」ボタン)を押し、エディット内容やチェックが書き込まれたままの状態で、FormまたはUnitごと保存を行いたいのですが、どういうプログラムを組めばいいのかわかりません。

また、プログラム実行上で、その保存したFormをまた開き、更新できるようにする方法も教えていただけないでしょうか?

当方、SaveToFileを使ってMemoの内容をテキストにて保存することはできるレベルです。
どうかよろしくお願いします。


Delphi大好き  2010-09-21 03:40:37  No: 39200

自分が良く使う手法です。
チェックボックスとエディットの内容をMemo1コンポーネントを使って保存します。
Memo1はあらかじめVisibleをFalseにして見えなくしておきます。
うまく動作してない時はTrueにしてMemo1の中身を確認できます。

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  memo1.Lines.Clear;
  if CheckBox1.Checked then
    memo1.Lines.Add('True')
  else
    memo1.Lines.Add('False');
  memo1.Lines.Add(edit1.Text);
  try
    memo1.Lines.SaveToFile(changefileext(paramstr(0),'.ini'));
  except

  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  try
    memo1.Lines.LoadFromFile(changefileext(paramstr(0),'.ini'))
  except

  end;
  if memo1.Lines[0] = 'True' then
    CheckBox1.Checked := True
  else
    CheckBox1.Checked := False;
  edit1.Text := memo1.Lines[1];
end;


igy  2010-09-21 05:13:09  No: 39201

>FormまたはUnitごと保存・読み取り

の方法は、わかりませんが、

>・エディット

>・コンボボックス

の値などは、INIファイルかレジストリなどに保存するのも、よいかと思います。

ini ファイルとシステムレジストリの操作
http://docwiki.embarcadero.com/RADStudio/XE/ja/Ini_%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%A8%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%83%AC%E3%82%B8%E3%82%B9%E3%83%88%E3%83%AA%E3%81%AE%E6%93%8D%E4%BD%9C

>・リストボックス

>・コンボボックス
のリスト

などは、SaveToFileなどでファイルに保存するのは、いかがですか?


武田  2010-09-21 07:40:00  No: 39202

小生がかって先輩に教わったコード例です。何か参考になれば。
ざっと抜粋したのでミスがあると思いますが。
  TForm1 = class(TForm)
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;        
const
    BandCount=3;       //CoolBarを置きその上にToolbarを3個置いているという宣言です。
              //たとえば一段目を左右2個、2段目を一個。あるいは3段になったりする。
var
    Form1: TForm1;
    iniFile:  TIniFile;  //iniファイルの名前の宣言
    AppPath: string;    //このプログラムを置いておくフォルダパスを格納する
implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
        Form1.Position:=poDesigned;
    iniFile := TIniFile.Create(AppPath);//iniファイルをオープン
    //フォーム形状復元
      //最初inifairuganaitoki-100を取得したときインストールして最初の起動だと判断するため
      //いろいろな箇所で最初ならファイルを新規作成するため
    if IniFile.ReadInteger('Window', 'Top', -100)=-100 then
    begin
        Form1.Width:= 640;//俺のモニタはVGAだからはみ出すというクレームを食うので
        Form1.Height:= 480;
    end
    else
    begin  //iniファイルがあるとき
        Form1.Top:=    IniFile.ReadInteger('Window', 'Top',  Form1.Top   );
        Form1.Left:=   IniFile.ReadInteger('Window', 'Left', Form1.Left );
        Form1.Width:=  IniFile.ReadInteger('Window', 'Width',  640 );
        Form1.Height:= IniFile.ReadInteger('Window', 'Height', 480);
  //USBメモリーにインストールしている場合開いたモニタのサイズが違うかもしれないから
        if IniFile.ReadBool('Window', 'Maxmize', False) then
        begin
           Form1.WindowState := wsMaximized;
        end
        else
        begin
           Form1.WindowState := wsNormal;
        end;
    end;
    //-------------------------CoolBarの左右の長さやフロート状態を復元する-------------------------------------
    //CoolBarの上に3個のToolBarがありどんな形になっているかわからないので復元
    for i:=0 to BandCount-1 do
    begin           //Bandの位置とBreakを読込む
        BandIDNumber[i]:= IniFile.ReadInteger('CoolBar1','Band'+IntToStr(i)+'ID',i);

        BandWidth[i]   := IniFile.ReadInteger('CoolBar1','Band'+IntToStr(i)+'Width',452);  //452は自分のサイズ
        if i=1 then
            BandBreak[i]   := IniFile.ReadBool('CoolBar1','Band'+IntToStr(i)+'Break',false)
        else
            BandBreak[i]   := IniFile.ReadBool('CoolBar1','Band'+IntToStr(i)+'Break',true);
    end;
    CoolBar1.Bands.BeginUpdate;
    //値の呼び出して復元
    Tax                :=iniFile.ReadInteger('Tax',%',5);    //数値の復元    
    Edit1.Text     :=iniFile.ReadString('Edit1','Text',''); //文字列の復元
    DisplayYesNo  :=iniFile.ReadBool(DisplayYesNot','Yes',false);    //true or falseの復元
    iniFile.Free;    //iniファイルを閉じる  

end;

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  //フォームの状態をiniファイルに書き込みして保存する
        iniFile := TIniFile.Create(AppPath );//iniファイルを開く
              if Form1.WindowState = wsNormal then//フォームの状態を保存する
              begin
                IniFile.WriteBool(   'Window', 'Maxmize', False );
                IniFile.WriteInteger('Window', 'Top',     Form1.Top   );
                IniFile.WriteInteger('Window', 'Left',    Form1.Left  );
                IniFile.WriteInteger('Window', 'Width',   Form1.Width );
                IniFile.WriteInteger('Window', 'Height',  Form1.Height);
               end
               else
               begin
                  IniFile.WriteBool('Window', 'Maxmize', True);
               end;
        //---------------------------CoolBarの上のToolBarの保存------------
        for i:=0 to BandCount-1 do
        begin             //Bandの位置とBreakを書きこむ
          iniFile.WriteInteger('CoolBar1','Band'+IntToStr(i) +'ID',CoolBar1.Bands[i].ID);
          iniFile.WriteInteger('CoolBar1','Band'+IntToStr(i) +'Width',CoolBar1.Bands[i].Width);
          iniFile.WriteBool('CoolBar1','Band'+IntToStr(i)    +'Break',CoolBar1.Bands[i].Break);
        end;
    
            iniFile.WriteInteger('Tax','%',Tax );//数値の保存
            iniFile.WriteString( 'Edit1','Text',Edit1.Text);//文字列の保存
    iniFile.WriteBool('DisplayYesNot','Boolean',DisplayYesNo);//true  or  falseの保存
          IniFile.Free;//iniファイルを閉じる
end;

initialization 
AppPath := ExtractFilePath(Application.ExeName);  //起動時にこのexeファイルのあるフォルダパスを取得しておく
end.      // 一番最後のend


武田  2010-09-21 07:54:08  No: 39203

自己レスです。
早速ミスがありますので訂正
iniファイル名を任意の名前+.iniでつけてください。
 iniFile := TIniFile.Create(AppPath+'AppSetUp.ini');//iniファイルをオープン
では。


ポン  2010-09-21 11:50:50  No: 39204

iniファイルを使って状態を保存し、呼び出すんですね。
iniを使ったことが無かったので、とりあえずやってみます。
みなさん即レスありがとうございました。

トライしてみて、また詰まりましたら、アドバイスお願いします。


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

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






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