Autor Beitrag
DaBass
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 08.09.03 14:41 
mal wieder ich mit meinen Problemen.... :D

Ich habe eine Komponente geschrieben, die TPCInfo heisst.

Bis anhin habe ich folgende Funktionen darin verpackt:

ausblenden 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!
ausblenden 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.


Zuletzt bearbeitet von DaBass am Mi 10.09.03 18:31, insgesamt 1-mal bearbeitet
barfuesser
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 324



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2931

XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
BeitragVerfasst: 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:

ausblenden 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...!

_________________
gringo pussy cats - eef i see you i will pull your tail out by eets roots!
DaBass
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 324



BeitragVerfasst: 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
DaBass
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 08.09.03 15:01 
werde mich mal weiterbilden....
Motzi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2931

XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
BeitragVerfasst: Mo 08.09.03 15:07 
Kannst dir auch mal mein OOP "Tutorial" anschaun... www.x-spy.net/personal

_________________
gringo pussy cats - eef i see you i will pull your tail out by eets roots!
obbschtkuche
Gast
Erhaltene Danke: 1



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2931

XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
BeitragVerfasst: 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...!

_________________
gringo pussy cats - eef i see you i will pull your tail out by eets roots!
AndyB
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1173
Erhaltene Danke: 14


RAD Studio XE2
BeitragVerfasst: 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.

_________________
Ist Zeit wirklich Geld?
obbschtkuche
Gast
Erhaltene Danke: 1



BeitragVerfasst: Mo 08.09.03 21:18 
die heißen auch oft "new"
Motzi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2931

XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
BeitragVerfasst: 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"...

_________________
gringo pussy cats - eef i see you i will pull your tail out by eets roots!
AndyB
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1173
Erhaltene Danke: 14


RAD Studio XE2
BeitragVerfasst: 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.
ausblenden volle Höhe 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.

_________________
Ist Zeit wirklich Geld?