Results 1 to 4 of 4

Thread: Gezamenlijke Unit2 welke door Unit1 en Unit3 worden gebruikt

  1. #1

    Gezamenlijke Unit2 welke door Unit1 en Unit3 worden gebruikt

    Hallo allemaal,

    Ik heb een gezamenlijke Unit2 welke door Unit1 en Unit3 worden gebruikt. Wanneer ik in Unit1(op Form1) Button1 aanklik dan wordt de tekst op het Panell1 vervangen door een andere tekst. Met Button2 (op Form1) wordt Test_Frm (Unit3) scherm geopend. In dit scherm wordt Button1 geactiveerd en wordt de zelfde procedure uit Unit2 doorlopen, echter zonder resultaat. Hoe los je dat op?

    Frans

    Code:
    unit Unit1;
    
    {$mode objfpc}{$H+}
    
    interface
    
    uses
      Classes, SysUtils, Forms, Controls, Graphics, Dialogs, Unit2,Unit3, StdCtrls,
      ExtCtrls;
    
    type
    
      { TForm1 }
    
      TForm1 = class(TForm)
        Button1: TButton;
        Button2: TButton;
        Panel1: TPanel;
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
      private
    
      public
    
      end;
    
    var
      Form1: TForm1;
    
    implementation
    
    {$R *.lfm}
    
    { TForm1 }
    
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      Instellen(Form1);
    end;
    
    procedure TForm1.Button2Click(Sender: TObject);
    Var Dlg : TTest_Frm;
    begin
      Dlg := TTest_Frm.Create(nil);
      Dlg.ShowModal;
      Dlg.Free;
    end;
    
    end.
    
    // ==================================================
    
    unit Unit2;
    
    {$mode objfpc}{$H+}
    
    interface
    
    uses
      Classes, SysUtils,Forms,ExtCtrls;
    
    Procedure Instellen(AForm : TForm);
    
    implementation
    
    procedure Instellen(AForm : TForm);
    var
      I : Integer;
    begin
      for I := 0 to AForm.ComponentCount-1 do
        if (AForm.Components[I] is TPanel) then
          TPanel(AForm.Components[I]).Caption := 'aaaaaaaaa';
    end;
    
    end.                 
    
    // ======================================================
    
    unit Unit3;
    
    {$mode objfpc}{$H+}
    
    interface
    
    uses
      Classes, SysUtils, Forms, Controls, Graphics, Dialogs, ExtCtrls, StdCtrls,
      Unit2;
    
    type
    
      { TTest_Frm }
    
      TTest_Frm = class(TForm)
        Button1: TButton;
        Panel1: TPanel;
        Panel2: TPanel;
        procedure Button1Click(Sender: TObject);
      private
    
      public
    
      end;
    
    var
      Test_Frm: TTest_Frm;
    
    implementation
    
    {$R *.lfm}
    
    { TTest_Frm }
    
    procedure TTest_Frm.Button1Click(Sender: TObject);
    begin
      Instellen(Test_Frm);
    end;
    
    end.

  2. #2
    refresh van het form na updaten?

  3. #3
    Verander in unit 3:

    Delphi Code:
    1. // Instellen(Test_Frm);
    2. Instellen(Self);

    De uitleg: Test_Frm is een globale variabele. Die wijst niet noodzakelijk naar de instantie van TTest_Frm waarin je zit te werken.
    In dit geval is dat zeker niet zo, want de zichtbare, modal getoonde instantie, is opgeslagen in de lokale variabele Dlg in Form1. Self verwijst naar de huidige instantie van de class waarin je zit. Dat zal dus effectief de TTest_Frm zijn waarin je op de knop hebt gedrukt.

    Je zou in Form1 dus de variable Test_Frm kunnen vullen, of je zou dat vanuit de constructor van TTest_Frm kunnen doen, maar 't is allebei in de meeste gevallen niet zo netjes. Globale variabelen kunnen voor verwarring zorgen, en je in de problemen brengen, omdat je altijd maar één instantie in zo'n variabele kan opslaan. Het is een hulpmiddeltje van de IDE om je snel, zonder al te veel achtergrondkennis, te laten starten, maar het werkt verwarring op een later moment in de hand. Door in dit geval Self te gebruiken, en in andere gevallen lokale variabelen (zoals Dlg), en parameters, (zoals AForm), is het makkelijker om je code breed bruikbaar te houden.

    Daarbij wijst de variabele waarschijnlijk al naar een (andere) instantie van TTest_Frm. Ik zou verwachten dat de code van Instellen een fout zou geven op AForm.ComponentCount. Het feit dat dat niet gebeurt, geeft aan dat AForm (die de waarde van Test_Frm toegewezen heeft gekregen), waarschijnlijk een geldig object bevat. Ik vermoed dat je applicatie automatisch al een Test_Frm instantie maakt, die onzichtbaar op de achtergrond aanwezig is. Kijk daarvoor in de code van je `dpr`, of in Project -> Application -> Forms -> Auto-create forms.

    Ik geef er zelf de voorkeur aan om de globale variabelen van nieuwe forms en datamodules direct weg te halen, zodat ik ze niet per ongeluk kan gebruiken. Mocht ik het dan toch willen, dan kan ik ze altijd zo weer toevoegen.
    Last edited by GolezTrol; 06-Sep-21 at 15:25.
    1+1=b

  4. #4
    GolezTrol bedankt, het werkt.

    H.G. Frans

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •