genau.
Die eine Globale variable bleibt.
Allerdings nur mal ein beispiel.
Du programmierst ein Fussballspiel ohne Objekte.
1 Spieler
Du hast eine Globale Variable für die Position des Spieler 1.
Du hast ein booleanwert ob er den Ball besitzt,
Eine Integerzahl zu welchem Team er gehört.
eine weitere Zahl wieviele Rote/Gelbe karten er hat.
Torquoten.
EinpaarFunktionen wie zum beispiel:
function ist_Ball_in_nahe(position_vom_ball:TPoint):boolean;
So. Wenn du jetzt 2 spieler haben willst.
Dann kopierst du das alles. Das heißt du hast doppelt so viele Variablen und funktionen und das wird unübersichtlich.
Der Trick: Du machst 1 mal die Klasse TSpieler mit dem ganzen zeug. Un Definierst dann Global nur 22 Spieler. (also 22 Instanzen)
Und das war es.
Zu deiner Frage:
1. Ich sag dir nur schonmal das x := TTest.Create richtig ist. X.Create wird zwar kompiliert, gibt aber einen fehler zur laufzeit...
2.Wenn du es in Button 1 machst dann wird jedes mal eine neue instanz erstellt, deshalb ist der Wert von FZahl = 0, der wird 1 mal erhöht und dann ist er auf 1. Hier haben wir dann wieder das Speicherleck, da immer neuer speicher besetzt wird. Allerdings der Pfad zum alten Speicher verloren geht und dieser schwer bereinigt werden kann...
OnShow ist da besser, trotzdem kann es sein das wenn du die form minimierst oder schließt und dann wieder startest das die Prozedure 2 mal aufgerufen wird.
OnCreate ist hier empfehlenswerter.
(Ich mach das immer mit einem Timer den ich nur 1 mal ausführenlasse mit Timer1.Enabled := False; in OnTimer...)
3.Das self ist unnötig, kannst es aber drinn lassen wenn du willst...
4. Außerdem gibt es noch propertys. Die sind relativ nützlich - für den Benutzer verhält es sich wie eine Variable. Z.B TEdit.Text ist eine Property. Das tolle daran. Wir können sagen das soballt der Benutzer eine Variable veränder eine Prozedure ausgeführt wird...
Mann sollte die F-Variablen übrigenz nur in funktionen von TTest verwenden - Da diese (wie in deinem Fall richtig gemacht wurde) geschützt sind und somit, nur in der Unit von TTest verändert werden können...
Code: Alles auswählen
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;
type
{ TForm1 }
TForm1 = class(TForm)
Button1: TButton;
Label1: TLabel;
procedure Button1Click(Sender: TObject);
procedure FormShow(Sender: TObject);
private
{ private declarations }
public
{ public declarations }
end;
{ TTest }
TTest = class
private
Fzahl: Integer;
Ftext: String;
procedure Setzahl(const AValue: integer);
public
property Zahl:integer read FZahl write Setzahl; // hier darf man die zahl bestimmen. // wenn man die Zahl auslesen will wird man auf die variable fzahl weitergeleitet. will man sie ändern wird man auf SetZahl weitergeleitet.
property Text:string read Ftext; // diese Property ist Readonly, man kann Text nicht ändern nur lesen...
end;
var
X: TTest;
Form1: TForm1;
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.FormShow(Sender: TObject);
begin
X := TTest.Create;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
X.zahl := x.Zahl+1;
Label1.Caption:='X ='+X.Text; // ausgelesen wird über die Property Text
end;
procedure TTest.Setzahl(const AValue: integer);
begin
FZahl:=AValue;
Ftext := inttoStr(AValue); // jedes man wenn Zahl geändert wird wird FText mitgeändert...
end;
end.