Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Ungenügende Forward-/External-Deklaration (https://www.delphipraxis.net/168523-ungenuegende-forward-external-deklaration.html)

asdfghjkl 26. Mai 2012 16:23

Delphi-Version: 7

Ungenügende Forward-/External-Deklaration
 
Hallo, ich hab ein problem bei meinem Programm; ich arbeite gerade an einem Morse-Automaten; sobald "SOS" gesendet wird, soll eine Lampe erscheinen ("Warnlicht").

Code:
type
  TZustand =(A,Eins,Zwei,Drei,Vier,Fuenf,Sechs,S,O,Lampe );
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Sh1: TShape;
    Warnlicht: TShape;
    procedure ProcEins (Eingabe : Integer);
    procedure ProcZwei (Eingabe : Integer);
    procedure ProcS (Eingabe : Integer);
    procedure ProcDrei (Eingabe : Integer);
    procedure ProcVier (Eingabe : Integer);
    procedure ProcO (Eingabe : Integer);
    procedure ProcFuenf (Eingabe : Integer);
    procedure ProcSechs (Eingabe : Integer);
    procedure ProcLampe (Eingabe : Integer);
    procedure ProcA (Eingabe : Integer);
    procedure FormActivate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Sh1ContextPopup(Sender: TObject; MousePos: TPoint;
      var Handled: Boolean);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  Zustand : TZustand;

implementation
Dieser Fehler
Code:
[Fehler] Unit1.pas(16): Ungenügende Forward- oder External-Deklaration: 'TForm1.ProcEins'
wiederholt sich dann für jede procedure.

Wegen anderen Problemen hab ich auch noch ein wenig mit dem Warnlicht bzw. Sh1. gespielt.
(es wurde als undefinierter bezeichner angegeben obwohl ich den definitiv angegeben hab).

Könnt ihr mir bitte helfen?

Danke im Voraus & schöne Grüße!

jfheins 26. Mai 2012 16:28

AW: Ungenügende Forward-/External-Deklaration
 
Du hast im interface Teil zwar gesagt, dass es eine Methode "TForm1.ProcEins" gibt, diese aber im implementation Teil nicht (oder nicht richtig) implementiert.
Wenn du es noch genauer wissen möchtest, zeig' noch etwas mehr Code ;-)

jaenicke 26. Mai 2012 16:43

AW: Ungenügende Forward-/External-Deklaration
 
Lass mich raten:
Du hast nach implementation sowas stehen?
Delphi-Quellcode:
procedure ProcEins (Eingabe : Integer);
begin

end;
Da fehlt das TForm1. davor, deshalb auch die Fehlermeldung. Gefunden wird ProcEins, gesucht aber TForm1.ProcEins, denn das ist ja eine Methode (einer Klasse) und keine einzelne Prozedur. ;-)
Delphi-Quellcode:
procedure TForm1.ProcEins(Eingabe : Integer);
begin

end;
Nebenbei gehören eigene Methoden besser unter private oder public statt in den Standardsichtbarkeitsbereich.

sx2008 26. Mai 2012 17:01

AW: Ungenügende Forward-/External-Deklaration
 
Wenn du einen Aufzählungstyp wie diesen deklarierst:
Delphi-Quellcode:
TZustand =(A,Eins,Zwei,Drei,Vier,Fuenf,Sechs,S,O,Lampe );

Dann musst du darauf achten, dass die einzelne Werte genügend lange Bezeichner haben.
Andernfalls könnte es später zu einer Namenskollision kommen.
Delphi-Quellcode:
// Prefix mz = "Morsezeichen"
TZustand =(mzA,mzEins,mzZwei,mzDrei,mzVier,...);

jaenicke 26. Mai 2012 17:14

AW: Ungenügende Forward-/External-Deklaration
 
Ich würde eher dazu raten SCOPEDENUMS zu aktivieren... (falls man eine passende Delphiversion hat)
http://docwiki.embarcadero.com/RADSt...ungen_(Delphi)
Dann schreibt man einfach TZustand.A und fertig. ;-)

himitsu 26. Mai 2012 18:23

AW: Ungenügende Forward-/External-Deklaration
 
Zitat:

Zitat von jaenicke (Beitrag 1168228)
Dann schreibt man einfach TZustand.A und fertig. ;-)

Falls nicht möglich, dann einfach den entsprechenden Unitnamen als Namespace davorschreiben.

Zitat:

Obwohl TFoo nicht mit $SCOPEDENUMS ON deklariert wurde, kann der Wert A dennoch explizit anhand des Aufzählungsnamens aufgelöst werden.
Wenn ich das aber richtig lese, dann kann man immer den Typenmamen davor setzen, oder auch nicht. (bei OFF)
Bei $SCOPEDENUMS ON muß man es aber immer davorschreiben.

asdfghjkl 26. Mai 2012 20:37

Danke,
jetzt funktionierts.
Eure Tipps haben mir sehr geholfen :)

jaenicke 26. Mai 2012 21:03

AW: Ungenügende Forward-/External-Deklaration
 
Zitat:

Zitat von himitsu (Beitrag 1168230)
Wenn ich das aber richtig lese, dann kann man immer den Typenmamen davor setzen, oder auch nicht. (bei OFF)
Bei $SCOPEDENUMS ON muß man es aber immer davorschreiben.

Richtig. Ich würde immer dazu raten es zu aktivieren, wenn man keine Prefixe benutzt. Wenn die Bezeichner durch Prefixe ohnehin eindeutig genug sind, kann man es auch auslassen.
Aber wenn nicht, würde ich so immer sicherstellen, dass jeder den Typbezeichner benutzt.


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