Access violation

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
niederrheiner
Beiträge: 87
Registriert: Sa 19. Jan 2008, 17:21
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Rheinberg

Access violation

Beitrag von niederrheiner »

Hallo an Alle,
nach dem ich ein lauffähiges Programm "optimiert" habe, tritt beim Zugriff auf Arrays der Fehler Access Violation auf. Die "Optimierung" bestand darin, das ich das Füllen von Comboboxen über eine, für alle Comboboxen gültige, Procedure realisiert habe. Das Füllen der Comboboxen klappt auch. Nur wenn ich ein Element in einer Combobox ausgewählt habe und ich auf den Text und die ID zugreifen möchte, tritt dieser Fehler auf.

Hier nun der relevante Code:
externe Unit myfunc:

Code: Alles auswählen

unit myfunc;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
  Grids, ZDataset;
 
type
  TMyRecord = record
    id      :integer;
    name    :string;
  end;
TMyArr_Rec = array of TMyRecord;
type TMyRecord_cb = record
  sql_query       :TZQuery;
  sql_text        :string;
  cb_combo        :TComboBox;
  cb_arr          :TMyArr_Rec;
end;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    ComboBox1: TComboBox;
    StringGrid1: TStringGrid;
    ZQuery1: TZQuery;
  private
    { private declarations }
  public
    { public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.lfm}
 
end.
 
 


das eigentliche Programm:

Code: Alles auswählen

unit rez_verwaltung;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, db, FileUtil, Forms, Controls, Graphics, Dialogs, ComCtrls,
  StdCtrls, Menus, DbCtrls, Grids, ZConnection, ZDataset,quellen,myfunc;
 
 
type
  TMyRecord1 = record
            tabelle      :string;
            id_feld      :string;
            feld1        :string;
            sort_feld    :string;
            ar_arr       :TMyRecord;
  end;
 
  TRecordArr = array of TMyRecord;
  { Tfrm_main }
 
  Tfrm_main = class(TForm)
...
    cb_quellen: TComboBox;
    cb_mengeneinheit: TComboBox;
    cb_kategorie: TComboBox;
...
    procedure btn_rez_saveClick(Sender: TObject);
    procedure FormShow(Sender: TObject);
...     
 
 
  private
    { private declarations }
     procedure cb_fuellen(cb_rec :TMyRecord_cb);
    procedure cb_mengeneinheit_fuellen(cb_rec :TMyRecord_cb);
    procedure cb_quellen_fuellen(cb_rec :TMyRecord_cb);
    procedure cb_kategorien_fuellen(cb_rec :TMyRecord_cb);
    procedure grid_fuellen(grid_rec : TMyRec_stg);         
 
var
  frm_main                         :Tfrm_main;
  st_rec                           :TRecStamm;
  ar_quelle                        :TRecordArr;
  ar_kat                           :TRecordArr;
  ar_einheit                       :TRecordArr;
  rec_cb_upd                       :TMyRecord1;
  sttTest                          :TMyRecord;
  cb_rec                           :TMyRecord_cb;
  grid_rec                         :TMyRec_stg;
 
implementation
 
{$R *.lfm}
 
{ Tfrm_main }
 
...
 
procedure Tfrm_main.FormShow(Sender: TObject);
var
  AString                       :string;
  AInteger                      :integer;
  irow                          :integer;
 
begin
  btn_rez_neuClick(Sender);
 
  // Füllen der Quellen-Combobox
  cb_quellen_fuellen(cb_rec);
 
 
  // Füllen Kategorie-Combobox
  cb_kategorien_fuellen(cb_rec);
 
 
  // Füllen der Mengeneinheit-Combobox
  cb_mengeneinheit_fuellen(cb_rec);
 
...
 
end
 
procedure Tfrm_main.cb_kategorien_fuellen(cb_rec :TMyRecord_cb);
var
  sql     :string;
begin
  sql:='select kat_id, kat_name from tbl_kategorie where kat_id <> 0 order by kat_name ASC';
  cb_rec.sql_text := sql;
  cb_rec.cb_combo := cb_kategorie;
  cb_rec.sql_query := ZQuery1;
  cb_rec.cb_arr    := ar_kat;
 
  cb_fuellen(cb_rec);
end;               
 
procedure Tfrm_main.cb_fuellen(cb_rec :TMyRecord_cb);
var
 
  i_anz     :integer;
  i         :integer;
begin
  // Füllen einer Combobox
  cb_rec.sql_query.sql.clear;
  cb_rec.sql_query.sql.text := cb_rec.sql_text;
  cb_rec.sql_query.Active:=true;
  cb_rec.sql_query.Open;
  cb_rec.sql_query.First;
  cb_rec.cb_combo.Clear;
 
  i_anz := cb_rec.sql_query.RecordCount;
  setlength(cb_rec.cb_arr, i_anz);
 
  for i:= 0 to i_anz - 1 do
  begin
       cb_rec.cb_arr[i].ID              :=cb_rec.sql_query.Fields[0].AsInteger; // This should be your primary key
       cb_rec.cb_arr[i].name            :=cb_rec.sql_query.Fields[1].AsString// The value you want to display
       cb_rec.sql_query.Next;
  end;
 
  for i:= 0 to High(cb_rec.cb_arr) do
   begin
        cb_rec.cb_combo.Items.Add(cb_rec.cb_arr[i].name);
   end;
 
  cb_rec.sql_query.Close;
end;


Kann es sein, das die Arrays, die "hinter" den Comboboxen stehen, nicht mehr existieren oder leer sind? Ich vermute, das der Fehler in dieser Richtung liegt. Weiss aber nicht wie ich ihn beseitigen kann.

Hat jemand von euch Hinweise und Tipps?

Bis dann ...
MfG
Günter

Antworten