Forum: PC-Programmierung Delphi Problem


von Xenon (Gast)


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

von Enrico L. (enla)


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

von Enrico L. (enla)


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

von Hubert (Gast)


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.

von Xenon (Gast)


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

von Hubert (Gast)


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;

...

von Xenon (Gast)


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.

von Hubert (Gast)


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.

von Xenon (Gast)


Lesenswert?

Ok Dankeschön schonmal!

Wie kann ich die Random-Funktion denn benutzen?

Mfg Xenon

von Hubert (Gast)


Lesenswert?

Infos siehe Delphi-Hilfe.

von Xenon (Gast)


Lesenswert?

Danke!
Dann werd ich mich mal darüber informieren.

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

von Stefan M. (Gast)


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.

von Xenon (Gast)


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.

von Xenon (Gast)


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?

von Hubert (Gast)


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;

...

von Xenon (Gast)


Lesenswert?

Wow!

Jetzt geht es, Danke!!!

Langsam verstehe ich Delphi...

von Xenon (Gast)


Angehängte Dateien:

Lesenswert?

So ich habe den Würfel nun fertig ^^

Er ist im Anhang.

von Hubert (Gast)


Lesenswert?

Glückwunsch !

von Christoph W. (christoph)


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 ;-)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.