AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign Zugriff auf gemeinsame Eigenschaft in unterschiedlichen Klassen

Zugriff auf gemeinsame Eigenschaft in unterschiedlichen Klassen

Ein Thema von norwegen60 · begonnen am 6. Nov 2018 · letzter Beitrag vom 11. Nov 2018
Antwort Antwort
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.356 Beiträge
 
Delphi 11 Alexandria
 
#1

AW: Zugriff auf gemeinsame Eigenschaft in unterschiedlichen Klassen

  Alt 6. Nov 2018, 14:08
Du solltest Deine Listen auch von TBase ableiten und die eigentliche Liste dort nur intern benutzen.
TBaseList wäre dann ein Wrapper um eine normale Liste.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
norwegen60

Registriert seit: 23. Dez 2007
Ort: Schwarzwald
526 Beiträge
 
Delphi 12 Athens
 
#2

AW: Zugriff auf gemeinsame Eigenschaft in unterschiedlichen Klassen

  Alt 6. Nov 2018, 14:33
Hallo Stahli,

daran habe ich auch schon gedacht. Wie kann ich dann aber beim Hochblättern feststellen ob ich in TMessData1List oder TMessData2List bin. Typabfrage funktioniert dann ja nicht mehr. Oder funktioniert ein Konstrukt wie
Delphi-Quellcode:
TBaseList = class(TObjectList<TBase>)
  privat
    FParentObject: TObject;
  public
    property ParentObject: TObject read FParentObject write FParentObject;
  end;

TMessData1List = class(TBaseList)
  privat
  public
  end;
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.277 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Zugriff auf gemeinsame Eigenschaft in unterschiedlichen Klassen

  Alt 6. Nov 2018, 14:36
Benutz Interfaces
Heiko
  Mit Zitat antworten Zitat
norwegen60

Registriert seit: 23. Dez 2007
Ort: Schwarzwald
526 Beiträge
 
Delphi 12 Athens
 
#4

AW: Zugriff auf gemeinsame Eigenschaft in unterschiedlichen Klassen

  Alt 6. Nov 2018, 14:40
Benutz Interfaces
Mit denen habe ich mich noch nie abgegeben. Könntest du anzeigen, wie das geht. Meine Bedenken sind bei so was, dass es zuerst ganz einfach aussieht und man dann feststellt, dass man vieles beachten muss, was man noch nicht weiß. Ich bin ziemlich unter Zeitdruck
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.356 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Zugriff auf gemeinsame Eigenschaft in unterschiedlichen Klassen

  Alt 6. Nov 2018, 15:23
Interfaces bringen jetzt an der Stelle nicht wirklich viel.

Ich würde auch grundsätzlich zu Interfaces raten, aber man muss sich erst damit befassen. Die Klassen muss man dann aber auch differenziert ausgestalten.

Ich würde es so machen:

Delphi-Quellcode:
  TBase = class
   private
     FNr: Integer;
     FParentObject: TObject;
   public
     property Nr: Integer read FNr write FNr;
     property ParentObject: TObject read FParentObject write FParentObject;
   end;
   
   TMessData1List = class(TBase)
   private
     fItems: (TObjectList<TMessData1>);
     function get_Item(const Index: Integer): TMessData1;
     procedure set_Item(const Index: Integer; Value: TMessData1);
   public
     procedure Add(Item: TMessData1);
     procedure Delete(Item: TMessData1); overload;
     procedure Delete(Index: Integer); overload; // alle Methoden, die für die Liste gebraucht werden
   protected
   public
     property Items[const Index: Integer]: TMessData1 read get_Item write set_Item; // weiß nicht, ob die Syntax so richtig ist
   end;
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
norwegen60

Registriert seit: 23. Dez 2007
Ort: Schwarzwald
526 Beiträge
 
Delphi 12 Athens
 
#6

AW: Zugriff auf gemeinsame Eigenschaft in unterschiedlichen Klassen

  Alt 6. Nov 2018, 15:48
Hallo Stahli,

ja, das sieht gut aus. Bedeutet aber auch einiges an Umstellarbeit. Die würde ich gerne verschieben. Deshalb die Frage ob mein Ansatz funktioniert?
Delphi-Quellcode:
TBaseList = class(TObjectList<TBase>)
  privat
    FParentObject: TObject;
  public
    property ParentObject: TObject read FParentObject write FParentObject;
  end;

TMessData1List = class(TBaseList)
  privat
  public
  end;
Oder habe ich da ein Gedankenfehler?

Danke
Gerd
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.356 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Zugriff auf gemeinsame Eigenschaft in unterschiedlichen Klassen

  Alt 6. Nov 2018, 16:26
Jetzt ohne Delphi kann ich gar nicht sagen, ob das compiliert (ich würde vermuten, dass nicht).
Wenn es compiliert müsstest Du immer prüfen, von welcher Klasse das jeweilige ParentObjekt ist. Du musst also immer mit is und as casten.


Mein Ansatz ist nicht so aufwendig, wie man zunächst vermuten würde.
Du musst nur eine neu benötigte Listenmethode neu implementieren, wenn Du sie erstmalig brauchst. So schlimm ist das nicht.

Außerdem könntest Du auch Dein Parent als ParentObject als TBase verwalten.

FParentObject: TTBase; Dann kannst Du immer weiter die Parents durchlaufen und musst nicht unterscheiden, was das für ein tatsächliches Objekt ist. Es muss immer nur von TBase abgeleitet sein.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
norwegen60

Registriert seit: 23. Dez 2007
Ort: Schwarzwald
526 Beiträge
 
Delphi 12 Athens
 
#8

AW: Zugriff auf gemeinsame Eigenschaft in unterschiedlichen Klassen

  Alt 9. Nov 2018, 19:02
Ich würde es so machen:

Delphi-Quellcode:
  TBase = class
   private
     FNr: Integer;
     FParentObject: TObject;
   public
     property Nr: Integer read FNr write FNr;
     property ParentObject: TObject read FParentObject write FParentObject;
   end;
   
   TMessData1List = class(TBase)
   private
     fItems: (TObjectList<TMessData1>);
     function get_Item(const Index: Integer): TMessData1;
     procedure set_Item(const Index: Integer; Value: TMessData1);
   public
     procedure Add(Item: TMessData1);
     procedure Delete(Item: TMessData1); overload;
     procedure Delete(Index: Integer); overload; // alle Methoden, die für die Liste gebraucht werden
   protected
   public
     property Items[const Index: Integer]: TMessData1 read get_Item write set_Item; // weiß nicht, ob die Syntax so richtig ist
   end;
Jetzt wollte ich das mal ausprobieren und beim Durchspielen stellte ich fest, dass entweder du oder ich einen Gedankenfehler haben.
Problem: Wenn ich auf einem der Einträge MessData1 stehe muss ich ja wieder zuerst durch die Liste um zu wissen zu wem die Liste gehört. Jetzt könnte ich natürlich MessData1 als ParentObject TMessData1List zuordnen, aber wie schon gesagt, kann es auch sein dass ich nicht eine Class finden will sondern eine darüber liegende Liste.

Oder sehe ich was nicht?

Grüße
Gerd
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.356 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: Zugriff auf gemeinsame Eigenschaft in unterschiedlichen Klassen

  Alt 10. Nov 2018, 11:27
Wenn ich auf einem der Einträge MessData1 stehe muss ich ja wieder zuerst durch die Liste um zu wissen zu wem die Liste gehört. Jetzt könnte ich natürlich MessData1 als ParentObject TMessData1List zuordnen, aber wie schon gesagt, kann es auch sein dass ich nicht eine Class finden will sondern eine darüber liegende Liste.
Ich sehe da jetzt nicht das Problem.
Du könntest in der Basisklasse eine Suchfunktion, die dann nach oben iteriert:

Delphi-Quellcode:
TBase = class
private
  FNr: Integer;
  FParentObject: TBase;
public
  function FoundParentClass(aClassName: String): TBase;
  function FoundParentItem(aItem: TBase): Boolen;
  property Nr: Integer read FNr write FNr;
  property ParentObject: TBase read FParentObject write FParentObject;
end;


function TBase.FoundParentClass(aClassName: String): TBase;
begin
  Result := nil;
  if Assigned(ParentObject) then
  begin
    if (ParentObject.ClassName = aClassName) then
      Exit(ParentObject);
    Result := ParentObject.FoundParentClass(aClassName);
  end;
end;

function TBase.FoundParentItem(aItem: TBase): Boolen;
begin
  Result := False;
  if Assigned(ParentObject) then
  begin
    if (ParentObject = aItem) then
      Exit(True);
    Result := ParentObject.FoundParentItem(aItem);
  end;
end;
So kannst Du dich von einer beliebigen Stelle aus weiter nach oben hangeln.
Ob die Listeneinträge die Liste als ihren Parent sehen sollen, musst Du abhängig von der Programmlogik entscheiden.

Auch dieses Konstrukt hat einen großen Nachteil. Was vorher so aussah
[DELPHI] lBaseSample := TBaseSample(FSamplingList[i]);
Das ist aber auch nicht mein Vorschlag.


Kannst Du mal ein Unit hochladen, in der diese Klassen vollständig enthalten sind?
Es bräuchte ja keine GUI vorhanden sein - nur eine kompilierbare Unit. Dann könnte man (ich?) die mal entsprechend umbauen.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
norwegen60

Registriert seit: 23. Dez 2007
Ort: Schwarzwald
526 Beiträge
 
Delphi 12 Athens
 
#10

AW: Zugriff auf gemeinsame Eigenschaft in unterschiedlichen Klassen

  Alt 9. Nov 2018, 19:39
Delphi-Quellcode:
TBaseList = class(TObjectList<TBase>)
  privat
    FParentObject: TObject;
  public
    property ParentObject: TObject read FParentObject write FParentObject;
  end;

TMessData1List = class(TBaseList)
  privat
  public
  end;
Auch dieses Konstrukt hat einen großen Nachteil. Was vorher so aussah
Delphi-Quellcode:
var
  lBaseSample: TBaseSample;
begin
  Result := false;
  for lBaseSample in FSamplingList do
    if (lBaseSample.StatusSample <> assFilled) and (lBaseSample.StatusSample <> assProcessed) then
      exit;
  Result := true;
end;
sieht jetzt so aus:
Delphi-Quellcode:
var
  i: Integer;
  lBaseSample: TBaseSample;

begin
  Result := true;
  for i := 0 to Pred(FSamplingList.count) do
  begin
    lBaseSample := TBaseSample(FSamplingList[i]);
    if (lBaseSample.StatusSample <> assFilled) and (lBaseSample.StatusSample <> assProcessed) then
      exit;
  end;
  Result := true;
end;
Was mich am meisten daran stört ist dass ich jetzt überall ein Typwandlung lBaseSample := TBaseSample(FSamplingList[i]); statt lBaseSample := FSamplingList[i]; machen muss.

Jetzt wäre ich doch froh, wenn mir noch mal einer einen Tipp geben könnte

Grüße
Gerd
  Mit Zitat antworten Zitat
Antwort Antwort

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 23:04 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz