AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

TObjectList Problem

Ein Thema von Dennis07 · begonnen am 5. Dez 2011 · letzter Beitrag vom 8. Dez 2011
Antwort Antwort
Seite 3 von 3     123
Dennis07

Registriert seit: 19. Sep 2011
Ort: Deutschland
481 Beiträge
 
Delphi 11 Alexandria
 
#21

AW: TObjectList Problem

  Alt 5. Dez 2011, 18:58
Wo siehst Du in dem geposteten Code eine Rekursion? Dass die globalen Variablen alles andere als schön sind, wurde ja bereits gesagt und eine Alternative von mir gezeigt.
"Muss" ich es ändern oder nicht? Ich brauche globale Variablen, ansonsten, soviel könnt ihr mir ruhig zutrauen, würde ich sie nicht verwenden (ich finde ebenfalls, sie machen einen Quelltext extrem unübersichtlich, aber manchmal kommt man nicht, oder nur über erhebliche umwege, um sie herum).
Mir ist außerdem nicht bewusst, warum NewPanel bzw. PanelsList Probleme machen sollte, sie werden doch nirgendwo sonst vom Compiler belegt oder definiert.
Dennis
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.536 Beiträge
 
Delphi 11 Alexandria
 
#22

AW: TObjectList Problem

  Alt 5. Dez 2011, 19:08
Wie himi schon sagte, in einer Rekursion kann es Dir passieren, dass die Instanz überschrieben und somit unerreichbar für Dich wird.

[edit] Nebenbei haben globale Variablen den ganz dummen Nachteil, dass jeder, der Zugriff darauf hat, ungeprüft da rein schreiben kann, auch wenn oder wann man das eigentlich gar nicht möchte. [/edit]
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen

Geändert von DeddyH ( 5. Dez 2011 um 19:16 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.108 Beiträge
 
Delphi 12 Athens
 
#23

AW: TObjectList Problem

  Alt 5. Dez 2011, 19:30
Ich brauche globale Variablen, ansonsten, soviel könnt ihr mir ruhig zutrauen, würde ich sie nicht verwenden
Nein, brauchst du nicht, das kannst du mir ruhig glauben, soviel könntest du mir ruhig zutrauen, sonst würde ich es nicht sagen.

Zitat:
Delphi-Quellcode:
  NewPanel: TPanel;
  PanelID: Integer = 1;
  PanelsList: TObjectList;
  { ... }

procedure TfmPool.FormCreate(Sender: TObject);
begin
  PanelsList := TObjectList.Create;


Der Wert von NewPanel wird nur in und wärend der Laufzeit von SpawnPanel verwendet, es wird also nur lokal genutzt, also gehört diese Variable auch lokal in SpawnPanel rein.

Die anderen Beiden werden "nur" innerhalb von TfmPool erstellt, verwaltet und freigegeben.
TfmPool ist also dafür zuständig und somit gehören sie auch in dessen Zuständigkeitsbereich.
- als Property, wenn noch extern drauf zugegriffen wird
- und/oder als private Felder

SpawnPanel erstellt die Panele sichtbar auf der Form, es beeinflußt also direkt diese Form und somit gehört auch dieses als Methode in diese TfmPool.
Dabei hat sich auch gleich das Problem mit der bösen globalen fmPool gelöst, denn nun hat SpawnPanel direkten Zugriff auf diese Form.

Wieso bekommt eigentlich das neue Panel die Application als Owner?
Es liegt doch schließlich auf der Form und nicht im Application.
Und jetzt wo SpawnPanel eh schon zur Form gehört, kann man diese Form auch gleich als Owner nutzen.


Wozu soll eigentlich die PanelsList gut sein?
Vermutlich doch nur, damit die Panele alle wieder freigegeben werden ... nichwa?
PS: Der Owner ist für die Freigabe zuständig.

Deine Form gibt nun im OnDestroy (wie schon gesagt, ist OnClose falsch ... siehe nächster Punkt) diese PanelsList und somit auch die Panele frei.
Wäre die Form der Owner, würde sie es auch von selber machen und die ganze PanelsList wäre vollkommen unnötig.

im OnCreate erstellt => im OnDestroy freigeben
im Open erstellen => im OnClose freigeben
im OnShow erstellen => im OnHide freigeben
... fällt dir was auf?
Tipp: Gegensätze


PS: Wenn möglich verabschiede dich davon, diese globalen Form-Variablen zu verwenden, denn vor einer Weile hatte jemand mal mächtig Probleme damit.
... so als Beispiel, warum die böse sind ...

gegeben waren eine Form und darauf ein Edit
- leider wurde "ausversehn" die Form in der Projektdatei mehrfach erstellt
- die Form hatte, in der DFM, Visible als False stehen
- somit wirde nur die "MainForm" (also die Erste) angezeigt
- die nachfolgend erstellten Forms überschrieben aber alle diese globale Formvariabe, da sie ja ein Millisekündchen später erzeugt wurden.

Soooooooo

Man kann nun in diese Edit eingeben was man will,
in Form1.Edit1.Text stand und blieb immer der "Default-Wert" stehen, aus der DFM.
Genauso konnte man Form1.Edit1.Text zuweisen was man wollte ... das Angezeigte änderte sich nie.

Und nun rate mal warum?

Die angezeigt Form war nicht die, welche in der Globalen verlinkt war
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu ( 5. Dez 2011 um 19:34 Uhr)
  Mit Zitat antworten Zitat
Dennis07

Registriert seit: 19. Sep 2011
Ort: Deutschland
481 Beiträge
 
Delphi 11 Alexandria
 
#24

AW: TObjectList Problem

  Alt 5. Dez 2011, 20:26
Zitat:
Nebenbei haben globale Variablen den ganz dummen Nachteil, dass jeder, der Zugriff darauf hat, ungeprüft da rein schreiben kann, auch wenn oder wann man das eigentlich gar nicht möchte.
Hier irrelevant. Das Programm hat nur eine Form und wird auch nur einmal erzeugt.

Zitat:
Wozu soll eigentlich die PanelsList gut sein?
Vermutlich doch nur, damit die Panele alle wieder freigegeben werden ... nichwa?
Doch.

Zitat:
Deine Form gibt nun im OnDestroy (wie schon gesagt, ist OnClose falsch ... siehe nächster Punkt) diese PanelsList und somit auch die Panele frei.
Wäre die Form der Owner, würde sie es auch von selber machen und die ganze PanelsList wäre vollkommen unnötig.
Nun, das ist mir durchaus bewusst. Allerdings ist es nicht das, was ich will, bzw. nichts, wofür ich hilfe bräuchte. Was ich möchte, ist dass ALLE dieser Panels, die sich in der PanelsList-Objektliste befinden, per Knopfdruck gelöscht werden.

Zitat:
PS: Der Owner ist für die Freigabe zuständig.
Wofür ein Owner da ist weiß ich.

Zitat:
Und nun rate mal warum?
Soweit so gut, verstehe ich. Da ich kein "Visible" irgentwo, sowohl im Projekt, als auch in der (einzigen) Unit, irgentwo verwende, habe ich doch von da aus nichts zu befürchten. Außerdem funktionieren alle Anderen Globals auch einwandfrei....

Naja, das mit dem NewPanel kann ich ja mal Prozedurenbezogen machen und die Prozedur dann Formularbezogen. Mal sehen was rauskommt.
Danke auf jeden Fall schon mal für eure Hilfe
Dennis
  Mit Zitat antworten Zitat
Dennis07

Registriert seit: 19. Sep 2011
Ort: Deutschland
481 Beiträge
 
Delphi 11 Alexandria
 
#25

AW: TObjectList Problem

  Alt 7. Dez 2011, 12:36
Hat alles geklappt....
Ich denke es lag an dem (gerade bemerkten) PanelsList.Clear....
ich dachte bisher ich müsse .Free verwenden....
Danke trotzdem für eure Unterstützung.....

Noch eine Frage hätte ich allerdings: Ist es möglich alle Panels gleichzeitig zu Aktivieren/Deaktivieren??
Danke
Dennis

Geändert von Dennis07 ( 7. Dez 2011 um 12:39 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.536 Beiträge
 
Delphi 11 Alexandria
 
#26

AW: TObjectList Problem

  Alt 7. Dez 2011, 13:32
Free gibt die Objektliste an sich frei, Clear hingegen löscht nur die enthaltenen Elemente. Wenn OwnsObjects auf true steht, werden in beiden Fällen die enthaltenen Objekte automatisch freigebeben. Und zur 2. Frage: einfach die Liste durchgehen und Enabled setzen.
Delphi-Quellcode:
for i := 0 to FPanels.Count - 1 do
  (FPanels[i] as TPanel).Enabled := false;
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen

Geändert von DeddyH ( 7. Dez 2011 um 14:43 Uhr)
  Mit Zitat antworten Zitat
Dennis07

Registriert seit: 19. Sep 2011
Ort: Deutschland
481 Beiträge
 
Delphi 11 Alexandria
 
#27

AW: TObjectList Problem

  Alt 8. Dez 2011, 12:17
Vielen Dank für deine Hilfe... ich denke mit dem Thema bin ich jetzt durch.....

Grüße;
Dennis
Dennis
  Mit Zitat antworten Zitat
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 11:28 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