Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Prozeduren aus einer 2. Unit nutzten (https://www.delphipraxis.net/93285-prozeduren-aus-einer-2-unit-nutzten.html)

guitar1 3. Jun 2007 20:40


Prozeduren aus einer 2. Unit nutzten
 
Hi,

ich schreibe gerade ein Programm, in dem ich einige procedures in eine 2. Unit auslager. in der 2. Unit werden diese in eine Klasse gepackt, damit sie auch Ereignissen zugeordnet werden können (hier OnMouseEnter und Leave; das sollte aber eher nebensächlich sein). will ich nun allerdings einem Ereigniss eine Procedure zuordnen kommt die Fehlermeldung "Undefinierter Bezeichner". ich habe die 2. Unit auch schon in die uses eingebunden! wieso erkennt er die denn dann nicht???

procedures in der 2. Unit (gekürzt):
Delphi-Quellcode:
unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, unit1,
  Dialogs, ExtCtrls, StdCtrls, Menus, ComCtrls, Buttons, Grids, ImgList, Registry;

type
  Auswaehlen = class(TObject)
    procedure auswahl0leave(Sender: TObject);
    ...
  end;

var
  auswahl: Array of Timage;

implementation

procedure Auswaehlen.auswahl0leave(Sender: TObject);
begin
  form1.Statusbar.Panels[0].Text:= 'Fertig';
  form1.Statusbar.Panels[2].Text:= '';  
  auswahl[0].Transparent:=true;
  auswahl[0].OnClick:= form1.MachWas;
end;

end.
Aufruf in der 1. Unit:
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls, Menus, ComCtrls, Buttons, Grids, ImgList, Registry;

type
  TForm1 = class(TForm)
    MainMenu1: TMainMenu;
  end;

implementation

uses unit2;

procedure TForm1.NotenAuswahlEnter(Sender: TObject);
begin
  ton[0].Parent := ScrollBox1;
  ton[0].OnMouseEnter := auswahl0enter; // <-- hier kommt der Fehler
  ton[0].OnMouseLeave := auswahl0leave; // &lt;-- hier auch
end;

end.
was vielleicht noch gesagt werden sollte, dass ist das erste mal das ich in andere Units auslager, deshalb habe ich da noch nicht so viel erfahrung mit, also bitte auch nicht so komliziert erklären.

schon mal danke im Voraus
Andi

s-off 3. Jun 2007 20:55

Re: Prozeduren aus einer 2. Unit nutzten
 
Weil "ton" vielleicht kein Objekt der Klasse Auswaehlen ist?

guitar1 3. Jun 2007 21:48

Re: Prozeduren aus einer 2. Unit nutzten
 
muss es das denn sein?? weil "ton" ist ein wärend der laufzeit erstelltes TImage, wenn es rein muss, muss ich es dann wie "auswahl: Array of Timage" einbinden?

naja ich probiers mal, schonmal danke für die schnell antwort

xxl1 3. Jun 2007 22:16

Re: Prozeduren aus einer 2. Unit nutzten
 
Zitat:

Zitat von guitar1
Delphi-Quellcode:
unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, unit1,
  Dialogs, ExtCtrls, StdCtrls, Menus, ComCtrls, Buttons, Grids, ImgList, Registry;

type
  Auswaehlen = class(TObject)
  public //
    procedure auswahl0leave(Sender: TObject);
  private //
    ...
  end;

var
  auswahl: Array of Timage;

implementation

procedure Auswaehlen.auswahl0leave(Sender: TObject);
begin
  form1.Statusbar.Panels[0].Text:= 'Fertig';
  form1.Statusbar.Panels[2].Text:= '';  
  auswahl[0].Transparent:=true;
  auswahl[0].OnClick:= form1.MachWas;
end;

end.
Du solltest private/public/published benutzen um herauszustellen welche funktionen,prozeduren und variablen wie zu behandeln sind.
Auserdem solltest du constructor und destructor definieren damit die einzelnen teile flexibel erstellt werden können...
jedoch sollte es meines wissens auch so gehen:

Aufruf in der 1. Unit:
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls, Menus, ComCtrls, Buttons, Grids, ImgList, Registry;

type
  TForm1 = class(TForm)
    MainMenu1: TMainMenu;
  end;

implementation

uses unit2;

procedure TForm1.NotenAuswahlEnter(Sender: TObject);
begin
  ton[0].Parent := ScrollBox1;
  ton[0].OnMouseEnter := Auswaehlen.auswahl0enter; // <-- hier kommt der Fehler <-- Du musst zu erkennen geben wo die prozedur enthalten ist
  ton[0].OnMouseLeave := Auswaehlen.auswahl0leave; // &lt;-- hier auch        
end;

end.


guitar1 4. Jun 2007 13:25

Re: Prozeduren aus einer 2. Unit nutzten
 
so, ich hab jetzt mal die 2. unit in public, etc. unterteilt, das hat allerdings nichts geholfen, immer noch der gleiche fehler. Auch mit "ton[0].OnMouseEnter := Auswaehlen.auswahl0enter;" hat sich nur der Fehler geändert xD. jetzt ist es nicht mehr der Fehler "Undefinierter Bezeichner" sondern
Zitat:

[Pascal Fehler] Unit1.pas(1052): E2010 Inkompatible Typen: 'TNotifyEvent' und 'Auswaehlen.auswahl0enter'
@xxl1:
Zitat:

Zitat von xxl1
Auserdem solltest du constructor und destructor definieren damit die einzelnen teile flexibel erstellt werden können...

Was meinst du damit? Ich habe ja nicht wirklich eine neue Klasse geschrieben, ich wollte ja nur ca 1000 Zeilen Code auslagern in eine andere unit, das hat doch nichts mit de- und constructor zutun, oder? falls doch dann klärt mich auf, was ich da machen soll!

grüße
Andi

s-off 4. Jun 2007 14:41

Re: Prozeduren aus einer 2. Unit nutzten
 
Zitat:

Zitat von guitar1
so, ich hab jetzt mal die 2. unit in public, etc. unterteilt, das hat allerdings nichts geholfen, immer noch der gleiche fehler.

Warum sollte das auch was helfen?
IMHO werden Klassenmethoden ohne besondere Zuteilung als Published interpretiert.

Zitat:

Zitat von guitar1
Auch mit "ton[0].OnMouseEnter := Auswaehlen.auswahl0enter;" hat sich nur der Fehler geändert xD. jetzt ist es nicht mehr der Fehler "Undefinierter Bezeichner" sondern
Zitat:

[Pascal Fehler] Unit1.pas(1052): E2010 Inkompatible Typen: 'TNotifyEvent' und 'Auswaehlen.auswahl0enter'

Stichwort 'Methodenzeiger'

guitar1 4. Jun 2007 17:01

Re: Prozeduren aus einer 2. Unit nutzten
 
das mit methodenzeiger hab ich auch schon mal gesucht, aber ich hab nichts gefunden was ich verstanden hab, bzw. was bei mir funktioniert hat, deshalb habe ich extra diese Frage gestellt, umherauszufinden, wie das geht.
So langsam verzweifel ich noch, kann mir nicht jemand einfach sagen, wie ich eine procedure aus einer anderen unit einem event zuordne?

Grüße
Andi

guitar1 6. Jun 2007 23:03

Re: Prozeduren aus einer 2. Unit nutzten
 
gibts denn keinen hier in der ganzen DP der mir weiterhelfen kann?

Apollonius 7. Jun 2007 12:23

Re: Prozeduren aus einer 2. Unit nutzten
 
TNotifyEvent ist eine Methode. Das heißt, du musst bei der Zuweisung an ein onSowieso auch eine Instanz übergeben, also:
Delphi-Quellcode:
MeinDummy:=Auswaehlen.create;
auswahl[0].OnClick:=MeinDummy.auswahl0leave;
MeinDummy.free; //Erst ganz am Ende (in der Finalization), sonst gibts eine Zugriffsverletzung!
Hoffe geholfen zu haben
Apollonius

bitsetter 7. Jun 2007 12:24

Re: Prozeduren aus einer 2. Unit nutzten
 
Zitat:

Zitat von guitar1
so, ich hab jetzt mal die 2. unit in public, etc. unterteilt, das hat allerdings nichts geholfen, immer noch der gleiche fehler. Auch mit "ton[0].OnMouseEnter := Auswaehlen.auswahl0enter;" hat sich nur der Fehler geändert xD. jetzt ist es nicht mehr der Fehler "Undefinierter Bezeichner" sondern
Zitat:

[Pascal Fehler] Unit1.pas(1052): E2010 Inkompatible Typen: 'TNotifyEvent' und 'Auswaehlen.auswahl0enter'

Hallo,

wenn ich richtig verstanden habe ist ton[0] ein TImage. Ein Standard TImage hat bei mir jedoch keinen Event OnMouseEnter, mich hätte mal interessiert wie bei dir der Prozedurkopf von OnMouseEnter und dein jetziger Code aussieht.


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:57 Uhr.
Seite 1 von 2  1 2      

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