Hi<p>Ich möchte eine Funktion schreiben, die bei der Komponente, von der sie aufgerufen wird, die Eigenschaften ändert. Also zB wird die Eigenschaft Caption von der Komponente, die die Funktion aufruft auf 'gut' gesetzt. Der Typ dieser aufrufenden Komponente ist festgelegt (TSpeedButton). Über den Parameter Sender geht das ja nicht, da dieser ja nicht die Komponente selbst sondern nur eine Kopie ist. Ich habe es schon versucht, über<PRE>Form1.Components[TSpeedButton(Sender).ComponentIndex].Caption:='gut';</PRE>zu schaffen, aber Components scheint eine NUR-LESEN-Eigenschaft des Formulars zu sein. Dann habe ich es über<PRE>FindComponent(TSpeedButton(Sender).Name). Caption:='gut';</PRE>versucht, aber FindComponent gibt TObject zurück...also<PRE>TSpeedButton(FindComponent(TSpee dButton(Sender).Name)).Caption:='gut';</PRE>schließlich ist mir eingefallen, dass ich bei einem Funktionsresult schwerlich eine Eigenschaft verändern kann und dass dies sowohl bei TSpeedButton() als auch bei FindComponent() gilt...jetzt weiß ich nicht mehr weiter und brauche euren Rat...gibt es überhaupt eine Lösung für das Problem?<p>danke schonmal für eure Hilfe, Sebastian Meßmer
Announcement
Collapse
No announcement yet.
Parameter Sender - Eigenschaften bearbeiten
Collapse
X
-
Hm stimmt...funktioniert...es ist dann allerdings das Problem, dass es 2 verschiedene Funktionen sind...die 1. Funktion erstellt einen Zeiger auf den Sender, der dann erst in einer 2. Funktion verwendet wird...vereinfacht<PRE>var BTN:^TButton;<br>
procedure TForm1.Button1Click(Sender: TObject);
begin
BTN:=@Sender;
end;
<br>
procedure TForm1.Button2Click(Sender: TObject);
begin
BTN^.Caption:='test';
end;</PRE>und irgendwie klappt das nicht...ich klick zuerst auf Button1 und dann auf Button2 - es wird aber nicht das Caption von Button1 sondern das Caption des Formulars verändert...und wenn ich genau den selben Quelltext nehme, nur die Variable BTN als ^TSpeedButton deklariere und statt Buttons eben SpeedButtons nehme, gibt es eine EAccessViolation (dummerweise brauche ich TSpeedButtons in meiner Anwendung
Comment
-
Hi Sebastian,<BR><BR>
um erst mal dein Beispiel zum Laufen zu bringen:<PRE>
var BTN: TButton;
<BR>
procedure TForm1.Button1Click(Sender: Object);
begin
BTN := TButton(Sender);
end;
<BR>
procedure TForm1.Button2Click(Sender: Object);
begin
BTN.Caption := 'test';
end;
</PRE>
Da Delphi alle Objekte per Referenz übergibt, kannst du auf Pointer verzichten. Du erzeugst Zeiger auf Zeiger...<BR>
Die Variable BTN ist also von Typ TButton und erhält mit<BR>
BTN := TButton(Sender); <BR>
die Speicheradresse des ersten Buttons als Wert. Da Sender vom Typ TObject ist und BTN vom Typ TButton, musst du das Type Casting von Sender durchführen, damit der Compiler nicht meckert.<BR><BR>
Frank


Comment
-
Du hast recht *staun* scheinbar übergibt Delphi wirklich nur die Referenz...da programmiere ich jetzt schon jahrelang Delphi und weiß sowas grundlegendes nicht...*sich an den kopf fass*...danke <br>Aber da tut sich gleich eine weitere Fragen auf, die ich jetzt nicht mehr für meine Anwendung brauche (das funktioniert jetzt), mich aber grundlegend interessiert...Wenn das nur per Referenz übergeben wird, muss es doch auch eine Funktion geben, die es wirklich kopiert und nicht nur die Referenz übergibt...Typen wie zB TBitmap oder TStringList haben dafür ja Assign() - aber wie zB kopiere ich ein TButton-Objekt
Comment
-
Hallo Sebastian,<BR><BR>
wenn es um Klassen und Objekte geht, muss man es - zum richtigen Verständnis - sehr genau nehmen.<BR>
Die Methode Assign erzeugt auch bei TStringList und TBitMap kein neues Objekt bzw. keine Kopie.<BR>Assign weist einem Objekt Eigenschaften von einem anderem Objekt zu. Beide Objekte müssen bereits existieren.<BR>
Wolfgang hat absolut recht. Es gibt keinen vernünftigen Grund, z.B. bei einer Funktion, welche ein Objekt als Parameter erhält, eine Kopie des Objektes zu erzeugen.<BR><BR>
Gruß, Fran
Comment
-
Hi<p>Es muss ja nicht unbedingt TButton sein, dass ich kopieren will...es kann durchaus auch eine eigene (Selbsterstellte) Klasse sein, die man kopieren will. Es kann ja zum Beispiel sein, dass man 2 Variablen der selben Klasse benötigt, mit nur leicht veränderten Eigenschaften...natürlich wäre es dann möglich, eine neue Variable der Klasse zu generieren und einfach Stück für Stück die Einstellungen zu übertragen - aber das ist meiner Meinung nach zu kompliziert um die richtige Lösung zu sein...<p>cu, Heinz
Comment
-
Hallo Sebastian,<BR><BR>
auch TButton besitzt die Methode Assign.<BR>
Wenn man eigene Klassen schreibt und benötigt die Funktionalität von Assign, so achtet man darauf, dass von TPersistent abgeleitet und die in TPersistent deklarierte Methode Assign überschrieben wird. Natürlich muss ich selbst wissen, welche Eigenschaften übernommen werden sollen.<BR><BR>
Fran
Comment
-
Hi Sebastian,<br>
so ganz kann ich dein "Problem" nicht nachvollziehen.<br>
DU kannst im VAR Teil folgendes deklarieren: Tabelle : TQuery;<br>Danach kannst du mit Tabelle := Query1; etwas zuweisen. Wenn du eine echte Kopie benötigst, musst du mit create das Object erstellen und über assign die Eigenschaften einer vorhandenen Komponente zuweisen.<br>cu Michae
Comment
-
Also, entweder verstehe ich das Problem nicht oder ...? Naja, egal.
Also, Sender ist meines wissens keine Kopie, sondern das Objekt selbst, war zumindest bei mir immer so. Also ich würde es so lösen:
<pre>
TSpeedButton(Sender).Caption:='gut';
</pre>
Du kannst auch nachsehen, ob das aufrufende Objekt wirklich ein TSpeedButton ist.
<pre>
if Sender is TSpeedButton then
BlieBlaBlub;
</pre>
Und ändern kannst du eigenschaften, da du ja nicht die Adresse des Objektes änderst.
Und wenn man das Objekt kopieren will, muß man ein neues Objekt von gleichen Typ erzeugen, und dann alle properties Kopieren.
Wenn es das nicht ist, was du willst, hab ich deine Frage nicht verstanden.


Comment
-
Weil es keine eigenschaft gibt, die eine Kopie von einem Objekt anlegt. Was ich in einem Solchen Fall mache, wenn ich das brauche, ich leite das Objekt ab, und erstelle mit eine funktion, die mir eine Kopie von dem Objekt erzeugt.
<pre>
type
TTestButton = class(TButton)
function CopyObject: TTestButton;
...
end;
function TTestbutton.CopyObject: TTestButton;
begin
result:=TTestbutton.create(self.Parent);
result.parent:=self.parent;
result.color:=self.color;
...
end;
</pre>
Comment
Comment