我的程序是delphi+oracle+odac,程序在ibm的XP上运行了四天,突然保错,但另一台同步运行的2000机器却没有报错,报错为access voliation 错误,why 
是否同机器系统有关?还是同程序有关?

解决方案 »

  1.   

    还有就是通常是第一次存盘后第二次存盘前发生,程序中有个stringgrid表格,设为可写,错误就发生在写stringgrid时
      

  2.   

    请教naner_china(naner)为什么会是程序运行四日才发生错误
      

  3.   

    条件不足,
    access voliation 是非法访问,
    可能是网络有问题,也可能是内存泄露...
      

  4.   

    我在stringgrid中嵌套了一个ComboBox,是否与这个有关?
    procedure Tfrmsfjl.cbInplaceComboBoxChange(Sender: TObject);
    var
      intRow:integer;
    begin
      inherited;   {Get the ComboBox selection and place in the grid} 
      with cbInplaceComboBox do 
      begin 
        intRow := sgall.Row;
        if (sgall.Col = 2) then
          sgall.Cells[2, intRow] := Items[ItemIndex]
        else
          sgall.Cells[sgall.Col, intRow] := Items[ItemIndex];
        Visible := False;
      end; 
      sgall.SetFocus;
      try
      if not dm.ADO_conn.Connected then dm.ADO_conn.Open;
      try
      strsql:='select * from syn_sfxm where sfxm='''+sgall.Cells[0,introw]+'''';
      with dm.sfxm do
      begin
          close;
          SQL.Clear;
          sql.Add(strsql);
          open;
       end;
      sgall.cells[1,introw]:=dm.sfxm.FieldByName('sfxmbh').AsString;
      except
        showmessage('无法查找到相关信息!');
      end;
      //dm.ADO_conn.Close;
      dm.sfxm.Close;
    except
     showmessage('无法与数据库连接!');
     exit;
    end;
    end;
      

  5.   

    两台机子程序运行情况肯定各自不同,和机器系统应该无关。
    检查程序内部给stringgrid赋值时是否有读取了并不存在的数据项,例如越界读取
      

  6.   

    出现这类错误,可以肯定是设计有问题,并非外界环境的影响。
    请仔细检查你的程序逻辑,看是否使用未初始化的指针、未实例化的对象,或使用了已经解除的指针或对象,或者解除了的全局对象未将其置为nil。
    同样的操作在xp上有错但在win2000上没错,是由于win2000使用了更稳定和厚实的内存管理方法。
      

  7.   

    请教sxqwhxq(步青云) ,我的程序中未用到指针,也没全局对象,我就是在STRINGGRID 中使用了嵌套combobox的下拉框,当选中下拉框后,把内容传到Stringgrid 中去,此方法是在此论坛上找到代码的,http://search.csdn.net/Expert/topic/1577/1577126.xml?temp=.5289118
     fscyber(无知无识) 的代码,是否有错
      

  8.   

    如何在Delphi 的StringGrid 控件的 cell 中添加进别的控件
      
    经过我多方查找,终找到一个比较好的例子,和大家一同分享:
    =========================================================
    StringGrid.dpr:
    program StringGrid;uses
      Forms,
      frmMain in 'frmMain.pas' {Form1};{$R *.RES}begin
      Application.Initialize;
      Application.CreateForm(TForm1, Form1);
      Application.Run;
    end.
    ===================================================================
    StringGrid.dpr
    program StringGrid;uses
      Forms,
      frmMain in 'frmMain.pas' {Form1};{$R *.RES}begin
      Application.Initialize;
      Application.CreateForm(TForm1, Form1);
      Application.Run;
    end.
    =========================================================================
    frmMain.dfm
    object Form1: TForm1
      Left = 189
      Top = 108
      Width = 430
      Height = 390
      Caption = 'Example: TStringGrid advanced using'
      Color = clBtnFace
      Font.Charset = DEFAULT_CHARSET
      Font.Color = clWindowText
      Font.Height = -11
      Font.Name = 'MS Sans Serif'
      Font.Style = []
      OldCreateOrder = False
      OnCreate = FormCreate
      PixelsPerInch = 96
      TextHeight = 13
      object StringGrid1: TStringGrid
        Left = 8
        Top = 8
        Width = 405
        Height = 201
        ColCount = 2
        DefaultColWidth = 200
        DefaultRowHeight = 21
        RowCount = 9
        TabOrder = 0
        OnDrawCell = StringGrid1DrawCell
        OnSelectCell = StringGrid1SelectCell
        RowHeights = (
          21
          21
          21
          21
          21
          21
          21
          21
          21)
      end
      object cbInplaceComboBox: TComboBox
        Left = 216
        Top = 32
        Width = 145
        Height = 21
        Style = csDropDownList
        ItemHeight = 13
        TabOrder = 1
        OnChange = cbInplaceComboBoxChange
        Items.Strings = (
          '1 value '
          '2 value '
          '3 value '
          '4 value'
          '5 value'
          '6 value'
          '7 value '
          '8 value'
          '9 value')
      end
      object Button1: TButton
        Left = 320
        Top = 333
        Width = 91
        Height = 25
        Caption = '&Close'
        Default = True
        TabOrder = 2
        OnClick = Button1Click
      end
      object MemoDescription: TMemo
        Left = 7
        Top = 216
        Width = 406
        Height = 105
        Font.Charset = DEFAULT_CHARSET
        Font.Color = clNavy
        Font.Height = -11
        Font.Name = 'MS Sans Serif'
        Font.Style = [fsBold]
        Lines.Strings = (
          'In this sample I shows how you can:'
          ''
          '1. change the inplace editor for second column '
          '  from standard inplace editor to user TComboBox component'
          ''
          '  view the next procedures:'
          '      - TfrmMain.FormCreate'
          '      - TfrmMain.CMDialogKey'
          '      - TfrmMain.cbInplaceComboBoxChange'
          '      - TfrmMain.StringGrid1SelectCell'
          ''
          '2. draw the cell values with different fonts'
          ''
          '  view the next procedure:'
          '      - TfrmMain.StringGrid1DrawCell'
          '  '
          '3. change alignment for cells'
          '    '
          '  view the next procedure:'
          '      - TfrmMain.StringGrid1DrawCell')
        ParentFont = False
        ScrollBars = ssVertical
        TabOrder = 3
      end
    end
    ========================================================================
    frmMain.pas
    unit frmMain;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls, Grids;type
      TForm1 = class(TForm)
        StringGrid1: TStringGrid;
        cbInplaceComboBox: TComboBox;
        Button1: TButton;
        MemoDescription: TMemo;
        procedure FormCreate(Sender: TObject);
        procedure cbInplaceComboBoxChange(Sender: TObject);
        procedure StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer;
          var CanSelect: Boolean);
        procedure StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
          Rect: TRect; State: TGridDrawState);
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
        procedure CMDialogKey(var msg: TCMDialogKey); message CM_DIALOGKEY;
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.DFM}procedure TForm1.FormCreate(Sender: TObject);
    var
      i:integer;
    begin
      StringGrid1.DefaultRowHeight:=cbInplaceComboBox.Height;
      cbInplaceComboBox.Visible:=False;
      StringGrid1.Cells[0,0]:='Row No';
      StringGrid1.Cells[1,0]:='Values(from combobox)';
      for i:=1 to StringGrid1.RowCount-1 do
        StringGrid1.Cells[0,i]:=IntToStr(i);
    end;procedure TForm1.CMDialogKey(var msg:TCMDialogKey);
    begin
      if (ActiveControl = cbInplaceComboBox) then
        begin
          if (msg.CharCode = VK_TAB) then
          begin
            //set focus back to the grid and pass the tab key to it
            cbInplaceComboBox.SetFocus;
            cbInplaceComboBox.Perform(WM_KEYDOWN, msg.CharCode, msg.KeyData);
            // swallow this message
            msg.result := 1;
            Exit;
          end;
      end;  inherited;
    end;procedure TForm1.cbInplaceComboBoxChange(Sender: TObject);
    var
      intRow:integer;
    begin
      inherited;   {Get the ComboBox selection and place in the grid} 
      with cbInplaceComboBox do 
      begin 
        intRow := StringGrid1.Row; 
        if (StringGrid1.Col = 2) then
          StringGrid1.Cells[2, intRow] := Items[ItemIndex]
        else
          StringGrid1.Cells[StringGrid1.Col, intRow] := Items[ItemIndex];
        Visible := False;
      end; 
      StringGrid1.SetFocus; 
    end;procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol,
      ARow: Integer; var CanSelect: Boolean);
    var
      R:TRect;
    begin
      if ((ACol = 1) and (ARow <> 0)) then
      begin 
        {Size and position the combo box to fit the cell} 
        R := StringGrid1.CellRect(ACol, ARow); 
        R.Left := R.Left + StringGrid1.Left; 
        R.Right := R.Right + StringGrid1.Left; 
        R.Top := R.Top + StringGrid1.Top; 
        R.Bottom := R.Bottom + StringGrid1.Top;     {Show the combobox} 
        with cbInplaceComboBox do 
        begin 
          Left := R.Left + 1; 
          Top := R.Top + 1; 
          Width := (R.Right + 1) - R.Left; 
          Height := (R.Bottom + 1) - R.Top; 
          ItemIndex := Items.IndexOf(StringGrid1.Cells[ACol, ARow]);
          Visible := True;
          SetFocus;
        end;
      end;
      CanSelect := True;end;procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
      Rect: TRect; State: TGridDrawState);
    const
      AlignFlags: array [TAlignment] of Integer =
        (DT_LEFT or DT_VCENTER or DT_WORDBREAK or DT_EXPANDTABS or DT_NOPREFIX,
          DT_RIGHT or DT_VCENTER or DT_WORDBREAK or DT_EXPANDTABS or DT_NOPREFIX,
          DT_CENTER or DT_VCENTER or DT_WORDBREAK or DT_EXPANDTABS or DT_NOPREFIX);
    var s: string;
    begin
      inherited;  with Rect do
        begin
          Left := Left + 2;
          Top := Top + 2;
          Right := Right - 5
        end;  s:= StringGrid1.Cells[ACol, ARow];  if (ARow = 0) and (ACol < StringGrid1.ColCount) then
        begin
          StringGrid1.Canvas.Font.Style := StringGrid1.Canvas.Font.Style + [fsBold];
          StringGrid1.Canvas.Brush.Color := StringGrid1.FixedColor;
          StringGrid1.Canvas.FillRect(Rect);      DrawText(StringGrid1.Canvas.Handle,
                    PChar(s), Length(s),
                    Rect, AlignFlags[taCenter]);
        end
        else
          if (ACol = 0) and (ARow > 0) and (ARow < StringGrid1.RowCount) then
            begin
              StringGrid1.Canvas.FillRect(Rect);
              DrawText(StringGrid1.Canvas.Handle,
                      PChar(s), Length(s),
                      Rect, AlignFlags[taRightJustify]);
            end;
      
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin
      close;
    end;end. 
      

  9.   

    选好COMBOBOX内容,然后就是在STRINGGRID表格中的另一些CELL中写入一些数字,就这样,WHY????