Announcement

Collapse
No announcement yet.

"Ansprechen" dynamisch erzeugter Formulare...

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

  • "Ansprechen" dynamisch erzeugter Formulare...

    Hallo Leute,

    ich programmiere gerade an einer MDI-Anwendung. Das Problem ist nur, es werden zur Laufzeit dynamisch untergeordnete Formulare erzeugt.
    Diese sehen alle gleich aus, es befindet sich eine TeechartKomponente drauf. Ich erzeuge nun auf Kopfdruck die gewünschte Anzahl an Formularen das sieht so aus:

    constructor TForm2.Create(AOwner: TWinControl; sParam: String);
    begin
    inherited Create(AOwner);
    self.Caption := 'Kanal-Nr. '+sParam;
    self.Name := 'child' + sParam;
    self.Chart1.Name := 'Chart1' + sParam;
    self.series1.Name := 'Name' + sParam;
    end;

    sParam ist wie'n Zähler und ist ausschlaggebend für den späteren Namen, Titel usw. des dyn. erzeugten Formulares (isch des richtig!?!)

    Ja und nun zur Frage:
    Wie kann ich dann die einzelnen TeeCharts ansprechen, die sollen nämlich total verschiedene Werte anzeigen und ich kriegs nicht gebacken!!!

    Ok, danke im voraus

    Tatjana

  • #2
    Hallo Tatjana,<p>
    um dein Problem besser verstehen zu können solltest du vielleicht noch zeigen, wie du die Formulare erzeugst. Was übergibst du dem Konstrukter als AOwner?<p>
    Gruß<p>
    Wolfgang Rolle

    Comment


    • #3
      Hallo Tatjana,<p>
      Du solltest Dir vielleicht mal den Befehl FindComponent anschauen. Darüber solltest Du wieder auf Deine Formulare zugreifen können.<p>
      Grüße, Mario Noac
      Schöne Grüße, Mario

      Comment


      • #4
        Hallo Tanja, <br>
        ich habe vorab ein paar Fragen an Dich:<br>
        1. warum heissen die Fenster immer anders? <br>
        2. was bezweckst Du damit?<br>
        3. Sind die im Fenster angezeigen Daten konstant oder sollen Sie sich bei geöffneten Fenster dynamisch ändern?<br>
        <br>
        4. Hast Du schon einmal etwas von Model View Controller gehört?<br>
        <br>
        Gruss<br>
        Frank<br&gt

        Comment


        • #5
          Hallo Tatjana,<br>
          ich glaube zwar, daß eigentlich jedes MDI-Child selber dafür verantwortlich sein mußte, daß es die Daten seiner Chartkomponente füllen muß, aber Du kannst es auf jeden Fall so machen.
          <pre>
          for i:=0 to MDIChildCount-1 do
          begin
          if MDIChildren[i] is TForm2 then
          begin
          sparam:=strtointdef(copy(MDIChildren[i].name,length('child')+1,length(MDIChildren[i].name)-length('child')),-1);//Nummer herausfinden
          if sparam>-1 then
          begin
          fillteechartofchildren(sparam,MDIChildren[i] as TForm2);
          end;
          end;
          end;
          procedure fillteechartofchildren(sparam:Integer;Aform:Tform2 )
          var acharr:tchart;
          begin
          achart:=tchart(aform2.findcomponent('Chart1' + inttostr(sParam)));
          end;
          </pre&gt

          Comment


          • #6
            @Wolfgang

            Hi Wolfgang! Wie geht's wie steht's :-) ?
            Ich übergebe dem Konstruktor als AOwner TForm

            procedure TForm1.Button3Click(Sender: TObject);
            var
            i :Integer;
            begin
            for i := 1 to dynamischeAnzahlDerZuErzeugendenChildFormulare do begin
            Form2 := TForm2.Create(self,intTostr(i));
            end;
            end;

            @Mario

            Ja, das habe ich schon gemacht mit FindComponent. Ich kann die erzeugten Formulare ansprechen, aber die darauf platzierte Komponente TeeChart nicht.
            So sieht's bei mir aus:
            procedure TForm1.Button5Click(Sender: TObject);
            var
            i: Integer;
            begin
            for i := 1 to dynamischeAnzahlDerZuErzeugendenChildFormulare do begin
            Form2 := TForm(FindComponent('child'+IntToStr(i)));
            Form2.Free;//Forms entfernen
            end;
            end;

            @Frank

            1.die verschiedenen Instanzen können ja nicht immer gleich heissen(?) sonst kann ich sie ja nicht ansprechen, zumal die Formulare alle gleichzeitig angezeigt werden.
            2.siehe 1.
            3. die Daten sind dynamisch und in jedem Child soll ein anderes Diagramm gezeichnet werden, das wiederum soll parallel geschehen
            4. Model View Controller ist nicht bekann

            Comment


            • #7
              Hallo Tatjana,<br>
              Du kannst Die Fenster auch über die for i:=0 to MDIChildCount-1 do
              Schleife ansprechen. Dann hast Du das jeweilige Form in MDIChildren[i], ohne den Namen zu benötigen. Über I hättest Du die Nummer des jeweiligen CHilds herausgefunden. Diese kannst Du dann in der Procedure fillteechartofchildren mit den Daten füllen die das jeweilige Fenster benötigt. Da diese Procedure ja die Nummer des Kindes als Parameter bekommt. Dort bekommst Du dann auch mit achart Zugriff auf die jeweilige TChart Komponente<br>
              Aber trotzdem noch einmal. Ich glaube es wäre viel eleganter, wenn sich das jeweilige Fenster die angezeigten Werte selber besorgt. So bekommst Du nämlich Probleme, wenn der Benutzer irgend ein Fenster schließt und daraufhin ein neues wieder erzeugt. Du müßtest dem Fentser eigentlich nur sagen welche Daten es anzeigen soll. Also nach dem Create irgendetwas in der Art AngezeigteDatendesFormulars:=DatenTypXY

              Comment


              • #8
                Hallo Tatjana,<br>
                zu 1. alle Instanzen eines Objektes können gleichheissen!!!<br>
                Der Name einer Komonente, muss nur dann unterschiedlich sein, wenn ich eine bestimmte Komponente identifizieren will.<p>
                Frage: Ist zum Zeitpunkt des Erzeugens Deines Formulares bereits bekannt, welche Daten in dem Formular angezeigt werden sollen?<p>
                Ist es möglich z.B. folgenden Aufruf zu programmieren:<p>
                TForm1.ButtonClick( Sender: TObject);<br>
                var
                i : Integer;
                Form2 : TForm2;
                begin<br>
                for i := 0 to AnzahlDerFormule - 1 do<br>
                begin<br>
                Form2 := TForm2.Create( self );<br>
                Form2.setData( DatenPool[i] ); <br>
                end;<br>
                end;<p>
                In der Methode setData des Formulars kann Du dann die übergebenen Daten in dem TeeChart anzeigen.<p>

                Gruss Frank Lin

                Comment


                • #9
                  @Tatjana,<p>
                  danke der Nachfrage. Mir geht's gut. Ich hoffe dir geht's ebenso. (Ich war heute mal wieder im Haus Beuttler. Herr W. wollte noch eine Archivierungsfunktion für Anlagen in Stüli. ;-) )<p>
                  Nun aber zu deinem Problem. Ich habe versucht ein kl. Progrämmchen zu schreiben und hatte zunächst das Problem, daß immer wenn ich auf Chart1 zugreifen wollte, ich eine EAccessViolation-Exception erhalten habe. Jetzt geht's. Im Konstruktor hatte ich zunächst wie du die Zeile:<p>
                  <b>Chart1.Name := 'chart' + sParam;</b><p>
                  stehen. Mit dem Debugger stellte ich aber fest, daß immer wenn ich danach auf Chart1 zugreifen wollte, dort nil angezeigt wurde. Danach habe ich die Zeile auskommentiert. Von da an konnte ich auf Chart1 ohne Probleme zugreifen.<br>
                  Ich wüßte nicht, warum man den Namen des Objektes nicht ändern können sollte. Es scheint sich hier um einen Fehler in der TChart-Komponente zu handeln. Aber ich denke du kannst darauf verzichten den Namen des TChart-Objektes zu ändern. Falls das nicht dein Problem war, dann melde dich nochmals und beschreibe bitte etwas ausführlicher, was denn das Problem ist.<p>
                  Gruß<p>
                  Wolfgang Roller<p>
                  PS: Ich arbeite mit Delphi 5 Professional

                  Comment

                  Working...
                  X