主要的问题是如何通过combobox的取值来返回ini文件的小节变量!ini文件
[language] 
   ivar=2
[frmCount] 
   wCount=3
[frm1] 
   total=3 
   frmCaption=测试窗口1 
   label1=TestName1^测试测试按钮标题1^ALT+D ^255 ^8 ^测试提示1^参考1
   label2=TestName2^测试测试按钮标题2^ALT+D ^255 ^8 ^测试提示2^参考2
   label3=TestName3^测试测试按钮标题3^ALT+D ^255 ^8 ^测试提示3^参考3
[frm2] 
   total=3 
   frmCaption=测试窗口2 
   label1=TestName1^测试测试按钮标题1^ALT+D ^255 ^8 ^测试提示1^参考1
   label2=TestName2^测试测试按钮标题2^ALT+D ^255 ^8 ^测试提示2^参考2
   label3=TestName3^测试测试按钮标题3^ALT+D ^255 ^8 ^测试提示3^参考3
[frm3] 
   total=3 
   frmCaption=测试窗口3 
   label1=TestName1^测试测试按钮标题1^ALT+D ^255 ^8 ^测试提示1^参考1
   label2=TestName2^测试测试按钮标题2^ALT+D ^255 ^8 ^测试提示2^参考2
   label3=TestName3^测试测试按钮标题3^ALT+D ^255 ^8 ^测试提示3^参考3源代码
unit Language;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, DBCtrls, Menus, DB, DBClient, Grids, DBGrids, IniFiles,
  StdCtrls;type
  TForm1 = class(TForm)
    MainMenu1: TMainMenu;
    OpenDialog1: TOpenDialog;
    SaveDialog1: TSaveDialog;
    DataSource1: TDataSource;
    ClientDataSet1: TClientDataSet;
    File1: TMenuItem;
    Exit1: TMenuItem;
    N1: TMenuItem;
    N2: TMenuItem;
    SaveAs1: TMenuItem;
    Save1: TMenuItem;
    Close1: TMenuItem;
    Open1: TMenuItem;
    New1: TMenuItem;
    ClientDataSet1Field: TStringField;
    ClientDataSet1Field2: TStringField;
    ClientDataSet1Field3: TStringField;
    ClientDataSet1Field4: TStringField;
    ClientDataSet1Field5: TStringField;
    ClientDataSet1Field6: TStringField;
    ClientDataSet1Field7: TStringField;
    ClientDataSet1Field8: TStringField;
    Label1: TLabel;
    ComboBox1: TComboBox;
    DBGrid1: TDBGrid;
    Label2: TLabel;
    Label3: TLabel;
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Exit1Click(Sender: TObject);
    procedure Open1Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;var
  Form1: TForm1;
  IniFile:TIniFile;
  ivar,i,j,total,wCount:Integer;
  slabel:string;
implementation{$R *.dfm}
function SplitStr(var AStr: string; ASplitChar: Char = ';'): string;//截取字符串
var
  sF: string;
begin
  sF := '';
  if AStr <> '' then
    if Pos(ASplitChar, AStr) > 0 then
    begin
      sF := Copy(AStr, 1, Pos(ASplitChar, AStr) - 1);
      AStr := Copy(AStr, Pos(ASplitChar, AStr) + 1, MaxInt);
    end
    else
    begin
      sF := AStr;
      AStr := '';
    end;
  Result := sF;
end;procedure TForm1.FormCreate(Sender: TObject);
begin
  ClientDataSet1.Close;
  ClientDataSet1.CreateDataSet;
  ClientDataSet1.Open;
end;procedure TForm1.Exit1Click(Sender: TObject);
begin
  close;
end;procedure TForm1.Open1Click(Sender: TObject);
begin
  if OpenDialog1.Execute then
  begin
    IniFile:=TIniFile.Create(OpenDialog1.FileName);
    ivar:= IniFile.ReadInteger('language','ivar',0);
    if ivar = 0 then
    begin
      Label2.Caption:= '窗口语言:英语';
    end;
    if ivar = 1 then
    begin
      Label2.Caption:= '窗口语言:繁体';
    end;
    if ivar = 2 then
    begin
      Label2.Caption:= '窗口语言:简体';
    end;
    wCount:=IniFile.ReadInteger('frmCount','wCount',1);
    Label3.Caption:= '窗口数量:' + IntToStr(wCount);
    for i := 1 to wCount do
    begin
      total:=IniFile.ReadInteger('frm'+IntToStr(i),'total',1);
      Combobox1.Text:=IniFile.ReadString('frm'+IntToStr(1),'frmCaption','');
      Combobox1.Items.Add(IniFile.ReadString('frm'+IntToStr(i),'frmCaption','')) ;
    end;
  end;
end;procedure TForm1.Button1Click(Sender: TObject);
begin
  i:=2 ;   //如何根据Combobox的值来判断小节
    begin
      for j := 1 to total do
      begin
      slabel:=IniFile.ReadString('frm'+IntToStr(i),'label'+IntToStr(j),'');
      ClientDataSet1.Append;
      ClientDataSet1.FieldByName('窗口名称').AsString:=IniFile.ReadString('frm'+IntToStr(i),'frmCaption','');
      ClientDataSet1.FieldByName('程序名称').AsString:=SplitStr(slabel,'^');
      ClientDataSet1.FieldByName('标题语言').AsString:=SplitStr(slabel,'^');
      ClientDataSet1.FieldByName('快捷键').AsString:=SplitStr(slabel,'^');
      ClientDataSet1.FieldByName('颜色').AsString:=SplitStr(slabel,'^');
      ClientDataSet1.FieldByName('字体大小').AsString:=SplitStr(slabel,'^');
      ClientDataSet1.FieldByName('提示说明').AsString:=SplitStr(slabel,'^');
      ClientDataSet1.FieldByName('备注').AsString:=SplitStr(slabel,'^');
      ClientDataSet1.Post;
      end;
    end;
end;end.
我每次都会给分的!大家可以看看我以前的发问贴!

解决方案 »

  1.   

    要求就是通过选择combobox中的值反映到dbgrid中!就是注释处的地方有问题!
    i:= 2 ;   //如何根据Combobox的值来判断小节
    这句是错的!i的值应该根据combobox的值来反映!例如下面
    Combobox1.Text:=测试窗口1则i=1
    Combobox1.Text:=测试窗口2则i=2
    Combobox1.Text:=测试窗口3则i=3
      

  2.   

    function ExtractStrings(Separators, WhiteSpace: TSysCharSet; Content: PChar; Strings: TStrings): Integer;
    这么好的string解析为什么不用呢!?SplitStr自己写的用的不爽!
    procedure TForm1.Button1Click(Sender: TObject);
    var 
       indexName:String;
    begin
      indexName:=combobox1.Text;   //如何根据Combobox的值来判断小节
        begin
          for j := 1 to total do
          begin
          slabel:=IniFile.ReadString(indexName,'label'+IntToStr(j),'');
          ClientDataSet1.Append;
          ClientDataSet1.FieldByName('窗口名称').AsString:=IniFile.ReadString(indexName,'frmCaption','');
          ClientDataSet1.FieldByName('程序名称').AsString:=SplitStr(slabel,'^');
          ClientDataSet1.FieldByName('标题语言').AsString:=SplitStr(slabel,'^');
          ClientDataSet1.FieldByName('快捷键').AsString:=SplitStr(slabel,'^');
          ClientDataSet1.FieldByName('颜色').AsString:=SplitStr(slabel,'^');
          ClientDataSet1.FieldByName('字体大小').AsString:=SplitStr(slabel,'^');
          ClientDataSet1.FieldByName('提示说明').AsString:=SplitStr(slabel,'^');
          ClientDataSet1.FieldByName('备注').AsString:=SplitStr(slabel,'^');
          ClientDataSet1.Post;
          end;
        end;
    end;估计是我理解错了!这是你要的答案么!?
      

  3.   

    很可惜,不是!楼上的可以看看下面就知道了!
    Combobox1.Text:=IniFile.ReadString('frm'+IntToStr(1),'frmCaption','');
    Combobox1.Items.Add(IniFile.ReadString('frm'+IntToStr(i),'frmCaption','')) 
      

  4.   

    combobox1.Text取的就是frmCaption的值!不是小节名!frmCaption在小节里
      

  5.   

    应该是这样function TForm1.GetSectionByfrmCaption(frmCap: string): string;
    var
      ini: TIniFile;
      Sections: TStringList;
      i: Integer;
      S: string;
    begin
      Ini := TIniFile.Create('D:\1.ini');
      Sections := TStringList.Create;
      try
        ini.ReadSections(Sections); //加载所有的Section
        for i := 0 to Sections.Count - 1 do
        begin
          Result := Sections[i];
          S := ini.ReadString(Result, 'frmCaption', ''); //取得当前循环对应的frmCaption值
          if CompareText(frmCap, S) = 0 then
            Exit;
        end;
      finally
        Sections.Free;
        ini.Free;
      end;
      Result := '';
    end;
    测试代码:procedure TForm1.Button1Click(Sender: TObject);
    begin
      ShowMessage(GetSectionByfrmCaption(ComboBox1.Text));
    end;
      

  6.   

    估计楼主只是不知道TIniFile的ReadSections函数而已,其它的都比较简单
      

  7.   

    Combobox1.Text:=IniFile.ReadString('frm'+IntToStr(i),'frmCaption','');
    就是知道Combobox1.Text的值反过来找i,记住Combobox1.Text是某个关键字的值!
      

  8.   

    我用一个笨方法解决啦!谢谢各位,虽然没有解决我的问题,但是也给我不少启发!
    unit Language;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ExtCtrls, DBCtrls, Menus, DB, DBClient, Grids, DBGrids, IniFiles,
      StdCtrls;type
      TForm1 = class(TForm)
        MainMenu1: TMainMenu;
        OpenDialog1: TOpenDialog;
        SaveDialog1: TSaveDialog;
        DataSource1: TDataSource;
        ClientDataSet1: TClientDataSet;
        File1: TMenuItem;
        Exit1: TMenuItem;
        N1: TMenuItem;
        N2: TMenuItem;
        SaveAs1: TMenuItem;
        Save1: TMenuItem;
        Close1: TMenuItem;
        Open1: TMenuItem;
        New1: TMenuItem;
        ClientDataSet1Field: TStringField;
        ClientDataSet1Field2: TStringField;
        ClientDataSet1Field3: TStringField;
        ClientDataSet1Field4: TStringField;
        ClientDataSet1Field5: TStringField;
        ClientDataSet1Field6: TStringField;
        ClientDataSet1Field7: TStringField;
        ClientDataSet1Field8: TStringField;
        Label1: TLabel;
        ComboBox1: TComboBox;
        DBGrid1: TDBGrid;
        Label2: TLabel;
        Label3: TLabel;
        Button1: TButton;
        procedure FormCreate(Sender: TObject);
        procedure Exit1Click(Sender: TObject);
        procedure Open1Click(Sender: TObject);
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;
      IniFile:TIniFile;
      ivar,total,wCount:Integer;
      slabel:string;
    implementation{$R *.dfm}
    function SplitStr(var AStr: string; ASplitChar: Char = ';'): string;//截取字符串
    var
      sF: string;
    begin
      sF := '';
      if AStr <> '' then
        if Pos(ASplitChar, AStr) > 0 then
        begin
          sF := Copy(AStr, 1, Pos(ASplitChar, AStr) - 1);
          AStr := Copy(AStr, Pos(ASplitChar, AStr) + 1, MaxInt);
        end
        else
        begin
          sF := AStr;
          AStr := '';
        end;
      Result := sF;
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
      ClientDataSet1.Close;
      ClientDataSet1.CreateDataSet;
      ClientDataSet1.Open;
    end;procedure TForm1.Exit1Click(Sender: TObject);
    begin
      close;
    end;procedure TForm1.Open1Click(Sender: TObject);
    var
     i: Integer;
    begin
      if OpenDialog1.Execute then
      begin
        IniFile:=TIniFile.Create(OpenDialog1.FileName);
        ivar:= IniFile.ReadInteger('language','ivar',0);
        if ivar = 0 then
        begin
          Label2.Caption:= '窗口语言:英语';
        end;
        if ivar = 1 then
        begin
          Label2.Caption:= '窗口语言:繁体';
        end;
        if ivar = 2 then
        begin
          Label2.Caption:= '窗口语言:简体';
        end;
        wCount:=IniFile.ReadInteger('frmCount','wCount',1);
        Label3.Caption:= '窗口数量:' + IntToStr(wCount);
        for i := 1 to wCount do
        begin
          total:=IniFile.ReadInteger('frm'+IntToStr(i),'total',1);
          Combobox1.Text:=IniFile.ReadString('frm'+IntToStr(1),'frmCaption','');
          Combobox1.Items.Add(IniFile.ReadString('frm'+IntToStr(i),'frmCaption','')) ;
        end;
      end;
    end;procedure TForm1.Button1Click(Sender: TObject);
    var
    i,j,p:Integer;
    boxtext:string;
    begin
      for p := 1 to wCount do
      begin
        boxtext:=IniFile.ReadString('frm'+IntToStr(p),'frmCaption','');
        if  boxtext=Combobox1.Text then
        begin
          i:=p;
        end;
      end;   //如何根据Combobox的值来判断小节
        begin
          for j := 1 to total do
          begin
          slabel:=IniFile.ReadString('frm'+IntToStr(i),'label'+IntToStr(j),'');
          ClientDataSet1.Append;
          ClientDataSet1.FieldByName('窗口名称').AsString:=IniFile.ReadString('frm'+IntToStr(i),'frmCaption','');
          ClientDataSet1.FieldByName('程序名称').AsString:=SplitStr(slabel,'^');
          ClientDataSet1.FieldByName('标题语言').AsString:=SplitStr(slabel,'^');
          ClientDataSet1.FieldByName('快捷键').AsString:=SplitStr(slabel,'^');
          ClientDataSet1.FieldByName('颜色').AsString:=SplitStr(slabel,'^');
          ClientDataSet1.FieldByName('字体大小').AsString:=SplitStr(slabel,'^');
          ClientDataSet1.FieldByName('提示说明').AsString:=SplitStr(slabel,'^');
          ClientDataSet1.FieldByName('备注').AsString:=SplitStr(slabel,'^');
          ClientDataSet1.Post;
          end;
        end;
    end;end.