|
| 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.
>
>
>
| |
|
|