Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Unitis, external Proceduren deklarieren, oder wie auch immer (https://www.delphipraxis.net/45085-unitis-external-proceduren-deklarieren-oder-wie-auch-immer.html)

Osse 29. Apr 2005 11:18


Unitis, external Proceduren deklarieren, oder wie auch immer
 
Moin, Moin

ich hab gerade ein kleines Projekt geschrieben, welches langsam ausufert. Deshalb hab ich jetzt mal versucht meherer Units zu schreiben und mein Hauptprogramm aufzuräumen. :coder:

Soweit so gut.

Dachte mir das jetzt auch mal richtig mit den Classen so zu machen, da es ja wirklich die Übersichtlichkeit verbessert. :coder2:

Nun mein Problem:

In der Main Unit möchte ich die Procedure
Delphi-Quellcode:
 procedure Initalisierung_CANController(Netz : HCANNet ; Hardware : HCANHw ;
    Baudrate : Integer ; Netzname : String ; Clientname : String ; var Client : HCANClient);
aufrufen, welche ich in einer anderen Unit geschrieben habe.

Delphi-Quellcode:
interface

uses
  Windows,WinTypes, Winprocs, Messages, SysUtils, Classes, Graphics, Controls,
  Forms, Dialogs, StdCtrls, CanApi2, ExtCtrls, ComCtrls, Menus, SyncObjs, Grids;

type
//allgemeine Controlerbezeichnung
   TController = CLASS
       m_hClient: HCANClient;     // Typ 'Client-Handle' Byte Variable aus Unit CANAPI2 eigentlich eine Byte Variable
      m_hNet : HCANNet;
    m_hHardware : HCANHw;
   END ;

  CAN_Controller = CLASS(TController);


   procedure Initalisierung_CANController(Netz : HCANNet ; Hardware : HCANHw ;
    Baudrate : Integer ; Netzname : String ; Clientname : String ; var Client : HCANClient);

  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }


end;

implementation

//******************************************************************************
// Initalisierung des Controllers
//
// Funktion :  Einrichen und Verbinden des CAN Controllers mit einem Nezt.
//                     Alle wichtigen Parameter können eingestellt werden.
//
// Eingabeparameter :    - Clientname   : Name des Clients, der angemeldet ist, wird vom aufruf übergeben
//                                 - Netz            : Handle des PCAN-Netzes Nummer des Netzes : definiert in CanApi2
//                                  - Netzname      : Name des Netzes,wo sich angemeldet werden soll
//                                 - Hardware      : angeschlossene Hardware
//                                 - Baudrate      : einstellen der Übertragungsrate
//
// Rückgabewert :            - Client         : Gibt den Client zurück
//******************************************************************************
procedure Initalisierung_CANController(Netz : HCANNet ; Hardware : HCANHw ;
    Baudrate : Integer ; Netzname : String ; Clientname : String ; var Client : HCANClient);
Das funktioniert aber so nicht. Hab zunächst einen Fehler in der Klassendeklaration. Wie muss ich das schreiben, dass die Prozedur auch in dem Hauptprogramm erkannt wird?? Irgendwas mit external????

Im Hauptprogrmm hab ich schon die Unit eingebunden und es Funktioniert auch.

Vielen Dank für eure Hilfe

Steve 29. Apr 2005 11:27

Re: Unitis, external Proceduren deklarieren, oder wie auch i
 
Hi,

ein paar Fragen:

Soll Initalisierung_CANController eine Methode von CAN_Controller sein?
-> Wenn ja, muss das Semikolon nach CAN_Controller = CLASS(..) weg. Und vor Initalisierung_CANController gehört im implementaion-Teil dann noch der Klassenname.
-> Wenn nein, was tun dann private und public da? (soll heißen, die müssen da weg :mrgreen: )

Zitat:

Hab zunächst einen Fehler in der Klassendeklaration.
Welchen Fehler?

Zitat:

...dass die Prozedur auch in dem Hauptprogramm erkannt wird?? ...
Im Hauptprogrmm hab ich schon die Unit eingebunden und es Funktioniert auch.
??? Funktionierts nun im 'Hauptprogramm' oder nicht? :gruebel:


Gruß
Stephan :dance:

Osse 29. Apr 2005 11:39

Re: Unitis, external Proceduren deklarieren, oder wie auch i
 
Also, die procedure soll eine Methode der Klasse sein.

Sieht jetzt so aus und das müsste auch richtig sein.

Delphi-Quellcode:
type
//allgemeine Controlerbezeichnung
   TController = CLASS
       m_hClient: HCANClient;     // Typ 'Client-Handle' Byte Variable aus Unit CANAPI2 eigentlich eine Byte Variable
      m_hNet : HCANNet;        // Typ 'Net-Handle' Byte Variable aus Unit CANAPI2 eigentlich eine Byte Variable
    m_hHardware : HCANHw;    // Typ 'Hardware-Handle' Byte Variable aus Unit CANAPI2 eigentlich eine Byte Variable
   END ;

  CAN_Controller = CLASS(TController)
      procedure Initalisierung_CANController(Netz : HCANNet ; Hardware : HCANHw ;
    Baudrate : Integer ; Netzname : String ; Clientname : String ; var Client : HCANClient);

end;

implementation
wenn ich das so schreibe, dann bekomme ich wieder die Fehlermeldung:
Delphi-Quellcode:
[Fehler] Controller.pas(35): Ungenügende Forward- oder External-Deklaration: 'CAN_Controller.Initalisierung_CANController'
Hab mich eben ein bissel blöd ausgedrückt, mit :
Zitat:

Im Hauptprogrmm hab ich schon die Unit eingebunden und es Funktioniert auch.
Ich hab die Unit in mein Hauptprogramm eingebunden, kann aber die Procedure nicht aufrufen.

Wie geht der Funktionsaufruf??

Was muss ich alles in der Main deklarieren??

Steve 29. Apr 2005 11:50

Re: Unitis, external Proceduren deklarieren, oder wie auch i
 
Hi,

hast Du im implentation-Teil den Klassennamen vor den Methodennamen geschrieben?
Delphi-Quellcode:
interface
  ...
  CAN_Controller = ...
    procedure Initialisierung_...
...
implementation
...
procedure CAN_Constroller.Initalisierung_CANController(Netz : HCANNet ; Hardware : HCANHw ;
    Baudrate : Integer ; Netzname : String ; Clientname : String ; var Client : HCANClient);
(Man beachte das "CAN_Controller." :stupid: )

In der aufrufenden Unit musst Du die aufzurufende Unit einbinden (hast ja schon gemacht), dann kannste ein Objekt Deiner Klasse erzeugen und auf dieses wie gewohnt zugreifen (durch das Einbinden in die uses ist in der aufrufenden unit der interface-Teil der aufzurufenden unit bekannt, somit auch CAN_Controller und deren veröffentlichten Methoden, Ereignisse und Eigenschaften ;) ):
Delphi-Quellcode:
...
var
  myCanCtrl : CAN_Controller;
begin
  myCanCtrl := CAN_Controller.Create();
  myCanCtrl.InitialisierungCanController(...);
  ...
end;
PS: Vor dem Klassennamen schreibt man gewöhnlich ein T --> also TCAN_Controller :zwinker:

Gruß
Stephan :dance:

Osse 29. Apr 2005 12:20

Re: Unitis, external Proceduren deklarieren, oder wie auch i
 
Jo Super, Funktioniert :hello:

Vielen Dank :hi:

Für alle anderen, die auch mal ein Problem damit haben sollten.
Delphi-Quellcode:
Unit main.pas

public
   CAN_Controller : TCAN_Controller;         // Can Controller einstellungen und eingenschaften,
                                // Klasse deklariert in der Controller.pas

....

//Funktionsaufruf
CAN_Controller.Initalisierung_CANController( 5 , m_hHardware, CAN_BAUD_500K , 'Testnet' , 'Oliver' , m_hClient );
In der Anderen Unit:
Delphi-Quellcode:

unit Controller;

interface

uses
  Windows,WinTypes, Winprocs, Messages, SysUtils, Classes, Graphics, Controls,
  Forms, Dialogs, StdCtrls, CanApi2, ExtCtrls, ComCtrls, Menus, SyncObjs, Grids;

type
//allgemeine Controlerbezeichnung
   TController = CLASS
       m_hClient: HCANClient;     // Typ 'Client-Handle' Byte Variable aus Unit CANAPI2 eigentlich eine Byte Variable
      m_hNet : HCANNet;        // Typ 'Net-Handle' Byte Variable aus Unit CANAPI2 eigentlich eine Byte Variable
    m_hHardware : HCANHw;    // Typ 'Hardware-Handle' Byte Variable aus Unit CANAPI2 eigentlich eine Byte Variable
   END ;

  TCAN_Controller = CLASS(TController)
         procedure Initalisierung_CANController(Netz : HCANNet ; Hardware : HCANHw ;
      Baudrate : Integer ; Netzname : String ; Clientname : String ; var Client : HCANClient);
    end;


implementation

procedure TCAN_Controller.Initalisierung_CANController(Netz : HCANNet ; Hardware : HCANHw ;
    Baudrate : Integer ; Netzname : String ; Clientname : String ; var Client : HCANClient);
Nochmal vielen Dank an alle :hi:


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:49 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