|
| Læse værdier fra Unit3 i Unit5 Fra : Monie Jacobsen |
Dato : 09-08-02 20:34 |
|
Hej
Vil du hjælpe mig med følgende problem. Som beskreves nedenfor?
I Unit3 er der værdier som jeg gerne vil bruge i Unit5, men får nedslående
Error.
Mener at havde bekendtgjort i Public, så at X, Yop, Yned, kunne bruges i
Unit5.
public
{ Public declarations }
X, Yop, Yned : array [0..18] of Double;
end;
implementation
{$R *.dfm}
begin
X[n] := (SektionBredde[6] * X1[n]);
Yop[n] := ((SektionBredde[6] * YOp1[n]));
Yned[n]:= ((SektionBredde[6] * YNed1[n]));
End;
[Error] Unit5.pas(161): Statement expected, but expression of type 'Double'
found
[Error] Unit5.pas(161): Statement expected, but expression of type 'Double'
found
[Fatal Error] Unit3.pas(51): Could not compile used unit
'..\Vingeberegningsprogram\Unit5.pas'
Forsøger at køre følgende rutine i Unit5, men få ovenstående Error.
begin
For n:=1 to 18 do
begin
X[n]; Yop[n]; Yned[n];
end;
Hvordan kan jeg læse værdier fra Unit3 som skal bruges i Unit5 ?
MVH
Monie
| |
Thomas Nelvik (10-08-2002)
| Kommentar Fra : Thomas Nelvik |
Dato : 10-08-02 07:41 |
|
"Monie Jacobsen" wrote:
> Hej
> Vil du hjælpe mig med følgende problem. Som beskreves nedenfor?
>
> I Unit3 er der værdier som jeg gerne vil bruge i Unit5, men får
> nedslående Error.
>
> Mener at havde bekendtgjort i Public, så at X, Yop, Yned, kunne
bruges i
> Unit5.
>
> Hvordan kan jeg læse værdier fra Unit3 som skal bruges i Unit5 ?
I Unit3 må du ta med "Unit5" i _uses_ klausulen:
uses Unit5; ???
Nøkkelordene "public", "private",... er relatert til classes, ikke
units.
-ThomasN
| |
Monie Jacobsen (10-08-2002)
| Kommentar Fra : Monie Jacobsen |
Dato : 10-08-02 15:20 |
|
Tak Thomas Nelvik
Jeg arbejder vider med det.
MVH
Monie
"Thomas Nelvik" <thomas.nelvik@chello.no> skrev i en meddelelse
news:Hz259.913$rS6.27284@news01.chello.no...
> "Monie Jacobsen" wrote:
> > Hej
> > Vil du hjælpe mig med følgende problem. Som beskreves nedenfor?
> >
> > I Unit3 er der værdier som jeg gerne vil bruge i Unit5, men får
> > nedslående Error.
> >
> > Mener at havde bekendtgjort i Public, så at X, Yop, Yned, kunne
> bruges i
> > Unit5.
> >
> > Hvordan kan jeg læse værdier fra Unit3 som skal bruges i Unit5 ?
>
>
> I Unit3 må du ta med "Unit5" i _uses_ klausulen:
>
> uses Unit5; ???
>
> Nøkkelordene "public", "private",... er relatert til classes, ikke
> units.
>
> -ThomasN
>
>
>
>
| |
Juno (10-08-2002)
| Kommentar Fra : Juno |
Dato : 10-08-02 07:48 |
|
Følgende er en kopi af teksten fra en mail jeg har sendt til Monie.
Monie Jacobsen skrev:
> Vil du hjælpe mig med følgende problem. Som beskreves nedenfor?
>
> I Unit3 er der værdier som jeg gerne vil bruge i Unit5, men får
> nedslående Error.
Variabler der er erklæret i "interface" delen af en unit, kan læses fra
andre units. Husk at tilføje den unit du skal læse fra i "uses".
> Mener at havde bekendtgjort i Public, så at X, Yop, Yned, kunne
> bruges i Unit5.
>
> public
> { Public declarations }
> X, Yop, Yned : array [0..18] of Double;
> end;
>
"Public" er en del af et objekt, ikke en unit. For at få adgang til
variabler erklæret i public delen af et objekt skal du referere dem via
et oprettet objekt. Fx:
interface
type
TMyObject = class
public
property x: Integer read privX write privX;
private
privX: Integer;
end;
implementation
procedure noget;
var:
v: TMyObject;
i: Integer;
begin
v := TMyObject.Create;
i := v.x;
v.Free;
end;
> implementation
>
> {$R *.dfm}
>
> begin
>
> X[n] := (SektionBredde[6] * X1[n]);
>
> Yop[n] := ((SektionBredde[6] * YOp1[n]));
>
> Yned[n]:= ((SektionBredde[6] * YNed1[n]));
>
> End;
>
Er ked af det, men det her kan jeg ikke se meningen med...
Og resten heller ikke...
Det du kæmper med, hedder "scope".
Vedhæfter 2 units der skal prøve at illustrere det, men det ER noget
forvirrende i starten, og temmelig svært at forklare det, så det er til
at forstå :-/
Hvis du har mod på det, kan du læse om "scope" i hjælpe filen, men som
sagt, det er noget forvirrende.
Her er lidt copy paste fra et svar jeg gav en anden gut for et par år
siden.
*************
>Jeg kæmper lidt med nogle procedure, og som "gammel" pascal mand, kan
>jeg ikke forstå hvorfor de ikke er globale, nå jeg erklærer dem øverst
i
>min første unit, og så tilføjer den i uses i de næste units ?
Alle variabler erklæret i INTERFACE delen, er Globale, i den forstand at
de også kan aflæses i andre units.
Alle variabler erklæret i IMPLEMENTATION delen, kan aflæses derfra hvor
den
er erklæret, og resten af pågældende unit.
******************
Håber at det hjalp lidt på det
--
*/*
jUno
spamfilter: Fjern din bh
| |
Monie Jacobsen (10-08-2002)
| Kommentar Fra : Monie Jacobsen |
Dato : 10-08-02 15:23 |
|
Hej Juno
Tak for din beskrivelse for løsning af problemet.
Viste ikke det var "scope" noge så svært som dette!
Men vil nu prøve om jeg kan få det til at fungere1
MVH
Monie
"Juno" <bauer.juno@dinbhget2net.dk> skrev i en meddelelse
news:3d54b6b4$0$43928$edfadb0f@dspool01.news.tele.dk...
> Følgende er en kopi af teksten fra en mail jeg har sendt til Monie.
>
> Monie Jacobsen skrev:
> > Vil du hjælpe mig med følgende problem. Som beskreves nedenfor?
> >
> > I Unit3 er der værdier som jeg gerne vil bruge i Unit5, men får
> > nedslående Error.
> Variabler der er erklæret i "interface" delen af en unit, kan læses fra
> andre units. Husk at tilføje den unit du skal læse fra i "uses".
>
> > Mener at havde bekendtgjort i Public, så at X, Yop, Yned, kunne
> > bruges i Unit5.
> >
> > public
> > { Public declarations }
> > X, Yop, Yned : array [0..18] of Double;
> > end;
> >
> "Public" er en del af et objekt, ikke en unit. For at få adgang til
> variabler erklæret i public delen af et objekt skal du referere dem via
> et oprettet objekt. Fx:
>
> interface
> type
> TMyObject = class
> public
> property x: Integer read privX write privX;
> private
> privX: Integer;
> end;
>
> implementation
>
> procedure noget;
> var:
> v: TMyObject;
> i: Integer;
> begin
> v := TMyObject.Create;
> i := v.x;
> v.Free;
> end;
>
> > implementation
> >
> > {$R *.dfm}
> >
> > begin
> >
> > X[n] := (SektionBredde[6] * X1[n]);
> >
> > Yop[n] := ((SektionBredde[6] * YOp1[n]));
> >
> > Yned[n]:= ((SektionBredde[6] * YNed1[n]));
> >
> > End;
> >
> Er ked af det, men det her kan jeg ikke se meningen med...
> Og resten heller ikke...
>
> Det du kæmper med, hedder "scope".
> Vedhæfter 2 units der skal prøve at illustrere det, men det ER noget
> forvirrende i starten, og temmelig svært at forklare det, så det er til
> at forstå :-/
> Hvis du har mod på det, kan du læse om "scope" i hjælpe filen, men som
> sagt, det er noget forvirrende.
>
> Her er lidt copy paste fra et svar jeg gav en anden gut for et par år
> siden.
> *************
> >Jeg kæmper lidt med nogle procedure, og som "gammel" pascal mand, kan
> >jeg ikke forstå hvorfor de ikke er globale, nå jeg erklærer dem øverst
> i
> >min første unit, og så tilføjer den i uses i de næste units ?
>
> Alle variabler erklæret i INTERFACE delen, er Globale, i den forstand at
> de også kan aflæses i andre units.
>
> Alle variabler erklæret i IMPLEMENTATION delen, kan aflæses derfra hvor
> den
> er erklæret, og resten af pågældende unit.
> ******************
>
> Håber at det hjalp lidt på det
>
> --
> */*
> jUno
> spamfilter: Fjern din bh
>
>
| |
Monie Jacobsen (11-08-2002)
| Kommentar Fra : Monie Jacobsen |
Dato : 11-08-02 16:09 |
|
Hej Juno
Jeg har forsøgt med alle midler, at få det til at virke, det du foreslog
mig.
Men uden held.
Håber ikke det er for meget jeg masser på?
Se nedstående Unit1 og Unit2.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
TForm1 = class(TForm)
TMyObject = class
private
{ Private declarations }
privX: Integer;
public
{ Public declarations }
property x: Integer read privX write privX;
end;
var
Form1: TForm1;
implementation
uses Unit2;
{$R *.dfm}
procedure noget;
var:
v: TMyObject;
i: Integer;
begin
v := TMyObject.Create;
i := v.x;
v.Free;
end;
//Det er disse værdier jeg vil bruge i Unit2 (X[n], Yop[n] og Yned[n]
For n:=1 to 18 do
begin
X[n] := (SektionBredde[6] * X1[n]);
Yop[n] := ((SektionBredde[6] * YOp1[n]));
Yned[n]:= ((SektionBredde[6] * YNed1[n]));
end;
end.
unit Unit2;
interface
uses Windows, SysUtils, Classes, Graphics, Forms, Controls, StdCtrls,
Buttons, ExtCtrls;
type
TOKBottomDlg = class(TForm)
OKBtn: TButton;
CancelBtn: TButton;
Bevel1: TBevel;
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form2: TForm2;
implementation
uses Unit1;
{$R *.dfm}
//Det er disse værdierne jeg vil bruge fra Unit1
begin
For n:=1 to 18 do
begin
X[n]; Yop[n]; Yned[n];
end;
end.
Med venlig hilsen
Monie
| |
Juno (11-08-2002)
| Kommentar Fra : Juno |
Dato : 11-08-02 17:23 |
|
Monie Jacobsen skrev i
news:3d567e13$0$51588$edfadb0f@dspool01.news.tele.dk
> Jeg har forsøgt med alle midler, at få det til at virke, det du
> foreslog mig.
> Men uden held.
Har tilføjet 3 linier og markeret dem med *******
De er tilføjet i interface delen af Unit1, og kan derfor læses af andre
units, der har den i "uses".
Interface delen går fra nøgleordet "interface" til nøgleordet
"implementation".
--
*/*
jUno
spamfilter: Fjern din bh
> unit Unit1;
>
> interface
>
> uses
> Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls,
> Forms, Dialogs;
>
> type
> TForm1 = class(TForm)
> TMyObject = class
> private
> { Private declarations }
> privX: Integer;
> public
> { Public declarations }
> property x: Integer read privX write privX;
> end;
>
> var
> Form1: TForm1;
X: array[1..18] of Real; ********************
Yop: array[1..18] of Real; *******************
Yned: array[1..18] of Real; ******************
> implementation
> uses Unit2;
> {$R *.dfm}
>
> //Det er disse værdier jeg vil bruge i Unit2 (X[n], Yop[n] og Yned[n]
> For n:=1 to 18 do
> begin
> X[n] := (SektionBredde[6] * X1[n]);
> Yop[n] := ((SektionBredde[6] * YOp1[n]));
> Yned[n]:= ((SektionBredde[6] * YNed1[n]));
> end;
> end.
>
>
> unit Unit2;
>
> interface
>
> uses Windows, SysUtils, Classes, Graphics, Forms, Controls, StdCtrls,
> Buttons, ExtCtrls;
>
> type
> TOKBottomDlg = class(TForm)
> OKBtn: TButton;
> CancelBtn: TButton;
> Bevel1: TBevel;
>
> private
> { Private declarations }
>
> public
> { Public declarations }
> end;
>
> var
> Form2: TForm2;
>
> implementation
> uses Unit1;
> {$R *.dfm}
>
> //Det er disse værdierne jeg vil bruge fra Unit1
> begin
> For n:=1 to 18 do
> begin
> X[n]; Yop[n]; Yned[n];
> end;
> end.
>
> Med venlig hilsen
> Monie
| |
Monie Jacobsen (11-08-2002)
| Kommentar Fra : Monie Jacobsen |
Dato : 11-08-02 19:49 |
|
Hej Juno
[Error] Unit2.pas(25): Statement expected, but expression of type 'Real'
found
[Error] Unit2.pas(25): Statement expected, but expression of type 'Real'
found
[Fatal Error] Unit1.pas(31): Could not compile used unit 'Unit2.pas'
Det er hvad jeg får ud af at køre nedstående Unit1 og Unit2
Jeg har meget brug for at kunne læse værdier fra en unit til en anden.
Har lavet nogle færdige enheder som vingeprofil og udskrivning,
som jeg nu skal havde til, at kunne kører sammen.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls,
Forms, Dialogs;
Type
TMyObject = class
end;
type
TForm1 = class(TForm)
private
{ Private declarations }
privX: Integer;
public
{ Public declarations }
property x: Integer read privX write privX;
end;
var
Form1: TForm1;
n:Integer;
X: array[1..18] of Real;
Yop: array[1..18] of Real;
Yned: array[1..18] of Real;
implementation
uses Unit2;
{$R *.dfm}
//Det er disse værdier der læses fra til bruge i Unit2 (X[n], Yop[n] og
Yned[n]
begin
For n:=1 to 18 do
begin
X[n] := 1.5;
Yop[n] := 2.5;
Yned[n]:= 3.5;
end;
end.
unit Unit2;
interface
uses
SysUtils, Windows, Messages, Classes, Graphics, Controls,
StdCtrls, ExtCtrls, Forms;
type
TForm2 = class(TForm)
end;
var
Form2: TForm2;
n:Integer;
implementation
uses Unit1;
{$R *.DFM}
//Det er disse værdierne jeg vil bruge fra Unit1
begin
For n:=1 to 18 do
begin
X[n]; op[n]; Yned[n];
end;
end.
MVH
Monie
| |
Juno (11-08-2002)
| Kommentar Fra : Juno |
Dato : 11-08-02 21:59 |
|
Monie Jacobsen skrev i
news:3d56b181$0$43965$edfadb0f@dspool01.news.tele.dk
>
> [Error] Unit2.pas(25): Statement expected, but expression of type
> 'Real' found
> [Error] Unit2.pas(25): Statement expected, but expression of type
> 'Real' found
> [Fatal Error] Unit1.pas(31): Could not compile used unit 'Unit2.pas'
>
> Det er hvad jeg får ud af at køre nedstående Unit1 og Unit2
> Jeg har meget brug for at kunne læse værdier fra en unit til en anden.
> Har lavet nogle færdige enheder som vingeprofil og udskrivning,
> som jeg nu skal havde til, at kunne kører sammen.
<snip>
> unit Unit2;
.......
> //Det er disse værdierne jeg vil bruge fra Unit1
> begin
> For n:=1 to 18 do
> begin
> X[n]; op[n]; Yned[n];
> end;
> end.
Hvad er det du vil opnå med ovenstående stump kode ?
Du kan ikke bare have kode "frit svævende" i en unit på den måde. Du er
nødt til at have en funktion eller procedure...
X[n]; op[n]; Yned[n];
Hvad er det du forventer at der sker i denne linie ?
--
*/*
jUno
spamfilter: Fjern din bh
| |
Monie Jacobsen (11-08-2002)
| Kommentar Fra : Monie Jacobsen |
Dato : 11-08-02 22:25 |
|
Hej Juno
Det er virklig svært at forklare sig!
Se kommentarene nedenfor.
"Juno" <bauer.juno@dinbhget2net.dk> skrev i en meddelelse
news:3d56cf98$0$51572$edfadb0f@dspool01.news.tele.dk...
> Monie Jacobsen skrev i
> news:3d56b181$0$43965$edfadb0f@dspool01.news.tele.dk
>
Der er disse Error der fås når Unit1 og Unit2 prøvekøres.
Det er en test på at kunne hente værdier fra Unit1 til brug i Unit2.
> >
> > [Error] Unit2.pas(25): Statement expected, but expression of type
> > 'Real' found
> > [Error] Unit2.pas(25): Statement expected, but expression of type
> > 'Real' found
> > [Fatal Error] Unit1.pas(31): Could not compile used unit 'Unit2.pas'
> >
> > Det er hvad jeg får ud af at køre nedstående Unit1 og Unit2
> > Jeg har meget brug for at kunne læse værdier fra en unit til en anden.
> > Har lavet nogle færdige enheder som vingeprofil og udskrivning,
> > som jeg nu skal havde til, at kunne kører sammen.
> <snip>
>
> > unit Unit2;
> ......
> > //Det er disse værdierne jeg vil bruge fra Unit1
> > begin
> > For n:=1 to 18 do
> > begin
> > X[n]; Yop[n]; Yned[n];
> > end;
> > end.
>
> Hvad er det du vil opnå med ovenstående stump kode ?
De værdier X[n]; Yop[n]; Yned[n]; fik tildelt nogen værdier, som nu skal
ses om de kan bruges/ses i Unit2.
> Du kan ikke bare have kode "frit svævende" i en unit på den måde. Du er
> nødt til at have en funktion eller procedure...
>
> X[n]; op[n]; Yned[n];
> Hvad er det du forventer at der sker i denne linie ?
Udlæse værdierne igen i Unit2
> --
Jeg er virklig på den. Kan man virkelig ikke tage data'er fra en Unit og
bruge dem i Unit2 når de nu er beregnet.
> */*
> jUno
> spamfilter: Fjern din bh
Undskyld hvis jeg ikke rigtig kan forklare mig!
MVH
Monie
| |
Juno (11-08-2002)
| Kommentar Fra : Juno |
Dato : 11-08-02 23:30 |
|
Monie Jacobsen skrev i
news:3d56d63b$0$51600$edfadb0f@dspool01.news.tele.dk
> Hej Juno
> Det er virklig svært at forklare sig!
> Se kommentarene nedenfor.
>
> "Juno" <bauer.juno@dinbhget2net.dk> skrev i en meddelelse
> news:3d56cf98$0$51572$edfadb0f@dspool01.news.tele.dk...
>> Monie Jacobsen skrev i
>> news:3d56b181$0$43965$edfadb0f@dspool01.news.tele.dk
<snip en hel del>
>>> unit Unit2;
>> ......
>>> //Det er disse værdierne jeg vil bruge fra Unit1
>>> begin
>>> For n:=1 to 18 do
>>> begin
>>> X[n]; Yop[n]; Yned[n];
>>> end;
>>> end.
>>
>> Hvad er det du vil opnå med ovenstående stump kode ?
> De værdier X[n]; Yop[n]; Yned[n]; fik tildelt nogen værdier, som nu
> skal ses om de kan bruges/ses i Unit2.
Ahaa
Så du vil altså bare udskrive dem.
Hvis du har en form tilknyttet Unit2, så prøv at lave en knap og en
listbox, og følgende onClick til knappen:
procedure btnVisInholdClick(Sender:TObject);
var
i: Integer;
s: string;
begin
ListBox1.Items.Clear;
for i := Low(X) to High(X) do
begin
s := Format( 'X[i] er nu lig med %.3f', [X[i]]);
ListBox1.Items.Add( s);
end;
end;
Ovenstående er utestet, det kan godt være at du skal rette lidt i det.
> Jeg er virklig på den. Kan man virkelig ikke tage data'er fra en Unit
> og bruge dem i Unit2 når de nu er beregnet.
Jo, men når compileren pludselig støder på "X[n]; op[n]; Yned[n]" midt i
det hele, bliver den lidt forvirret :)
Det var den linie der var skyld i din fejlmeddelelse.
Når du får en fejlmeddelelse, så prøv at dobbeltklikke på den, så hopper
editoren til den linie der er fejl i. (Eller i hvert fald den linie den
_mener_ der er fejl i. :) )
--
*/*
jUno
spamfilter: Fjern din bh
| |
Monie Jacobsen (12-08-2002)
| Kommentar Fra : Monie Jacobsen |
Dato : 12-08-02 08:06 |
|
Hej Juno
Får en mørkelig hejl nedenfor i Unit1.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
Type
TMyObject = class // Skal dette ikke væk?
end;
type
TForm1 = class(TForm)
btnExit: TButton;
btnTilForm2: TButton;
procedure btnExitClick(Sender: TObject);
procedure btnTilForm2Click(Sender: TObject);
private
{ Private declarations }
privX: Integer; // Skal dette ikke væk?
public
{ Public declarations }
property x: Integer read privX write privX; // Skal dette ikke væk?
end;
var
Form1: TForm1;
n:Integer;
X: array[1..18] of Real;
implementation
uses Unit2;
{$R *.dfm}
//Dette er værdier til bruge i Unit2 (X[n]
begin
For n:=1 to 18 do
begin
X[n]:= 1.5 + n;
end;
end; //Her fås Error fejl. Forstår det ikke. Har kikket i hjælp menuen.
Stiger jeg mig blind?
[Error] Unit1.pas(47): '.' expected but ';' found
[Fatal Error] Project1.dpr(6): Could not compile used unit 'Unit1.pas'
procedure TForm1.btnExitClick(Sender: TObject);
begin
Close;
end;
procedure TForm1.btnTilForm2Click(Sender: TObject);
begin
Form2.ShowModal;
end;
end.
MVH
Monie
| |
Juno (12-08-2002)
| Kommentar Fra : Juno |
Dato : 12-08-02 16:10 |
|
Hej Monie.
Det var ikke meningen at de 2 units jeg sendte, skulle ikke bruges til
andet end at illustrere hvor og hvordan man erklærer forskellige typer
af variable (global og lokal), og hvor disse variable kunne læses fra !
De skulle ikke kompileres, blot læses og forstås !
Humlen i det hele er, at hvis du skal bruge X[..], Yop[..] og Yned[..] i
flere Units, skal du erklære dem et sted mellem nøgleordet "interface"
og nøgleordet "implementation".
Den variabel du bruger i en for-next løkke derimod, skal være erklæret
lokalt, i den funktion/procedure du bruger den i.
Med andre ord: når du skriver "for n := 1 to 18" skal n erklæres lokalt:
procedure Noget;
var
n: Integer;
begin
for n := 1 to 18 ...
end;
--
*/*
jUno
spamfilter: Fjern din bh
| |
|
|