Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Operatoren // Alternative Proz. Parameter


thebe - Fr 04.07.03 14:02
Titel: Operatoren // Alternative Proz. Parameter
Moin,

Ich hab ma zwei Fragen die ich in meiner Delphi-Zeit noch nit wirklich beantworten konnte, vielleicht könnt ihr mir dabei helfen.

Und zwar...

1.) Kann man bei Delphi wie bei C++ "Operatoren Scoping" (so heißt das glaub ich) machen, sprich daß man neue Objecte/Klassen definiert und dann neue Operatoren die auf die Klassen angewendet werden können. Wäre z.b. recht gut für Rechnungen mit Vektoren, da man die ganzen Rechnungen da dann ganz schnell per Operatoren wie * und x machen kann.

2.) Wie kann man bei einer Prozedur einstellen, daß man z.b. nur einen Buffer braucht wo reingeschrieben wird (wie z.b. bei den Streams Read/Write, denen isses egal ob man in nen Integer oder aber sonst wo hinschreibt). Oder aber das man z.b. einige Parameter alternativ gestaltet. Wäre ja recht nett für Prozeduren wo man z.b. ne TStatusBar übergeben kann, die den Fortschritt anzeigt aber nicht unbedingt muss.

Scho ma vielen Dank für evtl. Hilfe

- Thebe


maximus - Fr 04.07.03 14:48

Zitat:
...Oder aber das man z.b. einige Parameter alternativ gestaltet. Wäre ja recht nett für Prozeduren wo man z.b. ne TStatusBar übergeben kann, die den Fortschritt anzeigt aber nicht unbedingt muss.


ja...so:


Delphi-Quelltext
1:
2:
3:
4:
procedure setCrap(para1:byte = 128 );
begin
  ...
end;


dieser parameter muss dann nicht angegeben werden und benutz dann zB. 128!


BeniSchindler - Fr 04.07.03 15:18

hi,

Bei 1.) weiss ich leider nicht was du meinst.
Deswegen kann ich dir nur zu 2.) etwas sagen.

Also du fragst da ja nach mehreren Sachen gleichzeitig ;) .

1. Wie kann ich der Prozedur einen Parameter übergeben, bei dem es egal ist was es für ein Datentyp ist?

A:

Delphi-Quelltext
1:
 procedure testproc( Variable1 : Variant);                    


Dadurch kannst du alles übergebne wozu du lustig bist. Es kann jedoch zu Fehlern in der Prozedure kommen, wenn etwas nicht korrekt umgewandelt werden kann.


2. Wie kann ich der Prozedure sagen, dass sie Standartwerte benutzt und man die Parameter deswegen nicht unbedingt angeben muss.

A:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
 procedure TForm1.testproc( StatBar1 : TStatusBar = nil);
 begin
   if StatBar <> nil then begin
     //Quelltext mit Statusbar.
   end else begin
     //Quelltext ohne Statusbar.
   end;
 end;


Du kannst nun eine Statusbar übergeben. Wenn nicht, so wird einfach der Wert benutz der hinter dem "=" steht. Dort könnte natürlich auch eine andere Standart-Statusbar deines Progs stehen die die Prozedur verwenden soll, wenn keine andere übergeben worden ist.

Wenn du mehrere Parameter mit Defaultwerten angibst, so musst du von Links nach rechts alle Werte übergeben bis zu dem Wert den du abändern willst. z.B. du hast 5 Paramter in einer Prozedur mit Defaultwerten versehen. Und nun möchtest du bei einem Aufruf den 3 Parameter abändern, so musst du im Prozeduraufruf Parameter 1-3 übergeben.




3. Wie kann man eine Prozedure mit einem Parameter definieren, wobei dieser Parameter jedoch aus mehreren verschiedenen Variablentypen bestehen kann.

A:

Delphi-Quelltext
1:
2:
  procedure tester( var1 : integer); override;
  procedure tester( var1 : string); override;


Du hast nun zwei Prozeduren, die du mit dem selben aufruf ansteuern kannst. Der Compiler unterscheidet an Hand der Variablentypen welche
Prozedur du benutzen möchtest.

Dadurch muss natürlch die Parameter eindeutig am Variablentyp zu unterscheiden sein.

Und du must die selbe Prozedur auch jeweils einmal schreiben für die jeweils verschiedenen Variablentypen.



Ich hoffe dir beantwortet das ein paar Fragen.


maximus - Fr 04.07.03 16:32

BeniSchindler hat folgendes geschrieben:
...3. Wie kann man eine Prozedure mit einem Parameter definieren, wobei dieser Parameter jedoch aus mehreren verschiedenen Variablentypen bestehen kann.

A:

Delphi-Quelltext
1:
2:
  procedure tester( var1 : integer); override;
  procedure tester( var1 : string); override;

....


Das ist so nicht richtig :wink: (wohl n schreib fehler) :


Delphi-Quelltext
1:
2:
  procedure tester( var1 : integer); overload;
  procedure tester( var1 : string); overload;


PS: warum wird overload nicht fett gemahlt?


BeniSchindler - Fr 04.07.03 17:41

Oups, ... sorry ... natürlich gehört da "overload" hin. :!:
Hab in den letzen Tagen einfach nichts anderes gemacht, als vererbte Prozeduren zu überschreiben :roll:. Hab deswegen gerade einen kleinen "Override"-Tick ;)


thebe - Fr 04.07.03 18:09

Aaaah wunderbar Danke, nu habsch das kapiert

Naja zu 2.)

Operation Scoping:

Man erstellt ne neue Klasse und gibt vor das man diese Klasse per neuem Operator und ner anderen Klasse / Wert verknüpfen kann.

z.B. VektorKlasse * irgendeinFloatWert = VektorKlasse(verlängert)

dieser Operator kann dann auch meinetwegen x oder + oder weiß der Geier was sein. Ist nicht wirklich wichtig, aber meines Erachtens nach ungeheuer übersichtlicher als wenn man "VerlängereVektor(VektorKlasse, irgendeinFloatWert);" benutzt im Code.

Nochmals vielen Dank wg. der Overload Geschichte :)

- Thebe


maximus - Fr 04.07.03 20:52

Das fehlende "Operation Scoping" ist leider ein kleines manko von delphi :cry:


AndyB - Fr 04.07.03 23:27

Heißt das nicht "Überladen von Operator" ? Und das ist mit Variants zum Teil machbar.


maximus - Fr 04.07.03 23:34

Operatoren auf Klassen anzuwenden is da aber ne ganz andere liga :shock: