nie rozumiem uses !!!!!!!!!

0

Przejrzałem wszelkie materiały i chyba nie do końca rozumiem kiedy i co należy umieszczać w uses.
Z tego co się dowiedziałem to uses można być w interface i implementation w zależności czy chcemy mieć dostęp do nich z innych unitów czy nie.
I tu mi coś nie pasuje bo chce zrobić coś takiego:
<font color="blue"> Program jest w unit1 (Form1), ale w pewnym momencie odwołuje sie do unit2 po przez wywolanie porcedury UNIT_DWA. Procedura UNIT_DWA jest zdefiniowana w Unit2, z tym że w UNIT_DWA skoleji chce umieścić zmienną która jest zdefiniowana w Unit1.
I caly problem polega na odpowiednim dobraniu uses. Wydaje mi sie ze powinno byc :
</span>
<font color="violet"> unit Unit1;
interface
uses
unit2,...... </span>

<font color="blue"> a dla Unit2 </span>

<font color="violet"> unit Unit2;
interface
uses
unit1,...... </span>

<font color="blue"> No ale przecież nie moze byc wzajemne odwołanie do uses w INTERFACE.
Wiec to nie dziala !!
</span>

<font color="red"> Czyli reasumując , czy jest możliwe :
Użycie w PROSEDURZE z UNIT2 zmienej z UNIT1 a następnie odwolanie sie w UNIT1 do tej PROCEDURY z UNIT2</span> ??????
A jesli tak to co powinno byc w USES???
[???] [???] [???] [???] [???] [???] [???] [???]
Pozdrawiam

0

Spróbuj w implementation. Swoją drogą, jeśli zaczniesz pisać procedurę lub odniesienie do właściwości obiektu z drugiego okna, to po uruchomieniu programu wyświetli się komunikat, który sam za ciebie doda Unit1, Unit2 do sekcji Uses.

0

tak jak chcesz to zrobic musisz zmienic jedną rzecz
w deklaracji w podrzędnej formie w Unit2 np nie delkarowac uses przy interface, a przy Implementation i bedzie działac :P

0

hmm, w sumie to dosc ciekawe, bo u mnie zmienne widoczne sa dla innych unitow tylko jesli dodam je do public, natomiast roznicy miedzy daniem ich do var przed implementation i po niej, prawde mowiac, nigdy nie dostrzeglem.

0

Unit2 jest bez formy, to jest sam unit.
I jak zdeklaruje <font color="red">unit1 w uses z implementation </span> to nie będę mógł użyć w procedurze z UNIT2 zmiennej która jest zdefiniowana w UNIT1.
[???] [???]

0

rożnica między implementation a interface polega na tym ze unity zadeklarowane w interface sa widoczne na zewnątrz unita, a zadeklarowane implementation tylko wewnątrz danego unitu,

0

Zadziałało gdy zmienne umieściłem poza PUBLIC :
to jest fragment UNIT1 :

<font color="blue"> (....) type TForm1 = class(TForm) Button1: TButton; Label1: TLabel; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations }

end;

var
Form1: TForm1;
g,h:integer; </span> <font color="red">//Tu są zmienne wykorzystywane w UNIT2 </span>
<font color="blue">implementation
(.....)</span>

Czy ktoś potrafi wytłumaczyć dlaczego tych zmiennych nie można umieścić w PUBLIC ???
Bo na moje oko to powinny być zdeklarowane w PUBLIC [cfaniak]

0

Moga być w public, ale nie muszą.
Jeśli będą w public, to będą częścią klasy TForm1 - będą dynamiczne (tworzone w trakcie działania programu razem z całym obiektem Form1). W var będą statyczne. Umieszczenie w public to przejaw OOP, umieszczenie w var to bardziej objaw programowania proceduralnego. Jeśli zmienna merytorycznie przynależy do obiektu (Formy) to bym ją raczej wsadził w klasę, jeśli nie - zostawiłbym w Var. A w ogóle raczej bym zrobił to, co bym uznał za wygodne :).

0

Ja nie potrafię tego wytłumaczyć ale gdy te zmienne umieszczam w PUBLIC to wysakuje (dla Unit2) że te zmienne są nie zdefiniowane. Więc chyba można umieścić tylko w var .
Na wszelki podaje cały kod:

DLA UNIT1 :
<font color="green"> unit Unit1;

interface

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

type
TForm1 = class(TForm)
Button1: TButton;
Label1: TLabel;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }

end;

var
Form1: TForm1;
g,h:integer;
implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
g:=4;
h:=8;
dodawanie;
end;

end. </span>

A DLA UNIT2 :

<font color="red"> unit Unit2;

interface

procedure dodawanie;

implementation
uses unit1,SysUtils;
procedure dodawanie ;
var k:integer;
begin
k:=g+h;
form1.label1.caption:=inttostr(k);
end;
end. </span>

<font color="blue"> Aha... jeszcze unit1--->form1 (label1,button1)
unit2 jest bez formy</span>

0

zmien to tak sie nie pisze bo na 100% bedziesz miał generowane błędy

function dodawanie(h, g : integer) : string;
begin
result := strToInt(h+g);
end;

jak zmienisz tą funkcje na taka w unit2
to w Form tam gdzie wywołujesz tą funkcje piszesz
Label.caption :=dodawanie(h,g);

0

<font color="green">>zmien to tak sie nie pisze bo na 100% bedziesz miał generowane błędy</span>

A mgłbyś napisać dlaczego będą generowane błędy , przecież teoretycznie nie ma w tym kodzie błędów<font color="red">??????????</span>
Zastosowanie FUNCTION jest tutaj rzeczywiście bardziej przejrzyste, ale w przypadkach bardziej zlożonym niż ten co pokazalem zastosowanie FUNCTION zamiast PROCEDURE byłoby utrudnione (jeśli nie niemożliwe) - np wtedy gdy w wyniku mam otrzymać wiele rozwiązań (działań). A w PROCEDURE mogę wtedy napisać :

form1.label1.caption=intTOstr(g+h);
form1.label2.caption=intTOstr(g-h);
form1.label3.caption=intTOstr(g-h+6798);

...to jest przykład , ale ja chciałbym wykorzystać do duzo duzo bardziej zlozonych obliczen - wiec musze chyba próbować z PROCEDURE.

0

to uzywasz rekordów, to znaczy na gorze pliku uses deklarujesz strukture

Type

bla : packed record
cos : string;
cos2 : folat;
end;

a byłedy będa generowane z tego powodu, ze nie sprawdzasz czy dany obiekt jest stworzony, jeśli obiektu nie ma będzie generowany wyjątek.
a w wielu przypadkach tak sie moze zdarzyc, wiec odwołujesz sie z zewnątrz do obiektu o ktorym nie wiesz czy istnieje, a dwa ogranicza cię to z funkcją do tego obiektu wiec takową mozesz zadeklarować w private classy

i bedziesz miał to samo bez większych problemow

0

<font color="green">to uzywasz rekordów, to znaczy na gorze pliku uses deklarujesz strukture

type

bla : packed record
cos : string;
cos2 : folat;
end; </span>

O tym niestety niewiele wiem, wiesz może gdzie można poczytać o RECORDACH ??

<font color="green">a byłedy będa generowane z tego powodu, ze nie sprawdzasz czy dany obiekt jest stworzony, jeśli obiektu nie ma będzie generowany wyjątek.
a w wielu przypadkach tak sie moze zdarzyc, wiec odwołujesz sie z zewnątrz do obiektu o ktorym nie wiesz czy istnieje,</span>

Chyba wiem o co Ci chodzi : ze w UNIT1 nie mam pewności że w procedurze DODAWANIE wszystko przebiegło bez zakłóceń .Czyli że nie mam pewności że DODAWANIE w ogóle istnieje. Hmm... no racja tylko jeśli kod będzie uważnie napisany to chyba powinno być ok.

Wilkie dzieki za wskazówki - bardzo mi sie przydały [hurra]

1 użytkowników online, w tym zalogowanych: 0, gości: 1