Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Optionale Parameter (https://www.delphipraxis.net/1920-optionale-parameter.html)

DerKapitalist 30. Dez 2002 16:41


Optionale Parameter
 
Hi,

ich erinnere mich, dass ich in VBasic damals Parameter als optional übergeben konnte (sprich, es ist nciht notwendig diese Parameter zu setzen)

ich habe nichts vergleichbares in Delphi gefunden, irre ich mich da?

danke!

Sebastian Nintemann 30. Dez 2002 16:51

Hallo DerKapitalist, ich hab jetzt nicht gesucht danach, aber geht das nicht in dem man den betreffenden Parameter schon in der Deklaration initialisiert? Ich meine so:

Delphi-Quellcode:
function MyFunction(a: integer; b: integer=0):TSomeType;
Bin mir wie gesagt nicht sicher.
Gruß, Sebastian

Sebastian Nintemann 30. Dez 2002 16:54

Ja so gehts. Gibt aber noch ein paar (notwendige!) Regeln dazu, such mal in der OH nach "Default parameters".

Gruß, Sebastian

DerKapitalist 30. Dez 2002 16:57

danke!

Brüggendiek 30. Dez 2002 21:17

Hallo!

Es gibt noch eine weitere Möglichkeit: OVERLOAD! Damit kannst Du mehrere Prozeduren/Funktionen mit demselben Namen, aber unterschiedlichen Parameterlisten schreiben. Der Compiler erzeugt dann Code, der die von den Parametern her "richtige" Routine aufruft. Die können sich sogar gegenseitig aufrufen. Beispiel:
Code:
function Test(S: string; I:integer): integer; overload;
begin
  // der gewünschte Code
end;

function Test(S: string): integer; overload;
begin
  Result:= Test (S, 0);
end;
Man muß nur für jede mögliche Parameter-Kombination eine Funktion schreiben. Hier wäre ja die Initialisierung in Ordnumg, aber bei einem optionalen VAR-Parameter (var I:integer) hilft nur Overload!

Gruß

Dietmar Brüggendiek

DerKapitalist 30. Dez 2002 21:20

danke! ich habe aber überladene Methoden bewusst nicht verwendet, es ging mir einfach nur um optionale Parameter... leider funktioniert das mit dynamische Arrays nicht.

Im Prinzip fuehrt meine Funktion das selbe aus, deshalb kein overload, ich dachte mir nur, es ist etwas stylischer das so zu programmieren :-)

Christian Seehase 30. Dez 2002 23:38

Moin Zusammen,

da gibt's doch aber einen gravierenden Unterschied:

overload wendet man an, wenn Funktionen gleichen Namens mit unterschiedlichen Parametertypen und Anzahlen aufrufen können soll, und default parameter, wenn einer oder mehrere der Parameter einen Standardwert bekommen können, so dass man nicht alle mitschreiben muss.

Real_Thunder 23. Nov 2007 17:45

Re: Optionale Parameter
 
Ich hätte da auch eine Frage zu den Standartwerten...

Wenn ich nun mehrere Default Parameter Deklariert habe und möchte bei dem proceduraufruft die ersten beiden auf standart lassen, und den letzten ändern.

Beispiel:
Delphi-Quellcode:
Procedure TForm1.Machwas(param0:String;param1:integer=1;param2:integer=2;param3:integer=3);
begin
  // Mach irgendwas;
end;
Wenn ich nun nur den Parameter3 einen Neuen wert verpassen will, wie stelle ich es an ?

Delphi-Quellcode:
Machwas('test',?,?,9); // ?????

DeddyH 23. Nov 2007 17:56

Re: Optionale Parameter
 
Dann wirst Du AFAIK alle Parameter übergeben müssen.

mkinzler 23. Nov 2007 17:56

Re: Optionale Parameter
 
Das geht so nicht. Du müsstest dann auch einen Wert für die anderen Parameter festlegen oder einen wert, den du dann im Programm durch den Standradwert ersetzt.

DeddyH 23. Nov 2007 17:57

Re: Optionale Parameter
 
[OT] :firejump: Einmal schneller als mkinzler :bouncing4:

:zwinker: :cheers: [/OT]

grenzgaenger 23. Nov 2007 18:15

Re: Optionale Parameter
 
Zitat:

Zitat von DerKapitalist
Hi,

ich erinnere mich, dass ich in VBasic damals Parameter als optional übergeben konnte (sprich, es ist nciht notwendig diese Parameter zu setzen)

ich habe nichts vergleichbares in Delphi gefunden, irre ich mich da?

danke!

nein, es gibt in pascal nichts vergleichbares, und wird es auch nicht geben. der grund dafür ist in der aufrufkonvention, wie die parameter beim procedure aufruf auf den stack gelegt werden. aber es gibt 'ne menge workarounds... ;-)

beispielsweise... 'n dynamisches array übergeben, 'n objektliste übergeben..., default parameter, variante records, etc. pp.

<HTH>

sirius 23. Nov 2007 20:43

Re: Optionale Parameter
 
@grenzgaenger:
Der Kapitalist war vor 4 Jahren das letzte Mal hier :zwinker:

mimi 26. Nov 2007 16:28

Re: Optionale Parameter
 
@grenzgaenger
und sie gibt es doch, oder habe ich was falsch verstanden?
Ich meine Default Paramter... ich kann jetzt nicht sagen wie das in VBA geht, aber in Object Pascal nutzt ich sie sehr gerne.... das geht sogar mit Klassen wie z.b. eine TStringlist.... ob auch ein array geht habe ich noch nicht wirklich ausprobiert.

shmia 26. Nov 2007 16:58

Re: Optionale Parameter
 
Es gibt auch die Möglichkeit über Dispatch-Interfaces zu arbeiten.
Damit sind dann solche Konstruktionen möglich:
Delphi-Quellcode:
 var
 object : OleVariant;
begin
  object := ...;

  // Filename, Mode und Backup sind Parameternamen, keine Variablen!
  object.Open(Filename:='C:\test.txt', Mode:=omReadWrite, Backup:=False);
Die Open-Methode könnte noch 10 weitere Parameter haben; man braucht sie nicht anzugeben.
Diese Art des Aufruf ist allerdings recht langsam, da im Hintergrund einiges abgeht.
Das ist aber auch der Weg, den VB einschlägt. (ein Hauptgrund, weshalb VB nicht so schnell ist)
Alle Parameter sind Variants, die aufgerufene Methode erkennt dass ein Parameter nicht befüllt wurde daran,
dass der Parameter = EmptyParam ist.

Borschti 2. Dez 2009 16:00

Re: Optionale Parameter
 
Hallo,

sorry das ich den alten Thread wieder ausgrabe aber mein Problem bezieht sich auf das oben genannte Overload, sprich überladen von Methoden.

Ich habe es so versucht:
Delphi-Quellcode:
procedure TOutlookPro.SendEmail(body : String; slAttPaths : TStringlist); overload;
var
  outlookApp : TOutlookApplication;
  mailItem : Variant;
  i : Integer;
begin
  outlookApp := TOutlookApplication.Create(Self);

  mailItem := OutlookApp.CreateItem(olMailItem);
  mailItem.Recipients.Add('alexander.bosshammer@bestserv.de');
  mailItem.Subject := 'Supportanfrage bsMIO';
  mailItem.Body := body;

  for i := 0 to slAttPaths.Count do
    begin
      mailItem.Attachments.Add(slAttPaths[i]);
    end;
   
  mailItem.Send;
end;

procedure TOutlookPro.SendEmail(body : String); overload;
var
  outlookApp : TOutlookApplication;
  mailItem : Variant;
begin
  outlookApp := TOutlookApplication.Create(Self);

  mailItem := OutlookApp.CreateItem(olMailItem);
  mailItem.Recipients.Add('alexander.bosshammer@bestserv.de');
  mailItem.Subject := 'Supportanfrage bsMIO';
  mailItem.Body := body;
  mailItem.Send;
end;
Ich bekomme aber jetzt die Meldung: E1030 Ungültige Compileranweisung: 'OVERLOAD'
Woran liegt das und wie bekomme ich die Meldung weg? :gruebel:

VG Alex

DeddyH 2. Dez 2009 16:06

Re: Optionale Parameter
 
Das "overload" gehört in die Klassen-Deklaration.
Delphi-Quellcode:
type
  TMyClass = class(TSomething)
  public
    procedure SomeProc(i: integer); overload; //hier overload hinschreiben
    procedure SomeProc(s: string); overload;
    procedure SomeProc(i: integer; s: string); overload;
  end;

...

procedure TMyClass.SomeProc(i: integer); //hier nicht
begin
  //
end;

mkinzler 2. Dez 2009 16:07

Re: Optionale Parameter
 
Wie sieht die Methodendeklaration im Interface aus?
Ist die Methode überladbar?

Luckie 2. Dez 2009 16:59

Re: Optionale Parameter
 
Noch eine Anmerkung zu den Standardparameter, sie müssen immer als letztes in der Deklaration angegeben werden.

Borschti 3. Dez 2009 07:04

Re: Optionale Parameter
 
Danke :) DeddyHs Antwort hat geholfen :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:39 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz