AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Variable aus anderer Unit kann nicht richtig ausgelesen werd
Thema durchsuchen
Ansicht
Themen-Optionen

Variable aus anderer Unit kann nicht richtig ausgelesen werd

Ein Thema von JBJHJM · begonnen am 30. Jun 2009 · letzter Beitrag vom 1. Jul 2009
Antwort Antwort
Seite 2 von 3     12 3      
Popov
(Gast)

n/a Beiträge
 
#11

Re: schon wieder ein Problem mit globale Variablen...

  Alt 30. Jun 2009, 15:31
Zitat von JBJHJM:
Ziel: Ich will auf eine Variable einer anderen Unit zugreifen, der Einfachheit halber erstmal mit showmessage(Form1.variable).
Problem: Der genannte Befehl erzeugt einfach nur eine leere Meldung.
Da du mit Form1.variable kommst und man deshalb nicht weiß wo du deine Variable deklariert hast, hier ein kleines 1 x 1 der Variablen. Ich habe 10 Variablen in verschiedenen Bereichen deklariert. Fünf in Unit2, fünf in Unit1. Je nachdem von wo man sie abrufen will, klappt es entweder nicht oder man muß etwas beachten. Zuerst Unit1 mit der Abfrage, dann Unit2:

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
    Variable1a: String;
  public
    { Public-Deklarationen }
    Variable2a: String;
  end;


var
  Form1: TForm1;
  Variable3a: String;

implementation

{$R *.dfm}

uses
  Unit2;

var
  Variable4a: String;

procedure TForm1.FormCreate(Sender: TObject);
var
  Variable5a: String;
begin
  Variable1a := 'Hallo Welt 1 A!';
  Variable2a := 'Hallo Welt 2 A!';
  Variable3a := 'Hallo Welt 3 A!';
  Variable4a := 'Hallo Welt 4 A!';
  Variable5a := 'Hallo Welt 5 A!';
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  Variable6a: String;
begin
  Variable6a := 'Hallo Welt 6 A!';

  //## Fremde Unit ##
  //ShowMessage(Variable1b); //klappt nicht - privat und andere Unit
  //ShowMessage(Variable2b); //klappt so nicht, trotz public
    ShowMessage(Form2.Variable2b); //klappt, aber nur mit Form2 davor
  ShowMessage(Variable3b); //klappt, wenn Unit eingetragen. Globale Variable
  //ShowMessage(Variable4b); //klappt nicht, global nur innerhalb der eigenen Unit
  //ShowMessage(Variable5b); //klappt nicht, lokale Variable

  //## Eigene Unit ##
  ShowMessage(Variable1a); //klappt, so aber nur in Form1-Prozeduren
    ShowMessage(Form1.Variable1a); //in normalen Prozeduren Form1 davor setzten
  ShowMessage(Variable2a); //klappt, so aber nur in Form1-Prozeduren
    ShowMessage(Form1.Variable2a); //in normalen Prozeduren Form1 davor setzten
  ShowMessage(Variable3a); //klappt überall in der eigenen Unit und in fremden Units
  ShowMessage(Variable4a); //klappt überall in der eigenen Unit
  //ShowMessage(Variable5a); //klappt nicht in fremder Prozedur, lokale Variable
  ShowMessage(Variable6a); //klappt, lokale Variable
end;

procedure Test; // normale Prozedur
begin
  //## Fremde Unit ##
  //ShowMessage(Variable1b); //klappt nicht - privat und andere Unit
  //ShowMessage(Variable2b); //klappt so nicht, trotz public
    ShowMessage(Form2.Variable2b); //klappt, aber nur mit Form2 davor
  ShowMessage(Variable3b); //klappt, wenn Unit eingetragen. Globale Variable
  //ShowMessage(Variable4b); //klappt nicht, global nur innerhalb der eigenen Unit
  //ShowMessage(Variable5b); //klappt nicht, lokale Variable

  //## Eigene Unit ##
  //ShowMessage(Variable1a); //klappt nicht so...
    ShowMessage(Form1.Variable1a); //...in normalen Prozeduren Form1 davor setzten
  //ShowMessage(Variable2a); //klappt nicht so...
    ShowMessage(Form1.Variable2a); //in normalen Prozeduren Form1 davor setzten
  ShowMessage(Variable3a); //klappt überall in der eigenen Unit und in fremden Units
  ShowMessage(Variable4a); //klappt überall in der eigenen Unit
  //ShowMessage(Variable5a); //klappt nicht in fremder Prozedur, lokale Variable
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  Test;
end;

end.
Unit2

Delphi-Quellcode:
unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TForm2 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
    Variable1b: String;
  public
    { Public-Deklarationen }
    Variable2b: String;
  end;

var
  Form2: TForm2;
  Variable3b: String;

implementation

{$R *.dfm}

var
  Variable4b: String;

procedure TForm2.FormCreate(Sender: TObject);
var
  Variable5b: String;
begin
  Variable1b := 'Hallo Welt 1 B!';
  Variable2b := 'Hallo Welt 2 B!';
  Variable3b := 'Hallo Welt 3 B!';
  Variable4b := 'Hallo Welt 4 B!';
end;

end.
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#12

Re: schon wieder ein Problem mit globale Variablen...

  Alt 30. Jun 2009, 15:33
Zitat von R2009:
Es gibt unter Delphi keine "globalen Variablen". Es gibt nur "Unit-globale" Variablen.
Naja, man sagt es aber so.
  Mit Zitat antworten Zitat
Benutzerbild von Die Muhkuh
Die Muhkuh

Registriert seit: 21. Aug 2003
7.332 Beiträge
 
Delphi 2009 Professional
 
#13

Re: schon wieder ein Problem mit globale Variablen...

  Alt 30. Jun 2009, 15:49
Anstatt hier alle ins Blaue hinein raten, wartet doch einfach, bis der TE sich wieder meldet?!
  Mit Zitat antworten Zitat
samso

Registriert seit: 29. Mär 2009
439 Beiträge
 
#14

Re: schon wieder ein Problem mit globale Variablen...

  Alt 30. Jun 2009, 16:30
Zitat:
R2009 hat folgendes geschrieben:
Es gibt unter Delphi keine "globalen Variablen". Es gibt nur "Unit-globale" Variablen.
Was ist z.B. "ExitCode" denn dann für eine Variable? Ich hatte das bisher immer so verstanden: "Eine Variable, die im ganzen Programm für alle Blöcke zur Verfügung steht, heißt globale Variable"
  Mit Zitat antworten Zitat
Tyrael Y.

Registriert seit: 28. Jul 2003
Ort: Stuttgart
1.093 Beiträge
 
Delphi 2007 Professional
 
#15

Re: schon wieder ein Problem mit globale Variablen...

  Alt 30. Jun 2009, 16:35
Man braucht hier nicht über Wörter zu streiten global oder unit global - beide meinen das Selbe.

Selbstverständlich wird auch in Delphi auf globale Variablen zugegriffen. Wäre es ein Teufelswerk, wäre eine
Implementierung solch einer Variable gar nicht erst möglich.

Der Rat im eigenen Code keine globalen Variablen zu nutzen, sollte man trotzdem beherzigen.
Umso umfangreicher der Code wird umso gefährlicher wird die Benutzung solcher globalen Variablen.
Levent Yildirim
Erzeugung von Icons aus Bildern:IconLev
  Mit Zitat antworten Zitat
JBJHJM

Registriert seit: 16. Jan 2009
88 Beiträge
 
Delphi 2005 Personal
 
#16

Re: Variable aus anderer Unit kann nicht richtig ausgelesen

  Alt 30. Jun 2009, 17:55
Ich habe oben noch mal etwas ergänzt, die Variable wird doch richtig ausgelesen, aber sie scheint einfach leer zu sein - obwohl sie vorher zugewiesen wurde.

@ Popov: Vielen Dank! Das solltest du vielleicht Mal allgemein irgendwo reinstellen, ist besser als die ganzen anderen Hilfe-Threads zu dem Thema.

Ich probiere nochmal eben was aus...

Ansonsten nehme ich mir mal ein paar von den Räten hier zu Herzen und verzichte auf "globale Variablen" - habe es halt so gelernt, stehe noch ziemlich am Anfang.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#17

Re: Variable aus anderer Unit kann nicht richtig ausgelesen

  Alt 30. Jun 2009, 18:18
Wenn Du keine Dinge wie Referenzzählung brauchst, solltest Du wie bereits angesprochen lieber Properties verwenden. Das klingt kompliziert, ist aber im Grunde ganz einfach:
Delphi-Quellcode:
type
  TForm1 = class(TForm)
  ...
  private
    //eine private Variable vom gewünschten Datentyp definieren
    FVariable: Datentyp;
    ...
  public
    //und über eine Property indirekten Zugriff auf obige Variable gestatten
    property Variable: Datentyp read FVariable write FVariable;
    ...
  end;
Nun hat jede Instanz, die Du von Deiner Klasse anlegst, eine eigene Property "Variable" und kommt sich garantiert nicht mit anderen Instanzen ins Gehege. Außerdem kannst Du Properties auch ReadOnly/WriteOnly definieren oder über die sog. Getter- und Settermethoden z.B. Fehleingaben abfangen.
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
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#18

Re: Variable aus anderer Unit kann nicht richtig ausgelesen

  Alt 30. Jun 2009, 18:37
Zitat von JBJHJM:
habe es halt so gelernt, stehe noch ziemlich am Anfang.
Ich kann mich daran erinnern wo ich mal mit VB Programmierern zu tun hatte und mir einige deren Programme angucken mußte. Dabei ist mir aufgefallen, daß es bei denen nicht unüblich war eine eigene Unit (in VB heißt das anders) nur für globale Variablen zu haben. Da waren Listen von zig Variablen die überall galten. Ich hab es zur Kenntnis genommen und dachte mir, daß es in VB so üblich ist.
  Mit Zitat antworten Zitat
JBJHJM

Registriert seit: 16. Jan 2009
88 Beiträge
 
Delphi 2005 Personal
 
#19

Re: Variable aus anderer Unit kann nicht richtig ausgelesen

  Alt 30. Jun 2009, 19:43
@ Popov - Ja, mein Lehrer hat das auch ganz selbstverständlich so erklärt...

@ DeddyH - Danke, ich probiers mal aus!
  Mit Zitat antworten Zitat
JBJHJM

Registriert seit: 16. Jan 2009
88 Beiträge
 
Delphi 2005 Personal
 
#20

Re: Variable aus anderer Unit kann nicht richtig ausgelesen

  Alt 1. Jul 2009, 16:17
Habe jetzt 'property' benutzt, aber das Problem besteht weiterhin. Wenn ich in der 2. Unit versuche "Instanz" auszulesen, findet er sie zwar, zeigt aber an, dass sie leer ist.

Habe noch zwei Fragen (mit den Fragezeichen im Quelltext markiert):
1. Muss ich die Variable hier deklarieren - ansonsten zeigt Delphi an, es gäbe keine Variable 'WichtigerString'.
2. Greife ich so richtig auf 'Instanz' zu?

3. Wieso funktioniert das nicht *nein Scherzfrage...*

Delphi-Quellcode:
unit ErsteUnit
type
  TForm1 = class(TForm)
 ...
  private
    WichtigerString: String;
  public
    property Instanz: string read WichtigerString write WichtigerString;
  end;

var
  Form1: TForm1;
  WichtigerString: string; // ????????? 1.
    
implementation
...
begin
  WichtigerString:= 'A1CW5d3f';
end.
Delphi-Quellcode:
unit ZweiteUnit;
...
type
  TForm2 = class(TForm)
 ...

var
    Form2: TForm2;

implementation

uses ErsteUnit;
...
begin
showmessage(form1.instanz); //???????? 2.
end;
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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 22:25 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