Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Komponente.Funktion.Unterfunktion [Erledigt]


Delete - Mo 08.09.03 14:41
Titel: Komponente.Funktion.Unterfunktion [Erledigt]
mal wieder ich mit meinen Problemen.... :D

Ich habe eine Komponente geschrieben, die TPCInfo heisst.

Bis anhin habe ich folgende Funktionen darin verpackt:


Delphi-Quelltext
1:
2:
3:
4:
5:
TPCInfo.GetTotalPhysRamSize(): Extended;
TPCInfo.GetAvailPhysRamSize(): Extended;
TPCInfo.GetTotalVirtualRamSize(): Extended;
TPCInfo.GetAvailVirtualRamSize(): Extended;
{...}

jetzt möchte ich der Übersichtheits halber diese Funktionen in eine Unterfunktion packen. Ist das überhaupt möglich?? Oder geht das gar nicht??

die Aufrufe der Funktionen sollten dann etwa so wie folgt aussehen, jedoch sollte in der Komponente für das ganze nur eine Funktion geschrieben werdn!

Delphi-Quelltext
1:
2:
3:
4:
5:
Result := TPCInfo.GetRAMInfo.TotalPhys();
Result := TPCInfo.GetRAMInfo.AvailPhys();
Result := TPCInfo.GetRAMInfo.TotalVirtual();
Result := TPCInfo.GetRAMInfo.AvailVirtual();
{...}

Kann mir da jemand weiter helfen??

Moderiert von user profile iconTino: Code- durch Delphi-Tags ersetzt.


barfuesser - Mo 08.09.03 14:44

Unterfunktionen gibt es nicht. Aber wenn es Dir nur um das entsprechende Aufrufschema geht, dann nimm eine Klasse namens RAMInfo, der Du die 4 Methoden gibst. Diese Klasse nutzt Du dann in der Klasse oder Komponente TPCInfo.

barfuesser


Motzi - Mo 08.09.03 14:46

Find ich ehrlich gesagt nicht sehr sinvoll... würde entweder (so wie bisher) für jede Info eine eigene Methode oder aber eine Methode GetRAMInfo nehmen, die einen Record mit allen Infos zurückgibt. So wie du das willst ginge das nur über ein "Unterobjekt" zB:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
TRAMInfo = class
  TotalPhys(): Extended;
  AvailPhys(): Extended;
  TotalVirtual(): Extended;
  AvailVirtual(): Extended;
end;

TPCInfo = class
  GetRAMInfo: TRAMInfo
end;

Die TRAMInfo-Instanz musst du natürlich im Konstruktor erzeugen und im Destruktor wieder freigeben...!


Delete - Mo 08.09.03 14:47

kannst du mir dafür ein kleines Bsp. erstellen??

Ich verstehe nicht genau, wie ich dies anstellen soll.... :oops:


barfuesser - Mo 08.09.03 14:52

Dafür werde ich Dir kein auch noch so kleines Beispiel erstellen! Wie ich feststellen muß fehlen Dir noch die Grundlagen der Delphi-Programmierung. Diese solltest Du Dir erst einmal aneignen. Dazu kann ich Dir nur empfehlen einen Buchhändler Deiner Wahl aufzusuchen und Dir die entsprechende Lektüre auszusuchen. Alternativ wären auch eine öffentlich Leihbibliothek oder diverse Suchfunktionen in den verschiedenen Delphiforen und Suchmaschinen zu empfehlen. Wenn dabei dann konkrete Probleme auftreten, helfe ich gerne weiter.

barfuesser


Delete - Mo 08.09.03 15:01

werde mich mal weiterbilden....


Motzi - Mo 08.09.03 15:07

Kannst dir auch mal mein OOP "Tutorial" anschaun... http://www.x-spy.net/personal


Anonymous - Mo 08.09.03 16:38

du kannst auch "objects" benutzen, die lassen sich dann wie records einfach deklarieren, dh der constructor fällt weg. (Und die ganzen sonstigen fuinktionen und eigenschaften)
Die sind aber glaub ich als deprecated eingestuft.


Motzi - Mo 08.09.03 17:24

obbschtkuche hat folgendes geschrieben:
Die sind aber glaub ich als deprecated eingestuft.

Richtig, außerdem müssen solche Objekte auch erzeugt werden, auch wenn es keine Konstruktoren wie bei den Delphi-Klassen gibt...!


AndyB - Mo 08.09.03 19:21

Motzi hat folgendes geschrieben:
Richtig, außerdem müssen solche Objekte auch erzeugt werden

Solange man keine Variable als Zeiger auf ein object deklariert, werden diese komplett auf den Stack bzw. im Datensegment abgelegt. Ein Speicherreservieren ala TObject.Create ist nicht notwendig, da der Compiler dies bereits erledigt hat.

Zitat:
auch wenn es keine Konstruktoren wie bei den Delphi-Klassen gibt...!

object besitzt sehr wohl Konstruktoren und Destruktoren. Deren Aufgabe ist aber nur auf die Initialisierung bzw. Finalisierung der Felder begrenzt und nicht, wie bei class zur Speicherreservierung für die jeweilige Instanz gedacht.

object ist nicht nur deprecated sondern enthält auch einige Bugs, die nicht mehr behoben werden.


Anonymous - Mo 08.09.03 21:18

die heißen auch oft "new"


Motzi - Mo 08.09.03 23:50

AndyB hat folgendes geschrieben:
Solange man keine Variable als Zeiger auf ein object deklariert, werden diese komplett auf den Stack bzw. im Datensegment abgelegt. Ein Speicherreservieren ala TObject.Create ist nicht notwendig, da der Compiler dies bereits erledigt hat.

Du meinst so wie die statischen Objekte von C++? Das ist mir neu...

Zitat:
object besitzt sehr wohl Konstruktoren und Destruktoren. Deren Aufgabe ist aber nur auf die Initialisierung bzw. Finalisierung der Felder begrenzt und nicht, wie bei class zur Speicherreservierung für die jeweilige Instanz gedacht.

Ich weiß, wollte nur nicht so sehr ins Detail gehen. Sollte eigentlich heißen "auch wenn es keine Konstruktoren in der Form wie bei den Delphi-Klassen gibt"...


AndyB - Di 09.09.03 01:21

Motzi hat folgendes geschrieben:
Du meinst so wie die statischen Objekte von C++? Das ist mir neu...

Dann hast du nun was gelernt.

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
type
  PFahrzeug = ^TFahrzeug;
  TFahrzeug = object
  private
    FFarbe: TColor;
  public
    constructor Init;
    destructor Done;

    function Farbe: TColor;
    procedure SetFarbe(Value: TColor);
  end;

  PAuto = ^TAuto;
  TAuto = object(TFahrzeug)
  private
     FMarke: string;
  public
    constructor Init;
    destructor Done;

    function Marke: string;
    procedure SetMarke(const Value: string);
  end;


procedure MyProc;
var
  Auto: TAuto;
  OtherAuto: TAuto;
  DynAuto: PAuto;
begin
 // statische Instanz
  Auto.Init;
  ShowMessage(IntToStr(Integer(Auto.Farbe)));
  Auto.Done;


  DynAuto := New(PAuto, Init);
  try
    DynAuto^.SetFarbe(clYellow);
  finally
    Dispose(DynAuto, Done);
  end;

 // statische Instanz ohne Konstruktor und Destruktor Aufruf
  OtherAuto.SetFarbe(clBlack);
end;

Hierbei entsteht kein Speicherleck, da durch das Verlassen der Funktion der Stack aufgeräumt wird und Auto und OtherAuto gelöscht werden.

Ein besseres Beispiel findet man im TurboPASCAL und BorlandPASCAL Handbuch.