| Autor |
Beitrag |
DaBass
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mo 08.09.03 14:41
mal wieder ich mit meinen Problemen....
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 Tino: Code- durch Delphi-Tags ersetzt.
Zuletzt bearbeitet von DaBass am Mi 10.09.03 18:31, insgesamt 1-mal bearbeitet
|
|
barfuesser
      
Beiträge: 324
|
Verfasst: 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
      
Beiträge: 2931
XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
|
Verfasst: 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...!
_________________ gringo pussy cats - eef i see you i will pull your tail out by eets roots!
|
|
DaBass
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mo 08.09.03 14:47
kannst du mir dafür ein kleines Bsp. erstellen??
Ich verstehe nicht genau, wie ich dies anstellen soll.... 
|
|
barfuesser
      
Beiträge: 324
|
Verfasst: 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
|
Verfasst: Mo 08.09.03 15:01
werde mich mal weiterbilden....
|
|
Motzi
      
Beiträge: 2931
XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
|
Verfasst: 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
|
Verfasst: 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
      
Beiträge: 2931
XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
|
Verfasst: 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
      
Beiträge: 1173
Erhaltene Danke: 14
RAD Studio XE2
|
Verfasst: 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
|
Verfasst: Mo 08.09.03 21:18
die heißen auch oft "new"
|
|
Motzi
      
Beiträge: 2931
XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
|
Verfasst: 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
      
Beiträge: 1173
Erhaltene Danke: 14
RAD Studio XE2
|
Verfasst: 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.
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 Auto.Init; ShowMessage(IntToStr(Integer(Auto.Farbe))); Auto.Done;
DynAuto := New(PAuto, Init); try DynAuto^.SetFarbe(clYellow); finally Dispose(DynAuto, Done); end;
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?
|
|