Autor |
Beitrag |
Jakob Schöttl
      
Beiträge: 929
Erhaltene Danke: 1
Delphi 7 Professional
|
Verfasst: So 08.04.07 14:02
Hallo mal wieder,
Ich habe eine Klasse, die eine Eigenschaft besitzt vom TEdit. Eine Instanz von TEdit soll von anderen Programmteilen erstellt und zugewiesen werden. Das bedeutet, dass auch andere Programmteile das Objekt freigeben können -> Exception!
Aber was ist, wenn jetzt meine Klasse auf das Edit zugreift, obwohl gar keine Instanz von TEdit existiert?
Bis jetzt hab ich es so gemacht:
Delphi-Quelltext 1:
| if Assigned(Self.Edit) then Self.Edit.Text := 'Test'; |
Aber das reicht leider nicht, weil wenn ich Self.Edit.Free aufrufe, dann zeigt Self.Editimmer noch auf ein Objekt, das aber nicht mehr existiert.
Folge: Zugriffsverletzung.
Gibt es eine Funktion, die mir sagt, o b der Objektzeiger zugewiesen ist und das Objekt existiert?
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: So 08.04.07 14:12
Deshalb benutzt man zum Freigeben auch die Funktion FreeAndNil(Self.Edit);
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
HelgeLange
      
Beiträge: 735
Erhaltene Danke: 6
Windows 7
Delphi7 - Delphi XE
|
Verfasst: So 08.04.07 14:15
ausserdem sollte man sich, wenn man Komponenten schreibt, die sich andere Komponenten zuweisen lassen, eine Methode implementieren, die Notification heisst, dort einfach schaun, ob Operation = opRemove ist, dann testen, ob AComponent dein Edit ist und wenn ja, dann kannst deinen internen zeiger auf nil setzen, weil das edit gleich ins nirvana geschickt wird
_________________ "Ich bin bekannt für meine Ironie. Aber auf den Gedanken, im Hafen von New York eine Freiheitsstatue zu errichten, wäre selbst ich nicht gekommen." - George Bernhard Shaw
|
|
Jakob Schöttl 
      
Beiträge: 929
Erhaltene Danke: 1
Delphi 7 Professional
|
Verfasst: So 08.04.07 15:01
mh, dann kann ich wohl nichts anderes machen, als auf Exceptionen zu reagieren.
In meinem Fall ist die Klasse ein Thread, es sieht so aus:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26:
| type TLeseThread = class(TThread) private FSerial: TSerial; protected procedure Execute; override; public property Serial: TSerial read FSerial write FSerial; end;
implementation
procedure TLeseThread.Execute; var chr: char; begin While not Terminated do if Assigned(FSerial) then if FSerial.TryReadChar(chr) then begin end; end;
end. |
Komischerweise gibt es gar nicht gleich eine Exception, wenn ich von einer anderen Unit aus mit LesenThread.Serial.Free das Objekt freigebe, obwohl in Execute dieses Objekt die ganze Zeit genutzt wird...
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: So 08.04.07 15:40
Hat jemand mal n paar Steine und ne Peitsche, um den Autor dieses Sources zu St\Peinigen? OBJEKT-PROPERTIES NIE ÜBER DIREKTE FELDZUGRIFFE!!!Erzeuge für deine Komponente für diese Eigenschaft separate Getter und Setter-Methoden, dann kannst Du auch entsprechend drauf reagieren... Ferner: KOMPONENTEN AUF DIE EIN OBJEKT ANGEWIESEN IST, NIEMALS!!! DURCH FREMDOBJEKTE FREIGEBEN!!!Wenn Du ein Unlink vornehmen willst, dann: Delphi-Quelltext 1: 2: 3:
| Serial := ThreadKompo.Serial; ThreadKompo.Serial := nil; FreeAndNil(Serial); | Dann funktioniert nämlich auch das Freigeben problemlos!!!
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
JayEff
      
Beiträge: 2971
Windows Vista Ultimate
D7 Enterprise
|
Verfasst: So 08.04.07 15:58
BenBE hat folgendes geschrieben: | Hat jemand mal n paar Steine und ne Peitsche, um den Autor dieses Sources zu St\Peinigen? |
...Dass du immer gleich so brutal werden musst!
Nur könntest du vielleicht zur Verdeutlichung (Damit sogar ich es verstehe  ) ein kleinens Sourcebeispiel hierzu bringen?
BenBE hat folgendes geschrieben: | OBJEKT-PROPERTIES NIE ÜBER DIREKTE FELDZUGRIFFE!!!
Erzeuge für deine Komponente für diese Eigenschaft separate Getter und Setter-Methoden, dann kannst Du auch entsprechend drauf reagieren... |
_________________ >+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: So 08.04.07 16:33
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
Jakob Schöttl 
      
Beiträge: 929
Erhaltene Danke: 1
Delphi 7 Professional
|
Verfasst: So 08.04.07 19:28
Kannst du mir mal ein Stichwort für F1 geben, bitte? Dann kann ichs mir da nochmal anschauen.
Aber der Code sieht schon mal ganz nützlich aus - Danke!
Bloß ein Problem: Das Objekt muss in anderen Units verwendet werden! Dazu benutze ich natürlich einen anderen Zeiger. Es muss deswegen woanders verwendet werden, weil dieser Thread für das dauernde Lesen von RS 232 zuständig ist, für das Schreiben aber nicht. Und zwei Objekte von TSerial kann ich nicht verwenden, sonst ist kein Zugriff von beiden auf die Schnittstelle möglich.
|
|
Jakob Schöttl 
      
Beiträge: 929
Erhaltene Danke: 1
Delphi 7 Professional
|
Verfasst: So 08.04.07 19:32
Mir fällt gerade ein, Ich könnte doch auch eine Thread-Methode für das Schreiben machen, oder nicht? Kann ein Thread Execute ausführen, und gleichzeitig andere Thread-Methoden aufgerufen werden. Ja, zB. Terminate
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: So 08.04.07 19:53
Ja. Können sie. Ach ja: Was denkst Du, wozu der Setter eines Properties zuständig ist?
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
Jakob Schöttl 
      
Beiträge: 929
Erhaltene Danke: 1
Delphi 7 Professional
|
Verfasst: So 08.04.07 19:54
BenBE hat folgendes geschrieben: | Delphi-Quelltext 1: 2: 3: 4:
| Function TThreadEx.GetSerial: TSerial; begin Result := FSerial; end; |
Der Getter sieht zwar erstmal sinnlos aus, verhindert aber den direkten Zugriff auf die Variable FSerial, wodurch unbefugte Manipulationen wie diese für TApplication.Mainform möglich sind, verhindert werden (und damit die Nutzung des Setters erzwungen wird. |
das stimmt leider nicht ganz, weil wenn ich zur SetMethode noch ShowMessage schreibe und eine Eigenschaft ändere, dann wird keine ShowMessage angezeigt.
|
|
HelgeLange
      
Beiträge: 735
Erhaltene Danke: 6
Windows 7
Delphi7 - Delphi XE
|
Verfasst: So 08.04.07 20:04
naja, wenn man eine get methode hat und doch an dem objekt von ausserhalb spielen will, dann macht mans ich einfach ne variable und weisst diese zu, dann kann man spielen, bis man schwarz wird. Ausserdem finde ich, dass das Spielen dazugehört, Delphi muss manchmal vergewaltigtw erden, damit es sich ordentlich verhält, allerdings sollte man eben auch wissen, was man macht
_________________ "Ich bin bekannt für meine Ironie. Aber auf den Gedanken, im Hafen von New York eine Freiheitsstatue zu errichten, wäre selbst ich nicht gekommen." - George Bernhard Shaw
|
|
|