Q&A

  • INI파일 사용시 Win 98/ME에서 에러
ini파일을 사용해서
db경로를 설정하는 실행파일을 만들었습니다.
작업하고 있는운영체제는 win200 pro 이구요

uses 절에 inifiles 를 추가하구나서
ini변수.readstring / ini변수.writestring 로  구현했거든요

근데 이실행파일이 win2000 에서는 잘돌아 가는데

win me 에서는 커널오류가나구요

win98 에서는 잘못된연산 페이지 부재 이런 에러가 나네요! 쩝

원래 ini 파일을 쓰려면 uses절에 참조만하구 실행파일을 만들면

델파이 내의 inifiles.pas도 함께 포함되서 컴파일 되는게 아닌가요?
이것이 궁금합니다. 그리구 에러가 뜨는 이유를 모르겠습니다.

아시는 분은 답변바랍니다.
수고하세요!
3  COMMENTS
  • Profile
    남양원 2002.12.11 06:38
    에러난 INI 파일의 사이즈를 보세요 분명 64K를 넘으셨을 겁니다.

    Microsoft Windows 98 Registry  .... 주황색 색깔 많은 표지의 책 아시져
    그책 십 몇 페이지 쯤에 설명 있습니다.

    해결 방법은 64K가 넘지 않는 INI 파일 사용(파일을 분리하는 것도 좋아여)

    아님 다른 방법으로 델파이 도움말에는 RegIni 파일이 있다는 데 그건 안 써봤습니다.

    그냥 텍스트 파일 맹그러도 되구요

    즐프되세여~!

  • Profile
    백진욱 2002.12.12 05:57
    ini파일이 없을때도 에러가 발생하네요
    소스를 좀봐주시면 감사하겠습니다.

    unit UPath;

    interface

    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, FileCtrl, StdCtrls, ExtCtrls, Buttons;

    type
      Tfrmpath = class(TForm)
        btnSave: TBitBtn;
        btnClose: TBitBtn;
        pnlpath: TPanel;
        drvcbo: TDriveComboBox;
        dirlst: TDirectoryListBox;
        filelst: TFileListBox;
        procedure btnCloseClick(Sender: TObject);
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
        procedure filelstChange(Sender: TObject);
        procedure btnSaveClick(Sender: TObject);
        procedure drvcboChange(Sender: TObject);
        procedure FormCreate(Sender: TObject);


      private
        { Private declarations }
      public
        { Public declarations }
      end;

    var
      frmpath: Tfrmpath;

    implementation

    uses IniFiles;

    {$R *.dfm}  

    procedure Tfrmpath.btnCloseClick(Sender: TObject);
    begin
      close;
    end;

    procedure Tfrmpath.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      action := cafree;
    end;

    procedure Tfrmpath.filelstChange(Sender: TObject);
    begin
      pnlpath.Caption := ' 경로 : ' + filelst.FileName;
    end;

    procedure Tfrmpath.btnSaveClick(Sender: TObject);
    var
      p_ini : TiniFile;
      ls_path : String;
    begin
      p_ini := TiniFile.Create('ITACADEMY.ini');
      ls_path := dirlst.Directory;
      p_ini.WriteString('System','Path',ls_path);
      p_ini.WriteString('System','Dbname',filelst.FileName);
      p_ini.Free;
    end;

    procedure Tfrmpath.drvcboChange(Sender: TObject);
    begin
      dirlst.SetFocus;
    end;

    procedure Tfrmpath.FormCreate(Sender: TObject);
    var
      p_ini : TiniFile;
      ls_filename, ls_path : String;
    begin
      p_ini := TiniFile.Create('ITACADEMY.ini');
      ls_filename := p_ini.ReadString('System','Dbname',' 경로 : ');
      pnlpath.Caption := ls_filename;
      ls_path := p_ini.ReadString('System','Path',' 경로 : ');
      p_ini.Free;
      if trim(pnlpath.Caption) <> '경로 :' then
      begin
        drvcbo.Drive := ls_path[1];
        dirlst.Directory := ls_path;
        filelst.FileName := ls_filename;
      end;
    end;

    end.
  • Profile
    남양원 2002.12.12 07:55
    제가 아는데까지 아래 주석 달아봤어염.
    초보라서 딱히 이게 문제라고 못하네여...

    그럼 즐프하세여....


    unit UPath;

    interface

    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, FileCtrl, StdCtrls, ExtCtrls, Buttons;

    type
      Tfrmpath = class(TForm)
        btnSave: TBitBtn;
        btnClose: TBitBtn;
        pnlpath: TPanel;
        drvcbo: TDriveComboBox;
        dirlst: TDirectoryListBox;
        filelst: TFileListBox;
        procedure btnCloseClick(Sender: TObject);
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
        procedure filelstChange(Sender: TObject);
        procedure btnSaveClick(Sender: TObject);
        procedure drvcboChange(Sender: TObject);
        procedure FormCreate(Sender: TObject);


      private
        { Private declarations }
      public
        ExePath: string;
        { Public declarations }
      end;

    var
      frmpath: Tfrmpath;

    implementation

    uses IniFiles;

    {$R *.dfm}  

    procedure Tfrmpath.btnCloseClick(Sender: TObject);
    begin
      close;
    end;

    procedure Tfrmpath.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      action := cafree;
    end;

    procedure Tfrmpath.filelstChange(Sender: TObject);
    begin
      pnlpath.Caption := ' 경로 : ' + filelst.FileName;
    end;

    procedure Tfrmpath.btnSaveClick(Sender: TObject);
    var
      p_ini : TiniFile;
      ls_path : String;
    begin
      p_ini := TiniFile.Create(ExePath + '' + 'ITACADEMY.ini');
      ls_path := dirlst.Directory;
      p_ini.WriteString('System','Path',ls_path);
      p_ini.WriteString('System','Dbname',filelst.FileName);
      p_ini.Free;
    end;

    procedure Tfrmpath.drvcboChange(Sender: TObject);
    begin
      dirlst.SetFocus;
    end;

    procedure Tfrmpath.FormCreate(Sender: TObject);
    var
      p_ini : TiniFile;
      ls_filename, ls_path : String;
    begin
      ExePath := ExtractFilePath(Application.ExeName);

      // 의심 가는 부분 1
      // 아래 부분에서 경로를 지정했구요... 흐릿한 기억으로 ini 파일은 경로 지정없으면 윈도우 폴더에서 해당 파일을 찾는 걸로 알거든요.... 원래 윈도우 폴더에 있는 INI 파일을 참조하는 거라면 필요 없구요.
      p_ini := TiniFile.Create(ExePath + '' + 'ITACADEMY.ini');
      try
        ls_filename := p_ini.ReadString('System','Dbname',' 경로 : ');
        pnlpath.Caption := ls_filename;
        ls_path := p_ini.ReadString('System','Path',' 경로 : ');
      finally
        p_ini.Free;
      end;

      if trim(pnlpath.Caption) <> '경로 :' then
      begin
        drvcbo.Drive := ls_path[1]; // 의심 가는 부분 2 : Win9x 에서 긴 패스 명에 대한 인식이 의심 가거든요
    // 테스트 하실때 아래와 같이 출력 확인해 보시구요....
    // MessageBox(0, PChar(Is_Path[1]), PChar('OK'), MB_OK);
    // MessageBox(0, PChar(drvcbo.Drive), PChar('OK'), MB_OK);
    //
    // 그리고 다음과 같은 테스트도 한번 해보세여
    //  아래 두가지로 각각 지정해 보고 이상 없는지여...
    //  drvcbo.Drive := 'C:Temp';
    //  drvcbo.Drive := 'C:WindowsTemporary Internet Files';
    //

        dirlst.Directory := ls_path;
        filelst.FileName := ls_filename;
      end;
    end;

    end.