Announcement

Collapse
No announcement yet.

Objekteigenschaften als VAR Parameter an Funktion übergeben

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Objekteigenschaften als VAR Parameter an Funktion übergeben

    Hallo,

    ich benötige einige spezielle String Funktionen, habe einige Problem bei der Parameter Deklaration. Hier die entsprechende Funktion:

    <pre>
    function strCopy(var s: string; start, copycount : integer;
    Killing : Boolean = False) : String;
    begin
    // Parameter prüfen
    if start > Length(s) then exit;
    if start + copycount > Length(s) then exit;

    result := Copy(s,start,copycount);

    if killing then Delete(s,start,copycount);
    end;
    </pre>

    Wenn ich nun die Funktion aufrufe, z.B. x := strCopy(Edit1.Text,1,5) hat der Compiler damit natürlich ein Problem. Weis jemand wie der Kopf der Funktion aussehen muss, damit der eben genannte Funktionsaufruf funktioniert ?

    Bis dann ...

  • #2
    <p>Hallo,<br>
    <br>
    Objekt-Propertys können nicht als var-Parameter übergeben werden. Also musst Du <b>var</b> im Funktionskopf löschen.<br>
    Ausserdem würde ich einen anderen Namen für die Funktion wählen, da bereits eine Delphi-Funktion mit gleichem Namen in der Unit SysUtils existiert.<br>
    <br>
    Gruß Thomas</p&gt

    Comment


    • #3
      Hi,

      das mit den Objekt-Properties funktioniert deshalb nicht, weil die Properties keine wirklichen Variablen in dem Sinn sind wie du sie sonst verwendest sondern Eigenschaften die über bestimmte Read-, Write-Methoden auf eine Variable im <B>private</B> Bereich zugreifen. Wenn aber nun eine Variable an eine Funktion mit einem <B>var</B>-Paramter übergeben wird, so wird nicht eine Kopie dieser Variable, sondern ein Pointer auf jene übergeben, sodass die Änderungen die während der Funktion/Prozedure an der Variable vorgenommen werden sich auch auf die übergebene Variable auswirken. Da aber die Objekt-Properties keine wirklichen Variablen sind, kannst du auch nicht ihre Speicheradresse (also den Pointer) auslesen, da ja der eigentliche Wert in einer ganz anderen Variable gespeichert ist.<BR><BR>
      Um dein Problem zu umgehen müsstest du also mit einer Variable arbeiten:<BR><BR>
      <Font Face = "Courier New" Size = 4><B>function</B> StringCopy(<B>var</B> s: <B>String</B>; Start, Copycount: Tnteger; Killing: Boolean = False) : String;<BR>
      <B>begin</B><BR>
      &nbsp;&nbsp;<I>// Parameter prüfen</I><BR>
      &nbsp;&nbsp;<B>if</B> (Start > Length(s)) <B>or</B> (start + copycount > Length(s)) <B>then</B> Exit;<BR>
      &nbsp;&nbsp;Result := Copy(s, Start, Copycount);<BR>
      &nbsp;&nbsp;<B>if</B> Killing <B>then</B> Delete(s, Start, Copycount); <BR>
      <B>end</B>;<BR><BR>
      <B>procedure</B> TForm1.Button1Click(Sender: TObject);<BR>
      <B>var</B><BR>
      &nbsp;&nbsp;sTemp: <B>String</B><BR>
      <B>begin</B><BR>
      &nbsp;&nbsp;sTemp := Edit1.Text;<BR>
      &nbsp;&nbsp;Label1.Caption := StringCopy(sTemp, 1, 5);<BR>
      &nbsp;&nbsp;Edit1.Text := sTemp;<BR>
      <B>end</B>;</Font><BR><BR>
      Motz

      Comment

      Working...
      X