ich habe ein Projekt mit mehreren Formularen. In fast allen Formularen benötige ich die Combobox. Da das befüllen der Combobox immer gleich abläuft, wollte ich mir eine allgemeingültige Procedure/Funktion schreiben, die nach Übergabe der entsprechenden Parameter die Combobox in dem entsprechenden Formular füllt. Wenn ich nun den Namen der Combox übergebe bekomme ich einen Fehler
Code: Alles auswählen
ernaehr_rez_erf.pas(117,80) Error: Only class methods can be referred with class references
Code: Alles auswählen
UNIT my_package;
{$mode objfpc}{$H+}
INTERFACE
USES
Classes, sqldb, StdCtrls, Sysutils, Fileutil, Lresources, Forms, Controls,
Graphics, Dialogs;
TYPE
TMyrec_Combo = Record
ID : integer;
Name : string;
end;
TMyrec_insert = record
tabelle : string;
aFeld : array of string;
combo : TCombobox;
END;
TMyrec_RezKat = Record
ID : integer;
Name : string;
cb_name : Tcombobox;
end;
TRec_Rec_Combo_arr = array of TMyrec_Combo;
TRec_Rec_kat_Arr = array of TMyrec_RezKat;
{ Tfrm_my_package }
Tfrm_my_package = CLASS(Tform)
Combobox1: Tcombobox;
Sqlquery1: Tsqlquery;
procedure combobox_fuellen(sqlf :TSQLQuery; aArr : TRec_Rec_Combo_arr; aIns : TMyrec_insert);
PRIVATE
{ PRIVATE Declarations }
aRezKat : TRec_Rec_kat_Arr;
PUBLIC
{ PUBLIC Declarations }
End;
VAR
frm_my_package : Tfrm_my_package;
aRecCombo : TRec_Rec_Combo_arr;
aRecInsert : TMyrec_insert;
combo_params : TMyRec_combo_params;
IMPLEMENTATION
PROCEDURE Tfrm_my_package.combobox_fuellen(Sqlf: Tsqlquery;
aArr: Trec_rec_combo_arr; aIns: Tmyrec_insert);
var
iRecAnz : integer;
i : integer;
txt_sql : string;
begin
// Füllen einer Combobox
sqlf.SQL.Clear;
txt_sql := 'SELECT ' + aIns.aFeld[0] + ', ' + aIns.aFeld[1] + ' FROM ' + aIns.tabelle + ';';
sqlf.sql.Text:= txt_sql;
sqlf.Open;
iRecAnz := sqlf.RecordCount;
// löschen einer Combobox
aIns.combo.Items.Clear;
setlength(aRezKat, iRecAnz);
i := 0;
while not sqlf.EOF do begin
aRezKat[i].ID:=sqlf.FieldByName(aIns.aFeld[0]).AsInteger;
aRezKat[i].Name:=sqlf.FieldByName(aIns.aFeld[1]).AsString;
aIns.combo.Items.AddObject(sqlf.FieldByName(aIns.aFeld[1]).AsString, TObject(sqlf.FieldByName(aIns.aFeld[0]).AsInteger));
sqlf.Next;
i := i + 1;
END;
sqlf.Close;
END;
Code: Alles auswählen
UNIT ernaehr_rez_erf;
{$mode objfpc}{$H+}
INTERFACE
USES
Classes, ComCtrls, Grids, mysql50conn, sqldb, StdCtrls, Sysutils, Fileutil,
Lresources, Forms, Controls, Graphics, Dialogs, ernaehr_kategorie, ernaehr_lebensmittel, ernaehr_rezeptquellen,my_package;
TYPE
{ Tfrm_rez_erf }
Tfrm_rez_erf = CLASS(Tform)
...
cb_rez_erf_kat: TComboBox;
SQLQuery_rez_erf: TSQLQuery;
PROCEDURE Cb_rez_erf_katdblclick(Sender: Tobject);
...
PROCEDURE Formshow(Sender: Tobject);
...
procedure combobox_fuellen(sqlf :TSQLQuery; aArr : TRec_Rec_Combo_arr; aIns : TMyrec_insert);
PRIVATE
{ PRIVATE Declarations }
...
iCol : integer;
iRow : integer;
procedure kategorie_fuellen();
PUBLIC
{ PUBLIC Declarations }
sql_rez_erf : Tsqlquery;
END;
VAR
frm_rez_erf: Tfrm_rez_erf;
IMPLEMENTATION
Procedure Tfrm_rez_erf.kategorie_fuellen();
var
txt_sql : string;
begin
// Füllen der Combobox cb_rez_erf_kat
aRecInsert.tabelle:='tblKategorie';
setlength(aRecInsert.aFeld, 2);
aRecInsert.aFeld[0]:='katID';
aRecInsert.aFeld[1]:='katName';
aRecInsert.combo:= frm_rez_erf.cb_rez_erf_kat;
my_package.Tfrm_my_package.combobox_fuellen(sql_rez_erf,aRecCombo,aRecInsert); // <===============n hier tritt die Fehlermeldung auf
END;
Villeicht hat jemand von Euch eien Tip oder Hinweis, wie ich das Problem löse, oder besser löse
Bis dann ...
MfG
Günter