Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Problem mit Variable (https://www.delphipraxis.net/75151-problem-mit-variable.html)

Gehstock 15. Aug 2006 09:34


Problem mit Variable
 
Und zwar folgendes wir sind auf FormMain und wollen eine Variable erzeugen mit:
Delphi-Quellcode:
i:=ConfigDlg.ComboBox4.ItemIndex;
ConfigDLG heißt bei mir ne andere Form

Beim Erzeugen gibts aber einen Fehler
Zitat:

Access Violation............
den man wegdrücken kann danach Läuft das Prog aber wie es soll. Kann man keine Variablen auf anderen Forms bilden?

GuenterS 15. Aug 2006 09:46

Re: Problem mit Variable
 
Klingt danach, dass Du den ConfigDlg nicht erzeugt hast.

Jürgen Thomas 15. Aug 2006 09:47

Re: Problem mit Variable
 
Zitat:

Zitat von Gehstock
Und zwar folgendes wir sind auf FormMain und wollen eine Variable erzeugen mit:
Delphi-Quellcode:
i:=ConfigDlg.ComboBox4.ItemIndex;
ConfigDLG heißt bei mir ne andere Form

Beim Erzeugen gibts aber einen Fehler
Zitat:

Access Violation............
den man wegdrücken kann danach Läuft das Prog aber wie es soll. Kann man keine Variablen auf anderen Forms bilden?

1. Die genaue Formulierung der Zugriffsverletzung hilft bei der Fehlersuche ungemein. Andere Nutzer sagen gerne:
Zitat:

Meine Glaskugel ist gerade kaputt.
2. Variable auf andere Forms hängen von den Zugriffsrechten ab. Standard für Controls sind private. Notfalls (vor allem als schnelle Lösung) kannst Du von ConfigDLG aus den Zugriff freigeben, indem Du die ComboBox4 anders deklarierst (public oder published).

3. Als saubere Lösung kannst Du den ItemIndex übergeben:
Delphi-Quellcode:
private function GetComboBox4ItemIndex: integer;
public property ComboBox4ItemIndex: integer read GetComboBox4ItemIndex;
...
function TConfigDLG.GetComboBox4ItemIndex: integer;
begin
  result := ComboBox4.ItemIndex;
end;
Es wird dringend empfohlen, eine solche saubere Lösung zu verwenden.

Jürgen

Muetze1 15. Aug 2006 09:56

Re: Problem mit Variable
 
Zitat:

Zitat von Jürgen Thomas
2. Variable auf andere Forms hängen von den Zugriffsrechten ab. Standard für Controls sind private. Notfalls (vor allem als schnelle Lösung) kannst Du von ConfigDLG aus den Zugriff freigeben, indem Du die ComboBox4 anders deklarierst (public oder published).

Bei Win32, Delphi? Nein - die sind alle published. Der Form Designer klatscht dir jede Komponente die du einfügst oben in die Klasse, direkt hinter TForm1=Class(TForm), und dort sind diese öffentlich. Es wird keine Sichtbarkeit eingeschränkt - nicht im geringsten. Die Elemente sind alle sichtbar von aussen - ausser natürlich man trägt per Hand vor den Komponentendeklarationen ein "private" ein...

GuenterS 15. Aug 2006 09:56

Re: Problem mit Variable
 
Zitat:

Zitat von Jürgen Thomas
2. Variable auf andere Forms hängen von den Zugriffsrechten ab. Standard für Controls sind private. Notfalls (vor allem als schnelle Lösung) kannst Du von ConfigDLG aus den Zugriff freigeben, indem Du die ComboBox4 anders deklarierst (public oder published).

Die online Hilfe sagt da aber was ganz anderes (genauso wie es sich dann auch verhält)

Zitat:

Zitat von Delphi Hilfe
Ein Element ohne Attribut erhält automatisch die Sichtbarkeit des vorhergehenden Elements in der Deklaration. Die Elemente am Anfang einer Klassendeklaration ohne explizite Sichtbarkeitsangabe werden standardmäßig als published deklariert, wenn die Klasse im Status {$M+} compiliert oder von einer mit {$M+} compilierten Klasse abgeleitet wurde. Andernfalls erhalten sie das Attribut public.

Das heißt, dass ein Control mindestens public ist, wenn man es zur Designzeit einfügt.

Zitat:

Zitat von Muetze
Bei Win32, Delphi? Nein - die sind alle published. Der Form Designer klatscht dir jede Komponente die du einfügst oben in die Klasse, direkt hinter TForm1=Class(TForm), und dort sind diese öffentlich. Es wird keine Sichtbarkeit eingeschränkt - nicht im geringsten. Die Elemente sind alle sichtbar von aussen - ausser natürlich man trägt per Hand vor den
Komponentendeklarationen ein "private" ein...

Dann darfst dich aber auch nicht wundern, wenn im ObjectInspector plötzlich keine Ereignismethoden mehr zur Verfügung stehen, wenn Du private davor schreibst...

Gehstock 15. Aug 2006 10:12

Re: Problem mit Variable
 
Ok Ok Ok

Habs Behoben mit:
ConfigDLG

Delphi-Quellcode:
procedure TConfigDlg.ComboBox4Change(Sender: TObject);
var
Typ : Integer;
begin
 Typ := ConfigDlg.ComboBox4.ItemIndex
end;
und auf FormMain
Delphi-Quellcode:
i:=Typ;

Muetze1 15. Aug 2006 10:30

Re: Problem mit Variable
 
Zitat:

Zitat von GuenterS
Dann darfst dich aber auch nicht wundern, wenn im ObjectInspector plötzlich keine Ereignismethoden mehr zur Verfügung stehen, wenn Du private davor schreibst...

Ich mache sowas ja nicht, aber ein manueller Eingriff wäre der einzige Weg um zu dem von Jürgen Thomas beschriebenen Verhalten zu kommen...

Zitat:

Zitat von Gehstock
Habs Behoben mit:
ConfigDLG

Delphi-Quellcode:
procedure TConfigDlg.ComboBox4Change(Sender: TObject);
var
Typ : Integer;
begin
 Typ := ConfigDlg.ComboBox4.ItemIndex
end;
und auf FormMain
Delphi-Quellcode:
i:=Typ;

Hä? Wie funktioniert denn dies? Du weist den ItemIndex einer lokalen Variable zu und dann irgendwo in einer anderen Form weist du die lokale Variable einer anderen Variable zu?

1. ist es lokale Variable die somit nicht ausserhalb der ConfigDlg Methode sichtbar ist, somit ist auch kein Zugriff möglich.
2. die lokale Variable verliert ihre Gültigkeit und ihren Inhalt mit verlassen der Methode.

Daher: Wie funktioniert dieses?

Gehstock 15. Aug 2006 10:36

Re: Problem mit Variable
 
Läuft aber wie es soll Deswegen mach ich mir jetzt keinen Kopf mehr Deswegen

Jürgen Thomas 15. Aug 2006 10:41

Re: Problem mit Variable
 
@GuenterS
@Muetze1
Zitat:

Form Designer klatscht dir jede Komponente die du einfügst oben in die Klasse, direkt hinter TForm1=Class(TForm), und dort sind diese öffentlich. Es wird keine Sichtbarkeit eingeschränkt
Oh, Sch... Bei meinen anderen Beiträgen schreibe ich die Warnung hin, dass ich zz. überwiegend mit C# arbeite. Dort gilt dies aber wirklich; deshalb habe ich das (ohne Prüfung) auf Delphi übertragen.

Unabhängig davon gilt aber doch wohl trotzdem, dass man nur mit Vorsicht direkt auf Controls in anderen Formularen zugreifen sollte und einzelne Informationen durch Eigenschaften oder öffentliche Funktionen zur Verfügung gestellt werden sollen.

Jürgen

GuenterS 15. Aug 2006 11:04

Re: Problem mit Variable
 
Zitat:

Zitat von Jürgen Thomas
@GuenterS
@Muetze1
Zitat:

Form Designer klatscht dir jede Komponente die du einfügst oben in die Klasse, direkt hinter TForm1=Class(TForm), und dort sind diese öffentlich. Es wird keine Sichtbarkeit eingeschränkt
Oh, Sch... Bei meinen anderen Beiträgen schreibe ich die Warnung hin, dass ich zz. überwiegend mit C# arbeite. Dort gilt dies aber wirklich; deshalb habe ich das (ohne Prüfung) auf Delphi übertragen.

Unabhängig davon gilt aber doch wohl trotzdem, dass man nur mit Vorsicht direkt auf Controls in anderen Formularen zugreifen sollte und einzelne Informationen durch Eigenschaften oder öffentliche Funktionen zur Verfügung gestellt werden sollen.

Jürgen

Stimmt, hat aber auch niemand bestritten. :)

Zitat:

Zitat von Muetze1
Zitat:

Zitat von Gehstock
Habs Behoben mit:
ConfigDLG

Delphi-Quellcode:
procedure TConfigDlg.ComboBox4Change(Sender: TObject);
var
Typ : Integer;
begin
 Typ := ConfigDlg.ComboBox4.ItemIndex
end;
und auf FormMain
Delphi-Quellcode:
i:=Typ;

Hä? Wie funktioniert denn dies? Du weist den ItemIndex einer lokalen Variable zu und dann irgendwo in einer anderen Form weist du die lokale Variable einer anderen Variable zu?

1. ist es lokale Variable die somit nicht ausserhalb der ConfigDlg Methode sichtbar ist, somit ist auch kein Zugriff möglich.
2. die lokale Variable verliert ihre Gültigkeit und ihren Inhalt mit verlassen der Methode.

Daher: Wie funktioniert dieses?

Vermutlich hat er eine globale Variable die auch Typ heißt und es geht rein zufällig für die Fälle die er getestet hat.

Muetze1 15. Aug 2006 11:07

Re: Problem mit Variable
 
Zitat:

Zitat von Gehstock
Läuft aber wie es soll Deswegen mach ich mir jetzt keinen Kopf mehr Deswegen

Nette Einstellung - na dann viel Spass wenn du in einem halben Jahr ein Problem hast und debuggen musst und nicht mehr durch siehst. Vor allem wenn man nicht weiss was man tut, was soll denn dann für eine Software dabei rauskommen?

Zitat:

Zitat von Jürgen Thomas
Unabhängig davon gilt aber doch wohl trotzdem, dass man nur mit Vorsicht direkt auf Controls in anderen Formularen zugreifen sollte und einzelne Informationen durch Eigenschaften oder öffentliche Funktionen zur Verfügung gestellt werden sollen.

Bei modalen Dialog verdecke ich meist die ShowModal Methode und ergänze sie um benötigte bzw. zu veränderne Variablen. Aber viele Wege führe nach Rom...


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