Wie arbeite ich mit "Klassen"-Listen
Hallo,
Euer erster Schritt, mir in oop zu helfen war prima. Nun gleich zu einer exotischen Anwendung von Objekten, und zwas in einer Liste. Der folgende Code soll die Frage Euch verdeutlichen:
Delphi-Quellcode:
Im Code habe ich das Problem schon markiert.
unit EB_Pat_Foto_Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, IniFiles, Dialogs, StdCtrls, ExtCtrls, FileCtrl, ShellAPI, SDL_ColSel, SDL_Thumbnails, ComCtrls, ShellCtrls; type ... TSatz = class(TObject) Bild: TImage; BildName: string; BildNurName: string; BildNurPath: string; BildNurExt: string; FileName: string; FileNurName: string; FileNurPath: string; FileNurExt: string; Datum: string; Notiz: string; Checked: boolean; private Fgeb: string; FPatName: string; FID: string; FInhalt: string; function GetID: string; function GetPatName: string; function GetGeb: string; function GetInhalt: string; procedure Setgeb(const Value: string); procedure SetID(const Value: string); procedure SetPatName(const Value: string); procedure SetInhalt(const Value: string); public property PatName: string read GetPatName write SetPatName; property geb: string read Getgeb write Setgeb; property ID: string read GetID write SetID; property Inhalt: string read GetInhalt write SetInhalt; end; var ... Satz: array of TSatz; // dieses wird im Folgenden // Probleme machen ... implementation uses ... ; {$R *.dfm} //.............................................................................. procedure TForm1.FormCreate(Sender: TObject); var i: integer; Fehler: Word; DatumStr: string; begin ... Satz := TSatz.create; // und das mag der Compiler nicht // wegen "array of TSatz" // Instanzendeklaration setlength(Satz, 50); ... end; ... end. Von der Klasse TSatz will ich ein dynamisches Array instanzieren und beim Instanz.Create gibt es Compiler-Mecker. Wie kann ich dieses Problem wohl am besten lösen? Gibt es da nicht irgend eine andere Lösung mit Listen oder so ? Danke für Hilfe E. B. |
Re: Wie arbeite ich mit "Klassen"-Listen
Delphi-Quellcode:
inc(anz);
SetLength( satz, anz); Satz[anz-1] := TSatz.create; // und das mag der Compiler nicht // wegen "array of TSatz" // Instanzendeklaration |
Re: Wie arbeite ich mit "Klassen"-Listen
|
Re: Wie arbeite ich mit "Klassen"-Listen
Hallo EccoBravo,
mit Listen und so geht das natürlich auch. Guck mal in der Hilfe nach TObjectList. Mein Vorschlag: In Form1 deklarierst du FSatzListe : TObjectList; In TForm1.FormCreate erzeugst du dann die Objektinstanz dazu. Sätze in die Liste einfügen: FSatzListe.Add(TSatz.Create); P.S.: ich war schon wieder zu langsam :( |
Re: Wie arbeite ich mit "Klassen"-Listen
Da es sich nur um eine Klasse (nämlich TSatz) handelt, kann man sogar auf eine TCollection gehen.
|
Re: Wie arbeite ich mit "Klassen"-Listen
Zitat:
|
Re: Wie arbeite ich mit "Klassen"-Listen
Wie mache ich das in meinem Falle?
Für TObjectList brauche ich
Delphi-Quellcode:
Wenn ich in meinem Code:
Uses Contnrs ...
Delphi-Quellcode:
Jetzt könnt Ihr Euch sicherlich vorstellen, wie wenig Ahnung ich von TObjectList habe.
unit EB_Pat_Foto_Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, IniFiles, Dialogs, StdCtrls, ExtCtrls, FileCtrl, ShellAPI, SDL_ColSel, SDL_Thumbnails, ComCtrls, ShellCtrls, Contnrs; type ... TSatz = class(TObject) Bild: TImage; BildName: string; BildNurName: string; BildNurPath: string; BildNurExt: string; FileName: string; FileNurName: string; FileNurPath: string; FileNurExt: string; Datum: string; Notiz: string; Checked: boolean; private Fgeb: string; FPatName: string; FID: string; FInhalt: string; function GetID: string; function GetPatName: string; function GetGeb: string; function GetInhalt: string; procedure Setgeb(const Value: string); procedure SetID(const Value: string); procedure SetPatName(const Value: string); procedure SetInhalt(const Value: string); public property PatName: string read GetPatName write SetPatName; property geb: string read Getgeb write Setgeb; property ID: string read GetID write SetID; property Inhalt: string read GetInhalt write SetInhalt; end; var ... Satz: TSatz; // hier beginnen meine SatzListe: TObjectList; // Unsicherheiten ... implementation uses ... ; {$R *.dfm} //.............................................................................. procedure TForm1.FormCreate(Sender: TObject); var i: integer; Fehler: Word; DatumStr: string; begin ... SatzListe := TObject.Create; // hier bin ich for i := 0 to maxSatzZahl do // ebenfalls unsicher SatzListe.Add(TAstz.Create); // ... ... end; ... ... procedure TForm1.E_geborenExit(Sender:TObject); begin Satz[1].geb := E_geboren.Text; // hier meckert der Compiler E2149 !!!! end; // schon beim compilieren ... ... end. Ich will im Programm über einen IndexInteger auf einzelne Datensätze der Liste zugreifen.
Delphi-Quellcode:
Ja, Unwissenheit schützt vor Dummheit nicht,
Satz[i] := ...;
... := Satz[j]; Vielleicht Könnt Ihr mir da weiterhin helfen Danke, Grüße ... E. B. |
Re: Wie arbeite ich mit "Klassen"-Listen
Hallo,
um auf die einzelnen Objekte zugreifen zu können, machst du einfach das hier:
Delphi-Quellcode:
TObjectlist gibt standardmäßig auch den SpeicherTSatz(Satzliste.Items[1]).Eigenschaft:= 'bla'; der Objekte wieder frei. Edit: Zitat:
nicht die Objektliste, aber ansonsten ist die Vorgehensweise richtig. Gruß Pfoto |
Re: Wie arbeite ich mit "Klassen"-Listen
Dann typisieren wir die Liste noch und können uns das casten sparen ;)
|
Re: Wie arbeite ich mit "Klassen"-Listen
Siehe hier: Container-Klassen in Delphi
|
Re: Wie arbeite ich mit "Klassen"-Listen
Hallo Pfoto,
Wie erstelle ich dann eine Objektliste und kein Object? Danke E. B. |
Re: Wie arbeite ich mit "Klassen"-Listen
Hi,
hoffe das hilft dir.
Delphi-Quellcode:
Mit dem Konstrukt kannst du dann zb sowas machentype TMyObject = class(TObject) private FNAme: String; public property Name: String read FName write FName; end; type TMyObjectList = class(TObjectList) private function GetItem(ndx: Integer): TMyObject; procedure SetItem(ndx: Integer; AValue: TMyObject); public property items[ndx: Integer]:TMyObject read GetItem write SetItem; end; implementation function TMyObjectList.GetItem(ndx: Integer): TMyObject; begin Result := TMyObject(inherited items[ndx]); end; procedure TMyObjectList.SetItem(ndx: Integer; AValue: TMyObject); begin items[ndx] := AValue; end;
Delphi-Quellcode:
Grüße
procedure irgendwas;
var aList: TMyObjectList; begin aList := TMyOBjectList.Create; aList.Add(TMyObject.Create); aList.items[0].Name := 'Hello World'; end; |
Re: Wie arbeite ich mit "Klassen"-Listen
Hi,
Ich hab das bei meinem Spiel sogemacht
Delphi-Quellcode:
So ich hoffe ich habe es richtig verstahnden, was du willst und wenn, dann hoffe ich das es dir hilft.
//als erstes von TCollectionItem ableiten
//beispiel von mir TLager = class(TCollectionItem) //eigene Eigenschaften end; //dann hab ich eine Klasse wo die Variable gespeichert ist TSchiff = class(TGlFreeForm) //einge klasse von meiner Engien hatt nicht damit zutun private FLagerliste : TCollection //kann auch eine Variable sein published property Lagerliste : TCollection read FLagerliste write FLagerliste; end; //im Creater dann FLagerliste := TCollection.Create(TLager) //die abgeleitete TCollectionItem Klasse //dann for-Schleife for I := 0 to 4 do with FLagerliste.Add as TLager do //kannst du direkt auf die neue Klasse zugreifen //sachen, die du verändern willst |
Re: Wie arbeite ich mit "Klassen"-Listen
Hallo angos und Danke an alle,
angos, soweit so gut, compilieren soweit ohne Mecker, angos, Deine Lösung gefällt mir am besten. beim Ausführen des Programms kommt dann aber eine Meldung; Zitat:
Ich weiss nicht, was da los ist (Antwort auf diese Frage kann ich wohl nicht erwarten) Zweite Frage: Wie kann ich bei Form1.close die Objectliste wieder frei geben? Also nochmals vielen Dank. Ihr tragt nicht nur mit Töpfen Licht ins Dunkle. Grüße E. B. |
Re: Wie arbeite ich mit "Klassen"-Listen
ich habe mal kurz mein minitool angeschmissen.
Delphi-Quellcode:
That's the way i alway do. eine typisierte TObjectList. Finde ist das einfachste was man machen kann.
unit SatzList;
interface uses Contnrs, Satz; type TSatzList = class( TObjectList ) protected //* Protected functions.. function GetItem(Index: Integer): TSatz; reintroduce; procedure SetItem(Index: Integer; const Value: TSatz); reintroduce; public //* Constructors.. don't forget to call "inherited" //constructor Create; overload; //constructor Create(AOwnsObjects: Boolean); overload; //* List Functions & Propertys function Add(AObject: TSatz): Integer; reintroduce; function Extract(Item: TSatz): TSatz; reintroduce; function Remove(AObject: TSatz): Integer; reintroduce; function IndexOf(AObject: TSatz): Integer; reintroduce; procedure Insert(Index: Integer; AObject: TSatz); reintroduce; function First: TSatz; reintroduce; function Last: TSatz; reintroduce; property Items[Index: Integer]: TSatz read GetItem write SetItem; default; //* Insert your own functions here... end; implementation { TSatzList } function TSatzList.Add(AObject: TSatz): Integer; begin result := inherited Add( AObject ); end; function TSatzList.Extract(Item: TSatz): TSatz; begin result := inherited Extract( Item ) as TSatz; end; function TSatzList.First: TSatz; begin result := inherited First as TSatz; end; function TSatzList.GetItem(Index: Integer): TSatz; begin result := inherited GetItem( Index ) as TSatz; end; function TSatzList.IndexOf(AObject: TSatz): Integer; begin result := inherited IndexOf( AObject ); end; procedure TSatzList.Insert(Index: Integer; AObject: TSatz); begin inherited Insert(Index,AObject); end; function TSatzList.Last: TSatz; begin result := inherited Last as TSatz; end; function TSatzList.Remove(AObject: TSatz): Integer; begin result := inherited Remove(AObject); end; procedure TSatzList.SetItem(Index: Integer; const Value: TSatz); begin inherited SetItem(Index,Value); end; end. habe mir das tool "mal eben" geschrieben weil ich keine lust auf das dauernde ersetzen etc hatte. basisklasse eingeben start drücken fertig werden :-) daher mal schnell die "lösung" bereitstell gruß reli |
Re: Wie arbeite ich mit "Klassen"-Listen
Zitat:
|
Re: Wie arbeite ich mit "Klassen"-Listen
Zitat:
Zitat:
Delphi-Quellcode:
freigeben.
FreeAndNil( FMeineListe );
gruß reli edit: Luckie das is doch oversized :-p *duck* |
Re: Wie arbeite ich mit "Klassen"-Listen
Das ist nicht oversized, das ist genau das, was ihr heir die ganze zeit zu erklären versucht. ;)
|
Re: Wie arbeite ich mit "Klassen"-Listen
ah sorry. ja ich hab dir gerade unrecht getan. ich hatte noch im hinterkopf dass hier jemand an einem "generics for win32" ähnlichem gerüst gearbeitet hat. oder es jedenfalls hier diskutiert wurde. und als ich dann kurz den thread überflogen habe sah ich den D.NET ansatz von elvis und ich dachte mir: "generics sind genau das richtige was ein anfänger braucht - bei uns in der firma hatten bei der schulung von bernd ua schon einige alteingesessene leute probleme mit den dingern" und äußerte mich deshalb mit oversized. aber du hast recht. das ist genau was er braucht und wie immer auf die gute luckie art erklärt.
|
Re: Wie arbeite ich mit "Klassen"-Listen
Prima allerseits,
es funktioniert, Danke für alle für die Hilfe. Der Vorschlag von angos war mir am sympatischten, Den Fehler habe ich übringens auch gefunden, die Initialisierung der SatzList:TSatzList in der Form.Create war am Emde der Methode und mußte an den Anfang der Methode, weil in dieser schon gebraucht. Nun habe ich die Vorzüge des RAD2007 Together voll genossen. Nachdem ich das alles fertig hatte habe ich mit einem Federstreich zuerst die Klasse TSatz in eine neue Unit ausgelagert und dann auch die ganze Klasse TSatzList. Nun ist das eigentliche Programm ein kleiner Vers geworden und läßt sich prima pflegen. Nun bin ich zufrieden und gehe nach haus. Euch allen ein schönes Wochenende E. B. |
Re: Wie arbeite ich mit "Klassen"-Listen
Zitat:
|
Re: Wie arbeite ich mit "Klassen"-Listen
Hi und danke für die Blumen,
wobei ich noch sagen muss: der Vorschlag von Relicted ist quasi das gleiche wie meines, nur direkt schon mit erweiterter Funktionalität. Nimms auf jedenfall mal mit, wenn du dich grad durch die OOP kämpfst ;) Da es jetzt schon spät (oder früh, je nach Sichtweise) ist, schau ich mir Luckies Link erst morgen an und kann dazu grad nichts sagen. Anschauen solltest du dir das auf jedenfall auch, weil von Luckie eigentlich viel Brauchbares kommt was auch gut erklärt ist. Gruß und Gute Nacht PS: Warum bin ich eigentlich noch nicht auf die Idee gekommen, ein Tool zur schnellen Erzeugung von Klassenstrukturen zu bauen :? Todo.Add(Daten_Im_Kopf); [Edit] so jetzt reichts auch mit dem Luckie-Schleimen der Comunity :stupid: :angel: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:46 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