Delphi Problem

Gast #250404
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
#250405
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
Gast #250407
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.
Gast #250408
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
Gast #250409
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;

...
Gast #250410
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.
Gast #250411
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.
Gast #250415
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.
Gast #250416
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.
Gast #250417
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?
Gast #250418
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;

...
#250422
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren