Einzelnen Beitrag anzeigen

Perlsau
(Gast)

n/a Beiträge
 
#3

AW: Record-Variable in Klasseninstanz setzen

  Alt 9. Dez 2012, 12:42
Funktioniert es denn, wenn Du von Nested Types auf "normale" umsteigst? Wobei mir übrigens der Sinn so einer Klasse nicht ganz klar ist.
Keine Ahnung, was Nested Types bedeutet ... aber ich hab gleich mal nachgeschlagen und festgestellt, daß man darunter die Erstellung einer Klasse in einer Klasse (Nest) versteht. Also müßte ich den Record nicht innerhalb des anderen Types deklarieren:

Delphi-Quellcode:
unit Main_Zugriff;

INTERFACE

USES
  Vcl.Forms, System.Classes, System.SysUtils, JvRichEdit, JvDBRichEdit;

TYPE
    TTab_User = RECORD
                    Titel_Index : Integer;
                    Titel_SortIndex : Integer;
                    Titel_SortOrder : Boolean;
                    Titel_SortText : String;
                END;

  TMain_Zugriff = CLASS

  PRIVATE

  PUBLIC
      User_Tab : TTab_User;
      Titel_Index : Integer;
Das ändert jedoch nichts, es erscheint derselbe Fehler. Nun habe ich der Klasse TMain_Zugriff eine weitere Procedure beigefügt, die User_Tab.Titel_Index ändern soll:
Delphi-Quellcode:
procedure TMain_Zugriff.Set_Titel_Index(Idx: Integer);
begin
     User_Tab.Titel_Index := Idx;
     Set_StatusBar(4,IntToStr(User_Tab.Titel_Index));
end;
Rufe ich diese Procedure von Create aus auf, dann funktioniert sie:
Delphi-Quellcode:
constructor TMain_Zugriff.Create;
begin
     Set_Titel_Index(11111);
end;
Rufe ich sie jedoch von Aset_TitelAfterScroll (DatMod) aus auf, verweigert sie den Dienst:
Delphi-Quellcode:
procedure TDatMod.Aset_TitelAfterScroll(DataSet: TDataSet);
VAR
   Idx_Titel : Integer;
begin
     ...
     MainZu.Set_Titel_Index(Idx_Titel);
end;
Die anderen Proceduren wie z.B. Set_StatusBar funktionieren aber von Aset_TitelAfterScroll aus ... aber die ändern auch keine Variablen der eigenen Klasse, sondern die einer anderen Klasse (TFormMain).

Der Sinn dieser Klasse besteht darin (oder soll darin bestehen), nicht vom Datenmodul aus die Mainform referenzieren zu müssen, wenn Ereignisse im Datenmodul Veränderungen in der Mainform erfordern. Doch warum eigentlich nicht, die Mainform referenziert ja das Datenmodul nicht, das läuft alles über die Unit MainTools. Deshalb hab ich das jetzt so gemacht:

In der Unit UnitData (Form DatMod) hab ich als ersten Type meine Record-Deklaration platziert. Im Public-Teil von DatMod steht jetzt die Variablen-Deklaration des Records. So gibt's keine Zugriffsverletzung mehr ... Ob das die endgültige Lösung ist, wird sich zeigen.

Aber ich glaube, daß ich sowieso irgendwie auf dem Holzweg bin mit meiner Vorstellung über die Trennung von GUI und Methoden ... Vielleicht sollte ich mal SirRufo fragen, wie eine Kapselung für Datenbank-Komponenten aussehen muß ... immerhin propagiert er die ja des öfteren mal ...
  Mit Zitat antworten Zitat