Announcement

Collapse
No announcement yet.

Parameter Sender - Eigenschaften bearbeiten

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Parameter Sender - Eigenschaften bearbeiten

    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

  • #2
    Sender nicht die Kompo selbst? Wie kommst du da drauf?

    Zieh doch mal ein TButton auf ein Form und tippe dies ins OnClick-Event:
    <PRE>
    (Sender as TButton).Caption := 'Clicked!';
    </PRE&gt

    Comment


    • #3
      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


      • #4
        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

        &#10

        Comment


        • #5
          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


          • #6
            Hallo Sebastian,

            warum um himmelswillen willst du eine Kopie eines Buttons erstellen? Diese Frage hat sich mir in 10 Delphi-Benutzung noch nie gestellt.

            Gruß

            Wolfgan

            Comment


            • #7
              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


              • #8
                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


                • #9
                  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


                  • #10
                    Hi<p>Hm scheinbar gibt es wirklich genügend Möglichkeiten um um eine Objekt-Kopier-Funktion herumzukommen...mir fällt jetzt auch nichts mehr ein, wofür man eine solche Methode brauchen könnte...danke für eure Hilfe <p>cu, Sebastia

                    Comment


                    • #11
                      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


                      • #12
                        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.

                        &#10

                        Comment


                        • #13
                          Hi<p>Doch genau das ist es - ich kann nur nicht verstehen dass man da umständlich alle Properties kopieren muss...<p>cu, Sebasia

                          Comment


                          • #14
                            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&gt

                            Comment

                            Working...
                            X