Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Prism Zugriff auf Komponenten aus eigener Prozedur (https://www.delphipraxis.net/75610-zugriff-auf-komponenten-aus-eigener-prozedur.html)

gfjs 22. Aug 2006 11:58


Zugriff auf Komponenten aus eigener Prozedur
 
Hallo, Allerseits.

Auf einem Formular befindet sich ein zur Entwurfszeit eingefügtes Panel, auf dem zur Laufzeit eine Reihe von Labels platziert werden. In einer Prozedur sollen nun diese Labels mit
Delphi-Quellcode:
for i := 0 to Panel1.Controls.Count - 1 do something
diese Labels durchlaufen werden - allerdings mit einer eigenen Prozedur "RefreshStatus(n:integer)", die außerhalb des Formulars deklariert wird. Leider habe ich noch keine Möglichkeit gefunden, auf das Panel zuzugreifen. Die o.a. Möglichkeit brachte die Fehlermeldung: Nicht deklarierter Bezeichner ...

Daneben habe ich noch versucht:
Delphi-Quellcode:
for i := 0 to frmSpielplan.Panel1.Controls.Count - 1 do something
Hier kam die Fehlermeldung: frmSpielplan enthält kein Element namens Panel1 ...

Für Hinweise bin ich wie immer dankbar.

mfg Jürgen

Khabarakh 22. Aug 2006 12:27

Re: Zugriff auf Komponenten aus eigener Prozedur
 
Diese schrecklichen globalen Formvariablen vergisst du am Besten gleich wieder :zwinker: .
Wird in der Methode nur auf das Panel zugegriffen? Falls ja, solltest du es per Parameter übergeben:
Delphi-Quellcode:
type
  MyHelperClass = static class
    class method DoSomething(panel: Panel);
  end;
Falls nein, hat die Methode nichts außerhalb der Form zu suchen.

gfjs 22. Aug 2006 12:41

Re: Zugriff auf Komponenten aus eigener Prozedur
 
@ Khabarak

Vielen Dank für die schnelle Antwort. Leider fällt mir keine andere Möglichkeit ein, als das so zu lösen.

In dem Programm passiert folgendes:

Mit jedem Klick auf eines der Labels verändert sich der Text eines oder mehrerer Labels. Nach jedem Klick wird der Zustand aller Labels in einem Array gespeichert. Um zu erreichen, dass mit Navigationstasten vor und zurück navigiert werden kann, muss ich den jeweiligen Zustand wieder herstellen. D.h. ich muss die Werte aus dem Array wieder in die Labels bringen. - Ich hoffe, ich habe mich einigermaßen verständlich ausgedrückt.

Kann ich das auch anders lösen, als mit einer Prozedur, die außerhalb des Formulars deklariert ist?

mfg Jürgen

Vielleicht zur Erläuterung ein einfaches Beispiel:

Panel1 enthält 10 Labels, deren Text-Eigenschaft '0' ist.
1. Klick auf Label9 => Label9.Text := '1';
2. Klick auf Label6 => Label6.Text := '2';
3. Klick auf Label2 => Label2.Text := '3';
Klick auf Navigationstaste "zurück": Label2.Text muss wieder '0' sein
Klick auf Navigationstaste "Vor": Label2.Text muss wieder '3' sein

PS

Delphi-Quellcode:
 MyHelperClass = static class
    class method RefreshStatus(panel: panel; n : integer);
  end;
brachte die Fehlermeldung: "Nicht deklarierter Bezeichner 'static' ..."

Jürgen Thomas 22. Aug 2006 13:33

Re: Zugriff auf Komponenten aus eigener Prozedur
 
Zitat:

Zitat von gfjs
Delphi-Quellcode:
for i := 0 to Panel1.Controls.Count - 1 do something
Fehlermeldung: Nicht deklarierter Bezeichner ...
Delphi-Quellcode:
for i := 0 to frmSpielplan.Panel1.Controls.Count - 1 do something
Fehlermeldung: frmSpielplan enthält kein Element namens Panel1 ...

Bei der ersten Fehlermeldung sollte doch auch angegeben sein, welcher Bezeichner nicht deklariert wurde.

Beim zweiten Versuch sollte geändert werden:
Delphi-Quellcode:
//  nicht:
frmSpielplan.Panel1.Controls.Count
//  sondern:
self.Panel1.Controls.Count
Denn Panel1 ist als Bestandteil der Klasse TfrmSpielplan und nicht der Instanz eingeführt.

Beide Fehlermeldungen zusammen lassen mich aber vermuten, dass zwischen dem Formular und Panel1 noch ein anderes Control als Zwischenschicht liegt.

Merke: Unter NET sind Controls (direkt) immer nur innerhalb eines Containers enthalten, gehören aber nicht unmittelbar zum Formular. (Deswegen muss man, wenn man z.B. alle Arten von Labels anpassen will, rekursiv alle Container durchlaufen.)

Hilft dies? Jürgen

gfjs 22. Aug 2006 13:56

Re: Zugriff auf Komponenten aus eigener Prozedur
 
@ Jürgen Thomas

Fehlermeldung im ersten Beispiel: Nicht deklarierter Bezeichner Panel1

Dein Vorschlag hilft leider nicht weiter, er produziert folgende Fehlermeldungen:

Nicht deklarierter Bezeichner 'self' ...
Nicht deklarierter Bezeichner 'Panel1' ...

Es ist auch kein weiteres Control zwischen dem Formular und dem Panel. Zur Entwurfszeit wurden in das Formular das Label "Dummy" und Panel1 eingefügt und dann zur Laufzeit die Labels auf dem Panel.

Ich habe kein Problem damit, zB. aus der Methode "procedure frmSpielplan.dummy_Click(sender: System.Object; e: System.EventArgs);" die Labels zu durchlaufen. Die Probleme treten erst in der Procedur "procedure RefreshStatus(n:integer); auf.

mfg Jürgen

Muetze1 22. Aug 2006 14:23

Re: Zugriff auf Komponenten aus eigener Prozedur
 
Ja, ganz logisch. Da es keine Methode ist, hat es auch keinen Zugriff auf die Elemente der Klasse, da sie nunmal nicht zur Klasse gehört. Wie Khabarakh schon vorgeschlagen hatte: übergebe dir beim Aufruf die Instanz oder bau es um zu einer Methode der Klasse...

Khabarakh 22. Aug 2006 14:26

Re: Zugriff auf Komponenten aus eigener Prozedur
 
Ich verstehe nicht, warum du die Methode nicht in der Form deklarieren willst, das wäre wirklich das Einfachste.

Zitat:

Zitat von gfjs
Delphi-Quellcode:
 MyHelperClass = static class
    class method RefreshStatus(panel: panel; n : integer);
  end;
brachte die Fehlermeldung: "Nicht deklarierter Bezeichner 'static' ..."

Das ist Chrome-Code ;) .Ich habe weder eine Delphi.Net-Referenz noch einen -Compiler zur Hand.

[edit] Wo kommt denn nun die Mütze her :stupid: ? [/edit]

gfjs 23. Aug 2006 04:30

Re: Zugriff auf Komponenten aus eigener Prozedur
 
Guten Morgen, Allerseits.

Vielen Dank für Eure Bemühungen, aber leider komme ich damit nicht klar. Ich habe in der Typ-Deklaration des Formulars unter "public"

Delphi-Quellcode:
procedure RefreshStatus(sender: System.Object; n: integer);
eingegeben, in der Hoffnung, ich könnte dann im Implementationsteil die Prozedur implementieren. Ich erhalte jedoch die Fehlermeldung: "Nicht deklarierter Bezeichner 'Panel1' ...".

Jetzt wäre ich sehr dankbar, wenn mir jemand von Euch erklären könnte, wie ich das Problem lösen kann.

mfg Jürgen


Es geschehen noch Zeichen und Wunder! - Ich hab's doch noch weitgehend selbst geschafft!

In der Typ-Deklaration des Formulars:
Delphi-Quellcode:
    procedure RefreshStatus(sender: System.Object; n: integer);
In der definierenden Deklaration im implementation-Abschnitt:
Delphi-Quellcode:
procedure frmSpielplan.RefreshStatus(sender: System.Object;n: integer);
Wenn ich die Prozedur nun per Klick auf einen Button aufrufe, kann ich die Eigenschaften des Panels und des Formulars verändern. Was mir aber noch nicht gelingt, ist auf die Eigenschaften der zur Laufzeit erzeugten Labels zuzugreifen.


Jetzt hab' ich auch das noch geschafft:

Delphi-Quellcode:
  for i := 0 to Self.Panel1.Controls.Count - 1 do
  begin
    j := i+1;
    (Panel1.Controls[i] as &Label).Text := j.ToString;
  end;
Vielleicht hilft's ja irgend jemand.


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