Avatar billede franzthomsen Nybegynder
17. oktober 2001 - 14:47 Der er 33 kommentarer og
1 løsning

Underlig håndtering af en property

Er der et klogt hovede der kan svare mig på, hvorfor compileren brokker sig over følgende stykke kode. For at reproducere: 1) Nyt program. 2) Overskriv hele Unit1 med dette. 3) placer en button på formen. Prøv det lige af inden du skyder af fra hoften og rammer forkert :)

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    procedure DoSomething(var Input:Double);
    { Public declarations }
  end;

  TGonyf = class
  private
    FTest : Double;
    function GetTest : Double;
    procedure SetTest(D : Double);
  public
    property Test : Double read GetTest write SetTest;
  end;

var
  Form1: TForm1;
  Gonyf : TGonyf;

implementation

{$R *.DFM}

function TGonyf.GetTest : Double;
begin
  Result := FTest;
end;

procedure TGonyf.SetTest(D : Double);
begin
  FTest := D;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  DoSomething(Gonyf.Test);
end;

procedure TForm1.DoSomething(var Input:Double);
begin
  Result:=Input*Input;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Gonyf:=TGonyf.Create;
end;

end.

Avatar billede microtec Nybegynder
17. oktober 2001 - 15:04 #1
Nu havde det være rart, hvis du havde beskrevet HVAD problemet var.

Jeg kan da se mindst en fejl. Nemlig:

procedure TForm1.DoSomething(var Input:Double);
begin
  Result:=Input*Input;
end;

Det skal IKKE være en procedure men en function. Ellres kan du ikke retunere et resultat.
Avatar billede franzthomsen Nybegynder
17. oktober 2001 - 15:07 #2
Det var jeg godt selv klar over lige efter jeg havde postet, men hvis du prøver programmet som jeg skrev :) ville du se, at compileren ikke kommer længere end til
DoSomething(Gonyf.Test), hvor den skriver :\"Constant object cannot be passed as var parameter\"
Avatar billede microtec Nybegynder
17. oktober 2001 - 15:10 #3
Hvorfor KRÆVER du at folk compilere din kode FØR de svarer, når du ikke en gang selv har testet den?

Du spilder min tid.
Avatar billede microtec Nybegynder
17. oktober 2001 - 15:11 #4
Hvordan skal man \"prøver programmet\" når der er åbenlyse fejl, som gør at det ikke kan compileres ;o)
Avatar billede franzthomsen Nybegynder
17. oktober 2001 - 15:17 #5
Kan du svare på problemet eller ej? Du spilder MIN tid med overflødige kommentarer der jo ikke afspejler din formentlig fine forståelse af min uddybning af spørgsmålet.
Avatar billede microtec Nybegynder
17. oktober 2001 - 15:20 #6
Hvor meget af det er \"fejl\", som du godt vidste var der?

Du kan som det mindste afprøve det du poster.
Specielt når du så arrogant siger \"Prøv det lige af inden du skyder af fra hoften og rammer forkert\".
Avatar billede franzthomsen Nybegynder
17. oktober 2001 - 15:25 #7
Mit spørgsmål er stadig åbent til besvarelse, hvis der er nogle der har et seriøst bud.
Avatar billede microtec Nybegynder
17. oktober 2001 - 15:25 #8
Nå, skidt.

Problemet er at VAR-erklæringen i:

procedure TForm1.DoSomething(var Input:Double);

Ret det til

function TForm1.DoSomething(Input:Double) : Double;


Avatar billede microtec Nybegynder
17. oktober 2001 - 15:29 #9
... så kan det compileres uden problemer.

Når du erklære som (var Input:Double) skal baremetren være en variabel, da der kan tilskrives inde i funktionen.

Avatar billede franzthomsen Nybegynder
17. oktober 2001 - 15:32 #10
Godt bud, men problemet er, at jeg i det \"rigtige program\" hvor jeg benytter det har 3 parametre som input med værdier, der modificeres og ryger den anden vej igen. Så spørgsmålet er, hvorfor Delphi opfatter en, efter min mening, variabel som en konstant og hvordan man løser problemet. en løsning er selvfølgelig:

procedure TForm1.Button1Click(Sender: TObject);
var Temp:Double;
begin
  Temp:=Gonyf.Test;
  DoSomething(Temp);
  Gonyf.Test:=Temp;
end;

men den måde er i mine øjne lidt kikset.

Avatar billede martinlind Nybegynder
17. oktober 2001 - 15:33 #11
Og det er en Property IKKE
Avatar billede franzthomsen Nybegynder
17. oktober 2001 - 15:36 #12
Ok, mao det kan ikke lade sig gøre det jeg prøver på?
Avatar billede microtec Nybegynder
17. oktober 2001 - 15:37 #13
Jammen, det er den VAR-erklæring, der er problemet.

Du kan ikke bruge en Property i en VAR-erklæring.
Lav det på en anden måde. Brug f.eks. en global-erklæret variabel.
Avatar billede microtec Nybegynder
17. oktober 2001 - 15:38 #14
...ved godt det ikke er så pånt med globale var´s, men nogen gange er det ikke let at bruge parameter-overførsel.
Avatar billede martinlind Nybegynder
17. oktober 2001 - 15:42 #15
En property på et obj. \"virker som en Variable men er jo faktisk en get og set func. så der for SKAL du via en var, hvis parameteren skal være en VAR, men du kunne jo overveje at sende dit OBJ ned i stedte for en property på obj. så kan dosomething rette directe på obj. property\'s, og du kan undvære din VAR overførsel

/Martin
Avatar billede franzthomsen Nybegynder
17. oktober 2001 - 15:43 #16
Tak for dansen ;)
Avatar billede microtec Nybegynder
17. oktober 2001 - 15:45 #17
martinlind >> Du vil altså overføre hele OBJ, i stedet for blot den ene property?

Det må give et stort overhead af kode/tid?
Avatar billede microtec Nybegynder
17. oktober 2001 - 15:47 #18
franzthomsen  >> Helt ærlig. Det der kan du sku ikke tillade dig.
Jeg fandt begge dine fejl. Gav dig en mulig løsning.
Nu giver du så alle point til martinlind.

Du er er dum skid, som ikke skal forvente hjælp fra mig igen :o(
Avatar billede franzthomsen Nybegynder
17. oktober 2001 - 15:49 #19
Nej, det er ikke den måde jeg vil gøre det på. Jeg kan se at den eneste mulighed nok er at:

Temp:=Gonyf.Test;
DoSomething(Temp);
Gonyf.Test:=Temp;

med en lokal variabel. Det er godt nok en amatøragtig måde, specielt set i lyset af, at der i mine øjne ikke skulle være noget til hinder for at det virkede i starten af. Men sådan er det jo nok bare skruet sammen i D :/
Avatar billede franzthomsen Nybegynder
17. oktober 2001 - 15:53 #20
microtec >> du fandt ingen fejl jeg ikke allerede var klar over og gav ingen muligheder jeg ikke allerede var klar over. martinlind gav en forklaring jeg ikke var klar over og en mulighed jeg selv havde prøvet. Derfor
Avatar billede martinlind Nybegynder
17. oktober 2001 - 15:53 #21
Et HELT obj er jo \"bare en Pointer\" så JA det ville jeg overveje kraftig, det er sikker det nemeste og hurtigste, du behøver ikke allokere en lokal var på stacken og opnår det du vil.
Avatar billede microtec Nybegynder
17. oktober 2001 - 15:55 #22
franzthomsen >>

Spørgsmålet var hvorfor dit program IKKE kunne compileres.
SVARET er her:

<====================================>
Afvist svar fra microtec 
17/10 2001 15:25:49    Nå, skidt.

Problemet er at VAR-erklæringen i:

procedure TForm1.DoSomething(var Input:Double);

Ret det til

function TForm1.DoSomething(Input:Double) : Double;
<====================================>


Avatar billede microtec Nybegynder
17. oktober 2001 - 15:56 #23
Det står ikke en skid i dit spørgsmål om at du skal have overført 3 variable til DoSomething!!!!
Avatar billede franzthomsen Nybegynder
17. oktober 2001 - 15:57 #24
Ja, men hvis TGonyf er en property i en overklasse, som igen indgår i en hovedklasse, så er det i virkeligheden hele min datastruktur i programmet der skal overføres :)
Avatar billede microtec Nybegynder
17. oktober 2001 - 15:58 #25
...jeg har fundet 2 programmering-fejl for dig.

Man kan ikke bagefter sige \"du fandt ingen fejl jeg ikke allerede var klar over\".
Avatar billede martinlind Nybegynder
17. oktober 2001 - 16:00 #26
Nej du over bare din TGonyF, det kan du sagtens da det er en classe
Avatar billede microtec Nybegynder
17. oktober 2001 - 16:01 #27
martinlind >> Mener du virkelig selv at du har givet svar på det spørgsmålet oprindelig gik på?

\"Er der et klogt hovede der kan svare mig på, hvorfor compileren brokker sig over følgende stykke kode\"

Avatar billede franzthomsen Nybegynder
17. oktober 2001 - 16:04 #28
aaaah, ja. Tak :)
Avatar billede martinlind Nybegynder
17. oktober 2001 - 16:04 #29
Jeg mener jeg har fortalt hvordan han kunne løse sit problem, men det er jo altså ikke mig der deler point ud :)
Avatar billede microtec Nybegynder
17. oktober 2001 - 16:08 #30
martinlind >> Det var ikke der der blev spurt om.
Spørgsmålet var hvad årsagen var.
Det rigtige svar står her:


<=====================================>
Nå, skidt.

Problemet er at VAR-erklæringen i:

procedure TForm1.DoSomething(var Input:Double);

Ret det til

function TForm1.DoSomething(Input:Double) : Double;


 

  Kommentar fra microtec 
17/10 2001 15:29:00    ... så kan det compileres uden problemer.

Når du erklære som (var Input:Double) skal baremetren være en variabel, da der 
<=====================================>


Du poster et svar til en løsning (spørges der ikke efter), efter jeg har givet svar på det spørgsmålet gik på.

Jeg er fandme ved at være træt af den opførsel, der efterhånden er standard på Eksperten!!!!!
Avatar billede franzthomsen Nybegynder
17. oktober 2001 - 16:14 #31
Problemet jeg bad om svar til var, hvorfor min compiler skrev \"Constant object cannot be passed as var parameter\", hvilket også ville fremgå, hvis programmet blev kørt. Svaret på det var at en property ikke er en variabel.
Avatar billede 123test Nybegynder
17. oktober 2001 - 16:20 #32
franzthomsen >> Det er sku da også det svar du får fra mig 17/10 2001 15:29:00.

Se at få delt de point ud!
Avatar billede martinlind Nybegynder
17. oktober 2001 - 16:25 #33
123test >> har vi skiftet alias ???
Avatar billede microtec Nybegynder
17. oktober 2001 - 16:33 #34
martinlind >> Ja det gør vi da. \"Ulveflokken\" kommer nok efter mig nu.

Som sagt, er jeg dødhammerende træt at den måde dette forum har udviklet sig på.
Folk lukker ikke sine spørgsmål, vender ikke tilbage, afviser rigtige svar. Sproget er efterhånden et kapitel for sig selv. Bliver man kun kaldt spasser, skal det opfattes som en kærlighedserklæring.

Sidst jeg oprettede et spørgmål med alle min point for at gøre opmærksom på problemet, førte admin dem blot tilbage uden så meget som EN kommentar.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester