Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Wie kann man ein Array leeren? (https://www.delphipraxis.net/165880-wie-kann-man-ein-array-leeren.html)

CreativeMD 19. Jan 2012 15:29

Wie kann man ein Array leeren?
 
Wie kann man ein Array leeren?

Deklaration:

Delphi-Quellcode:
Labels: Array [0 .. 100] of TLabel;

Mein Versuch

Delphi-Quellcode:
zahl3 := 0;
  while zahl3 <= 100 do
  begin
    If Assigned(Labels[zahl3]) then FreeAndNil(Labels[zahl3]);
    zahl3 := zahl3 + 1;
  end;
Aber nicht alle Labels sind mit Inhalt gefüllt.

Delphi-Quellcode:
Labels[zahl] := TLabel.Create(Form1);
          Labels[zahl].Parent := panels[zahl];
          Labels[zahl].Font.Name := 'Bauhaus';
          Labels[zahl].Font.Size := 12;
          Labels[zahl].Caption := '-Nicht verfügbar-';
          Labels[zahl].Top := 8;
          Labels[zahl].Left := 250;
          Labels[zahl].OnMouseEnter := Form1.PanelsOver;
          Labels[zahl].OnMouseLeave := Form1.PanelsLeave;
          Labels[zahl].Tag := zahl;
Es gibt leider eine Fehlermeldung.
Was mache ich falsch oder gibt es eine andere Lösung.

DeddyH 19. Jan 2012 15:35

AW: Wie kann man ein Array leeren?
 
Und welche Fehlermeldung? Ist der Array-Inhalt initial genullt worden?

Mavarik 19. Jan 2012 15:42

AW: Wie kann man ein Array leeren?
 
hmm

Delphi-Quellcode:
Fillchar(Labels[0],Sizeof(Labels],0);

Mavarik

shmia 19. Jan 2012 15:54

AW: Wie kann man ein Array leeren?
 
Es gibt übrigens höherwerte Datentypen als Arrays: Listen.
Der Kopf ist rund damit das Denken die Richtung ändern kann.

Bei einer Liste kann man einfach Elemente (z.B. TLabels) hinzufügen oder entfernen ohne
dass man sich um die Löcher kümmern müsste die beim Löschen aus einem Array zurückbleiben.

Eine Liste ändert dynamisch und automatisch seine Grösse während die Grösse eines Arrays vom Programmierer explizit geändert werden muss.

CreativeMD 19. Jan 2012 18:27

AW: Wie kann man ein Array leeren?
 
Zitat:

Zitat von Mavarik (Beitrag 1146732)
hmm

Delphi-Quellcode:
Fillchar(Labels[0],Sizeof(Labels],0);

Mavarik

Das macht zwar keine Fehler Meldung aber der Label geht auch net weg.
Zitat:

Zitat von shmia (Beitrag 1146734)
Es gibt übrigens höherwerte Datentypen als Arrays: Listen.
Der Kopf ist rund damit das Denken die Richtung ändern kann.

Bei einer Liste kann man einfach Elemente (z.B. TLabels) hinzufügen oder entfernen ohne
dass man sich um die Löcher kümmern müsste die beim Löschen aus einem Array zurückbleiben.

Eine Liste ändert dynamisch und automatisch seine Grösse während die Grösse eines Arrays vom Programmierer explizit geändert werden muss.

Meinst du damit eine ListBox. Erklär bitte genauer.

DeddyH 19. Jan 2012 18:31

AW: Wie kann man ein Array leeren?
 
Er meint eine Liste. Für Labels bietet sich z.B. eine TObjectList bzw. TComponentList an. Dafür musst Du die Unit Contnrs einbinden.

CreativeMD 19. Jan 2012 18:58

AW: Wie kann man ein Array leeren?
 
Solche Listen gibt es aber im normalen Delphi gar net.
Wo finde ich die?
und kann man auch dort Buttons reinmachen????

DeddyH 19. Jan 2012 19:06

AW: Wie kann man ein Array leeren?
 
Was ist ein "normales" Delphi? Hast Du die Unit Contnrs eingebunden?

[edit]
TObjectList
TComponentList
[/edit]

Luckie 19. Jan 2012 19:09

AW: Wie kann man ein Array leeren?
 
Natürlich gibt es die in Delphi. Und was ist für dich ein nicht normales Delphi?

CreativeMD 19. Jan 2012 19:13

AW: Wie kann man ein Array leeren?
 
achso ich dachte es wäre eine Vcl Komponente.
Aber wie kann ich sie benutzen bzw. ein Objekt hinzugüfen, z.b einen Button oder ein Label?

Luckie 19. Jan 2012 19:21

AW: Wie kann man ein Array leeren?
 
Google, Sucher, erster Treffer: "delphi TObjectList"

DeddyH 19. Jan 2012 19:22

AW: Wie kann man ein Array leeren?
 
Ist das zuviel verlangt, einmal einen Blick in die Hilfe oder die DP-Suchfunktion zu werfen? Ich meine, XE 2 Architect im Profil und sich dann alles vorkauen zu lassen geht irgendwie nicht zusammen, oder?

Luckie 19. Jan 2012 19:24

AW: Wie kann man ein Array leeren?
 
Oder http://www.delphipraxis.net/dp_reference.php nach TObjetList suchen.

DeddyH 19. Jan 2012 19:33

AW: Wie kann man ein Array leeren?
 
Hab ich doch sogar schon verlinkt ;)

himitsu 19. Jan 2012 20:25

AW: Wie kann man ein Array leeren?
 
Ich mag die geheimen OH-Tags ... passend zur unbekannten F1-Taste. :stupid:
Delphi-Referenz durchsuchenTObjectList

CreativeMD 21. Jan 2012 10:15

AW: Wie kann man ein Array leeren?
 
Sorry aber in all diesen Links war keine einzige Antwort zu meiner Frage :(.
Ich habe auch schon in google gesucht.

DeddyH 21. Jan 2012 11:48

AW: Wie kann man ein Array leeren?
 
So?
Zitat:

• class Contnrs.TObjectList » [DE] [FR]
• function Contnrs.TObjectList.Add » [DE] [FR]
• constructor Contnrs.TObjectList.Create » [DE] [FR]
• destructor Contnrs.TObjectList.Destroy » [DE] [FR]
• function Contnrs.TObjectList.Extract » [DE] [FR]
• function Contnrs.TObjectList.ExtractItem » [DE] [FR]
• function Contnrs.TObjectList.FindInstanceOf » [DE] [FR]
• function Contnrs.TObjectList.First » [DE] [FR]
• function Contnrs.TObjectList.GetItem » [DE] [FR]
• function Contnrs.TObjectList.IndexOf » [DE] [FR]
• function Contnrs.TObjectList.IndexOfItem » [DE] [FR]
• procedure Contnrs.TObjectList.Insert » [DE] [FR]
• property Contnrs.TObjectList.Items » [DE] [FR]
• function Contnrs.TObjectList.Last » [DE] [FR]
• procedure Contnrs.TObjectList.Notify » [DE] [FR]
• property Contnrs.TObjectList.OwnsObjects » [DE] [FR]
• function Contnrs.TObjectList.Remove » [DE] [FR]
• function Contnrs.TObjectList.RemoveItem » [DE] [FR]
• procedure Contnrs.TObjectList.SetItem » [DE] [FR]
Da kann man sogar draufklicken (vorzugsweise jeweils unter [DE]) :cyclops:.

CreativeMD 22. Jan 2012 14:26

AW: Wie kann man ein Array leeren?
 
Danke ich weiß aber immer noch net.
Ich ich ein bestimmtes objekt einbinde.
Add(TButton) funktioniert net
Add(Labels[zahl]) funktioniert auch net
wie mache ich das?

Sir Rufo 22. Jan 2012 14:37

AW: Wie kann man ein Array leeren?
 
Hier die Deklaration
Delphi-Quellcode:
uses
  Contnrs;

// statt Labels : array[0..100] of TLabel;
type
  TForm1 = class( TForm )
  ..
  private
    Labels : TList;
  end;

..

implementation

..

procedure TForm1.FormCreate( Sender : TObject );
begin
  Labels := TObjectList.Create;
end;

procedure TForm1.FormDestroy( Sender : TObject );
begin
  // Alle enthaltenen Objekte (hier die Labels) werden automatisch entsorgt
  Labels.Free;
end;

procedure TForm1.Button1Click( Sender : TObject );
var
  idx : integer;
  lbl : TLabel;
begin
  for idx := 1 to 100 do
  begin
    lbl := TLabel.Create( nil ); // keinen Owner angeben!!! Die Labels-Liste kümmert sich um die Freigabe!
    lbl.Parent := Self; // oder wer auch immer
    lbl.Caption := 'Hallo';
    ..
    Labels.Add( lbl );
  end;
end;

Furtbichler 22. Jan 2012 14:38

AW: Wie kann man ein Array leeren?
 
Poste mal deinen Code.
Ich glaube, Du hast die 100 Label erzeugt und willst nun, das sie wieder verschwinden. Da reicht es natürlich nicht das Array oder die Liste oder die Objektliste oder was auch immer dein Container ist, zu nullen.

Um die Label zu erzeugen, instantiierst Du sie mit dem Konstruktor.
Um die Label zu entfernen, gibst Du es mit dem Destruktor frei.

Um ein Label unsichtbar zu machen, setzt Du Visible auf False oder entfernst den Text (Caption).

Der Konstruktor heißt Create, und der Destruktor heißt... Destroy.

Und weil Delphi nun mal ein wenig rumgefrickelei ist, verwendet man nicht den Destruktor direkt, sondern etwas, das viel toller ist, nämlich "Free".
Das macht das Gleiche, prüft aber vorher auf Nil.

Wenn Du das hier nicht verstanden hast, solltest Du erst einmal die grundlegenden Grundlagen von Delphi lernen.

CreativeMD 22. Jan 2012 15:17

AW: Wie kann man ein Array leeren?
 
Vielen Dank
Sir Rufo

Furtbichler ich werde das jetzt mit TObjectList machen.

himitsu 22. Jan 2012 17:20

AW: Wie kann man ein Array leeren?
 
Zitat:

Zitat von Furtbichler (Beitrag 1147112)
Ich glaube, Du hast die 100 Label erzeugt und willst nun, das sie wieder verschwinden. Da reicht es natürlich nicht das Array oder die Liste oder die Objektliste oder was auch immer dein Container ist, zu nullen.

Doch, es reicht.
Zumindestens wenn man eine passende Liste verwendet.

Und die Delphi-Referenz durchsuchenTObjectList ist genau dafür gedacht.
Man erstellt diese mit OwnsObjects = True und schon kümmert sich die Liste um die Freigabe, wenn man einen Eintrag aus der Liste rauslöscht.

Furtbichler 22. Jan 2012 17:25

AW: Wie kann man ein Array leeren?
 
Stimmt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:10 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