AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TObjektList mit 2 oder mehr TObjekte

Ein Thema von alfold · begonnen am 30. Dez 2018 · letzter Beitrag vom 1. Jan 2019
Antwort Antwort
Benutzerbild von scrat1979
scrat1979

Registriert seit: 12. Jan 2007
Ort: Sulzbach a.d. Murr
1.029 Beiträge
 
Delphi 10.4 Sydney
 
#1

AW: TObjektList mit 2 oder mehr TObjekte

  Alt 31. Dez 2018, 01:12
Zum erkennen wieviele Objekte vom jeweiligen Typ vorhanden sind könntest du folgendes machen (Code inkomplett aber die Vorgehensweise sollte klar sein):

Delphi-Quellcode:
for i:=0 to Count-1 do
 If Items[i] is TSoundRow then...
Michael Kübler
  Mit Zitat antworten Zitat
hoika

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

AW: TObjektList mit 2 oder mehr TObjekte

  Alt 31. Dez 2018, 05:43
Hallo,
warum soll es ein Speicher-Problem geben?
Du schreibst den Speichern-Code ja auch, oder?
Heiko
  Mit Zitat antworten Zitat
alfold

Registriert seit: 29. Jun 2010
Ort: Neustrelitz
393 Beiträge
 
Delphi 7 Enterprise
 
#3

AW: TObjektList mit 2 oder mehr TObjekte

  Alt 31. Dez 2018, 09:21
Zum erkennen wieviele Objekte vom jeweiligen Typ vorhanden sind könntest du folgendes machen (Code inkomplett aber die Vorgehensweise sollte klar sein):

Delphi-Quellcode:
for i:=0 to Count-1 do
 If Items[i] is TSoundRow then...
Hab ich schon gemacht. Damit erhalte ich die Anzahl SoundsRow und SoundCol aber nicht den jeweiligen itemindex so wie man ihn brauch (aus einem Array, oder Liste).
Hallo,
warum soll es ein Speicher-Problem geben?
Du schreibst den Speichern-Code ja auch, oder?
Zitat von alfold:
Wird hoffentlich kein Problem dann beim Speichern ???.
Mh, bei 2 Objektlisten! Irgendwann sollen die Daten ja gespeichert werden.
Stell ich mir sehr komplex vor dies in eine Datei zu Speichern.

Wie gesagt hab ich noch nie gemacht, bis dato.

Totzdem Danke an alle,
hab jetzt noch ein 2 property hinzugefügt als itemindex.
Hätt ich gleich machen sollen

Gruß alfold
  Mit Zitat antworten Zitat
Aviator

Registriert seit: 3. Jun 2010
1.611 Beiträge
 
Delphi 10.3 Rio
 
#4

AW: TObjektList mit 2 oder mehr TObjekte

  Alt 31. Dez 2018, 12:15
hab jetzt noch ein 2 property hinzugefügt als itemindex.
Hätt ich gleich machen sollen
Dann würde mich jetzt mal interessieren, was bei deinem Programm passiert wenn du folgendes Szenario hast:

  • Du speicherst 10 Objekte in deiner ObjectList.
  • Die zusätzliche Property ItemIndex deiner Objects sind von 0-9 durchnummeriert
  • Du löschst das vierte (oder was auch immer für ein) Element/Object aus der Liste
  • Du durchläufst die Liste und willst irgendein spezielles Object haben. Sagen wir das, bei dem deine ItemIndex Property auf 9 steht
  • Du greifst auf das jetzt 9. Object in der Liste zu und nimmst dir den ItemIndex
  • Der Item Index ist 9, aber der größte Index ist 8, da nur noch 9 Objekte in deiner Liste sind
  • ... probier aus was passiert

Ein anderer Fall wäre, dass du auf ein Object mit einem bestimmten ItemIndex zugreifen möchtest, dieses aber in Wirklichkeit von einem anderen Typen ist, da sich durch das Löschen von Elementen die Reihenfolge verschoben hat. Also spätestens beim Cast auf ein anderes Object bzw. beim Zugriff auf eine Property dieses Objects knallt es dann.

Also hast du nur zwei Möglichkeiten:
  1. Du musst jedes Mal wenn du ein Element aus der Liste löschen willst den ItemIndex aller nachfolgenden Elemente korrigieren
  2. Du benutzt einfach zwei unterschiedliche Listen für dein Problem
  3. (Optional: Du machst dir eine eigene Klasse die wiederum in einer generischen TObjectList<T> gespeichert wird und verwaltest dort deine Daten)
  Mit Zitat antworten Zitat
alfold

Registriert seit: 29. Jun 2010
Ort: Neustrelitz
393 Beiträge
 
Delphi 7 Enterprise
 
#5

AW: TObjektList mit 2 oder mehr TObjekte

  Alt 1. Jan 2019, 09:50
ist vorbei. Ein gutes Neues an alle

Also hast du nur zwei Möglichkeiten:
  1. Du musst jedes Mal wenn du ein Element aus der Liste löschen willst den ItemIndex aller nachfolgenden Elemente korrigieren
  2. Du benutzt einfach zwei unterschiedliche Listen für dein Problem
  3. (Optional: Du machst dir eine eigene Klasse die wiederum in einer generischen TObjectList<T> gespeichert wird und verwaltest dort deine Daten)
Zu 1: Jo so würd ich es auch machen wollen.
zu 2: Hat @jaenicke auch schon geschrieben. Hab ich auch schon dran gedacht. Aber wie löse ich das, wenn die Daten in eine Datei gespeichert und wieder ausgelesen werden sollen? Hab ich auch noch nie gemacht!
zu 3: Delphi 7 Enterprise??

Alle Jubeljahre mal wieder ein kleines Project. Da fängt man immer wieder bei null an Wollte halt mal mit Objectlist arbeiten. Gerade wegen des abspeichern in eine Datei.

Gruß alfold
  Mit Zitat antworten Zitat
Benutzerbild von scrat1979
scrat1979

Registriert seit: 12. Jan 2007
Ort: Sulzbach a.d. Murr
1.029 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: TObjektList mit 2 oder mehr TObjekte

  Alt 1. Jan 2019, 11:57
Das Speichern von mehreren Listen in eine Datei ist überhaupt kein Problem. Spendiere jedem Object eine SaveToStream-Methode (die musst du selbst schreiben). Eine Objektliste speicherst du dann, indem du zunächst die Anzahl der Elemente in den Stream schreibst und dann durch die Liste durchiterierst und so die einzelnen Objekte schreibst. Das Auslesen geht dann entsprechend umgekehrt.

Mein Sohn blockiert gerade den PC. Auf Wunsch kann ich später mal Code posten.

P.S.: Ebenfalls ein Gutes Neues natürlich
Michael Kübler
  Mit Zitat antworten Zitat
Benutzerbild von scrat1979
scrat1979

Registriert seit: 12. Jan 2007
Ort: Sulzbach a.d. Murr
1.029 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: TObjektList mit 2 oder mehr TObjekte

  Alt 1. Jan 2019, 14:14
Anbei nun ein Beispielcode. Gibt noch andere Ansätze, aber das Grundprinzip sollte klar werden. Mit einer generischen TObjectList<T> wäre es noch eleganter, aber die steht Dir ja bei D7 nicht zur Verfügung...

Voila...

Delphi-Quellcode:
unit TestUnit;

interface

uses Classes, SysUtils, Contnrs;


type TObjekt1 = class(TObject)
  private
    FID : Integer;
    FValue : Integer;

  public
    property ID : Integer read FID write FID;
    property Value : Integer read FValue write FValue;

    procedure SavetoStream(AStream : TStream);
    procedure LoadFromStream(AStream : TStream);

    constructor Create(AID : Integer; AValue : Integer);
end;

type TObjektListe = class(TObjectList)
  public
    procedure LoadFromStream(AStream : TStream);
    procedure SaveToStream(AStream : TStream);

end;

implementation

{ TObjekt1 }

constructor TObjekt1.Create(AID, AValue: Integer);
begin
  FID := AID;
  FValue := AValue;
end;

procedure TObjekt1.LoadFromStream(AStream: TStream);
begin
  AStream.ReadBuffer(FID, SizeOf(FID));
  AStream.ReadBuffer(FValue, SizeOf(FValue));
end;

procedure TObjekt1.SavetoStream(AStream: TStream);
begin
  AStream.WriteBuffer(FID, SizeOf(FID));
  AStream.WriteBuffer(FValue, SizeOf(FValue));
end;

{ TObjektListe }

procedure TObjektListe.LoadFromStream(AStream: TStream);
var FCount : Integer;
  i: Integer;
begin
  (* Liste löschen *)
  Clear;

  (* Anzahl der Elemente auslesen *)
  AStream.ReadBuffer(FCount, SizeOf(Fcount));

  for i := 0 to FCount-1 do begin
    Add(TObjekt1.Create(-1, -1));
    TObjekt1(Last).LoadFromStream(AStream);
  end;
end;

procedure TObjektListe.SaveToStream(AStream: TStream);
var FCount : Integer;
  i: Integer;
begin
  (* Anzahl der Elemente speichern *)
  FCount := Count;
  AStream.WriteBuffer(FCount, SizeOf(FCount));

  (* Einzelne Elemente speichern *)
  for i := 0 to FCount-1 do
    TObjekt1(Items[i]).SavetoStream(AStream);
end;

end.
Michael Kübler
  Mit Zitat antworten Zitat
alfold

Registriert seit: 29. Jun 2010
Ort: Neustrelitz
393 Beiträge
 
Delphi 7 Enterprise
 
#8

AW: TObjektList mit 2 oder mehr TObjekte

  Alt 1. Jan 2019, 15:17
MH Ich dachte das dies einfacher wäre um alles in eine Datei zu speichern.

Delphi-Quellcode:
procedure TObjekt1.LoadFromStream(AStream: TStream);
begin
  AStream.ReadBuffer(FID, SizeOf(FID));
  AStream.ReadBuffer(FValue, SizeOf(FValue));
end;

procedure TObjekt1.SavetoStream(AStream: TStream);
begin
  AStream.WriteBuffer(FID, SizeOf(FID));
  AStream.WriteBuffer(FValue, SizeOf(FValue));
end;
wenn ich also jeden Parameter einzel aufführen muss, bei mir also

Code:
Soundfile: ShortString;
SoundName: ShortString;
SoundColor: TColor;
CommentText: ShortString;
CommentColor: TColor;
CommentSize: Integer;
SzeneText: ShortString;
SzeneColor: TColor;
ColIndex: Integer;
Start: TTime;
Anfang: TTime;
Ende: TTime;
LoopA: TTime;
LoopE: TTime;
VolA: Integer;
VolE: Integer;
FadeTime: real;
FadeIn: Boolean;
FadeOut: Boolean;
FwStop: Boolean;
und da kommt sicherlich noch was hinzu, ist dies aber auch nicht effektiver als meine alte speichern und lesen Routine, wo ich alles als String umwandle mit ';' trenne dann in eine Datei Speichere und wieder einlese.
Ich dachte das Binär Speichern währe einfacher.

Kannst du dir nicht die kostenlose Delphi Community Version holen? Da hättest du dann alle neuen Sprachfeatures.
Ja mach ich gerade.
  Mit Zitat antworten Zitat
Aviator

Registriert seit: 3. Jun 2010
1.611 Beiträge
 
Delphi 10.3 Rio
 
#9

AW: TObjektList mit 2 oder mehr TObjekte

  Alt 1. Jan 2019, 14:17
zu 3: Delphi 7 Enterprise??
Kannst du dir nicht die kostenlose Delphi Community Version holen? Da hättest du dann alle neuen Sprachfeatures.
  Mit Zitat antworten Zitat
Antwort Antwort


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 06:30 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 by Thomas Breitkreuz