PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Klassen in Delphi


aths
2004-04-19, 09:08:11
Es ist mir fast peinlich, danach zu fragen :schleich:

Wäre jemand so nett, beispielhaft eine einfache Klasse in Delphi zu posten?

- Zwei Membervariablen x und y, wobei x private und y public ist

- Eine Methode, die einen Parameter z übergeben bekommt und x+z ausgibt

- Eine Parameter-freie Methode, die x+y ausgibt.


(Bislang arbeitete ich mit Records, die von Procedures verändert werden. Mit diesem Vorgehen verfitzt sich aber der Code innerhalb kürzester Zeit.)

x-dragon
2004-04-19, 10:08:47
Bin mir zwar nicht sich ob ich das jetzt so richtig verstanden haben, aber das sollte schon mal weiterhelfen:
type
TMeineKlasse = class(TObject)

private
x : Integer;

public
y : Integer;

function GibMirXundZ (z : Integer) : array[1..2] of Integer;
function GibMirXundY : array[1..2] of Integer;
end;

[edit]
*procedure in function umkorrigier*

aths
2004-04-19, 10:34:51
Wo und wie werden die Methoden implementiert?

x-dragon
2004-04-19, 12:57:45
unit Test;

interface

uses
...

type
TMeineKlasse = class(TObject)
...
end

implementation

var
...

function TMeineKlasse.GibMirXundY : array[1..2] of Integer;
begin
//bla
end;

[edit]
*korrigier*, habs etwas mißverstanden ...
[edit2]
[edit]
*procedure in function umkorrigier*
jaja mal sollte nicht alles einfach so kopieren ... :)

Xmas
2004-04-19, 13:03:45
x-dragon, die Implementation von Methoden kommt unter implementation...

Und zwar in der Form
procedure TMeineKlasse.GibMirXundY : array[1..2] of Integer;
begin
//bla
end;

x-dragon
2004-04-19, 13:22:20
Äh ja, da hab ich mich ein wenig vertan :ups:.

Da hast du natürlich völlig recht, werd gleich oben mal korrigieren damit ich nicht zuviel Verwirrung stifte ...

Xmas
2004-04-19, 14:28:06
Original geschrieben von Xmas
procedure TMeineKlasse.GibMirXundY : array[1..2] of Integer;
begin
//bla
end;
Ups, ich hab das zwar jetzt auch nur übernommen, aber so ist das natürlich falsch, weil eine procedure nun mal keinen Datentyp braucht...

Brillus
2004-04-19, 15:58:48
Hier einmal alles auf einmal
Die Ganze Unit der Klasse
unit Unit2;

interface
//Hier die Klasse definiern
type
MeineKlasse = Class(TObject)//<-= Class(TObject) ist die Klasse von der abgeleitet wird
//in diesem Fall müsste man es nicht dabeischreiben weil wenn nicht angegben immer von TObject abgeleitet würde
public
x:integer;
function add(z:integer):integer;
procedure Setxy(px,py:integer);
private
y:integer;
end;
implementation
//Hier ihre Funktionen und Przeduren definiern
function MeineKlasse.add(z:integer):integer;
begin
Result:=z+y;
end;
procedure MeineKlasse.Setxy(px,py:integer);
begin
x:=px;
y:=py;
end;
end.

Und hier meine Unit in der man sie Benutzt

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,Unit2;//<-Uses der andern Unit nicht vergessen

type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
var Klasse:MeineKlasse;//in C++ würde man sagen der Zeiger auf dei Klasse
z:integer;
begin
Klasse:=MeineKlasse.Create; //Belegen des Speichersplatz für die Klasse
Klasse.Setxy(1,2);
z:=Klasse.add(3);
Klasse.Free;//Löschen des Speicherplatz für die Klasse
end;

end.


Ich glaube das das so im ganzen besser ersichtlich ist.
PS: auf jeden Fall in Delphi5 sollte man Klassen immer in Eigne Units schreiben da wenn man sie in die selbe unit schreib wie den Richtige Quelltext kann man auch auf die Privaten werte normal zugreifen. Wie es bei neuern DelphiVersionen ist kann ich dir nicht sagen

x-dragon
2004-04-19, 16:26:28
Original geschrieben von Xmas
Ups, ich hab das zwar jetzt auch nur übernommen, aber so ist das natürlich falsch, weil eine procedure nun mal keinen Datentyp braucht... Danke nochmal für den Hinweis, hab oben auch nochmal korrigiert (procedure -> function), wird langsam Zeit das ich Feierabend habe ...

Original geschrieben von Brillus
...
Ich glaube das das so im ganzen besser ersichtlich ist.
PS: auf jeden Fall in Delphi5 sollte man Klassen immer in Eigne Units schreiben da wenn man sie in die selbe unit schreib wie den Richtige Quelltext kann man auch auf die Privaten werte normal zugreifen. Wie es bei neuern DelphiVersionen ist kann ich dir nicht sagen Wirklich schön übersichtlich, aber was meinst du den mit "normal zugreifen"? Also das man direkt darauf zugreifen kann ohne das man die Klasse mit einbezieht? (arbeite selbst mit Delphi6)

Brillus
2004-04-19, 16:49:37
du kannst auf Privates zugreifen als wäre es Public. ohne irgendwelche Warungen oder Fehler

PS: und mit dem übersichtlicher habe ich das gemeint mit dem Hundetmal auf hunderverschieden Plätzen korrigiert.

Darkstar
2004-04-19, 21:05:02
Original geschrieben von Brillus
Wie es bei neuern DelphiVersionen ist kann ich dir nicht sagen Zumindest in Delphi 6 ist dieses „Feature“ ebenfalls enthalten. Steht übrigens auch in der Dokumentation/Hilfe (in meinem Delphi 6 PE in letzterem unter „Controlling access“).

aths
2004-04-20, 11:31:53
Wieso funzt das nicht?

Globale Variablen-Definition:

recwellen : array[0..2] of wellen;

Formcreate ruft initvars auf:
procedure initvars;
var f:integer;
begin
for f:=0 to 2 do recwellen[f].create();
end;
Hier heulte er rum (beim .create).


edit: Ach ich Dummerchen. Natürlich muss es so aussehen:

for f:=0 to 2 do recwellen[f]:=wellen.create();

Brillus
2004-04-20, 16:05:47
Edit: hab aths sein Edit nicht geshen