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
    Hi Oliver,
    du versuchst, einem Zeiger auf die Methode eines Objekts einen
    Zeiger auf eine globale Routine zuzuweisen, was der Compiler
    natürlich anmäkelt.
    <p>Es gibt's aber "statische" Methoden, die sich halbwegs wie globale
    Routinen verhalten. Das ergäbe bei dir sowas:
    <pre>
    type
    TDummy = class
    class procedure myClick(Sender: TObject);
    end;
    </pre>
    und du könntest "btn.OnClick := TDummy.myClick;" schreiben, musst also keine Instanz von TDummy anlegen.

    Ciao, Uli

    Comment


    • #3
      Hallo Ulrich,

      vielen Dank für deinen Tipp. Ob du es glaubst oder nicht, so einen ähnlichen Weg hatte ich auch schon versucht, aber warum bin ich nicht auf eine Lösung nach deinem Muster gekommen?

      Ich bin echt froh dass wir uns hier in diesem Forum austauschen können!

      Danke Ulrich

      Comment

      Working...
      X