AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Prinzip der Datenkapselung austricksen?
Thema durchsuchen
Ansicht
Themen-Optionen

Prinzip der Datenkapselung austricksen?

Ein Thema von sanobub · begonnen am 23. Jul 2004 · letzter Beitrag vom 24. Jul 2004
Antwort Antwort
sanobub

Registriert seit: 15. Jul 2004
9 Beiträge
 
#1

Prinzip der Datenkapselung austricksen?

  Alt 23. Jul 2004, 21:04
Hallo,
angenommen ich habe eine Klasse mit Objekten einer weiteren, untergeordneten Klasse. Also meinetwegen so:

Delphi-Quellcode:
type
class=Thallo
  constructor Create;
  procedure blabla...
private
  lala: TPanel;
end;
Wenn jetz ein Ereignis in lala passiert (der Panel wird angeklickt), wie kann ich das dann der übergeordneten klasse (Thallo) mitteiln, ohne gegen das Prinzip der Datenkapselung zu verstoßen?
Vielleicht ist auch ein ganz anderer Ansatz sinnvoller?

Gruß, Sandro
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.639 Beiträge
 
#2

Re: Prinzip der Datenkapselung austricksen?

  Alt 23. Jul 2004, 21:07
Delphi-Quellcode:
type
Thallo = Class;
  constructor Create;
  procedure blabla...
  procedure OnLalaClick(sender: TObject);
private
  lala: TPanel;
end;

implementation

constructor THallo.Create;
begin
   lala.OnClick := OnLalaClick;
end;

procedure THallo.OnLalaClick(sender: TObject);
begin
   // hier wird reingelaufen wenn auf lala geclickt wird...
end;

Edit Nachtrag:
1.) Der Code ist ungetestet, sollte aber so oder zumindest so ähnlich laufen.

2.) Das Datenkapselungsprinzip 'auszutricksen' ist eine ganz, ganz böse und schlechte idee, die ich gleich wieder verwerfen würde. Das Prinzip gibt es nicht umsonst

Zum Glück hat Dein Fall nichts damit zu tun. Und Du hast vor allem noch ein sehr gutes Beispiel, weil genau das Delphi ja selber macht: Ersetze THallo doch mal spasseshalber durch TForm1, ziehe da ein Panel drauf, und erzeuge über den Objektinspektor das OnClick - Event auf dem Panel. Du wirst sehen, daß a) das Panel ein Member der Klasse TForm1 ist, so wie hier von THallo, und das die Methode genauso wie da oben auf TForm1 implementiert wird. Nur das Zuweisen der Methode (der Teil im Constructor), das macht Delphi sozusagen unsichtbar im Hintergrund (nämlich im Formular selber, in der DFM - Datei). In dem Fall machst Du das nur per Hand.
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
sanobub

Registriert seit: 15. Jul 2004
9 Beiträge
 
#3

Re: Prinzip der Datenkapselung austricksen?

  Alt 23. Jul 2004, 21:34
Funktioniert einwandfrei! Danke für die schnelle Hilfe!

Gruß, Sandro
  Mit Zitat antworten Zitat
sanobub

Registriert seit: 15. Jul 2004
9 Beiträge
 
#4

Re: Prinzip der Datenkapselung austricksen?

  Alt 24. Jul 2004, 00:45
Delphi-Quellcode:
type
Thallo = Class;
  constructor Create;
  procedure blabla...
  procedure OnLalaClick(sender: TObject);
private
  [b]lala: array [1..10] of TPanel;[/b]
end;

implementation

constructor THallo.Create;
var i : integer;
begin
  for i:= 1 to high(lala) do
    lala[i].OnClick := OnLalaClick;
end;

procedure THallo.OnLalaClick(sender: TObject);
begin
   // hier wird reingelaufen wenn auf lala geclickt wird...
end;
Ich hab das noch mal nen bissel abgewandelt, um ein weiteres Problem erklären zu können, das sich mir stellt! Wie kann ich innerhalb der Prozedur OnLalaClick den Namen des Panels herausfinden, auf welches geklickt wurde? Eigentlich dachte ich mir, dass eben genau diese Information durch den Parameter Sender übergeben wird, aber der ist ja vom Typ TObject.
Das leuchtet mir nur ein, wenn Thallo so etwas wie eine Vererbung von TObject ist?! Um auszuprobieren ob Sender aber wirklich dem Panel entspricht, habe ich unter OnLalacClick einmal versucht, den Panel zu löschen mit Sender.free. Hat funktioniert, nur bringt mich das auch nicht weiter

Über konstruktive Beiträge würde ich mich sehr freuen! Im Gegenzug sei meine Unwissenheit zu entschuldigen

Sandro
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#5

Re: Prinzip der Datenkapselung austricksen?

  Alt 24. Jul 2004, 01:41
Moin Sandro,

statt

Thallo = Class kannst Du auch schreiben

Thallo = Class(TObject) Das ist für den Compiler gleichbedeutend.

Bei einer Methode wird immer der, unsichbare, Parameter self mit übergeben, der die Adresse der Instanz des Objektes enthält.

Innerhalb von

procedure THallo.OnLalaClick(sender: TObject); enthält self also die Adresse des Objektes, und ist vom Typ THallo.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
scp

Registriert seit: 31. Okt 2003
1.120 Beiträge
 
Delphi 7 Personal
 
#6

Re: Prinzip der Datenkapselung austricksen?

  Alt 24. Jul 2004, 05:20
Wenn du die Panels erstellst, kannst du ihnen einen eindeutigen namen geben:
Code:
  for i:= 1 to high(lala) do
  begin
    lala[i] := TPanel.Create(...
    lala[i].Name := 'lala' + IntToStr(i);
Im OnClick kannst du das dann z.B. abrufen mit
  If (Sender.Name = 'lala2') then Ob ein Objekt von einer bestimmten Klasse abstammt, kannst du so ermitteln:
  If (Sender is TPanel) then
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.639 Beiträge
 
#7

Re: Prinzip der Datenkapselung austricksen?

  Alt 24. Jul 2004, 09:53
Genau, scp hat da schon nen sehr guten Ansatz geliefert.
Delphi-Quellcode:
procedure THallo.OnLalaClick(sender: TObject);
begin
   if sender is TPanel then // wenn es wirklich ein Panel ist...
   with sender as TPanel do // dann tue jetzt so, als seien wir direkt das panel:
   begin
      if Name = 'pnlLala1then
         Free; // panel Lala 1 freigeben
       if Name = 'pnlLala2then
         Caption := 'Panel Lala 2'; // bei panel lala 2 den angezeigten Text ändern

      // hier drin (in dem with... block) musst Du aufpassen:
      // Alle Aufrufe wie z.B. Free oder Caption werden erstmal auf die Klasse TPanel bezogen.
      // nur, wenn es die Eigenschaft / Methode dort nicht gibt, dann wird die entsprechende
      // ausprägung auf THallo aufgerufen. Hier redet man vom 'Scope' in dem man sich befindet.
   end;
end;
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
sanobub

Registriert seit: 15. Jul 2004
9 Beiträge
 
#8

Re: Prinzip der Datenkapselung austricksen?

  Alt 24. Jul 2004, 16:13
Danke! Erstens hab ich mein Problem lösen können und darüber hinaus beginne ich immer mehr zu verstehen, wie Delphi hinter den Kulissen funktioniert!

Gruß, Sandro
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:40 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