/ Forside / Teknologi / Udvikling / Delphi/Pascal / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Delphi/Pascal
#NavnPoint
oldwiking 603
jrossing 525
rpje 520
EXTERMINA.. 500
gandalf 460
gubi 270
DJ_Puden 250
PARKENSS 230
technet 210
10  jdjespers.. 200
D:5 Objekt
Fra : Johannes Bakkedal


Dato : 26-11-01 20:23

Godt være det er et dumt spørgsmål.
Jeg har brug for at vide om man kan overføre et objekt fra en unit til en
anden.
Jeg har lavet et progr. hvor der i én unit, behandles data som så udskrives
i en anden unit/Form (et bitmap mønster).
Problemet er, at jeg ønsker at referere tilbage til objektet i unit1 fra
Form'en i unit2 hvis der ændres i bitmap-mønsteret.
På forhånd tak JB.




 
 
Thomas Due (27-11-2001)
Kommentar
Fra : Thomas Due


Dato : 27-11-01 09:14

"Johannes Bakkedal" <bakkedal@post6.tele.dk> wrote in message news:<3c029717$0$261$edfadb0f@dspool01.news.tele.dk>...
> Godt være det er et dumt spørgsmål.

Der findes ikke dumme spørgsmål, kunne dumme svar.

> Jeg har brug for at vide om man kan overføre et objekt fra en unit til en
> anden.
> Jeg har lavet et progr. hvor der i én unit, behandles data som så udskrives
> i en anden unit/Form (et bitmap mønster).
> Problemet er, at jeg ønsker at referere tilbage til objektet i unit1 fra
> Form'en i unit2 hvis der ændres i bitmap-mønsteret.
> På forhånd tak JB.

Jeg advarer om på forhånd at denne post godt kan blive lidt lang!

Hvis jeg forstår dig rigtigt vil du gerne kunne reference fra et objekt til
et andet og tilbage igen? Hvert objekt's klasse er defineret i hver sin unit.

Hvis det er rigtigt forstået, så kan du gøre følgende :

I klasse1 laver du en reference til klasse2. Klasse2's unit tilføjes
til Klasse1's uses klausul. Den anden vej er lidt mere omstændig. Man
skal nemlig være være opmærksom på at man ikke kan anvende cirkulære
referencer, som det hedder, i Delphi, så man skal have lave en omvej.

Der er to måder at gøre det på. Den bedste (og mest korrekte, rent OO
mæssigt) er på mange måde at lave en abstract klasse som din klasse2
så nedarver fra. Derved kan du refererer til denne abstrakte klasse fra
Klasse1 og senere til den rigtige klasse. Det er lidt omstændigt, men
på sigt en langt bedre løsning end den jeg præsenterer her som er hurtig,
men ikke pæn. (Ved nærmere eftertanke er det faktisk samme princip, jeg
anvender bare den mindste fællesnævner, nemlig TObject).

Jeg vedhæfter her en række units som viser hvordan man kan gøre dette
på en lidt griset måde :

KLASSE1:
========
unit Klasse1;

interface

Uses
Dialogs;

type
TKlasse1 = Class
Private
FModpart : TObject; // Her gemmer vi så referencen til klasse2.
Public
Procedure KaldKlasse2;
Procedure ShowBesked;
Property Modpart : TObject read FModpart write FModpart;
End;

implementation

uses Klasse2; // Først her skal referencen til klasse2 står. Dette er
// fordi selve klasse interfacet kender IKKE til Klasse2,
// men kun TObject. Jeg benytter mig med andre ord af
// Polymorfi.

procedure TKlasse1.KaldKlasse2;
begin
TKlasse2(FModpart).GoerEtEllerAndet; // Her typecast'er vi så referencen
// til den rigtige type.
end;

procedure TKlasse1.ShowBesked;
begin
ShowMessage('TKlasse1.ShowBesked');
end;

end.

KLASSE2:
========
unit Klasse2;

interface

Uses
Dialogs;

type
TKlasse2 = Class
Private
FModpart : TObject; // references til klasse1
Public
Property Modpart : TObject read FModpart write FModpart;
Procedure KaldModpartSHow;
procedure GoerEtEllerAndet;
End;

implementation

uses Klasse1; // Her er så en reference til klasse1's unit

procedure TKlasse2.GoerEtEllerAndet;
begin
ShowMessage('TKlasse2.GoerEtEllerAndet er kaldt');
end;

procedure TKlasse2.KaldModpartSHow;
begin
TKlasse1(FModpart).ShowBesked; // her kalder vi så den anden vej over i
// klasse1
end;

end.


TEST FORM:
==========
Alt det her kan du så teste i en form, ved at sætte to knapper ind på form
og udfylde disse hændelser. Du skal selvfølgelig også tilføje Klasse1 og
Klass2 til formens Uses klausul.

procedure TForm1.FormCreate(Sender: TObject);
begin
Klas1 := TKlasse1.Create;
Klas2 := TKlasse2.Create;

Klas1.Modpart := Klas2;
Klas2.Modpart := Klas1;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
Klas2.Free:
Klas1.Free;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Klas1.ShowBesked;
Klas1.KaldKlasse2;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
Klas2.GoerEtEllerAndet;
Klas2.KaldModpartSHow;
end;

Det var jo en voldsom omgang, men forhåbentlig giver det dig en ide om
hvordan man KAN gøre det. Nu er denne fremgangsmåde meget overfladisk og
der bør jo selvfølgelig tilføje en masse check og sikkerhedsmekanismer,
men det er i bund og grund måden man gør det på.

Mvh
Thomas Due

Johannes Bakkedal (28-11-2001)
Kommentar
Fra : Johannes Bakkedal


Dato : 28-11-01 17:33

Tak for hjælpen, det bringer mig videre med mit progr.problem.
JB.

"Thomas Due" <tdue@mail.dk> skrev i en meddelelse
news:f4373cde.0111270014.7453f651@posting.google.com...
> "Johannes Bakkedal" <bakkedal@post6.tele.dk> wrote in message
news:<3c029717$0$261$edfadb0f@dspool01.news.tele.dk>...
> > Godt være det er et dumt spørgsmål.
>
> Der findes ikke dumme spørgsmål, kunne dumme svar.
>
> > Jeg har brug for at vide om man kan overføre et objekt fra en unit til
en
> > anden.
> > Jeg har lavet et progr. hvor der i én unit, behandles data som så
udskrives
> > i en anden unit/Form (et bitmap mønster).
> > Problemet er, at jeg ønsker at referere tilbage til objektet i unit1 fra
> > Form'en i unit2 hvis der ændres i bitmap-mønsteret.
> > På forhånd tak JB.
>
> Jeg advarer om på forhånd at denne post godt kan blive lidt lang!
>
> Hvis jeg forstår dig rigtigt vil du gerne kunne reference fra et objekt
til
> et andet og tilbage igen? Hvert objekt's klasse er defineret i hver sin
unit.
>
> Hvis det er rigtigt forstået, så kan du gøre følgende :
>
> I klasse1 laver du en reference til klasse2. Klasse2's unit tilføjes
> til Klasse1's uses klausul. Den anden vej er lidt mere omstændig. Man
> skal nemlig være være opmærksom på at man ikke kan anvende cirkulære
> referencer, som det hedder, i Delphi, så man skal have lave en omvej.
>
> Der er to måder at gøre det på. Den bedste (og mest korrekte, rent OO
> mæssigt) er på mange måde at lave en abstract klasse som din klasse2
> så nedarver fra. Derved kan du refererer til denne abstrakte klasse fra
> Klasse1 og senere til den rigtige klasse. Det er lidt omstændigt, men
> på sigt en langt bedre løsning end den jeg præsenterer her som er hurtig,
> men ikke pæn. (Ved nærmere eftertanke er det faktisk samme princip, jeg
> anvender bare den mindste fællesnævner, nemlig TObject).
>
> Jeg vedhæfter her en række units som viser hvordan man kan gøre dette
> på en lidt griset måde :
>
> KLASSE1:
> ========
> unit Klasse1;
>
> interface
>
> Uses
> Dialogs;
>
> type
> TKlasse1 = Class
> Private
> FModpart : TObject; // Her gemmer vi så referencen til klasse2.
> Public
> Procedure KaldKlasse2;
> Procedure ShowBesked;
> Property Modpart : TObject read FModpart write FModpart;
> End;
>
> implementation
>
> uses Klasse2; // Først her skal referencen til klasse2 står. Dette er
> // fordi selve klasse interfacet kender IKKE til Klasse2,
> // men kun TObject. Jeg benytter mig med andre ord af
> // Polymorfi.
>
> procedure TKlasse1.KaldKlasse2;
> begin
> TKlasse2(FModpart).GoerEtEllerAndet; // Her typecast'er vi så
referencen
> // til den rigtige type.
> end;
>
> procedure TKlasse1.ShowBesked;
> begin
> ShowMessage('TKlasse1.ShowBesked');
> end;
>
> end.
>
> KLASSE2:
> ========
> unit Klasse2;
>
> interface
>
> Uses
> Dialogs;
>
> type
> TKlasse2 = Class
> Private
> FModpart : TObject; // references til klasse1
> Public
> Property Modpart : TObject read FModpart write FModpart;
> Procedure KaldModpartSHow;
> procedure GoerEtEllerAndet;
> End;
>
> implementation
>
> uses Klasse1; // Her er så en reference til klasse1's unit
>
> procedure TKlasse2.GoerEtEllerAndet;
> begin
> ShowMessage('TKlasse2.GoerEtEllerAndet er kaldt');
> end;
>
> procedure TKlasse2.KaldModpartSHow;
> begin
> TKlasse1(FModpart).ShowBesked; // her kalder vi så den anden vej over i
> // klasse1
> end;
>
> end.
>
>
> TEST FORM:
> ==========
> Alt det her kan du så teste i en form, ved at sætte to knapper ind på form
> og udfylde disse hændelser. Du skal selvfølgelig også tilføje Klasse1 og
> Klass2 til formens Uses klausul.
>
> procedure TForm1.FormCreate(Sender: TObject);
> begin
> Klas1 := TKlasse1.Create;
> Klas2 := TKlasse2.Create;
>
> Klas1.Modpart := Klas2;
> Klas2.Modpart := Klas1;
> end;
>
> procedure TForm1.FormDestroy(Sender: TObject);
> begin
> Klas2.Free:
> Klas1.Free;
> end;
>
> procedure TForm1.Button1Click(Sender: TObject);
> begin
> Klas1.ShowBesked;
> Klas1.KaldKlasse2;
> end;
>
> procedure TForm1.Button2Click(Sender: TObject);
> begin
> Klas2.GoerEtEllerAndet;
> Klas2.KaldModpartSHow;
> end;
>
> Det var jo en voldsom omgang, men forhåbentlig giver det dig en ide om
> hvordan man KAN gøre det. Nu er denne fremgangsmåde meget overfladisk og
> der bør jo selvfølgelig tilføje en masse check og sikkerhedsmekanismer,
> men det er i bund og grund måden man gør det på.
>
> Mvh
> Thomas Due



Thomas Riedel (27-11-2001)
Kommentar
Fra : Thomas Riedel


Dato : 27-11-01 12:04

Hej Johannes

Vi antager, at dit projekt har to forms: FrmVis i Uvis.pas og FrmBeregn i
Uberegn.pas,

Prøv i koden for FrmVis at referere direkte til frmBeregn f.eks ved:

procedure TfrmVis.Button1Click(sender : tobject);
begin
with frmBeregn do
begin
...
end;
end;

Det får Delphi til at foreslå selv sætte den korrekte Uses clause (I
implementation) ind i
UVis.pas.

Og i FrmBeregn kan du tilsvarende anvende

procedure TfrmBeregn.Button1Click(sender : tobject);
begin
with frmVis do
begin
...
end;
end;

Herved refererer dine to forms til hinanden uden du får 'Circular
...reference' fejlen.

mvh
--
Thomas Riedel, LogiHouse
"Johannes Bakkedal" <bakkedal@post6.tele.dk> wrote in message
news:3c029717$0$261$edfadb0f@dspool01.news.tele.dk...
> Godt være det er et dumt spørgsmål.
> Jeg har brug for at vide om man kan overføre et objekt fra en unit til en
> anden.
> Jeg har lavet et progr. hvor der i én unit, behandles data som så
udskrives
> i en anden unit/Form (et bitmap mønster).
> Problemet er, at jeg ønsker at referere tilbage til objektet i unit1 fra
> Form'en i unit2 hvis der ændres i bitmap-mønsteret.
> På forhånd tak JB.
>
>
>



Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408926
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste