Delphi-PRAXiS
Seite 1 von 2  1 2   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Variablen über Formularen (https://www.delphipraxis.net/166824-variablen-ueber-formularen.html)

JP29 1. Mär 2012 15:50

Variablen über Formularen
 
Hallo Leute,
ich habe da mal eine Frage.
Und zwar gibt es einen Bereich in Delphi, in dem ich Variablen erstellen kann, auf den man von jeder Form zugreifen kann und wo ich vorher schon Werte hineinschreiben kann.
Freu mich über eure Antworten.

DeddyH 1. Mär 2012 15:54

AW: Variablen über Formularen
 
Variablen im interface-Abschnitt sind von jeder Unit erreichbar, die diese Unit einbindet. Und gerade das ist das "Böse" daran, so dass man so etwas eigentlich vermeiden sollte.

Bummi 1. Mär 2012 15:57

AW: Variablen über Formularen
 
Globale Variablen kannst Du z.B. in einer eigenen Unit ablegen, die Du überall einbindest wo diese gebraucht werden.
Eine weitere beliebte Stelle ist der Bereich zwischen
Delphi-Quellcode:
var

implementation
beliebiger Formulare.
Globale Variablen sollte allerdings so sparsam wie möglich eingesetzt werden.

JP29 1. Mär 2012 16:21

AW: Variablen über Formularen
 
Ok danke für die Antworten
Wo ist denn das Problem mit den globalen Variablen??
und kann man Variablen auch Größen außerhalb einer Funktion oder procedure, also ohne das vorher etwas passiert ist schon zuorden und wenn ja wie mach ich das??
oder kann ich auch von mehreren formen auf eine unit zugreifen, wenn ja wie genau gestalte ich das, sorry für die vielen fragen bin noch ein anfänger

Bummi 1. Mär 2012 16:56

AW: Variablen über Formularen
 
könnte so aussehen, um überall daruf zugreifen zu können, einfach in die uses mit aufnehmen...
Delphi-Quellcode:
unit ConstsAndGlobals;

interface

uses
  Classes, Dialogs, SysUtils, Windows, RegistryUtils, RegistryKeys, Forms, Inifiles, graphics;

Type
  EDocError = Class(Exception);
  TDokuType = (dtAnf, dtAngeb, dtAB, dtLief, dtRech, dtGS);

Const
  Meldungen: Array [1 .. 4] of String = ('Daten wurden bereits gedruckt und an die Buchhaltung ausgegeben'#13'Änderung trotzdem zulassen ?',
    'Daten wurden bereits an die Buchhaltung ausgegeben'#13'Änderung trotzdem zulassen ?',
    'Daten wurden bereits an die Buchhaltung ausgegeben'#13'Löschen trotzdem zulassen ?',
    'Bankdiskette für diesen Satz wurde bereits erstellt'#13'Löschen trotzdem zulassen ?');

  C_TailingArrayNeeedNE: Array [boolean] of String = ('', 'en');
  CRLF=#13#10;
  C_ROUNDING = 10;
  C_SETTINGS = 'Settings';

  c_admin = 1 shl 0;
  c_KillKund = 1 shl 1;
  c_KillLiefer = 1 shl 2;
  ......
  ......
  c_MissingRight = 'Keine ausreichenden Rechte vorhanden';
  C_HelpTables: Array [0 .. 16] of String = ('anrede', 'Kalkgrup', 'Artikelobergruppen', 'Branche', 'Briefanr', 'Einheit', 'Fill', 'Typ', 'Bank', 'Kasstext',
    'Buchkto', 'Lagerort', 'Mwst', 'PersGemKosten', 'ORTFZ', 'SP_Konditionen', 'Wargrup');
  C_Stst: Array [0 .. 3] of String = ('RG', 'ZE', 'KA', 'UW');

var
  G_APPLICATION_PATH: String;
  G_REPORTS_PATH: String;
  G_CommandTimeOut: Integer;
  G_InifileName: String;
  ......
  ......
  G_Parameters: TStringList;
implementation

Procedure GetIniValues;
var
  ini: TInifile;
begin
  try
    ini := TInifile.Create(G_InifileName);
    try
  ......
  ......
      G_CommandTimeOut := ini.ReadInteger(C_SETTINGS,'CommandTimeOut',10);
    finally
      ini.Free;
    end;
  except
  end;
end;

Procedure SetIniValues;
var
  ini: TInifile;
begin
  try
    ini := TInifile.Create(G_InifileName);
    try
  ......
  ......
      ini.WriteInteger(C_SETTINGS,'CommandTimeOut',G_CommandTimeOut);    
   finally
      ini.Free;
    end;
  except
  end;
end;

initialization

G_Parameters := TStringList.Create;
G_APPLICATION_PATH := IncludeTrailingPathDelimiter(ExtractFilePath(ParamStr(0)));
G_REPORTS_PATH := G_APPLICATION_PATH + 'Reports';
G_InifileName := ChangeFileExt(Application.Exename, '.ini');
GetIniValues;
G_Parameters.Delimiter := ' ';
G_Parameters.DelimitedText := CmdLine;

finalization

G_Parameters.Free;
SetIniValues;

end.
http://www.delphipraxis.net/31181-gl...onstanten.html

DeddyH 1. Mär 2012 16:59

AW: Variablen über Formularen
 
Wie gesagt, das Blöde an solchen globalen Variablen ist, dass jeder sie ohne Überprüfung verändern kann. Das kann zu sehr "lustigen" Effekten führen. Und natürlich kannst Du aus anderen Units darauf zugreifen, Du musst nur die enthaltende Unit in deren uses-Klausel aufnehmen.
Zitat:

und kann man Variablen auch Größen außerhalb einer Funktion oder procedure, also ohne das vorher etwas passiert ist schon zuorden und wenn ja wie mach ich das??
Was meinst Du damit? Die Variablen initialisieren? Globalen Variablen kannst Du bereits bei der Deklaration einen Initialwert zuweisen.
Delphi-Quellcode:
var
  GlobalInt: integer = 42;

Popov 1. Mär 2012 17:24

AW: Variablen über Formularen
 
Zitat:

Zitat von JP29 (Beitrag 1153883)
Wo ist denn das Problem mit den globalen Variablen??

Du knabberst noch an den Grundlagen. An globalen Variablen ist kaum was auszusetzen wenn du ein kleines Programm schriebst, aber irgendwann wird es unübersichtlich. Aus diesem Grund programmiert man... sagen wir mal in kleinen "Häufchen". Da ne Prozedur, da ne Funktion, und wenn ein Auftrag zehn Prozeduren durchläuft, dann schickt man die Variable per Parameter mit. Und wenn du im 10 Monaten dein altes Programm anpackst und die Variable fTrs3 seihst, dann gibt es zwei Möglichkeiten. Ist es ein lokale Variable, dann siehst du an den paar Zeilen der Prozedur wozu die da ist. Ist es ein globale Variable, dann hast du keine Ahnung wo sie überall in dem 11564 Zeilen langen Programm vorkommt.

Am Anfang erscheint es unlogisch, aber lokale Variablen sind keine Bösartigkeit, sondern ein Prozess bei dem programmieren optimiert wurde.

Übrigens, wenn du willst kannst du auch mit Goto arbeiten. Hat Delphi auch. Nur ob es ein Sinn macht, ist eine andere Frage.

Und was Units angeht. Du kannst von jeder Unit auf eine andere Unit zugreifen, wenn du sie nur in uses anmeldest.

Luckie 1. Mär 2012 17:31

AW: Variablen über Formularen
 
[QUOTE=Popov;1153902]
Zitat:

Zitat von JP29 (Beitrag 1153883)
und wenn ein Auftrag zehn Prozeduren durchläuft, dann schickt man die Variable per Parameter mit.

Nein, dann macht man eine Klasse daraus und der Parameter wird zu einem Attribut der Klasse.

Popov 1. Mär 2012 17:49

AW: Variablen über Formularen
 
Zitat:

Zitat von Luckie (Beitrag 1153904)
Nein, dann macht man eine Klasse daraus und der Parameter wird zu einem Attribut der Klasse.

Ok, ich wollte ihn nicht gleich erschrecken, sonst läuft er gleich zu Visual Basic rüber.

JP29 2. Mär 2012 16:09

AW: Variablen über Formularen
 
ok das hab ich jetzt so weit verstanden nur die umsetzung mit den units noch nicht ganz also praktisch gesehen
ich zeig euch mal ein bischen von meinem quelltext und könnt ihr mir dort zeigen wie dir beiden units aufeinander zugreifen können...

unit 1:
Delphi-Quellcode:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    GroupBox1: TGroupBox;
    Panel1: TPanel;
    GroupBox2: TGroupBox;
    GroupBox3: TGroupBox;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    ComboBox1: TComboBox;
    ComboBox2: TComboBox;
    ComboBox3: TComboBox;
    ComboBox4: TComboBox;
    Label7: TLabel;
    Label8: TLabel;
    GroupBox4: TGroupBox;
    SpinEdit1: TSpinEdit;
    Label9: TLabel;
    Button1: TButton;
    procedure ComboBox1Change(Sender: TObject);
    procedure ComboBox3Change(Sender: TObject);
    procedure ComboBox2Change(Sender: TObject);
    procedure ComboBox4Change(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  abholung: string;
  ruckgabe: string;
  dauer: integer;

implementation

uses Unit2;

{$R *.dfm}
und unit2:

Delphi-Quellcode:
unit Unit2;

interface

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

type
  TForm2 = class(TForm)
    Panel1: TPanel;
    ListBox1: TListBox;
    GroupBox1: TGroupBox;
    Image1: TImage;
    GroupBox2: TGroupBox;
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form2: TForm2;
  abholung1: string;
  ruckgabe1: string;
  dauer1: integer;

implementation

uses unit1;

{$R *.dfm}

end.
...ist das jetzt so richtig ...

und kann ich jetzt auch mit einer procedure in form1 variablen in form2 verändern ??

und wie ist das wenn ich in beiden units variablen mit gleichem namen erstelle ... erkennt delphi das??

dankle schon mal im voraus...bis jetzt großes dankeschön an alle :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:28 Uhr.
Seite 1 von 2  1 2   

Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf