Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Ereignisse eines Forms in anderer Unit verarbeiten (https://www.delphipraxis.net/20599-ereignisse-eines-forms-anderer-unit-verarbeiten.html)

cBoB 20. Apr 2004 10:32


Ereignisse eines Forms in anderer Unit verarbeiten
 
Also folgende Frage:

Form1 wurde in Unit1 erstellt. Darin wurde zur Laufzeit eine ComboBox erstellt. Deren Ereignisbehandlungsroutine sollte aber außerdem noch in einer extra Unit untergebracht werden. Um die Ereignisse zu bearbeiten müssen diese aber Form1 zugeordnet werden, was mir aber irgendwie nicht möglich ist, da das ja in einer anderen Unit steht.
Was muß ich dabei beachten?? In der DelphiHilfe ist zu deisem Thema nix zu finden.

-c-

sakura 20. Apr 2004 10:37

Re: Ereignisse eines Forms in anderer Unit verarbeiten
 
Die Ereignismethoden müssen definitiv nicht im gleichen Form (in der gleichen Klasse) stehen, wie diese, in der das Objekt (Deine ComboBox) erstellt ist. Einzige Voraussetzung für die Ereignismethoden ist, daß diese zu einer Klasse (und einem initierten Object) gehören und die korrekte Parameterliste haben.

...:cat:...

himitsu 20. Apr 2004 10:43

Re: Ereignisse eines Forms in anderer Unit verarbeiten
 
du machst infach in der anderen Unit 'ne Klasse auf deklarierst dort drin deine Ereignisbehandlungs-Prozeduren und weist einfach in OnCreade deines Formulars diese Routienen deinen Komponenten zu.

z.B. siehe ComboBox - OnChange-Behandlung zuweisen

sakura 20. Apr 2004 10:50

Re: Ereignisse eines Forms in anderer Unit verarbeiten
 
@himitsu: Genau das wollte ich auch sagen, ich fand nur leider keine so schönen und simplen Worte :mrgreen:

...:cat:...

himitsu 20. Apr 2004 10:52

Re: Ereignisse eines Forms in anderer Unit verarbeiten
 
Hab ja auch lang genug überlegt, um es einfach rüberzubringen :mrgreen:

cBoB 20. Apr 2004 11:50

Re: Ereignisse eines Forms in anderer Unit verarbeiten
 
Klingt ja alles ganz logisch und sogar verständlich. Aber ich muß da irgendwo noch nen grundlegenden Denkfehler haben. Folgendes Beispiel soll mal kurz zeigen, wie ich mir das dachte:

Delphi-Quellcode:
unit devices;

interface

uses kl2700,Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  Menus, ComCtrls, StdCtrls, ExtCtrls;

type
  TDevice1 = class(TForm)
    procedure DevCBChange(Sender: TObject);
    procedure DevRep;
  private
  public
  end;

implementation

var Dev1 : TDevice1;

procedure TDevice1.DevCBChange(Sender: TObject);
begin
ShowMessage('Läuft');
end;

procedure TDevice1.DevRep;
const DevNames: array[0..5] of ShortString = ('KL2700','KL487','KL195','HP3440','HP4284','HP6622' );
var ListItem: TStrings;
    i,IndexDList: Integer;
    st_d1:String;

begin
with TCombobox.Create(Dev1) do
  begin
    Parent:=Dev1;
    top:=12;
    left:=8;
    For i:=0 to 5 do
    begin
    IndexDList := Items.Add(DevNames[i]);
    end;
    ItemIndex:=0;
    OnChange := DevCBChange(Dev1);  //hier kommt besagte Fehlermeldung "Inkompatible Typen..."
  end;

end;
So und da der Kompiler diese Unit vor der mit dem Hauptformular erzeugt, kanns ja nicht an dem Aufruf von da aus liegen. Er bricht ja hier schon ab.
Woran kann das liegen? :gruebel:
-c-

teebee 20. Apr 2004 11:55

Re: Ereignisse eines Forms in anderer Unit verarbeiten
 
Zitat:

Zitat von cBoB
Delphi-Quellcode:
    OnChange := DevCBChange(Dev1);

Lass da mal das Dev1 weg,

Gruß, teebee

cBoB 20. Apr 2004 12:06

Re: Ereignisse eines Forms in anderer Unit verarbeiten
 
@teebee
Hm, komisch - hast Recht gehabt. Aber warum geht das so? Normalerweise müßte ich doch einen Parameter übergeben. Sonst meckert der Kompiler ja auch wegen jeder Kleinigkeit!?

sakura 20. Apr 2004 12:09

Re: Ereignisse eines Forms in anderer Unit verarbeiten
 
Du musst Parameter nur bei der Ausführung(!) einer Methode übergeben. Du willst diese jedoch nicht ausführen, sondern die Methode nur einem Ereignis zuweisen, damit diese später ausgeführt werden kann. Das Ereignis übergibt anschließend dann die entsprechenden Parameter.

...:cat:...

himitsu 20. Apr 2004 12:10

Re: Ereignisse eines Forms in anderer Unit verarbeiten
 
Code:
unit device;

interface

uses kl2700,Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  Menus, ComCtrls, StdCtrls, ExtCtrls;

type
  TDevice1 = class(TForm)
    procedure DevCBChange(Sender: TObject);
  public
    procedure DevRep[color=red](Form: TForm)[/color];
  end;

[color=red]var Dev1: TDevice1;[/color]

implementation

procedure TDevice1.DevCBChange(Sender: TObject);
begin
ShowMessage('Läuft');
end;

procedure TDevice1.DevRep[color=red](Form: TForm)[/color];
const DevNames: array[0..5] of ShortString = ('KL2700','KL487','KL195','HP3440','HP4284','HP6622' );
var ListItem: TStrings;
    i,IndexDList: Integer;
    st_d1:String;

begin
with TCombobox.Create([color=red]Form[/color]) do
  begin
    Parent:=[color=red]Form[/color];
    top:=12;
    left:=8;
    For i:=0 to 5 do
      IndexDList := Items.Add(DevNames[i]);
    ItemIndex:=0;
    OnChange := [color=red]DevCBChange;[/color]
  end;
End;

end.
Delphi-Quellcode:
// Hauptunit
Dev1.DevRep(Form1);

cBoB 20. Apr 2004 12:27

Re: Ereignisse eines Forms in anderer Unit verarbeiten
 
Hey Danke Himitsu! Läuft!
Und wenn Du mir jetzt noch sagen kannst, warum ich das 2. Formular nicht mit "Create" kreieren muß, dann wärs noch schöner.
:cyclops:
-c-

himitsu 20. Apr 2004 12:30

Re: Ereignisse eines Forms in anderer Unit verarbeiten
 
Na weil du ja kein 2. Formular brauchst, welches mit Create erstellt wird.
Du brauchst ja nur die Struktur für die Proceduren - die Objekte werden ja auf dem 1. Formular gebraucht und deshalb auch dort erstellt und abgelegt.

cBoB 20. Apr 2004 13:08

Re: Ereignisse eines Forms in anderer Unit verarbeiten
 
Ach kuck an. Stimmt.
Also könnte man sagen, dass durch das Create nur die visuellen Komponenten initialisiert und sichtbar gemacht werden? Ich dachte, um die gesamte Struktur zu nutzten, müßte man das gesamte Teil auch "Create"ieren... Aber ok, dann geht das halt auch so.
Danke erstmal soweit!
Du wirst bestimmt noch öfter n paar blöde Fragen von mir zu lesen bekommen 8)

Bis dann!
-c-


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:24 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz