Autor Beitrag
beastofchaos
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 247
Erhaltene Danke: 4



BeitragVerfasst: So 13.03.11 14:57 
Hallo Leute,
Konstanten sind ein ziemich simples Thema, aber ich habe trotzdem ein Problem gefunden:

Bei mir ist es nicht möglich den Pfad durch eine Funktion in der Konstante "Path" zu speichern. Kann das Programm in dem Bereich vll auf solche externe Funktionen noch nicht zugreifen?
Hier der Quelltext:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
...

uses
  ..., MMSystem;

...

const
  s : String = ExtractFilePath(Application.ExeName);           // Soll den Pfad des Ordners der Exe-datei ermitteln

...




Natürlich ginge das ganze noch in Formcreate, aber ich finde es sauberer, wenn es in den Konstanten deklariert ist.


MfG Beast
Robert.Wachtel
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 895
Erhaltene Danke: 7

Windows 7 Ultimate x64
D5 Ent, D7 Arch, RAD Studio 2010 Pro, VS 2008
BeitragVerfasst: So 13.03.11 15:12 
Vielleicht noch einmal mit Grundlagen beschäftigen?
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 13.03.11 15:15 
user profile iconbeastofchaos hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden Delphi-Quelltext
1:
2:
const
  s : String = ExtractFilePath(Application.ExeName);           // Soll den Pfad des Ordners der Exe-datei ermitteln
Naja, was ist denn eine Konstante? Richtig, ein Wert, der konstant bleibt.

So, jetzt kompilierst du die Exe. Nehmen wir einmal an das würde funktionieren, dann stünde da z.B. 'c:\test' drin. Jetzt kopierst du die Exe aber nach c:\programme... und was jetzt? Du merkst: Das ist nun einmal kein konstanter Wert, also wie sollte der als fester konstanter Wert in die Exe kompiliert werden?

Konstanten müssen auch genau das sein: konstant, damit sie beim Kompilieren berechnet und als kostanter Wert in die Exe geschrieben werden können.
beastofchaos Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 247
Erhaltene Danke: 4



BeitragVerfasst: So 13.03.11 15:24 
user profile iconRobert.Wachtel hat folgendes geschrieben Zum zitierten Posting springen:
Vielleicht noch einmal mit Grundlagen beschäftigen?

Was ist denn DA mein gravierender Fehler?
Darf man Konstanten nicht mit funktionen bestimmen, oder wie?
anderes Beispiel wäre.
Angenommen QueryPerformanceCoutner wäre eine funktion statt so einer sinnlosen Prozedur:

ausblenden Delphi-Quelltext
1:
2:
const
  F: Extended = QueryPerformanceFrequency;


Es geht mir doch nur grundsätzlich darum - darf ich in DIESEM Abschnitt eine Funktion verwenden.



user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconbeastofchaos hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden Delphi-Quelltext
1:
2:
const
  s : String = ExtractFilePath(Application.ExeName);           // Soll den Pfad des Ordners der Exe-datei ermitteln
Naja, was ist denn eine Konstante? Richtig, ein Wert, der konstant bleibt.

So, jetzt kompilierst du die Exe. Nehmen wir einmal an das würde funktionieren, dann stünde da z.B. 'c:\test' drin. Jetzt kopierst du die Exe aber nach c:\programme... und was jetzt? Du merkst: Das ist nun einmal kein konstanter Wert, also wie sollte der als fester konstanter Wert in die Exe kompiliert werden?

Konstanten müssen auch genau das sein: konstant, damit sie beim Kompilieren berechnet und als kostanter Wert in die Exe geschrieben werden können.


Das ist mir klar, aber er berechnet die Konstante doch bei jedem Programmstart neu und, wenn du es jetzt wo anders hinschiebst, und es dann startest, hast du auch den neuen Pfad automatisch...
Übrigens ist eine Konstante zwar konstant, aber nur die Programmzeit über... danach sind alle variablen und konstanten verschwunden ( kein programm, kein iwas )
ALF
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1085
Erhaltene Danke: 53

WinXP, Win7, Win10
Delphi 7 Enterprise, XE
BeitragVerfasst: So 13.03.11 15:30 
Beim Compilieren wird diese Const an dieser Stelle gefixt!
Was du nun innerhalb deines Prog zur Laufzeit machst ist was ganz anderes!

Hat user profile iconjaenicke doch geschrieben!
Gruss Alf

_________________
Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!


Zuletzt bearbeitet von ALF am So 13.03.11 15:35, insgesamt 1-mal bearbeitet
beastofchaos Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 247
Erhaltene Danke: 4



BeitragVerfasst: So 13.03.11 15:33 
Achso, ihr meitn der fixed das nicht bei jedem Programmstart, sondern nur einmal beim Programmschreiben? Oh... :))


Aber geht es denn jetzt grundsätzlich nicht mit Funktionen im Konstanten-Bereich oder geht das nur mit dieser Funktion nicht?
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 13.03.11 15:36 
user profile iconbeastofchaos hat folgendes geschrieben Zum zitierten Posting springen:
Aber geht es denn jetzt grundsätzlich nicht mit Funktionen im Konstanten-Bereich oder geht das nur mit dieser Funktion nicht?
Das geht generell nicht, denn beim Kompilieren wird kein Code deines Programms ausgeführt.
beastofchaos Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 247
Erhaltene Danke: 4



BeitragVerfasst: So 13.03.11 15:40 
Und wenn er dabei auf eine andere Unit zugreifen muss für die Funktion?

Andere Units werden schließlich "vorher" in uses schon gezeigt.
Robert.Wachtel
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 895
Erhaltene Danke: 7

Windows 7 Ultimate x64
D5 Ent, D7 Arch, RAD Studio 2010 Pro, VS 2008
BeitragVerfasst: So 13.03.11 15:45 
Kann nur ich Deinen Ausführungen nicht folgen?
ALF
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1085
Erhaltene Danke: 53

WinXP, Win7, Win10
Delphi 7 Enterprise, XE
BeitragVerfasst: So 13.03.11 15:46 
Sonst könntest Du keine Zeile Prog schreiben wenn die IDE dir dies nicht zuverfügung stellen würde! Das ist ja das schöne daran das ich mir keinen Kopf machen muss wo sich welche Funktion in welcher Unit befindet! Den Rest macht für mich der Compiler!

Man muss es nur verstehen!

Auch hier noch mal, hat user profile iconjaenicke doch geschrieben! Der Compiler fürt kein QuellCode aus!
Also muss eine Const auch definitiv sein!

Gruss ALf

_________________
Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
beastofchaos Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 247
Erhaltene Danke: 4



BeitragVerfasst: So 13.03.11 16:01 
user profile iconALF hat folgendes geschrieben Zum zitierten Posting springen:

Der Compiler fürt kein QuellCode aus!
Also muss eine Const auch definitiv sein!
Gruss ALf


Verstanden, Dankeschön xD
Ich machs dann in FormCreate ;)

MfG Beast
ALF
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1085
Erhaltene Danke: 53

WinXP, Win7, Win10
Delphi 7 Enterprise, XE
BeitragVerfasst: So 13.03.11 16:08 
Zitat:
Verstanden, Dankeschön xD
Ich machs dann in FormCreate

MfG Beast

Und was soll da passieren!!!
Gruss Alf

_________________
Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
beastofchaos Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 247
Erhaltene Danke: 4



BeitragVerfasst: So 13.03.11 18:50 
Na was wohl :)
Er liest den Pfas des order, wo die Exe liegt. Sort hab ich für mein Programm einige Sounds und Bilder liegen und im spiel wechselt das mal :)
LexXis
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 170
Erhaltene Danke: 3



BeitragVerfasst: So 13.03.11 23:23 
Du wirst es mittlerweile wohl selbst herausgefunden haben, aber der Vollständigkeit halber nochmal:

Konstanten sind genau das: Konstant. Die ändern sich weder während des Kompilierens noch zur Runtime noch sonst wie. Sie behalten den Wert, der ihnen fix zugewiesen wird.
Kleines Beispiel:
ausblenden Delphi-Quelltext
1:
2:
const
  MONTAG = $D00F;

Keiner mag Montage. Deswegen kann ich MONTAG als Konstante deklarieren - das wird sich voraussichtlich nie ändern.

Aber:
ausblenden Delphi-Quelltext
1:
2:
const
  XTRALONGCHILICHEESE = SchaerfeempfindenVon(BenBE);

Das kann nicht funktionieren, weil niemand absehen kann wie scharf Ben seine Burger mag. Mal ganz davon abgesehen, dass ich beispielsweise die Schärfe vollkommen ausreichend finde. Hier liegt also kein konstanter Wert vor, sondern ein variabler.

Und genau da is dein Knackpunkt :) Nutz hierfür eine Variable, die lässt sich beim Ausführen beliebig ändern.

Gruß

Für diesen Beitrag haben gedankt: Hidden, Narses
beastofchaos Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 247
Erhaltene Danke: 4



BeitragVerfasst: So 13.03.11 23:52 
user profile iconLexXis hat folgendes geschrieben Zum zitierten Posting springen:
Du wirst es mittlerweile wohl selbst herausgefunden haben, aber der Vollständigkeit halber nochmal:
Und genau da is dein Knackpunkt :) Nutz hierfür eine Variable, die lässt sich beim Ausführen beliebig ändern.


Genau deswegen kam ich doch auf Konstanten, weil es nicht verändern werden darf...das ist schließlich der Pfad.
Den kann man nicht während einer Ausführung eines Programmes ändern, wei dann müsste man ja das ganze Spiel verschieben können zur Laufzeit, da würde es aber sicher iwie Probleme geben.

Ich dachte, dass man Konstanten bei jedem Programmstart neu definieren kann, aber sie während des Programmes/ zur Laufzeit nicht verändert werden können durch iwelche Prozeduren/Funktionen, wie wenn man z.B. auf einen Button klickt.

Es wurde doch schon so erklärt, dass die Konstante nicht bei Programmstart gefixed wird, sondern wenn das Programm geschrieben wird... Ist aber auch egal, da keiner hier mich bis jetzt verstanden hat und ich hab ja das Thema shcon als beantwortet markiert. Ist ja auch jetzt geklärt, indem halt der Pfad variabel ist.
elundril
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3747
Erhaltene Danke: 123

Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
BeitragVerfasst: Mo 14.03.11 01:15 
das ist der unterschied zwischen delphi und zb java. in java ist das final so das man die variable tatsächlich zur laufzeit genau einmal setzen kann. dieses konzept gibt es bei delphi nicht. wir verstehen dich auch was du von uns willst aber wir können die delphi-sprache leider nicht ändern.

lg elundril

_________________
This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.

Für diesen Beitrag haben gedankt: beastofchaos
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mo 14.03.11 06:27 
user profile iconelundril hat folgendes geschrieben Zum zitierten Posting springen:
dieses konzept gibt es bei delphi nicht.
In Delphi 1 konntest du es z.B. noch Konstanten zur Laufzeit verändern. Jetzt muss dafür die entsprechende Projektoption gesetzt werden (veränderbare typisierte Konstanten oder so). Das Konzept mit nur einmal ändern oder so gibt es in der Tat nicht.

Allerdings sehe ich darin keinen Sinn Konstanten veränderbar zu machen, denn dann sind es ja Variablen, nur dass dran steht es wären keine. :lol:
Yogu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Mo 14.03.11 09:56 
In C# gibt es übrigens beide Möglichkeiten: Man kann ein Symbol als const deklarieren, oder aber als static readonly. Im zweiten Fall können auch Objekte instanziert oder Funktionen aufgerufen werden. Wie oft sich der Rückgabewert dieser Funktion ändert, interressiert dabei keinen - er wird einfach einmal am Start ermittelt und festgehalten.
elundril
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3747
Erhaltene Danke: 123

Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
BeitragVerfasst: Mo 14.03.11 10:54 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconelundril hat folgendes geschrieben Zum zitierten Posting springen:
dieses konzept gibt es bei delphi nicht.
In Delphi 1 konntest du es z.B. noch Konstanten zur Laufzeit verändern. Jetzt muss dafür die entsprechende Projektoption gesetzt werden (veränderbare typisierte Konstanten oder so). Das Konzept mit nur einmal ändern oder so gibt es in der Tat nicht.


Typisierte Konstanten gibts in Delphi 7 zb auch noch. Muss man ebenfalls mit einem Compilerschalter aktiveren. Jedoch verhalten sie sich dann wie variablen, also können auch öfters geändert werden. Der einzige Vorteil von denen ist, das man ihnen beim erzeugen eben schon einen Wert zuweisen kann, so wie in C, C++, Java, wenn man Variablen nach diesem Schema erzeugt:

ausblenden Quelltext
1:
2:
int AnzahlForenuser = 32485;
int AnzahlSuchfunktionNutzer = 400;


Und irgendwie geht mir das auch in Delphi ab. Einerseits weil es kürzer ist und man nie vergessen kann eine Variable zu initialisieren und andererseits hab ich mir sagen lassen das es schneller ist wenn man eine Variable beim Initialisieren schon mit einem Wert belegt als wenn man zuerst die Variable erzeugt und ihr erst dann einen Wert zuweist.

lg elundril

_________________
This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mo 14.03.11 12:03 
user profile iconelundril hat folgendes geschrieben Zum zitierten Posting springen:
Der einzige Vorteil von denen ist, das man ihnen beim erzeugen eben schon einen Wert zuweisen kann, so wie in C, C++, Java, wenn man Variablen nach diesem Schema erzeugt:
Das geht in Delphi doch auch, nur eben nicht variable Werte. :gruebel:
ausblenden Delphi-Quelltext
1:
2:
3:
var
  MyForm: TMyForm;
  MyGlobalShit: Integer = 0;

user profile iconelundril hat folgendes geschrieben Zum zitierten Posting springen:
andererseits hab ich mir sagen lassen das es schneller ist wenn man eine Variable beim Initialisieren schon mit einem Wert belegt als wenn man zuerst die Variable erzeugt und ihr erst dann einen Wert zuweist.
Globale Variablen und Felder eines Objekts werden immer bereits mit 0 vorinitialisiert. Nur lokale Variablen nicht.

user profile iconelundril hat folgendes geschrieben Zum zitierten Posting springen:
Typisierte Konstanten gibts in Delphi 7 zb auch noch. Muss man ebenfalls mit einem Compilerschalter aktiveren.
Das meinte ich mit "jetzt muss dafür...". ;-)
Das geht in XE auch weiterhin, es ist nur nicht empfehlenswert das zu nutzen.