Results 1 to 7 of 7

Thread: Procedures aanroepen in andere units

  1. #1

    Procedures aanroepen in andere units

    Sinds enige tijd weer terug op het Delphi nest. Maar er gaat iets niet wat vroeger wel makkelijk ging:
    Ik heb een MainForm in Unit1.pas, en een MenuForm in Unit2.pas. In Unit1 staan een hoop functies en procedures gecodeerd waarvan ik er een paar in Unit2 wil aanroepen.

    Code:
    implementation
    
    {$R *.dfm}
    
    uses Unit1;
    
    procedure TItemForm.Button1Click(Sender: TObject);
    begin
      MainForm.CreateDatabase;
    end;
    Dit is code in MenuForm, Unit2.pas. Compiled niet want [dcc32 Error] Unit2.pas(37): E2003 Undeclared identifier: 'CreateDatabase'. Maar CreateDatabase in een simpele procedure in Unit1.pas in de sectie 'Implementation'. Volgens mij moet dat toch voldoende zijn om hem te vinden? Blijkbaar niet?
    Verwarrend.


    Sander

  2. #2
    Wat is Mainform dan? Je roept nu een method aan van het Mainform object.

    Als CreateDatabase een losse, simpele procedure is, dan kan je gewoon `CreateDatabase;` aanroepen. Die procedure moet dan wel in de interface van Unit1 staan vermeld. Alles wat alleen onder implementation staat, kan alleen binnen Unit1 gebruikt worden.

    Als CreateDatabase een procedure van je mainform is, dan zou je wellicht Mainform.CreateDatabase gebruiken, Mainform zou dan een (globale?) variabele zijn die naar je TMainform instantie wijst, en CreateDatabase moet in het public deel van het form zijn gedeclareerd.
    1+1=b

  3. #3
    Quote Originally Posted by GolezTrol View Post
    Wat is Mainform dan? Je roept nu een method aan van het Mainform object.

    Als CreateDatabase een losse, simpele procedure is, dan kan je gewoon `CreateDatabase;` aanroepen. Die procedure moet dan wel in de interface van Unit1 staan vermeld. Alles wat alleen onder implementation staat, kan alleen binnen Unit1 gebruikt worden.

    Als CreateDatabase een procedure van je mainform is, dan zou je wellicht Mainform.CreateDatabase gebruiken, Mainform zou dan een (globale?) variabele zijn die naar je TMainform instantie wijst, en CreateDatabase moet in het public deel van het form zijn gedeclareerd.
    Ik kan 'Procedure CreateDatabase;' nergens neerzetten. Ik krijg in Unit1 (MainForm) overal een 'Unsatisfied forward declaration', of ik hem nou in public declareer of in interface

  4. #4
    Tja, dan staat er toch iets verkeerd in die unit. Beetje lastig raden wat precies. Kan je 'm delen? Eventueel met de code in de procedures eruit geknipt als dat veel is.

    Je zou zoiets moeten hebben voor een simpele proc:

    Delphi Code:
    1. unit Unit1;
    2.  
    3. uses Forms;
    4.  
    5. type
    6.   TMainForm = class(TForm)
    7.   end;
    8.  
    9. var
    10.   MainForm: TMainForm;
    11.  
    12. procedure CreateDataBase;
    13.  
    14. implementation
    15.  
    16. {$R *.dfm}
    17.  
    18. procedure CreateDatabase;
    19. begin
    20.   // Implementatie
    21. end;
    22.  
    23. end.


    Of als method, maar dan roep je het aan met Mainform.CreateDatabase:

    Delphi Code:
    1. unit Unit1;
    2.  
    3. uses Forms;
    4.  
    5. type
    6.   TMainForm = class(TForm)
    7.     procedure CreateDataBase;
    8.   end;
    9.  
    10. var
    11.   MainForm: TMainForm;
    12.  
    13.  
    14. implementation
    15.  
    16. {$R *.dfm}
    17.  
    18. procedure TMainForm.CreateDatabase;
    19. begin
    20.   // Implementatie
    21. end;
    22.  
    23. end.
    Last edited by GolezTrol; 20-Dec-22 at 17:57.
    1+1=b

  5. #5
    Dank voor je moeite! Hier code, het meeste is eruit, CreateDatabase staat onderaan.

    Code:
    unit Unit1;
    
    interface
    
    uses
      Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
      Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls, Vcl.StdCtrls, Vcl.ComCtrls,
      Vcl.ToolWin, System.ImageList, Vcl.ImgList, Vcl.Menus, System.Actions,
      Vcl.ActnList, Vcl.PlatformDefaultStyleActnCtrls, Vcl.ActnMan, Vcl.ActnCtrls, ShellAPI,
      Vcl.StdActns, Vcl.ExtActns, rImprovedComps, rDBComponents, Vcl.DBCtrls,
      Data.DB, Vcl.Grids, Vcl.DBGrids, ABSMain, System.Win.registry, Winapi.shlobj, System.IOUtils,
      PropSaveMain, RosiCompGlobalCfg;
    
    type
      TMainForm = class(TForm)
        Splitter2: TSplitter;
        Panel1: TPanel;
        Splitter1: TSplitter;
        TreeviewImageList: TImageList;
        MemoEditImageList: TImageList;
        ListviewImageList: TImageList;
        TreeviewPopUp: TPopupMenu;
        Nieuwsubitem1: TMenuItem;
        Nieuwhoofditemonder1: TMenuItem;
        N1: TMenuItem;
        MainToolbarImageList: TImageList;
        SmallFileTypeImageList: TImageList;
        LargeFileTypeImageList: TImageList;
        AttachmentPopUp: TPopupMenu;
        MenuItem1: TMenuItem;
        MenuItem2: TMenuItem;
        MenuItem3: TMenuItem;
        MenuItem4: TMenuItem;
        Attachmentverwijderen1: TMenuItem;
        Attachmentverwijderen2: TMenuItem;
        FileOpenDialog: TOpenDialog;
        Panel2: TPanel;
        MemoEditToolBarActionManager: TActionManager;
        EditCut1: TEditCut;
        EditCopy1: TEditCopy;
        EditPaste1: TEditPaste;
        EditSelectAll1: TEditSelectAll;
        EditUndo1: TEditUndo;
        EditDelete1: TEditDelete;
        FormatRichEditBold1: TRichEditBold;
        FormatRichEditItalic1: TRichEditItalic;
        FormatRichEditUnderline1: TRichEditUnderline;
        FormatRichEditStrikeOut1: TRichEditStrikeOut;
        FormatRichEditBullets1: TRichEditBullets;
        FormatRichEditAlignLeft1: TRichEditAlignLeft;
        FormatRichEditAlignRight1: TRichEditAlignRight;
        FormatRichEditAlignCenter1: TRichEditAlignCenter;
        DialogOpenPicture1: TOpenPicture;
        DialogSavePicture1: TSavePicture;
        DialogColorSelect1: TColorSelect;
        DialogFontEdit1: TFontEdit;
        DialogPrintDlg1: TPrintDlg;
        ActionToolBar1: TActionToolBar;
        AttachmentToolBarActionManager: TActionManager;
        AttachmentToolBarImageList: TImageList;
        AddAttachment: TAction;
        DeleteAttachment: TAction;
        AttachmentActionToolbar: TActionToolBar;
        MemoEdit: TrRichEdit;
        Action3: TAction;
        Action4: TAction;
        Action5: TAction;
        Action6: TAction;
        N2: TMenuItem;
        Kleineiconen1: TMenuItem;
        Grotreiconen1: TMenuItem;
        Lijst1: TMenuItem;
        Lijst2: TMenuItem;
        rStatusBar1: TrStatusBar;
        TreeviewActionManager: TActionManager;
        NodeAbove: TAction;
        NodeUnder: TAction;
        NodeChild: TAction;
        Action7: TAction;
        Panel3: TPanel;
        Wijzigitem1: TMenuItem;
        EditAttachment: TAction;
        Label2: TLabel;
        Header1: TAction;
        Header2: TAction;
        Header3: TAction;
        ActionList1: TActionList;
        Action1: TAction;
        FilePageControl: TPageControl;
        FilesTabSheet: TTabSheet;
        LinksTabSheet: TTabSheet;
        AttachmentListview: TListView;
        DBGrid1: TDBGrid;
        ToolBar1: TToolBar;
        ToolButton1: TToolButton;
        ToolButton2: TToolButton;
        ToolButton4: TToolButton;
        ToolButton5: TToolButton;
        ToolButton6: TToolButton;
        ToolButton3: TToolButton;
        ToolButton7: TToolButton;
        ToolButton8: TToolButton;
        StorageDB: TABSDatabase;
        ItemsTbl: TABSTable;
        MemoTbl: TABSTable;
        FilesTbl: TABSTable;
        TreeViewPageControl: TPageControl;
        TabSheet1: TTabSheet;
        TabSheet2: TTabSheet;
        TabSheet3: TTabSheet;
        MainMenu1: TMainMenu;
        Bestand1: TMenuItem;
        Bestand2: TMenuItem;
        Open1: TMenuItem;
        Laatstgebruikt1: TMenuItem;
        N3: TMenuItem;
        N4: TMenuItem;
        Opslaanals1: TMenuItem;
        N5: TMenuItem;
        N6: TMenuItem;
        N7: TMenuItem;
        N8: TMenuItem;
        Allessluiten1: TMenuItem;
        Allessluiten2: TMenuItem;
        Einde1: TMenuItem;
        ItemsTreeView: TTreeView;
        Bewerkewn1: TMenuItem;
        Organizeren1: TMenuItem;
        Organizeren2: TMenuItem;
        Zoeken1: TMenuItem;
        Zoeken2: TMenuItem;
        oevoegen1: TMenuItem;
        oevoegen2: TMenuItem;
        Downloaden1: TMenuItem;
        Downloaden2: TMenuItem;
        N9: TMenuItem;
        N10: TMenuItem;
        Linkse1: TMenuItem;
        oevoegen3: TMenuItem;
        oevoegen4: TMenuItem;
        Aanpassen1: TMenuItem;
        Aanpassen2: TMenuItem;
        Wissen1: TMenuItem;
        Wissen2: TMenuItem;
        DatabaseNewDialog: TSaveDialog;
        LinksTbl: TABSTable;
        Einde2: TMenuItem;
        Einde3: TMenuItem;
        DatabaseOpenDialog: TOpenDialog;
        Icon1: TMenuItem;
        ItemsTblITEM_NR: TAutoIncField;
        ItemsTblITEM_ID: TSmallintField;
        ItemsTblITEM_TEXT: TStringField;
        ItemsTblITEM_IMAGEID: TIntegerField;
        ItemsTblITEM_PARENTID: TIntegerField;
        FilesTblFILE_ID: TAutoIncField;
        FilesTblITEM_ID: TSmallintField;
        FilesTblFILE_NAAM: TStringField;
        FilesTblFILE_SIZE: TLargeintField;
        FilesTblFILE_DATE: TDateField;
        FilesTblFILE_INFO: TStringField;
        FilesTblFILE_BLOB: TBlobField;
        MemoTblMEMO_ID: TAutoIncField;
        MemoTblITEM_ID: TSmallintField;
        MemoTblMEMO_TEXT: TBlobField;
        LinksTblLINK_ID: TAutoIncField;
        LinksTblLINK_INFO: TStringField;
        LinksTblLINK_STRING: TStringField;
        LinksTblITEM_ID: TIntegerField;
        MemoFilesLinkQuery: TABSQuery;
        QueryDS: TDataSource;
        procedure WMDropFiles(var Msg: TWMDropFiles); message WM_DROPFILES;
        procedure Nieuwsubitem1Click(Sender: TObject);
        procedure Nieuwsubitem2Click(Sender: TObject);
        procedure VSListToolButtonClick(Sender: TObject);
        procedure VSIconSmallToolButtonClick(Sender: TObject);
        procedure VSIconLargeToolButtonClick(Sender: TObject);
        procedure VSIconDetailsToolButtonClick(Sender: TObject);
        procedure AttachmentListviewContextPopup(Sender: TObject; MousePos: TPoint;
          var Handled: Boolean);
        procedure FormCreate(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
        procedure Attachmentverwijderen2Click(Sender: TObject);
        procedure AttachmentListviewDragDrop(Sender, Source: TObject; X,
          Y: Integer);
        procedure DialogFontEdit1FontDialogApply(Sender: TObject; Wnd: HWND);
        procedure DialogPrintDlg1BeforeExecute(Sender: TObject);
        procedure ToolButton9Click(Sender: TObject);
        procedure ToolButton8Click(Sender: TObject);
        procedure Action3Execute(Sender: TObject);
        procedure Action6Execute(Sender: TObject);
        procedure Action4Execute(Sender: TObject);
        procedure Action5Execute(Sender: TObject);
        procedure DialogColorSelect1ColorDialogClose(Sender: TObject);
        procedure Wijzigitem1Click(Sender: TObject);
        procedure DeleteAttachmentExecute(Sender: TObject);
        procedure Action1Execute(Sender: TObject);
        procedure ToolButton1Click(Sender: TObject);
        procedure ToolButton2Click(Sender: TObject);
        procedure ToolButton6Click(Sender: TObject);
        procedure ToolButton4Click(Sender: TObject);
        procedure ToolButton3Click(Sender: TObject);
        procedure ItemsTreeViewDragOver(Sender, Source: TObject; X, Y: Integer;
          State: TDragState; var Accept: Boolean);
        procedure ItemsTreeViewDragDrop(Sender, Source: TObject; X, Y: Integer);
        procedure ItemsTreeViewEdited(Sender: TObject; Node: TTreeNode;
          var S: string);
        procedure ItemsTreeViewChanging(Sender: TObject; Node: TTreeNode;
          var AllowChange: Boolean);
        procedure Bestand2Click(Sender: TObject);
        procedure Open1Click(Sender: TObject);
        procedure ItemsTreeViewDblClick(Sender: TObject);
        procedure N4Click(Sender: TObject);
        procedure ItemsTreeViewClick(Sender: TObject);
    
      private
        { Private declarations }
       public
    
        IDCounter: Integer;
        CurrentNodeID: integer;
        PreviousNodeID: integer;
        CurrentDatabaseFileName: String;
        IsMemoDirty: boolean;
        LastUsedDatabases: TStrings;
        { Public declarations }
      end;
    
      type
        PMyRec = ^TMyRec;
    
        TMyRec = record
        ID: Integer;
        NodeCaption: String;
        ParentID: Integer;
        IconID: Integer;
      end;
    
    var
      MainForm: TMainForm;
    
    implementation
    
    {$R *.dfm}
    
    procedure UnregisterFileType(FileExt: String; OnlyForCurrentUser: boolean = true);
    var
      R: TRegistry;
    begin
      R := TRegistry.Create;
      try
        if OnlyForCurrentUser then
          R.RootKey := HKEY_CURRENT_USER
        else
          R.RootKey := HKEY_LOCAL_MACHINE;
    
        R.DeleteKey('\Software\Classes\.' + FileExt);
        R.DeleteKey('\Software\Classes\' + FileExt + 'File');
      finally
        R.Free;
      end;
      SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, 0, 0);
    end;
    
    
    procedure RegisterFileType(FileExt: String;  FileTypeDescription:
      String;  ICONResourceFileFullPath: String;  ApplicationFullPath: String;
      OnlyForCurrentUser: boolean = true);
    var
      R: TRegistry;
    begin
      R := TRegistry.Create;
      try
        if OnlyForCurrentUser then
          R.RootKey := HKEY_CURRENT_USER
        else
          R.RootKey := HKEY_LOCAL_MACHINE;
    
        if R.OpenKey('\Software\Classes\.' + FileExt, true) then begin
          R.WriteString('', FileExt + 'File');
          if R.OpenKey('\Software\Classes\' + FileExt + 'File', true) then begin
            R.WriteString('', FileTypeDescription);
            if R.OpenKey('\Software\Classes\' + FileExt + 'File\DefaultIcon', true) then
            begin
              R.WriteString('', ICONResourceFileFullPath);
              if R.OpenKey('\Software\Classes\' + FileExt + 'File\shell\open\command', true) then
              R.WriteString('', ApplicationFullPath + ' "%1"');
              end;
            end;
          end;
        finally
        R.Free;
      end;
      SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, 0, 0);
    end;
    
    function GetFileModDate(FileName: string): TDateTime;
    var
      F: TSearchRec;
    begin
      FindFirst(FileName, faAnyFile, F);
      // Result := F.TimeStamp
      // if you wanted a TDateTime, change the return type and use this line:
      Result := FileDateToDatetime(F.Time);
      FindClose(F);
    end;
    
    function GetFileSize(FileName: string): Integer;
    var
      F: TSearchRec;
    begin
      FindFirst(FileName, faAnyFile, F);
      Result := F.Size;
      // if you wanted a TDateTime, change the return type and use this line:
      // Result := FileDateToDatetime(F.Time);
      FindClose(F);
    end;
    
    Function CreateRootNode(TreeView: TTreeView; NodeText: String; ImageID: Integer;
      ID: Integer): TTreeNode;
    var
      Node: TTreeNode;
      MyRecPtr: PMyRec;
    begin
      New(MyRecPtr);
      MyRecPtr^.ID := ID;
      MyRecPtr^.ParentID := 0;
      MyRecPtr^.NodeCaption := NodeText;
      MyRecPtr^.IconID := ImageID;
      Node := TreeView.Items.AddObject(nil, NodeText, MyRecPtr);
      Node.ImageIndex := ImageID;
      MainForm.PreviousNodeID := MainForm.CurrentNodeID;
      MainForm.CurrentNodeID := MyRecPtr.ID;
    
      Exit(Node)
    end;
    
    Function CreateSubNode(TreeView: TTreeView; NodeText: String; ImageID: Integer;
      ID: Integer): TTreeNode;
    var
      Node: TTreeNode;
      SelectedNode: TTreeNode;
      MyRecPtr: PMyRec;
      NodeRecPtr: PMyRec;
    begin
      New(MyRecPtr);
      New(NodeRecPtr);
      MyRecPtr^.ID := ID;
      MyRecPtr^.IconID := ImageID;
      MyRecPtr^.NodeCaption := NodeText;
      SelectedNode := TreeView.Selected;
      if SelectedNode <> NIL then
      begin
        NodeRecPtr := SelectedNode.Data;
        MyRecPtr^.ParentID := NodeRecPtr.ID;
        Node := TreeView.Items.AddChildObject(TreeView.Selected, NodeText,
          MyRecPtr);
        Node.ImageIndex := ImageID;
      end;
      Exit(Node);
    end;
    
    Procedure OpenDatabase(Database: TABSDatabase);
    begin
      try
        Database.Open;
        if MainForm.TreeViewPageControl.ActivePage.Caption = 'Default' then
            MainForm.TreeViewPageControl.ActivePage.Caption := ExtractFileName(Database.DatabaseFileName);
        MainForm.CurrentDatabaseFileName := Database.DatabaseFileName
    
      except
        on e: Exception do
          MessageDlg(e.Message, mtError, [mbOK], 0);
      end;
    end;
    
    Procedure CreateDatabase(Test: String);
    begin
      if MainForm.DatabaseNewDialog.Execute then
      begin
        MainForm.StorageDB.Close;
        MainForm.StorageDB.DatabaseFileName := MainForm.DatabaseNewDialog.FileName;
        MainForm.StorageDB.CreateDatabase;
        CopyTables();
        OpenDatabase(MainForm.StorageDB);
        ShowMessage('Storage database '+ MainForm.DatabaseNewDialog.FileName + ' is aangemaakt en geopend')
      end;
    
    end;

  6. #6
    Een losse procedure, inderdaad.

    Om die procedure buiten Unit1 te kunnen gebruiken, moet je de signatuur ervan kopieren naar de Interface-sectie. Dwz, alles tot en met de `;`:

    Delphi Code:
    1. Procedure CreateDatabase(Test: String);

    De parameterlijst, (Test: String), moet er in de Interface bij staan.
    In Implementation is hij optioneel, maar het is doorgaans wel handig om het daar ook te hebben.
    1+1=b

  7. #7
    OK dankjewel voor je moeite!

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •