Komponenten (Combobox) unit-übergreifend ansprechen

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
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

Komponenten (Combobox) unit-übergreifend ansprechen

Beitrag von niederrheiner »

Hallo an Alle,
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
Hier der Code der allgemeinen Procedure zum Füllen einer Combobox

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;
Hier der Code zum Füllen einer speziellen Combobox in einem anderen Formular (nur der Code zum Füllen der Combobox)

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;
Habe ich nun einen grundsätzlichen Gedankenfehler gemacht, oder geht es nicht so wie ich mir das vorstelle?

Villeicht hat jemand von Euch eien Tip oder Hinweis, wie ich das Problem löse, oder besser löse

Bis dann ...
MfG
Günter

Teekeks
Beiträge: 359
Registriert: Mi 27. Mai 2009, 20:54
OS, Lazarus, FPC: OpenSuse11.4 x86 (Lazarus: 0.9.30 FPC 2.4.2)
CPU-Target: x86
Wohnort: Cottbus

Re: Komponenten (Combobox) unit-übergreifend ansprechen

Beitrag von Teekeks »

niederrheiner hat geschrieben:

Code: Alles auswählen

my_package.Tfrm_my_package.combobox_fuellen(sql_rez_erf,aRecCombo,aRecInsert);     // <===============n hier tritt die Fehlermeldung auf
Der Fehler liegt daran dass du die Procedure einer Klasse und nicht einer Variablen aufrufst.
Es sollte also mit

Code: Alles auswählen

my_package.frm_my_package.combobox_fuellen(sql_rez_erf,aRecCombo,aRecInsert);
funktionieren!

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

Re: Komponenten (Combobox) unit-übergreifend ansprechen

Beitrag von niederrheiner »

Danke, der Tipp war es. Jetzt klappt es auch so wie gewünscht.

Bis dann ...

MfG

Günter

Antworten