Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi XE 7 Error Meldung E2158 System-Unit veraltet oder beschädigt @Clr fehlt (https://www.delphipraxis.net/184171-xe-7-error-meldung-e2158-system-unit-veraltet-oder-beschaedigt-%40clr-fehlt.html)

Erwin Pälzig 4. Mär 2015 17:54

XE 7 Error Meldung E2158 System-Unit veraltet oder beschädigt @Clr fehlt
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo alle zusammen,

ich habe ein kleines Problem mit der Compilierung eines alten Delphi Quellcodes.

In einem Abschnitt des Programms sollen deklarierte Variablen (array of real) über den nil-Pointer auf Null gesetzt werden.

Hier die Details:

SetLength(TotalEvap,0);
TotalEvap:= nil;

dabei ist TotalEvap : array of real;
TotalEvap ist vor dem Hauptteil im Variablen Abschnitt deklariert.
Hier auch die Fehlermeldung: [dcc32 Fataler Fehler] Unit4.pas(358): E2158 System-Unit veraltet oder beschädigt: '@Clr' fehlt
Sende im Anhang auch ein Screenshot.

In einer anderen Unit kommt keine Fehlermeldung. Was könnte ich falsch gemacht haben oder ist der Code falsch?
Fehlt eventuell ein Teil der Bibliothek? (wie in anderen Beiträgen)

Entschuldigt wenn ich einige Sachen zusammen werfe, beginne aber gerade wieder mit Delphi zu arbeiten...

Vielen Dank für eure Hilfe!

Uwe Raabe 4. Mär 2015 18:00

AW: XE 7 Error Meldung E2158 System-Unit veraltet oder beschädigt @Clr fehlt
 
Vielleicht solltest du dich erst um die darüber stehende Fehlermeldung kümmern, die auf dieselbe Zeile verweist.

Bist du sicher, daß die Deklaration wirklich so da steht?

Delphi-Quellcode:
var
  TotalEvap : array of real;
Ich hatte einen ähnlichen Fehler gerade in einem anderen Zusammenhang, aber da war einfach die Syntax falsch.

Erwin Pälzig 5. Mär 2015 10:42

AW: XE 7 Error Meldung E2158 System-Unit veraltet oder beschädigt @Clr fehlt
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Uwe,

Danke für deine schnelle Antwort!

Ich hatte zunächst auch dies vermutet.

Habe aber diese und weitere Variablen eindeutig deklariert.
Bsp.
Delphi-Quellcode:
var
 TotalEvap : array of real;
Im Anhang der entsprechende Screenshot.

Kann evtl. der Fehler in der Anwendung des SetLength sein?
Ich hatte in verschiedenen Bsp. gelesen, dass es meistens mit einer Variable des Typs char aufgerufen wird.

Danke für jeden Hinweis! :)

Uwe Raabe 5. Mär 2015 10:49

AW: XE 7 Error Meldung E2158 System-Unit veraltet oder beschädigt @Clr fehlt
 
Dann liegt es definitiv an etwas Anderem, denn ein einfaches Beispielprojekt funktioniert tadellos.

Delphi-Quellcode:
program Project10;

{$APPTYPE CONSOLE}

var
  TotalEvap: array of real;

begin
  SetLength(TotalEvap,0);
  TotalEvap := nil; // ist faktisch identisch mit dem vorigen Befehl
end.
Kannst du das fehlerhafte Projekt soweit schrumpfen, daß es hier hochgeladen werden kann?

DeddyH 5. Mär 2015 10:50

AW: XE 7 Error Meldung E2158 System-Unit veraltet oder beschädigt @Clr fehlt
 
Hast Du TotalEvap evtl. noch einmal deklariert (z.B. als lokale Variable oder auch Feld oder Property), ggf. mit einem anderen Typen?

Horst0815 5. Mär 2015 10:54

AW: XE 7 Error Meldung E2158 System-Unit veraltet oder beschädigt @Clr fehlt
 
mal die Projektquellen bereinigen
sehe da keinen Fehler hab´s extra nochmal ausprobiert keine Fehler bei der Compilierung

mkinzler 5. Mär 2015 10:55

AW: XE 7 Error Meldung E2158 System-Unit veraltet oder beschädigt @Clr fehlt
 
Funktioniert den Uwe's Testprogramm?

Erwin Pälzig 5. Mär 2015 11:02

AW: XE 7 Error Meldung E2158 System-Unit veraltet oder beschädigt @Clr fehlt
 
Also vielen Dank für die soliden Vorschläge und gute Hinweise! Bereite eine gesonderte Unit vor...

Zitat:

Zitat von mkinzler (Beitrag 1292435)
Funktioniert den Uwe's Testprogramm?

jep, eine kleinere Unit mit den Hinweisen von Uwe läuft und lässt sich compilieren.
Delphi-Quellcode:
unit Unit16;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs;

type
  TForm16 = class(TForm)
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form16: TForm16;
  TotalEvap: array of real;

implementation

{$R *.dfm}

begin
  SetLength(TotalEvap,0);
  TotalEvap := nil; // ist faktisch identisch mit dem vorigen Befehl
end.

himitsu 5. Mär 2015 11:12

AW: XE 7 Error Meldung E2158 System-Unit veraltet oder beschädigt @Clr fehlt
 
Zitat:

Delphi-Quellcode:
SetLength(TotalEvap,0);

Strg+Linksklick auf "TotalEvap" oder die Maus drüber halten und etwas warten ... Was sagt dir die IDE denn dabei?

mkinzler 5. Mär 2015 11:12

AW: XE 7 Error Meldung E2158 System-Unit veraltet oder beschädigt @Clr fehlt
 
Ich glaube Detlef ist auf der richtigen Fährte

Erwin Pälzig 5. Mär 2015 11:33

AW: XE 7 Error Meldung E2158 System-Unit veraltet oder beschädigt @Clr fehlt
 
So hab nun den größten Teil der Codezeilen entfernt: Hier die lauffähige Unit16.

Delphi-Quellcode:
unit Unit16;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs;

type
  TForm16 = class(TForm)
  //procedure ClearValues(Sender: TObject; var TotalEvap: array of real); -> wird im eigentlichen Code verwendet
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form16: TForm16;
  TotalEvap: array of real;

implementation

{$R *.dfm}

{1. Programmabschnitt}
//procedure TForm16.ClearValues; -> wird im eigentlichen Code verwendet
begin

//begin
  SetLength(TotalEvap,0);
  TotalEvap := nil; // ist faktisch identisch mit dem vorigen Befehl
//end;

{2... weitere Programmabschnitte}

//initialization -> wird im eigentlichen Code verwendet

//finalization   -> wird im eigentlichen Code verwendet

 end.
Die Prozedurdefinition, und der SetLength Aufruf passen nicht.

Danke für eure Hinweise!

Zu:
Zitat:

Zitat von DeddyH (Beitrag 1292433)
Hast Du TotalEvap evtl. noch einmal deklariert (z.B. als lokale Variable oder auch Feld oder Property), ggf. mit einem anderen Typen?

Gute Idee, ich prüfe dies auch.

Erwin Pälzig 5. Mär 2015 11:39

AW: XE 7 Error Meldung E2158 System-Unit veraltet oder beschädigt @Clr fehlt
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von himitsu (Beitrag 1292443)
Zitat:

Delphi-Quellcode:
SetLength(TotalEvap,0);

Strg+Linksklick auf "TotalEvap" oder die Maus drüber halten und etwas warten ... Was sagt dir die IDE denn dabei?

Hallo, vielen Dank auch für deinen Hinweis!

Bei betätigung springt der Mauszeiger auf die Procedurdefinition im Quelltext

Sonst hier die Aussage bei Bewegung des Mauszeigers über SetLength.

uligerhardt 5. Mär 2015 11:43

AW: XE 7 Error Meldung E2158 System-Unit veraltet oder beschädigt @Clr fehlt
 
Die Fehlermeldung klingt doch eher so, als wären die Pfadeinstellungen vergurkt?

Uwe Raabe 5. Mär 2015 11:51

AW: XE 7 Error Meldung E2158 System-Unit veraltet oder beschädigt @Clr fehlt
 
Zitat:

//procedure ClearValues(Sender: TObject; var TotalEvap: array of real); -> wird im eigentlichen Code verwendet
Das ist der entscheidende Hinweis! In diesem Fall ist TotalEvap nämlich als var-Parameter definiert und nicht als globale Variable. Allerdings wird der Typ generisch angegeben und nicht als deklarierter Typ und dann kommt der Compiler nicht mehr klar. So sollte es gehen (und so sollte man es auch machen):

Delphi-Quellcode:
program Project10;

{$APPTYPE CONSOLE}

type
  TRealArray = array of Real;

procedure ClearValues(Sender: TObject; var TotalEvap: TRealArray);
begin
  SetLength(TotalEvap,0);
  TotalEvap := nil;
end;

var
  TotalEvap: TRealArray;

begin
  ClearValues(nil, TotalEvap);
end.

Erwin Pälzig 5. Mär 2015 12:01

AW: XE 7 Error Meldung E2158 System-Unit veraltet oder beschädigt @Clr fehlt
 
Zitat:

Zitat von uligerhardt (Beitrag 1292454)
Die Fehlermeldung klingt doch eher so, als wären die Pfadeinstellungen vergurkt?

Hallo Uli.
Ich hatte ebenfalls danach gesucht.
Hatte hierrüber auch den Fehler (ähnlichen gefunden)

http://docs.embarcadero.com/products...spart_xml.html

Hier auch der Screenshot dazu. Ich habe nach der System.dcu gesucht und sie auch in dem entsprechendem Verzeichnis:
C:\Program Files (x86)\Embarcadero\Studio\15.0\lib\win64\release gefunden.


Nur scheint es, dass im Quelltext etwas nicht passt.

Zitat:

Zitat von DeddyH (Beitrag 1292433)
Hast Du TotalEvap evtl. noch einmal deklariert (z.B. als lokale Variable oder auch Feld oder Property), ggf. mit einem anderen Typen?


Erwin Pälzig 5. Mär 2015 12:08

AW: XE 7 Error Meldung E2158 System-Unit veraltet oder beschädigt @Clr fehlt
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1292455)
Zitat:

//procedure ClearValues(Sender: TObject; var TotalEvap: array of real); -> wird im eigentlichen Code verwendet
Das ist der entscheidende Hinweis! In diesem Fall ist TotalEvap nämlich als var-Parameter definiert und nicht als globale Variable. Allerdings wird der Typ generisch angegeben und nicht als deklarierter Typ und dann kommt der Compiler nicht mehr klar. So sollte es gehen (und so sollte man es auch machen):

Delphi-Quellcode:
program Project10;

{$APPTYPE CONSOLE}

type
  TRealArray = array of Real;

procedure ClearValues(Sender: TObject; var TotalEvap: TRealArray);
begin
  SetLength(TotalEvap,0);
  TotalEvap := nil;
end;

var
  TotalEvap: TRealArray;

begin
  ClearValues(nil, TotalEvap);
end.

Vielen Dank Uwe!

Ich werde deine Hinweise berücksichtigen und melde mich zurück!

Erwin Pälzig 5. Mär 2015 16:56

AW: XE 7 Error Meldung E2158 System-Unit veraltet oder beschädigt @Clr fehlt
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo alle zusammen!

Also vielen dank Uwe für deine tatkräftige Unterstützung.

Irgendwie steh ich auf der Leitung. Ich habe mehrere Varianten versucht und es treten jeweils immer verschiedne Fehler auf.
Dies ist die letzte
Delphi-Quellcode:
unit Unit16;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs;

type
  //TRealArray = array of Real; -> ist die Stelle hier korrekt (hier wird ein Datentyp deklariert, mit dem Typ Array (Feld) mit reelen Einträgen
  TForm16 = class(TForm)
  procedure TForm16.ClearValues(Sender: TObject);// -> fehlt hier etwas? [dcc32 Fehler] Unit16.pas(12): E2003 Undeklarierter Bezeichner: 'TForm16'
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form16: TForm16;
  TotalEvap:array of real; // Deklaration einer globalen Variable TotalEvap mit dem Datentyp (Feld) array mit reelen Einträgen

implementation

{$R *.dfm}

{1. Programmabschnitt}
procedure TForm16.ClearValues; //-> Definition der Procedur ClearFalues ([dcc32 Fehler] Unit16.pas(28): E2003 Undeklarierter Bezeichner: 'ClearValues')
//var -> wird genutzt wenn nur in diesem Unterabschnitt Variablen genutzt werden
  //TotalEvap: TRealArray;
 //TotalEvap:array of real;
begin
  //SetLength(TotalEvap,0);
  TotalEvap := nil; // ist faktisch identisch mit dem vorigen Befehl
end;

//var
 //TotalEvap: TRealArray;-> Der Parameter TotalEvap wird mit dem neuen selbsterzeugten Datentyp verknüpft.

 //begin
  //ClearValues(nil, TotalEvap); -> ClearValues wird aufgerufen und elemente werden auf Null gesetzt, und Totalevap Elemente werden eingfügt-> Verstehe diesn Audruck nicht zu 100%
 // end;
 end.
Zum aktuellen Quellcode ist eine weitere Fehlermeldung ist im Anhang zu sehen.

Ziel es ist mittels der Procedur Clearvalues die globalen Variablen zum Start des Programms auf Null zusetzten.
Besten Dank für eure Unterstüzung!
Ich bleibe auf jeden Fall dran.

Uwe Raabe 5. Mär 2015 17:14

AW: XE 7 Error Meldung E2158 System-Unit veraltet oder beschädigt @Clr fehlt
 
Delphi-Quellcode:
unit Unit16;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs;

type
  TRealArray = array of Real;

type
  TForm16 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
    procedure ClearValues(var theArray: TRealArray);
  end;

var
  Form16: TForm16;
  TotalEvap1: TRealArray; // Alle Arrays als TRealArray deklarieren!
  TotalEvap2: TRealArray;
  TotalEvap3: TRealArray;

implementation

{$R *.dfm}

{1. Programmabschnitt}
procedure TForm16.FormCreate(Sender: TObject);
begin
  ClearArray(TotalEvap1);
  ClearArray(TotalEvap2);
  ClearArray(TotalEvap3);

  { alternativ aber auch einfacher }
  TotalEvap1 := nil;
  TotalEvap2 := nil;
  TotalEvap3 := nil;
end;

procedure TForm16.ClearValues(var theArray: TRealArray);
begin
  theArray := nil;
end;

end.

Uwe Raabe 5. Mär 2015 17:16

AW: XE 7 Error Meldung E2158 System-Unit veraltet oder beschädigt @Clr fehlt
 
Zitat:

Zitat von Erwin Pälzig (Beitrag 1292527)
Ziel es ist mittels der Procedur Clearvalues die globalen Variablen zum Start des Programms auf Null zusetzten.

Das ist eigentlich gar nicht nötig, da dynamische Arrays als managed Objekte gelten und bei Programmstart bereits mit nil initialisiert sind.

Erwin Pälzig 9. Mär 2015 14:35

AW: XE 7 Error Meldung E2158 System-Unit veraltet oder beschädigt @Clr fehlt
 
Hallo Uwe,

vielen Dank für deine Hinweise!

Ich habe deine Hinweise mit beachtet und nun ist diese Passage im Hauptprogramm compilierbar!
Vorallem ist ebenfalls der am Anfang gennante Fehler: Error Meldung E2158 System-Unit veraltet oder beschädigt @Clr verschwunden!

Nun gibt zwar jede Menge andere, aber ich denke die schaffe ich.

Besten Dank an dich und andere Forumsbeitragende!
Problem hat sich gelöst! :-D

hoika 9. Mär 2015 21:04

AW: XE 7 Error Meldung E2158 System-Unit veraltet oder beschädigt @Clr fehlt
 
Hallo,
ist das jetzt ein neues Projekt oder ein geöffnetes altes Projekt?
Was passiert, wenn Du ein neues Projekt anlegst?

Heiko

Erwin Pälzig 10. Mär 2015 10:34

AW: XE 7 Error Meldung E2158 System-Unit veraltet oder beschädigt @Clr fehlt
 
Hallo Heiko,

das Projekt an dem ich arbeite ist ein geöffnetes altes Projekt evtl. Delphi 2007 oder so, weis es leider nicht so genau.

Zitat:

Zitat von hoika (Beitrag 1292847)
Hallo,
ist das jetzt ein neues Projekt oder ein geöffnetes altes Projekt?
Was passiert, wenn Du ein neues Projekt anlegst?

Heiko


Bei einem neuen Projekt habe ich so eine Lösung gefunden.
(Es lag an der Definition der globalen Variablen, Definition der Array Komponenten, Nutzung von SetLength(...) und Prozedur-Deklaration)

Delphi-Quellcode:
unit Unit16;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs;

type
  TRealArray = array of Real; //-> ist die Stelle hier korrekt (hier wird ein Datentyp deklariert, mit dem Typ Array (Feld) mit reelen Einträgen
type
  TForm16 = class(TForm)
  procedure FormCreate(Sender: TObject);
  private
    //procedure ClearValues(Sender: TObject; var theArray: TRealArray);
    { Private-Deklarationen }
  public
    procedure ClearValues(var Sender: TObject; var theArray: TRealArray);
    { Public-Deklarationen }
  end;

var
  Form16: TForm16;
  TotalEvap1: TRealArray; // Deklaration einer globalen Variable TotalEvap1 mit dem Datentyp TRealArray
  TotalEvap2: TRealArray; // Deklaration einer globalen Variable TotalEvap2 mit dem Datentyp TRealArray
  TotalEvap3: TRealArray; // Deklaration einer globalen Variable TotalEvap3 mit dem Datentyp TRealArray
implementation

{$R *.dfm}

{1. Programmabschnitt}
procedure TForm16.FormCreate(Sender: TObject); //-> Definition der Procedur ClearFalues
begin
  TotalEvap1 := nil; // Elemente des TotalEvap1-Arrays werden auf Nullzeiger gesetzt
  TotalEvap2 := nil; // Elemente des TotalEvap2-Arrays werden auf Nullzeiger gesetzt
  TotalEvap3 := nil; // Elemente des TotalEvap3-Arrays werden auf Nullzeiger gesetzt
end;

procedure TForm16.ClearValues;
begin
 theArray:= nil; // Elemente des theArray werden auf Nullzeiger gesetzt
end;

 end.


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