[Delphi] Komponente aus Mainform in anderer Unit nutzen

Stex

Zeta Sagittarii
ID: 54415
L
11 Mai 2006
937
185
Nabend!

Ich habe ein Programm, in dem auf dem Hauptformular mehrere Zeos-Komponenten (ZQuery, ZConnection, ZTable) und eine Datasource-Komponente sitzen.
Nun gibt es einige Funktionen, die ich in verschiedenen Unterprogrammen auch benötige, daher wollte ich sie in eine extra-Unit schreiben. Diese Funktionen müssen allerdings auch auf die Datenbank zugreifen können.

Aus diesem Grund hatte ich versucht, den Funktionen in der extra-Unit einfach die ZQuery aus dem Hauptprogramm zu übergeben, scheiterte jedoch daran, dass er die TZQuery in der Funktionsdeklaration nicht erkannt hat, da die entsprechende Unit (ZDataSet) erst nach implementation eingebunden wird.

Ich möchte die Unit ja nicht an mein Hauptformular binden, sonst würde ich selbiges ja auch noch in meine Funktionsunit einbinden.
Fällt euch eine besser Lösung oder zumindest eine für meine ZQuery-Übergabe ein?

Vielen Dank schonmal im Voraus!
 
Ich habe jetzt versucht, das über eine Klasse zu regeln, allerdings auch mit eher mäßigem Erfolg.

Die Type-Deklaration sieht folgendermaßen aus:
Code:
type
  TAccessRights = array[1..7] of boolean;
  TUserPermissions = class(tMyObj)
    private
      getUserQuery: TZQuery;
      setUserQuery: TZQuery;
    public
      function getAccessRights(const _name: string): TAccessRights;
      function Existsworker(const _name: string): boolean;
      function getWorkerNameByLogon(_name: string): string;
      function getGroupNameByWorker(_name: string): string;
      procedure setOnlineStatus(_status: boolean);
      property UserQuery: TZQuery read getUserQuery write setUserQuery;
    end;
Aufgerufen wird die Funktion aus dem Hauptformular
Code:
var logonname, realname: string;
Users : TUserPermissions;

begin
Users := TUserPermissions.Create;
Users.UserQuery := zquery;
ZConnection1.Connected := true;

  //Windows-Anmeldekennung holen

  logonname := GetWinUsername;

  //Userberechtigungen holen
  
   realname := Users.getWorkerNameByLogon(logonname);
  l_anmeldung_name.caption := 'Angemeldet als: ' + realname + ' (' + logonname + ')';
Die Funktion (Mit irgendeiner SQL-Query)
Code:
function TUserPermissions.getWorkerNameByLogon(_name: string): string;
var workername: string;
begin
   // SELECT m.name FROM mitarbeiter m WHERE m.init = _name
   UserQuery.SQL.Text := 'SELECT * FROM mitarbeiter';
   UserQuery.Open;
   UserQuery.First;

  while not UserQuery.Eof do
  begin
    workername := UserQuery.FieldValues['name'];
    UserQuery.Next;
  end;    // while

  UserQuery.Close;

  result := workername;

end;
Der Fehler taucht dieser Zeile auf: UserQuery.SQL.Text := 'SELECT * FROM mitarbeiter'; - Egal, was ich dort eingebe. Die Abfrage funktioniert in der Datenbank.

Beim Abbruch zeigt er mir eine Funktion aus den Zeos-Komponenten an

Code:
function TZAbstractRODataset.GetSQL: TStrings;
begin
  Result := FSQL;
end;
---------------------------
Benachrichtigung über Debugger-Exception
---------------------------
Im Projekt Verwaltung.exe ist eine Exception der Klasse EAccessViolation aufgetreten. Meldung: 'Zugriffsverletzung bei Adresse 00536038 in Modul 'Verwaltung.exe'. Lesen von Adresse 000001AC'. Prozess wurde angehalten. Mit Einzelne Anweisung oder Start fortsetzen.
Wo kann da der Fehler liegen?



edit: Ok, ich lasse das ganze jetzt über ein Datenmodul laufen, das in beide Units eingebunden wird.
Aber warum ist es nicht möglich, dass man einer Klasse eine Komponente übergibt und dann mit ihr in dieser Klasse weiterarbeitet? Ich bekomme da regelmäßig einen Zugriffsfehler.
 
Zuletzt bearbeitet: