AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Zugriff auf Komponenten aus eigener Prozedur

Ein Thema von gfjs · begonnen am 22. Aug 2006 · letzter Beitrag vom 23. Aug 2006
Antwort Antwort
gfjs

Registriert seit: 8. Dez 2005
Ort: Hohenkammer
298 Beiträge
 
Delphi 2006 Professional
 
#1

Zugriff auf Komponenten aus eigener Prozedur

  Alt 22. Aug 2006, 11:58
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
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:
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
Mein neues Motto (von "Unbekannt"):
Gewinnen: Wenn Du kannst - Verlieren: Wenn Du musst - Aufgeben: NIE!
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#2

Re: Zugriff auf Komponenten aus eigener Prozedur

  Alt 22. Aug 2006, 12:27
Diese schrecklichen globalen Formvariablen vergisst du am Besten gleich wieder .
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.
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
gfjs

Registriert seit: 8. Dez 2005
Ort: Hohenkammer
298 Beiträge
 
Delphi 2006 Professional
 
#3

Re: Zugriff auf Komponenten aus eigener Prozedur

  Alt 22. Aug 2006, 12:41
@ 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' ..."
Mein neues Motto (von "Unbekannt"):
Gewinnen: Wenn Du kannst - Verlieren: Wenn Du musst - Aufgeben: NIE!
  Mit Zitat antworten Zitat
Jürgen Thomas

Registriert seit: 13. Jul 2006
Ort: Berlin
750 Beiträge
 
#4

Re: Zugriff auf Komponenten aus eigener Prozedur

  Alt 22. Aug 2006, 13:33
Zitat von gfjs:
for i := 0 to Panel1.Controls.Count - 1 do something Fehlermeldung: Nicht deklarierter Bezeichner ...
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
#D mit C# für NET, dazu Firebird
früher: Delphi 5 Pro, Delphi 2005 Pro mit C# (also NET 1.1)
Bitte nicht sauer sein, wenn ich mich bei Delphi-Schreibweisen verhaue; ich bin inzwischen an C# gewöhnt.
  Mit Zitat antworten Zitat
gfjs

Registriert seit: 8. Dez 2005
Ort: Hohenkammer
298 Beiträge
 
Delphi 2006 Professional
 
#5

Re: Zugriff auf Komponenten aus eigener Prozedur

  Alt 22. Aug 2006, 13:56
@ 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
Mein neues Motto (von "Unbekannt"):
Gewinnen: Wenn Du kannst - Verlieren: Wenn Du musst - Aufgeben: NIE!
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#6

Re: Zugriff auf Komponenten aus eigener Prozedur

  Alt 22. Aug 2006, 14:23
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...
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#7

Re: Zugriff auf Komponenten aus eigener Prozedur

  Alt 22. Aug 2006, 14:26
Ich verstehe nicht, warum du die Methode nicht in der Form deklarieren willst, das wäre wirklich das Einfachste.

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 ? [/edit]
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
gfjs

Registriert seit: 8. Dez 2005
Ort: Hohenkammer
298 Beiträge
 
Delphi 2006 Professional
 
#8

Re: Zugriff auf Komponenten aus eigener Prozedur

  Alt 23. Aug 2006, 04:30
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"

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:
    procedure RefreshStatus(sender: System.Object; n: integer); In der definierenden Deklaration im implementation-Abschnitt:
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.
Mein neues Motto (von "Unbekannt"):
Gewinnen: Wenn Du kannst - Verlieren: Wenn Du musst - Aufgeben: NIE!
  Mit Zitat antworten Zitat
Antwort Antwort


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 09:48 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