[delphi] Variabel over gehele project

Pagina: 1
Acties:

  • bgever
  • Registratie: April 2002
  • Laatst online: 28-05-2021
Ik heb uren op inet gezocht en de help van delphi heeft me ook niet verder geholpen.

Ik wil een of meerdere variabelen over het hele project (programma) declaren.
Maar hoe moet dat?

Ik heb in de code van project al var gebruikt, maar dat wil niet werken.
Ik ben een beginner op Delphi, maar de tuto die ik gebruik wijst me niet verder uit...

  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
Gebruik een class, sluit hem in met het Singleton design pattern en gebruik deze overal.

Hierdoor heb je een object welke overal te benaderen is, en waarvan er maar 1 van kan bestaan. Mooier kan het niet imho ;)

Voorbeeld (wel in java, maarja, het idee wordt wel duidelijk zo)
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
public class GlobalCountVariableSingleton {

        private static GlobalCountVariableSingleton _instance   = null;
        private static final int COUNTER_START_VALUE            = 0;
        
        private int _counter;
        
        private GlobalCountVariableSingleton( int theCounter ) {
                
                setCount( theCounter );
        }
        
        private setCount( int theCounter ) {
                
                _counter = theCounter;
        }
        
        public getCount( ){
                
                return _counter;
        }
        
        public raiseCounter( int amount ){
                
                setCount( getCount() + amount );
        }
        
        public static GlobalCountVariableSingleton getInstance( ) {
                
                if( _instance == null ) {
                        _instance = new GlobalCountVariableSingleton( COUNTER_START_VALUE );
                }
                
                return _instance;
        }
}


aanroepen met
Java:
1
2
3
4
5
6
public void methodX( ){

   //raise counter by 6
   //
   GlobalCountVariableSingleton.getInstance().raiseCounter( 6 );
}


edit:
Mooie code wordt ook nergens meer gewaardeerd :) ;)

  • bgever
  • Registratie: April 2002
  • Laatst online: 28-05-2021
Hmz, dat moet ik even uitzoeken...

Ik heb wel eerst de code gehad, en dat was een stuk makkeijker. 3 regeljes of zow... Dat zoek ik eigenlijk...

  • Apen-nootjes
  • Registratie: September 2001
  • Laatst online: 03-04-2025

Apen-nootjes

aka Apen-klootjes

MMM... 'k weet niks van Delphi af maar in Visual Basic heb je een zogenaamde module (*.bas) bestand. Heb je zoiets niet in delphi ook???

SmartDoDo: Ach, afhankelijk van je smaak kan het best een lekker geil ding zijn :P
You never had a date you couldn't inflate


  • bgever
  • Registratie: April 2002
  • Laatst online: 28-05-2021
:S, ik voel me toch meer in PHP thuis...

Maar kun je dan niet over het hele project een variable defineren?

Dus ergens:

Delphi:
1
2
var
  blaala : string;


in de code zetten die over het hele programma hangt?
Zo ging dat toen ook ongeveer meen ik...

  • dusty
  • Registratie: Mei 2000
  • Laatst online: 21-02 00:06

dusty

Celebrate Life!

oikoyama schreef op 26 oktober 2002 @ 14:11:
:S, ik voel me toch meer in PHP thuis...

Maar kun je dan niet over het hele project een variable defineren?
[..]
in de code zetten die over het hele programma hangt?
Zo ging dat toen ook ongeveer meen ik...

Dat kan, in de hoofd unit op de juiste plaats :)

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 21:25
Word ik genegeerd? Dat vind ik niet leuk.

  • dusty
  • Registratie: Mei 2000
  • Laatst online: 21-02 00:06

dusty

Celebrate Life!

Soultaker schreef op 26 oktober 2002 @ 14:16:
Word ik genegeerd? Dat vind ik niet leuk.

Had je ondertussen toch wel aan gewend moeten zijn he, op linkjes drukken naar een zoek resultaat is veel te veel werk, zelfs als het de eerste link is die het juiste antwoord bevat :)

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR


Verwijderd

Soultaker zijn link bevat deze info:
Global variables - program level scope

If we want to create true global variables (or/and constants) in a project, we have to place the declaration in the interface section of the unit. Variables declared in the interface section will be visible (accessible) to any unit which uses that unit.

For example, to change SomeNumber variable value that is declared in Unit1 from
Unit2, use this statement:
Unit1.SomeNumber:=999.99;

Be sure to add Unit1 to the uses clause of Unit2.

  • bgever
  • Registratie: April 2002
  • Laatst online: 28-05-2021
Soultaker schreef op 26 oktober 2002 @ 14:16:
Word ik genegeerd? Dat vind ik niet leuk.
Neu hoor, tot pagina 6 doorgebladert, maar als dan niets nuttigs is gevonden, houd mijn 56k het ook voor gezien ;)

  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
Waarom wil je het überhaupt op zon gare procedurele manier doen als het ook briljant OO kan ;)

  • bgever
  • Registratie: April 2002
  • Laatst online: 28-05-2021
Glimi schreef op 26 oktober 2002 @ 14:24:
Waarom wil je het überhaupt op zon gare procedurele manier doen als het ook briljant OO kan ;)
Omdat ik van die code van jou helemaal gaar wordt (no offence), omdat ik nog een beginner ben. En vooral omdat ik weet dat het met een paar simpele regeltjes code kon! Ik kan ze alleen niet meer herinneren, en daarom d8 ik dat die slimme mensen hier 'm misschien wel wisten...

Btw, ik wil deze variabelen gebruiken om settings data in op te slaan, die ik in elk form nodig heb...

Verwijderd

Het antwoord is al meerdere malen op verschillende manieren (OO of procedureel) gegeven in deze thread :|

  • bgever
  • Registratie: April 2002
  • Laatst online: 28-05-2021
Verwijderd schreef op 26 oktober 2002 @ 14:31:
Het antwoord is al meerdere malen op verschillende manieren (OO of procedureel) gegeven in deze thread :|
I know, maar als deze niet willen werken in Delphi hier op de achtergrond, blijf ik natuurlijk vragen... :Y)

[edit]
Global variables - program level scope

If we want to create true global variables (or/and constants) in a project, we have to place the declaration in the interface section of the unit. Variables declared in the interface section will be visible (accessible) to any unit which uses that unit.

For example, to change SomeNumber variable value that is declared in Unit1 from
Unit2, use this statement:
Unit1.SomeNumber:=999.99;

Be sure to add Unit1 to the uses clause of Unit2.
Zelfs dit wil niet werken :S

  • bgever
  • Registratie: April 2002
  • Laatst online: 28-05-2021
dusty schreef op 26 oktober 2002 @ 14:15:
Dat kan, in de hoofd unit op de juiste plaats :)
Als dat dan zo is hè? Welke plek dan? :+

  • megamuch
  • Registratie: Februari 2001
  • Laatst online: 29-01 20:14

megamuch

Tring Tring!

onder public moet je je vars declareren..

(zie bovenin je hoofdunit)

Verstand van Voip? Ik heb een leuke baan voor je!


Verwijderd

Ik zou het gewoon zo doen:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
program Project1;

uses
  Forms,
  Unit1 in 'Unit1.pas' {Form1};

var
  GlobaleVariabele: Integer;

begin
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.


En dat dan in je .dpr file van je project. Dat zou gewoon moeten werken, je kunt nu overal de variabele GlobaleVariabele benaderen.

  • bgever
  • Registratie: April 2002
  • Laatst online: 28-05-2021
Verwijderd schreef op 26 oktober 2002 @ 14:54:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
program Project1;

uses
  Forms,
  Unit1 in 'Unit1.pas' {Form1};

var
  GlobaleVariabele: Integer;

begin
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.
Dat d8 ik ookal. En ik heb dat ookal verschillende malen gedaan.
Maar dan krijg ik de volgende error bij Form1:
[Error] Unit1.pas(34): Undeclared identifier: 'Tekstje'
Dit heb ik dan in mijn .dpr:
Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
program Project1;

uses
  Forms,
  Unit1 in 'Unit1.pas' {Form1},
  Unit2 in 'Unit2.pas' {Form2},
  Unit3 in 'Unit3.pas' {Form3};

var
  tekstje : string;

{$R *.res}
begin
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.CreateForm(TForm2, Form2);
  Application.CreateForm(TForm3, Form3);
  Application.Run;
end.

  • whoami
  • Registratie: December 2000
  • Laatst online: 19:34
Globale variabelen == evil.

https://fgheysels.github.io/


  • bgever
  • Registratie: April 2002
  • Laatst online: 28-05-2021
whoami schreef op 26 oktober 2002 @ 15:01:
Globale variabelen == evil.
Tja, dat kan wel zijn, maar ik heb ze toch nodig... :|

Verwijderd

Ok, zo werkt het bij mij wel:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
unit Unit2;

interface

// global variable
var GlobaleVariabele: String;

// set/get functions
function GetGlobal(): String;
procedure SetGlobal(Value: String);

implementation

function GetGlobal(): String;
begin
  Result := GlobaleVariabele;
end;

procedure SetGlobal(Value: String);
begin
  GlobaleVariabele := Value;
end;

end.


Vervolgens in je programma:

code:
1
2
3
4
5
6
7
8
9
10
11
implementation

uses Unit2;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  SetGlobal('tekst');
  ShowMessage(GetGlobal);
end;


Conclusie: maak een aparte unit aan, waarin je de variabelen stuk voor stuk aanmaakt, en voor elke variabele schrijf je een get/set functie. Vervolgens kun je overal in je programma de unit includen in de implementation. Daarna kun je de waarden van de 'globale' variabelen instellen en opvragen. Succes!

  • bgever
  • Registratie: April 2002
  • Laatst online: 28-05-2021
Verwijderd schreef op 26 oktober 2002 @ 15:21:
Conclusie: maak een aparte unit aan, waarin je de variabelen stuk voor stuk aanmaakt, en voor elke variabele schrijf je een get/set functie. Vervolgens kun je overal in je programma de unit includen in de implementation. Daarna kun je de waarden van de 'globale' variabelen instellen en opvragen. Succes!
Thnx, dit vat ik tenmninste... Ik heb net wat zitten te testen, en nu kan ik ook variabelen van andere forms halen en editen. Ik denk dat ik dit laatste maar gebruik, maar die van _JWB_ is ook bruikbaar...

Thnx allemaal!

Ik heb btw nog die vent gemailt, die mij die code gaf, en als ik die nog mocht krijgen, post ik 'm wel hier voor de nieuwschierigen ;)

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

En je hoeft zelfs niet eens die functies te maken. Alleen de var in de interface sektie zetten is genoeg. Gewoon overal die unit uses waar je m nodig hebt

We adore chaos because we like to restore order - M.C. Escher


Verwijderd

LordLarry schreef op 26 oktober 2002 @ 15:32:
En je hoeft zelfs niet eens die functies te maken. Alleen de var in de interface sektie zetten is genoeg. Gewoon overal die unit uses waar je m nodig hebt
Dat is waar ja, maar omdat Glimi zei: "Mooie code wordt ook nergens meer gewaardeerd", probeerde ik deze 'lelijke' non-OO code toch nog een beetje 'op te poetsen', zodat het wat meer leek :)

Je kunt de functies inderdaad ook achterwege laten, maar aan de andere kant zou je in de functies nog controle kunnen uitvoeren op de waarde die in de variabele wordt gezet. Het is dan nog wat uit te breiden, maar voor simpele dingen is het inderdaad niet per se nodig.

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Dan zou ik je variable in de implementatie sectie zetten. Dan kan je er ook helemaal niet meer bij dan via de functies. Je kan het ook meer java/.net achtig doen en dan alle globale variablen in 1 singelton class

We adore chaos because we like to restore order - M.C. Escher


Verwijderd

whoami schreef op 26 oktober 2002 @ 15:01:
Globale variabelen == evil.
Hehe, maar al te waar jah :) Globale variabelen kun je maar beter proberen te voorkomen in je programma's, meestal duiden ze op een slecht ontwerp. Globale variabelen in procedures of functies is al helemaal uit den boze (8>

Verwijderd

Wat je ook kan doen is aan het Mainform van je Applicatie, property's toevoegen.
Meestal is het mainform door de gehele applicatie wel te benaderen.
Of je maakt een TApplVar class, waarin je dit soort zaken zet, dit weer in een aparte unit file zetten, heb je de zaak mooi gescheiden.

Zomaar globale variabelen gebruiken kan moeilijk te traceren bugs opleveren.

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Nee, dat MainForm lijkt me een niet zo'n goed plan maui71. Je maakt dan alle forms afhankelijk van je mainform en ook andersom. Je koppelt de zaken dan te strak met elkaar dan nodig is.

We adore chaos because we like to restore order - M.C. Escher


Verwijderd

Zet je variable tussen de public { Public declarations }. En als je dan een form
hebt welke gebruik moet maken van de variable dan klik je op File > Use Unit
en kies je de unit waar deze variable in staat.
Pagina: 1