Verwalten von Instanzen in einer ObjectList

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
klausi1305
Beiträge: 35
Registriert: Mo 1. Jul 2013, 21:30
OS, Lazarus, FPC: Win 7 Laz 1.0.10
CPU-Target: 32 Bit
Wohnort: Leipzig

Verwalten von Instanzen in einer ObjectList

Beitrag von klausi1305 »

Hallo verehrte Lazarusfans,

Eigentlich nen triviales Problem. Ich versuche erzeugte Instanzen, Exemplare von nur einemn Objekt zu verwalten. Bei Lazarus habe ich dazu die Klasse TObjectlist. Das Erzeugen der verschiedenen Instanzen sowie das Adden in die Liste läuft.

Mein Problem ist das ich nur die Infos der letzten erzeugten Instanz auslesen kann, obwohl ich nen verschiedenen Index verwende.

Ich wollte als Ergebnis doch nur im Memofeld untereinander Test 1, Test 2, Test 3 stehen sehen, welche ich mit dem Property GetName erhalte

Code: Alles auswählen

procedure TForm1.BitBtn1Click(Sender: TObject);
{------------------------------------------------------------}
{Bilder als Objekte erzeugen, bezeichnen, und in Memofeld auslesen lassen}
{---------Zu Testzwecken wird keine For oder Repeatschleife verwendet----}
begin
 //Erzeuge 1. Instanz von Einheit
     Einheit.Laden('TestEinheit.bmp');   //BitMap laden
     Einheit.SetPos(10,10,37,37);          //Pos auf Spielfläche setzn
     Einheit.SetName('Test 1');              //Name setzen
     EinheitObjListe.Add(Einheit);         //In Objektliste adden
     Einheit.Zeigen;                             //auf Spielfeld zeichnen
  //Erzeuge 2. Instanz von Einheit
     Einheit.Laden('TestEinheit.bmp');
     Einheit.SetPos(50,50,37,37);
     Einheit.SetName('Test 2');
     EinheitObjListe.Add(Einheit);
     Einheit.Zeigen;
  //Erzeuge 3. Instanz von Einheit
     Einheit.Laden('TestEinheit.bmp');
     Einheit.SetPos(100,100,37,37);
     Einheit.SetName('Test 3');
     EinheitObjListe.Add(Einheit);
     Einheit.Zeigen;
 {------------Ausgabe der Werte--------}
 
 Einheit := EinheitObjliste.Items[0] as TBild;     //Mit Laufzeitprüfung
 Memo1.Lines.Add(Einheit.GetName);
 Einheit := EinheitObjliste.Items[1] as TBild;
 Memo1.Lines.Add(Einheit.GetName);
 Einheit := EinheitObjliste.Items[2] as TBild;
 Memo1.Lines.Add(Einheit.GetName);
end;                         
Zuletzt geändert von Lori am Di 16. Jul 2013, 19:18, insgesamt 1-mal geändert.
Grund: richtiger Highlighter

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2818
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Verwalten von Instanzen in einer ObjectList

Beitrag von m.fuchs »

Ich sehe da nur eine Instanz. Du lädst halt immer neue Daten in diese Instanz und fügst sie immer wieder neu hinzu.

Welchen Typ hat Einheit und wie ist der definiert?
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

klausi1305
Beiträge: 35
Registriert: Mo 1. Jul 2013, 21:30
OS, Lazarus, FPC: Win 7 Laz 1.0.10
CPU-Target: 32 Bit
Wohnort: Leipzig

Re: Verwalten von Instanzen in einer ObjectList

Beitrag von klausi1305 »

Code: Alles auswählen

[code=laz]Var 
 Einheit : TBild; 
 
(* ============================ TBild ============================ *)
 
constructor TBild.Create;
(* --------------------------------------------------------------- *)
begin
  inherited;
  Bitmap := TBitmap.Create;
end;
 
procedure TBild.SetName(Text: String);
{---------------------------------------------------------------------}
begin
  Name :=Text;
end;
 
function TBild.GetName: String;
begin
  Result := Name;
end;
 
procedure TBild.SetPos(ax1, ay1, ax2, ay2 : longint);
(* --------------------------------------------------------------- *)
begin
  x1 := ax1;
  y1 := ay1;
  x2 := ax2;
  y2 := ay2;
 
  Bitmap.Width  := ax2;  // Bildgroesse auf Parameter setzen
  Bitmap.Height := ay2;
end;
 
 
procedure TBild.Zeigen;
(* --------------------------------------------------------------- *)
begin
  mybild.Canvas.Draw(x1, y1,Bitmap);
end;
 
 
procedure TBild.Loeschen;
(* --------------------------------------------------------------- *)
var
  dummy   : TRechteck;
  dx2,dy2 : integer;
begin
  dx2 := self.Bitmap.Width;
  dy2 := self.Bitmap.Height;
 
  dummy := TRechteck.Create;
  dummy.SetPos(x1,y1,x1+dx2,y1+dy2);
  dummy.SetFarbe(myZeichenblatt.GetFuellfarbe);
  dummy.SetFuellFarbe(myZeichenblatt.GetFuellfarbe);
 
  mybild.Canvas.CopyMode := cmWhiteness;
  mybild.Canvas.Draw(x1, y1,Bitmap);
  mybild.Canvas.CopyMode :=cmSrcCopy;
 
  dummy.Zeigen;
  dummy.Free;
end;
 
 
procedure TBild.Entfernen;
(* --------------------------------------------------------------- *)
begin
  Bitmap.Free;
  inherited;
end;
 
procedure TBild.Laden(dateiname : string);
(* --------------------------------------------------------------- *)
begin
  BitMap.LoadFromFile(dateiname);
end;
 
 
function TBild.IstMarkiert (ax, ay : longint):boolean;
(* --------------------------------------------------------------- *)
var
  R : TRechteck;
  dx2,
  dy2 : integer;
begin
  dx2 := self.Bitmap.Width;
  dy2 := self.Bitmap.Height;
 
  R := TRechteck.Create;
  R.SetPos(x1-5, y1-5, x1+dx2, y1+dy2);
  if R.IstMarkiert(ax,ay)
  then Result := true
  else Result := false;
 
  R.Free;
end;
 
 
procedure TBild.Ziehen (ax, ay : longint);
(* --------------------------------------------------------------- *)
begin
  if IstMarkiert(ax,ay) then
  begin
  Loeschen;
  PosVersetzenNach(ax,ay);
  Zeigen;
  end;
end;
[/code]

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2818
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Verwalten von Instanzen in einer ObjectList

Beitrag von m.fuchs »

Dann erweitere dein Erzeugen mal um folgendes, dann erzeugst du immer eine neue Instanz.

Code: Alles auswählen

//Erzeuge 1. Instanz von Einheit
Einheit := TBild.Create;
Einheit.Laden('TestEinheit.bmp');   //BitMap laden
Einheit.SetPos(10,10,37,37);          //Pos auf Spielfläche setzn
(* ... *)

Zum Schluss nicht vergessen alle Instanzen wieder freizugeben.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

klausi1305
Beiträge: 35
Registriert: Mo 1. Jul 2013, 21:30
OS, Lazarus, FPC: Win 7 Laz 1.0.10
CPU-Target: 32 Bit
Wohnort: Leipzig

Re: Verwalten von Instanzen in einer ObjectList

Beitrag von klausi1305 »

Danke,

funktioniert wunderbar!!

ich war der festen Überzeugung, das einmalige Erzeugen des Objects beim starten reicht aus.......für jede Instanz also ein neues Create!!

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2818
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Verwalten von Instanzen in einer ObjectList

Beitrag von m.fuchs »

Ja, ohne das Create hast du immer nur eine Instanz und überschreibst die Daten.

Dementsprechende brauchst du auch für jedes Element in deiner Liste ein .Free(). Es sei denn deine ObjectList hat die Eigenschaft OwnsObjects auf True gesetzt. Dann wird bei einem EinheitObjListe.Free() auch jede Einheit in der Liste abgeräumt.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

klausi1305
Beiträge: 35
Registriert: Mo 1. Jul 2013, 21:30
OS, Lazarus, FPC: Win 7 Laz 1.0.10
CPU-Target: 32 Bit
Wohnort: Leipzig

Re: Verwalten von Instanzen in einer ObjectList

Beitrag von klausi1305 »

ja, die Liste wird mit Einheitobjectlist.Create(True) erzeugt, also OwnObjects True...

btw, wo kann ich die diversen "Free" meiner Objects mit dem Klick auf das schöne Windows X, welches oben rechts rumgammelt erzeugen?

Bisher beende ich das Programm deswegen über nen extra Button, da ich mir nicht sicher bin ob das klicken auf das X das macht und die Recherche im Netz sehr dürftig ist

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2818
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Verwalten von Instanzen in einer ObjectList

Beitrag von m.fuchs »

Wenn dein Programm beendet wird, wird der Speicher sowieso freigeräumt. Da wäre es egal.

Wenn du auf den Schließen Button des Fensters reagieren willst, ist TForm.OnClose dein Freund.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Antworten