mikrocontroller.net

Forum: PC-Programmierung Delphi Problem


Autor: Xenon (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!
Ich habe in Borland Delphi 6 vor ein Programm zu schreiben. Aber
bereits am Anfang kann er nicht compilieren...:

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Label1: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

var zahl:Integer;
zahl:=0;

procedure TForm1.Button2Click(Sender: TObject);
begin
zahl:=1;
end;

end.


Die Fehlermeldung:
[Error] Unit1.pas(30): Identifier redeclared: 'zahl'
[Error] Unit1.pas(34): Constant expression violates subrange bounds
[Error] Unit1.pas(14): Unsatisfied forward or external declaration:
'TForm1.Button1Click'
[Fatal Error] Project3.dpr(5): Could not compile used unit
'Unit1.pas'


Was ist daran falsch? Kann man Befehle nicht außerhalb von Prozeduren
schreiben?

Mfg Xenon

Autor: Enrico L. (enla)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

soweit ich mich erinnere kannst Du Variablen so nicht ausserhalb von
Funktionen einen wert zuweisen.
  "var zahl:Integer;
   zahl:=0;"
Du müsstest also "zahl" innerhalb deines Constructors oder einer
anderen Funktion zuweisen.
Möglicherweise funktioniert auch..
  "var zahl:Integer = 0;"
Bin mir aber nicht sicher.

zu
  "[Error] Unit1.pas(14): Unsatisfied forward or external
declaration:
   'TForm1.Button1Click'"
Du hast eine Memberfunktion "Button1Click" in deiner Klasse
definiert, diese jedoch niemals deklariert.
  "procedure TForm1.Button1Click(Sender: TObject);
   begin
   end;"
in den Code einfügen oder
   "procedure Button1Click(Sender: TObject);"
aus der Klasse entfernen.

LG

Autor: Enrico L. (enla)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hab nochmal nachgeschaut: "var zahl:Integer = 0;" sollte
funktionieren!

Oh man, wie kann man nur so hartnäckig Deklaration und Definition
vertauschen :( grmpf

LG

Autor: Hubert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stimmt, Werte darf man Variablen nur innerhalb von Funktionen und
Prozeduren zuweisen (und natürlich innerhalb des Hauptprogramms). Die
von Enrico erwähnte Methode ist eine Initialisierung und muß
unmittelbar bei der Deklaration erfolgen.

Autor: Xenon (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schon mal danke für die Antworten. Es funktioniert jetzt auch so weit.
Aber wenn ich eine if Anweisung einbaue:

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Label1: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

var zahl:Integer=0;

procedure TForm1.Button1Click(Sender: TObject);
begin
close;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
zahl:=1;
end;

if zahl=1 then close;         //diese zeile hat das problem

end.

Fehler:
Declaration expected but 'if' found.

Muss ich noch eine unit einbinden um if zu benutzen oder irgendwie eine
hauptprozedur erstellen? Oder genauer gesagt: Wo schreibt man das
Hauptprogramm hin?

Mfg Xenon

Autor: Hubert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du mußt keine Unit einbinden, sondern die If-Anweisung in eine Prozedur
packen. So wie du es jetzt hast, steht die außerhalb. Also besser ist:


...

procedure TForm1.Button2Click(Sender: TObject);
begin
  zahl := 1;
  if zahl = 1 then Close;
end;

...

Autor: Xenon (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie kann ich denn eine Hauptprozedur erstellen? Ich habe eigentlich vor,
dass dort 6 if blöcke sind und diese immer wieder abgefragt werden. Wenn
man dann den Button drückt bleibt er stehen und zb eine 4 wird
angezeigt. Also ein Würfel. Daher muss das if irgendwo anders stehen
nur wo? Also das Hauptprogramm.

Autor: Hubert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die "Hauptprozedur" erstellt Delphi automatisch. Um sie anzusehen mußt
du "Projekt" -> "Quelltext ansehen" oder so ähnlich auswählen
(Menu).

Ich würde ein Würfel aber mit der Random-Funktion realisieren.

Autor: Xenon (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok Dankeschön schonmal!

Wie kann ich die Random-Funktion denn benutzen?

Mfg Xenon

Autor: Hubert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Infos siehe Delphi-Hilfe.

Autor: Xenon (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke!
Dann werd ich mich mal darüber informieren.

Tolles Forum einfach! Für jedes Problem ne Lösung ^^

Autor: Stefan M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mit folgendem Trick kommst du einfach ans Ziel:
1. In der Delphi Hilfe schauen, da ist normal ein Beispiel drin
2. www.delphipraxis.net durchsuchen (durchsuchen != thread eröffnen)
3. Google befragen
4. erst jetzt ein Thread aufmachen

Ah und einmal einen minimal kleinen Blick in ein Delphi-Tutorial
werfen.

Autor: Xenon (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was hast du für ein Problem, wenn ich ein Thread eröffne?
Davon abgesehen habe ich schon viele tutorials durchgesehen aber keine
Antworten gefunden, weil ich an die C Programmierung gewöhnt bin und
daher nie das Hauptprogramm suchen musste.

Autor: Xenon (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
Ich hab noch eine Frage...

procedure eins;
begin
label1.caption := 'X';
end;

Die Prozedur habe ich oben deklariert. Wenn ich label1.caption :=
'X';
in die Prozedur eines Buttons eingebe meldet der Compiler kein Problem
aber in dieser Prozedur sagt er: Undeclared Identifier: 'label1' .#
Was ist das Problem?

Autor: Hubert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das kann nicht gehen, da Prozedur "eins" nicht Bestandteil deiner
Form1-Klasse ist. Also deshalb:

procedure TForm1.eins;
begin
  label1.caption := 'X';
end;


Aber nicht vergessen, diese Prozedur auch "oben" bei der
Klassendeklaration anzugeben:

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Label1: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure eins;
  private
    { Private declarations }
  public
    { Public declarations }
  end;

...

Autor: Xenon (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wow!

Jetzt geht es, Danke!!!

Langsam verstehe ich Delphi...

Autor: Xenon (Gast)
Datum:
Angehängte Dateien:
  • W_exe (362 KB, 244 Downloads)

Bewertung
0 lesenswert
nicht lesenswert
So ich habe den Würfel nun fertig ^^

Er ist im Anhang.

Autor: Hubert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Glückwunsch !

Autor: Christoph Wagner (christoph)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hübscher Würfel !

Villeicht noch zur Schönheit : Setz doch mal die BorderStyle
Eigenschaft deiner Form auf bssingle. Dann kann man das Fenster auch
nicht nach eigenem belieben vergrößern, verkleinern oder maximieren.
Mit Poisition = poScreenCenter kannst du erreichen, dass dein Programm
beim Starten stets im Mittelpunkt steht ;-)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.