AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Auf "überliegende" Klasse zugreifen ?

Ein Thema von stiftII · begonnen am 30. Aug 2014 · letzter Beitrag vom 1. Sep 2014
Antwort Antwort
Seite 1 von 2  1 2   
stiftII

Registriert seit: 2. Sep 2009
Ort: Cuxhaven
122 Beiträge
 
#1

Auf "überliegende" Klasse zugreifen ?

  Alt 30. Aug 2014, 18:55
Hallo,
ich weiß nicht ob das überhaupt möglich ist was ich vorhabe, aber ich versuche es mal zu erklären

Ich habe ein Programm mit folgender Struktur.
Delphi-Quellcode:
    TUseFullClass = class
      public
        function DoSomething:boolean;    
    end;

    TMainClass = class
      usefullinfos:string;
      UsefullClass:TUsefullClass;
    end;
   
   
   
   ........
   
   function Tusefullclass.DoSomething:Boolean;
   begin
      //Access TmainClasses "usefullinfos" String ??
   
   end;
Also 2 einfache Klassen, wobei die eine Klasse "TMainClass" die "TUseFullClass" deklariert.

Nun möchte ich wenn TUseFullClass in TMainClass deklariert ist auf Variablen von TMainClass zugreifen mit der Funktion DoSomething von TUseFullClass.

Geht das so überhaupt, oder gibt es eine bessere Möglichkeit das umzusetzen ?

Freue mich auf antworten

Grüße
stiftII
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.533 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Auf "überliegende" Klasse zugreifen ?

  Alt 30. Aug 2014, 19:02
Das ginge schon, aber wenn sich 2 Klassen gegenseitig kennen müssen, hat das immer ein "Geschmäckle". Was genau hast Du denn vor, evtl. könntest Du das über ein Event lösen?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Olli73
Olli73

Registriert seit: 25. Apr 2008
Ort: Neunkirchen
647 Beiträge
 
#3

AW: Auf "überliegende" Klasse zugreifen ?

  Alt 30. Aug 2014, 19:07
Hilft dir das hier weiter?

Delphi-Quellcode:
   
    TMainClass = class;

    TUseFullClass = class
      private
        FMainClass: TMainClass;
      public
        function DoSomething:boolean;    
    end;

    TMainClass = class
      usefullinfos:string;
      UsefullClass:TUsefullClass;
    end;
   
   
   
   ........
   
   function Tusefullclass.DoSomething:Boolean;
   begin
      //Access TmainClasses "usefullinfos" String ??
                FMainClass.UseFullInfos....
   
   end;
Zitat:
Also 2 einfache Klassen, wobei die eine Klasse "TMainClass" die "TUseFullClass" deklariert.
Die "Referenz" muss natürlich in obigem Beispiel dann auf beiden Seiten gesetzt werden.

Beachte aber auch den Kommentar von DaddyH.

Gruß,
Olli

Edit: Klassennamen waren vertauscht!
  Mit Zitat antworten Zitat
stiftII

Registriert seit: 2. Sep 2009
Ort: Cuxhaven
122 Beiträge
 
#4

AW: Auf "überliegende" Klasse zugreifen ?

  Alt 30. Aug 2014, 19:25
Danke für eure Antworten

Olli73: Der Code sieht ja ansich sehr gut aus, bloß leider bekomme ich sofort eine Zugriffsverletzung wenn ich dann auf Die Variablen von TMainClass zugreifen möchte.

Fehler ist: External: SIGSEGV

Mein Programm sieht jetzt so aus:
Delphi-Quellcode:
unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;

  TMainClass = class;

    TUseFulClass = class
      private
        FMainClass: TMainClass;
      public
        function DoSomething:boolean;
    end;

    TMainClass = class
      usefulinfos:string;
      UsefulClass:TUsefulClass;
    end;



var
  Form1: TForm1;
  MainClass:TMainClass;

implementation

{$R *.lfm}

   { TForm1 }

   procedure TForm1.Button1Click(Sender: TObject);
   begin
      MainClass := TMainClass.Create;
      MainClass.usefulinfos:= 'Very useful Infos';
     Mainclass.usefulClass.DoSomething;
   end;

procedure TForm1.FormCreate(Sender: TObject);
begin

end;

   function Tusefulclass.DoSomething:Boolean;
   begin
      //Access TmainClasses "usefulinfos" String ??
      Form1.Caption:= FmainClass.usefulinfos;


   end;


end.
Ich glaube ich muss das irgendwie anders lösen ?

Geändert von stiftII (30. Aug 2014 um 19:37 Uhr) Grund: Im Eifer des Gefächts vergessen die Klasse zu erstellen (Create)
  Mit Zitat antworten Zitat
Benutzerbild von Olli73
Olli73

Registriert seit: 25. Apr 2008
Ort: Neunkirchen
647 Beiträge
 
#5

AW: Auf "überliegende" Klasse zugreifen ?

  Alt 30. Aug 2014, 19:36
Hast du den Code gekürzt oder sieht der wirklich so aus?

Denn darin gibt es keine Konstruktoren und diese werden auch nicht aufgerufen (um die Instanzen/Objekte zu erstellen).

Gruß,
Olli
  Mit Zitat antworten Zitat
stiftII

Registriert seit: 2. Sep 2009
Ort: Cuxhaven
122 Beiträge
 
#6

AW: Auf "überliegende" Klasse zugreifen ?

  Alt 30. Aug 2014, 19:44
Hey
Ja der Code ist stark vereinfacht, beim Originalcode blickt man vermutlich nicht so gut durch.

Ja hatte vergessen .create aufzurufen. Habs aber schon reineditiert

Muss man beim Konstruktor irgendwas beachten, damit auf "FMainClass" von "TUsefullclass" zugegriffen werden kann ?
  Mit Zitat antworten Zitat
Benutzerbild von Olli73
Olli73

Registriert seit: 25. Apr 2008
Ort: Neunkirchen
647 Beiträge
 
#7

AW: Auf "überliegende" Klasse zugreifen ?

  Alt 30. Aug 2014, 19:50
Ohne genau zu wissen, was du vorhast, kann dir keiner Tipps geben, wie du das sauber aufbauen kannst.

Aber grundsätzlich:

Du musst beide Objekte erstellen (create) und die Werte für FMainClass und UseFullClass entsprechend zuweisen (die müssen auf das jeweils andere Objekt, das du erstellst, zeigen).

Gruß,
Olli
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#8

AW: Auf "überliegende" Klasse zugreifen ?

  Alt 30. Aug 2014, 19:50
Nee, mach das nicht. Wenn A eine Eigenschaft von B ist, soll A keine Kenntnis von B haben. Wenn man so anfängt, sollte man es gleich sein lassen. denn 'A' könnte ja auch mal eine Eigenschaft von C sein, was aber nun nicht mehr wegen der Abhängigkeit zu B geht. Nee, nee.

Wenn die sich was zu sagen haben, dann soll 'A' ein Event bereitstellen, an das B sich hängen kann.
Und wenn 'A' etwas wissen muss, was auch 'B' weiß, dann soll 'B' das 'A' gefälligst mitgeben, z.B. so

Delphi-Quellcode:
Type
  TClassA = Class
  private
    fInfo : TInfo;
  public
    constructor Create (info : TInfo);
  end;

  TClassB = Class
  private
    FA: TClassA;
    FInfo : TInfo;
  public
    Constructor Create;
  end;

Constructor TClassB.Create;
Begin
   Finfo := TInfo.Create;
   FA := TClassA.Create(FInfo);
End;
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.533 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: Auf "überliegende" Klasse zugreifen ?

  Alt 30. Aug 2014, 20:01
Habbich doch gesacht, nur kürzer
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
stiftII

Registriert seit: 2. Sep 2009
Ort: Cuxhaven
122 Beiträge
 
#10

AW: Auf "überliegende" Klasse zugreifen ?

  Alt 30. Aug 2014, 20:03
Danke nochmal.

Zitat:
Ohne genau zu wissen, was du vorhast, kann dir keiner Tipps geben, wie du das sauber aufbauen kannst.
Okay dann versuch ichs mal zu erklären . Es soll ein Programm werden welches Pokertische verwaltet. Und es arbeitet mit einer Hauptklasse die 3 Threads aufruft.. So in Etwa:

Delphi-Quellcode:
    TMainClass = class
      ID:integer;
      UsefulThreadA:TUsefulThreadA;
      UsefulThreadB:TUsefulThreadB;
      UsefulThreadC:TUsefulThreadC;
      protected
        constructor Create;
    end;
Nun findet UsefulThreadA eine ID heraus und soll sie TMainClass übergeben. Sobald die Information zur Verfügung steht starten UsefulThreadB und UsefulThread C.

Also müssen UsefulThreadB und C wissen, was in TMainClass(.id) steht.

Zitat:
Wenn die sich was zu sagen haben, dann soll 'A' ein Event bereitstellen, an das B sich hängen kann.
Und wenn 'A' etwas wissen muss, was auch 'B' weiß, dann soll 'B' das 'A' gefälligst mitgeben, z.B. so
Das sieht echt super aus, ich glaube ich schreibe das ganze Programm etwas um und mache es dann so, dass ich die ID vorher hole und dann UsefulThreadB und UseFulThreadC im Constructor bei TMainClass mit übergebe.

Wobei ich glaube das das auch nicht optimal ist, da ich dann UsefulThreadA extern von meiner TMainClass hätte. Aber so würde es natürlich funktionieren.

Danke für eure Eingebungen

Geändert von stiftII (30. Aug 2014 um 20:05 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:13 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz