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.
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;
Hat jemand von euch Hinweise und Tipps?
Bis dann ...
MfG
Günter