Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi objectreferenz austauschen ohne globale variablen!!!! (https://www.delphipraxis.net/57226-objectreferenz-austauschen-ohne-globale-variablen.html)

richard_boderich 17. Nov 2005 13:53


objectreferenz austauschen ohne globale variablen!!!!
 
moin zusammen,

ich hab mal eine frage. es geht darum wie ich objectreferenzen uebertragen kann.

das problem ist. ich erhalte in einer procedure die objectreferenz, muss sie aber in einer anderen procedure verarbeiten. momentan mach ich das mit einer globalen
variablen von typ object. und zwar so. hab der einfachheit halber ein paar cast weggelassen.

Delphi-Quellcode:
var  //global
reftestobject: ttestobject;



procedure bla1
begin
  testobject1:=create(owner ....);
end;

procedure bla2
begin
  with reftestobject do
  begin

  //mach was zu tun ist

  end;
end;
so jetz meine fragen. globale variablen sind ja eine schlechte loesung, weil sie zu langwierigen und schwierigen debugging prozessen fuehren koennen.
meine frage jetzt wie kann ich das besser machen? ich dachte das ich da einen pointer verwenden koennte, aber der muss doch dann auch global definiert sein oder?


eventuell so?

Delphi-Quellcode:
var  //global
reftestobject: pointer


procedure bla1
begin
  testobject1^:=create(owner ....);
end;

procedure bla2
begin
  with @reftestobject do
  begin

  //mach was zu tun ist

  end;
end;
hoffe mir kann jemand ein paar tipps geben

Gruß euer Richard ;)

[edit=alcaeus]Delphi-Tags korrigiert. Mfg, alcaeus[/edit]

sh17 17. Nov 2005 14:12

Re: objectreferenz austauschen ohne globale variablen!!!!
 
und warum nicht:

Delphi-Quellcode:

type
  ttestobject = class...

procedure bla1 
begin
  testobject1:=create(owner ....);
  bla2(testobject1);
end;

procedure bla2(_reftestobject: ttestobject);
begin
  with _reftestobject do
  begin

  //mach was zu tun ist

  end;
end;
die variable testobject1 musst natürlich irgendwo deklarieren, z.B. in deinem Form oder einem eigenen Variablen-Container

Angel4585 17. Nov 2005 14:15

Re: objectreferenz austauschen ohne globale variablen!!!!
 
übergibt doch das Objekt einfach der Prozedur
Delphi-Quellcode:
procedure bla2(AObject : TTestObject);
begin
with AObject do
 begin

end;
end;
Da war einer schneller

Aufruf kann auch
Delphi-Quellcode:
bla2(TTestObject.Create);
sein

richard_boderich 17. Nov 2005 14:52

Re: objectreferenz austauschen ohne globale variablen!!!!
 
also das ist bei mir nicht so einfach moeglich, da es sich bei der 2 objectprocedure um eine standardprocedure eines vcl controls handelt.
ich muesste dann doch ein eigenes ereignis fuer das control implementieren bzw. das vorhandene überschreiben? eine globale klasse will ich nich. ist doch eigentlich das selbe wie ne globale variable, was das debugging betrifft.

Gruß richard

woki 17. Nov 2005 14:56

Re: objectreferenz austauschen ohne globale variablen!!!!
 
Hallo,

höst sich so an, als sei das ein Fall für ein Singleton Pattern, z.b.

http://www.castle-cadenza.demon.co.uk/single.htm

Woki

sh17 17. Nov 2005 14:58

Re: objectreferenz austauschen ohne globale variablen!!!!
 
Zitat:

Zitat von richard_boderich
eine globale klasse will ich nich. ist doch eigentlich das selbe wie ne globale variable, was das debugging betrifft.

irgendwie endet doch alles in einer globalen Variable, oder wo ist Dein Hauptformular deklariert?

Bau eine HelperKlasse:

Delphi-Quellcode:
THelper = class
public
class procedure Bla2(_objekt : TMyObject; _class : TMyWinControl);
end;

richard_boderich 17. Nov 2005 15:14

Re: objectreferenz austauschen ohne globale variablen!!!!
 
@woki hab mir grade den code angeschaut und ihn nicht verstanden. außerdem ist es viel zu viel code und viel zu viel definitiongeschreibsel. nochmal ich will bloß
eine objectreferenz von einer procedure an eine andere uebergeben. das problem ist das die zweite procedure eine standard onclick procedure eines vcl controls ist.
und ich nicht weis wie ich dieser den zusaetzlichen parameter (die objectreferenz) uebergeben kann. ich moecht das schnell haben und mit moeglichst wenig code.

eventuell ginge es auch mit einem hilfobject. //bitte vezeiht mir syntaxfehler. es geht um prizipelle konzept

z.b

Delphi-Quellcode:
type

       objectreferenz=class;
         param: tobject; // klassenvariable fuer objectreferenz


procedure 1
begin
...
objectreferenz.create;
objectreferenz.param:=create(owner,..);
...
end;


procedure 2
begin
with objectreferenz.param do // mach was zu tun ist
..

objectreferenz.free
end;
der voretil bei dier methode ist,das das übergabe obecjt nur solange existiert wie es wirklich gebraucht wird. und so spaeter beim debugging keine seiteneffekte bringt. was haltet ihr davon?


Gruß richadr

richard_boderich 17. Nov 2005 15:15

Re: objectreferenz austauschen ohne globale variablen!!!!
 
//doppelpost geloescht sorry

richard

Garby 17. Nov 2005 15:43

Re: objectreferenz austauschen ohne globale variablen!!!!
 
Hallo,

Wenn du dieses Edit eh schon selber abgeleitet hast, könntest du aus diesem Globalen objekt ja eine Property des Edits machen.

Ich kann mich ja auch irren ;)

richard_boderich 17. Nov 2005 15:48

Re: objectreferenz austauschen ohne globale variablen!!!!
 
was fuer ein edit? wie kommst du auf edit? und nein ich hab von dem control keine ableitung

richard

Jens Schumann 17. Nov 2005 15:56

Re: objectreferenz austauschen ohne globale variablen!!!!
 
Zitat:

Zitat von richard_boderich
... das problem ist das die zweite procedure eine standard onclick procedure eines vcl controls ist ...

Das hört sich eher nach einem Designproblem an. Ich vermute mal, Du hast den Code direkt in den OnClick-Handler des Controls geschrieben. Das habe ich anfangs auch öfter gemacht. Dabei bin auf die gleichen Probleme gestoßen wie Du.

Ich habe mir jetzt angewöhnt in Eventhandlern nur noch Methoden aufzurufen. Dann verschwinden solche Probleme.

Garby 17. Nov 2005 15:56

Re: objectreferenz austauschen ohne globale variablen!!!!
 
Ok, Ok ich hab das VCL Control gemeint.

Also steht das VCL Control in irgendeiner Beziehung zu dem Objekt oder nicht?
Deine Angaben sind etwas vage...
Kannst du das Objekt nicht in der procedure 2 erst erstellen?

richard_boderich 17. Nov 2005 16:07

Re: objectreferenz austauschen ohne globale variablen!!!!
 
@garbi

nein kann ich leider nicht. ich denke mal das ich klar gesagt habe was ich will. bitte lies nochmal genau nach. die 2 procedure ist eine ereignisprocedure.
in dieser procedure muss ich auf ein anderes object referenzieren.

Gruß richard

richard_boderich 17. Nov 2005 16:17

Re: objectreferenz austauschen ohne globale variablen!!!!
 
@ jens schumann

ja der code steht im onclick eines actionmenuelements

Jens Schumann 17. Nov 2005 16:20

Re: objectreferenz austauschen ohne globale variablen!!!!
 
Zitat:

Zitat von richard_boderich
@ jens schumann

ja der code steht im onclick eines actionmenuelements

Siehste - das ist das Problem.
Lagere den Code in eine eigene Methode aus. Dieser Methode kannst Du dann als Paramter die Objektreferenz übergeben.
Im OnClick Event steht dann nur noch der Methoden Aufruf.

richard_boderich 17. Nov 2005 16:42

Re: objectreferenz austauschen ohne globale variablen!!!!
 
@ jens schumann ,diese uebergabe ist ja das eigentliche problemob ich den code als methode auslagere oder nicht, spielt doch dabei ueberhaupt keine rolle?
ich verstehe nich wie du das meinst bzw was mir das bringt. die referenz musss ich trotzdem uebergeben. wobei wir wieder bei meiner ursprungsfrage sind?

Gruß richard

Jens Schumann 17. Nov 2005 16:56

Re: objectreferenz austauschen ohne globale variablen!!!!
 
Hallo,
ungefähr so
Delphi-Quellcode:
Type

  TMyForm = class(TForm)
  private
    FRefObject : TObject;
  ...
  end;

procedure TMyForm.CreateRefObject;
begin
  If Not Assinged(FRefObject) then
    FRefObject:=TOBject.Create;
end;

procedure TMyForm.DoSomething(aRefObject : TObject);
begin
  If Assinged(FRefObject) then
    MachWas
end;

procedure TMyForm.XYZClick(Sender : TObject);
begin
  CreateRefObject;
  DoSomething(FRefObject );
end;

richard_boderich 17. Nov 2005 17:58

Re: objectreferenz austauschen ohne globale variablen!!!!
 
ok jens jetz weis ich was du meinst ;)

ich wuerd noch folgendes ergaenzen?

Delphi-Quellcode:
Type

  TMyForm = class(TForm)
  private
    FRefObject : TObject;
  ...
  end;

procedure TMyForm.CreateRefObject;
begin
  If Not Assinged(FRefObject) then
    FRefObject:=TOBject.Create;
end;

procedure TMyForm.DoSomething(aRefObject : TObject);
begin
  If Assinged(FRefObject) then
    MachWas
end;

procedure TMyForm.XYZClick(Sender : TObject);
begin
  CreateRefObject;
  DoSomething(FRefObject );
  frefobject.free                    // um das übergabe object wieder nach benutzung freizugeben?? oder macht er das automatisch?
end;

Khabarakh 17. Nov 2005 18:12

Re: objectreferenz austauschen ohne globale variablen!!!!
 
[gelöscht]


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:17 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz