AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Fehlermeldung: Inkomp. Typen: 'TFNBFFCallBack' und 'Pointer
Thema durchsuchen
Ansicht
Themen-Optionen

Fehlermeldung: Inkomp. Typen: 'TFNBFFCallBack' und 'Pointer

Ein Thema von Garfield · begonnen am 26. Mär 2005 · letzter Beitrag vom 26. Mär 2005
Antwort Antwort
Benutzerbild von Garfield
Garfield

Registriert seit: 9. Jul 2004
Ort: Aken (Anhalt-Bitterfeld)
1.335 Beiträge
 
Delphi XE5 Professional
 
#1

Fehlermeldung: Inkomp. Typen: 'TFNBFFCallBack' und 'Pointer

  Alt 26. Mär 2005, 10:36
Aus dem Swiss Delphi Center habe ich die Routine:

Delphi-Quellcode:
function AdvSelectDirectory (const Caption : string;
                             const Root : WideString;
                             var StartDir : string;
                             var Directory : string;
                             EditBox : Boolean = False;
                             ShowFiles : Boolean = False;
                             AllowCreateDirs : Boolean = True): Boolean;
  {
    Callback-Funktion, die aufgerufen wird, wenn der Dialog initialisiert oder
    ein neues Verzeichnis selektiert wurde
  }

  function SelectDirCB (Wnd: HWND;
                             uMsg: UINT;
                             lParam, lpData: lParam): Integer; stdcall;

  var
    PathName: array [0..MAX_PATH] of Char;
  begin
    case uMsg of
      BFFM_INITIALIZED: SendMessage(Wnd, BFFM_SETSELECTION, Ord(True), Integer(lpData));
      {
        binde den folgenden Kommentar in deinen Code ein, wenn du auf das Ereignis
        reagieren willst, das aufgerufen wird, wenn ein neues Verzeichnis selektiert wurde
      }

      BFFM_SELCHANGED: SHGetPathFromIDList(PItemIDList(lParam), @PathName);
      {
        das Verzeichnis "PathName" wurde selektiert
      }

    end;
    Result := 0;
  end;

var
  WindowList: Pointer;
  BrowseInfo: TBrowseInfo;
  Buffer: PChar;
  RootItemIDList, ItemIDList: PItemIDList;
  ShellMalloc: IMalloc;
  IDesktopFolder: IShellFolder;
  Eaten, Flags: LongWord;

const
  {
    notwendig für einige der zusätzlichen Erweiterungen
  }

  BIF_USENEWUI = $0040;
  BIF_NOCREATEDIRS = $0200;

begin
  Result := False;
  if not DirectoryExists(Directory)
  then Directory := '';
  FillChar(BrowseInfo, SizeOf(BrowseInfo), 0);
  if (ShGetMalloc(ShellMalloc) = S_OK) and (ShellMalloc <> nil)
  then begin
    Buffer := ShellMalloc.Alloc(MAX_PATH);
    try
      RootItemIDList := nil;
      if Root <> ''
      then begin
        SHGetDesktopFolder(IDesktopFolder);
        IDesktopFolder.ParseDisplayName(Application.Handle,
                                        nil,
                                        POleStr(Root),
                                        Eaten,
                                        RootItemIDList,
                                        Flags);
      end;
      OleInitialize(nil);
      with BrowseInfo
      do begin
        hwndOwner := Application.Handle;
        pidlRoot := RootItemIDList;
        pszDisplayName := Buffer;
        lpszTitle := PChar(Caption);
        {
          legt fest, wie der Dialog erscheint:
        }

        ulFlags := $25
                or BIF_RETURNONLYFSDIRS
                or BIF_USENEWUI
                or BIF_EDITBOX * Ord(EditBox)
                or BIF_BROWSEINCLUDEFILES * Ord(ShowFiles)
                or BIF_NOCREATEDIRS * Ord(not AllowCreateDirs);
        lpfn := @SelectDirCB;
        lParam := Integer(PChar(StartDir));
      end;
      WindowList := DisableTaskWindows(0);
      try
        ItemIDList := ShBrowseForFolder(BrowseInfo);
      finally
        EnableTaskWindows(WindowList);
      end;
      Result := ItemIDList <> nil;
      if Result
      then begin
        ShGetPathFromIDList(ItemIDList, Buffer);
        ShellMalloc.Free(ItemIDList);
        Directory := Buffer;
      end;
    finally
      ShellMalloc.Free(Buffer);
    end;
  end;
end;
In meinem Testprogramm funktioniert es mit Delphi 7 Personal auch. Wenn ich es jedoch in mein Programm einbaue, bekomme ich bei Zeile 85

        lpfn := @SelectDirCB; die Fehlermeldung: Inkompatible Typen: 'TFNBFFCallBack' und 'Pointer'. Nehme ich das @ heraus, lautet die Fehlermeldung: Lokale Prozedur/Funktion 'BrowserCallBack' wurde Procedurenvariable zugewiesen.

In den Uses der Unit stehen:

Windows, SysUtils, Forms, ShellAPI, Graphics, Controls, Dialogs, Classes, Registry, ShlObj, ActiveX;

Und eine Unit mit den Uses:

Windows, SysUtils, Forms, FileCtrl, Messages, Graphics, MMSystem, StdCtrls, ExtCtrls, Classes, Controls, Dialogs, Gauges, Grids, MPlayer, ComCtrls, Buttons;

und ein paar eigene Units.

Die Sache ist nun, wenn ich die Zeile auskommentiere, wird nicht der angegebene Startordner sondern Eigene Dateien aufgeschlagen. Hat jemand eine Idee, woran das liegen könnte oder kennt eine Alternative für diese Dialogbox?
Angehängte Dateien
Dateityp: rar ordner__ffnen_743.rar (3,5 KB, 5x aufgerufen)
Gruss Garfield
Ubuntu 22.04: Laz2.2.2/FPC3.2.2 - VirtBox6.1+W10: D7PE, DXE5Prof
  Mit Zitat antworten Zitat
Benutzerbild von md_mse
md_mse

Registriert seit: 13. Aug 2003
Ort: Berlin
95 Beiträge
 
#2

Re: Fehlermeldung: Inkomp. Typen: 'TFNBFFCallBack' und 'Poin

  Alt 26. Mär 2005, 10:52
Warum nimmst du nicht einfach SelectDirectory aus FileCtrl?

Dürfte eingentlich das gleiche sein, nur ohne Fehler
  Mit Zitat antworten Zitat
Benutzerbild von Garfield
Garfield

Registriert seit: 9. Jul 2004
Ort: Aken (Anhalt-Bitterfeld)
1.335 Beiträge
 
Delphi XE5 Professional
 
#3

Re: Fehlermeldung: Inkomp. Typen: 'TFNBFFCallBack' und 'Poin

  Alt 26. Mär 2005, 12:22
Das mache ich im Moment. Aus ästhetischen Gründen würde ich lieber die oben genannte Routine benutzen.
Gruss Garfield
Ubuntu 22.04: Laz2.2.2/FPC3.2.2 - VirtBox6.1+W10: D7PE, DXE5Prof
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: Fehlermeldung: Inkomp. Typen: 'TFNBFFCallBack' und 'Poin

  Alt 26. Mär 2005, 12:42
Moin Garfield,

hast Du es schon mal so probiert?

lpfn := TFNBFFCallBack(@SelectDirCB);
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von Garfield
Garfield

Registriert seit: 9. Jul 2004
Ort: Aken (Anhalt-Bitterfeld)
1.335 Beiträge
 
Delphi XE5 Professional
 
#5

Re: Fehlermeldung: Inkomp. Typen: 'TFNBFFCallBack' und 'Poin

  Alt 26. Mär 2005, 13:47
Moin Chris,

nein, auf die Idee bin ich, da es im Beispiel funktioniert hatte, gar nicht gekommen.

Es funktioniert! Danke.
Gruss Garfield
Ubuntu 22.04: Laz2.2.2/FPC3.2.2 - VirtBox6.1+W10: D7PE, DXE5Prof
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:16 Uhr.
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