![]() |
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:
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 ...
for i := 0 to Panel1.Controls.Count - 1 do something
Daneben habe ich noch versucht:
Delphi-Quellcode:
Hier kam die Fehlermeldung: frmSpielplan enthält kein Element namens Panel1 ...
for i := 0 to frmSpielplan.Panel1.Controls.Count - 1 do something
Für Hinweise bin ich wie immer dankbar. mfg Jürgen |
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:
Falls nein, hat die Methode nichts außerhalb der Form zu suchen.
type
MyHelperClass = static class class method DoSomething(panel: Panel); end; |
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:
brachte die Fehlermeldung: "Nicht deklarierter Bezeichner 'static' ..."
MyHelperClass = static class
class method RefreshStatus(panel: panel; n : integer); end; |
Re: Zugriff auf Komponenten aus eigener Prozedur
Zitat:
Beim zweiten Versuch sollte geändert werden:
Delphi-Quellcode:
Denn Panel1 ist als Bestandteil der Klasse TfrmSpielplan und nicht der Instanz eingeführt.
// nicht:
frmSpielplan.Panel1.Controls.Count // sondern: self.Panel1.Controls.Count 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 |
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 |
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...
|
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:
[edit] Wo kommt denn nun die Mütze her :stupid: ? [/edit] |
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:
eingegeben, in der Hoffnung, ich könnte dann im Implementationsteil die Prozedur implementieren. Ich erhalte jedoch die Fehlermeldung: "Nicht deklarierter Bezeichner 'Panel1' ...".
procedure RefreshStatus(sender: System.Object; n: integer);
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:
In der definierenden Deklaration im implementation-Abschnitt:
procedure RefreshStatus(sender: System.Object; n: integer);
Delphi-Quellcode:
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.
procedure frmSpielplan.RefreshStatus(sender: System.Object;n: integer);
Jetzt hab' ich auch das noch geschafft:
Delphi-Quellcode:
Vielleicht hilft's ja irgend jemand.
for i := 0 to Self.Panel1.Controls.Count - 1 do
begin j := i+1; (Panel1.Controls[i] as &Label).Text := j.ToString; end; |
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