Announcement

Collapse
No announcement yet.

Aus einer globalen Unit heraus Elemente generieren

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

  • Aus einer globalen Unit heraus Elemente generieren

    Hallo!

    Ich habe folgendes problem und beiss mir daran schon seit Tagen die Zähne aus, wahrscheinlich ist die Lösung aber so simple dass ich die einfach nicht sehen kann. Und zwar habe ich ein Formular auf dem nichts zu sehen ist (keine Komponenten) nun binde ich eine globale Unit ein die von sich aus auf dem Formular eine TToolbar und einen TToolbutton setzt. Wenn ich jetzt aber versuche dem Button ein OnClick zuzuweisen sagt mir Delphi "Inkompatible Typen: Methodenzeiger und reguläre Prozedur". Ich habe shon alles mögliche versucht aber ich komme einfach nicht drauf wie ich das in einer externen Unit deklarieren muss damit mich Delphi versteht.

    Im folgenden habe ich die globale Unit die aufgerufen mal angehängt:

    unit global;

    interface

    uses ComCtrls, Dialogs, Forms, Controls, StdCtrls, Classes, Sysutils;

    procedure main;
    procedure myClick(Sender: TObject);

    implementation

    uses Unit1;

    var
    tb : TToolbar;
    btn: TToolButton;

    procedure myClick(Sender: TObject);
    begin
    showmessage('Button was clicked!');
    end;

    procedure main;
    begin
    with Application.Mainform do
    begin
    Caption := 'Test';
    tb := TToolbar.Create(nil);
    tb.parent := Application.Mainform;
    tb.Flat := true;
    tb.Autosize := true;
    tb.Images := Unit1.Form1.ImageList;
    btn := TToolButton.Create(nil);
    tb.InsertControl(btn);
    btn.ImageIndex := 0;

    btn.OnClick := myClick;
    end;
    end;

    end.

    Der Aufruf sieht so aus, dass lediglich in der Unit1 im OnShow Event des Formulares die Main Prozedur aufgerufen wird. Button und die Toolbar werden ja generiert und das Image aus der Imagelist wird auch zugewiesen, nur der kleine Click der fehlt halt noch.

    Vielen Dank für Eure Hinweise! Oli

  • #2
    Ohne das jetzt überprüft zu haben, würde ich mal vermuten, daß Du eben keine normale "procedure myClick(Sender: TObject);" an der Stelle angeben mußt, sondern eine Klassenprozedur (Methode eben). Das bedeutet, daß Du in Deiner globalen Unit eine Klasse implementierst und Createst, welche die "procedure myClick(Sender: TObject);" beinhaltet. Anschließend übergibst Du diese Proc dem OnClick-Ereignis.
    Also ungefähr so (aus dem Kopf, ohne getestet zu haben!):

    unit Global;
    ....
    TMyType = class
    procedure myClick(Sender: TObject);
    end;

    imlementation
    var fMyType: TMyType;
    procedure TMyType.myClick(Sender: TObject);
    begin (hier Deine Behandlungsroutine) end;

    initialization
    fMyType:= TMyType.Create;
    finalization
    FreeAndNil(fMyType);
    end

    Comment


    • #3
      Hallo Oliver,<br>
      die Sache funktioniert so:<br>
      <pre>
      <font face="Verdana" size="1" color="#000000">unit Unit1;

      interface

      uses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls;

      type
      TForm1 = class(TForm)
      Button1: TButton;
      procedure FormCreate(Sender: TObject);
      private
      { Private-Deklarationen }
      public
      { Public-Deklarationen }
      end;

      var
      Form1: TForm1;

      implementation

      uses Unit2;

      {$R *.DFM}

      procedure TForm1.FormCreate(Sender: TObject);
      begin
      <b>@Button1.OnClick:=@MyClick;
      </b>end;

      end.

      unit Unit2;

      interface

      uses Dialogs;

      procedure MyClick(Sender : TObject);

      implementation

      procedure MyClick(Sender : TObject);
      begin
      ShowMessage('Button clicked');
      end;

      end.</font>
      </pre>
      Button.OnClick erwartet einen Methodenzeiger. MyClick hingegen ist eine normale procedure. Der Adreßoperator sorgt jetzt dafür,<br>
      das Button.OnClick auf MyClick zeigt,<br&gt

      Comment

      Working...
      X