![]() |
Moin Mathias,
bei mir sieht die OPENFILENAME Struktur so aus
Delphi-Quellcode:
die erforderlichen Konstanten so
type
PcsOPENFILENAME = ^TcsOPENFILENAME; TcsOPENFILENAME = packed record lStructSize : DWORD; hwndOwner : HWND; hInstance : DWORD; lpstrFilter : PChar; lpstrCustomFilter : PChar; nMaxCustFilter : DWORD; nFilterIndex : DWORD; lpstrFile : PChar; nMaxFile : DWORD; lpstrFileTitle : PChar; nMaxFileTitle : DWORD; lpstrInitialDir : PChar; lpstrTitle : PChar; Flags : DWORD; nFileOffset : WORD; nFileExtension : WORD; lpstrDefExt : PChar; lCustData : lParam; lpfnHook : PcsOFNHookProc; lpTemplateName : PChar; pvReserved : Pointer; dwReserved : DWORD; FlagsEx : DWORD; end;
Delphi-Quellcode:
und die Funktionsdeklarationen so
const // aus COMMDLG.H
OFN_READONLY = $00000001; OFN_OVERWRITEPROMPT = $00000002; OFN_HIDEREADONLY = $00000004; OFN_NOCHANGEDIR = $00000008; OFN_SHOWHELP = $00000010; OFN_ENABLEHOOK = $00000020; OFN_ENABLETEMPLATE = $00000040; OFN_ENABLETEMPLATEHANDLE = $00000080; OFN_NOVALIDATE = $00000100; OFN_ALLOWMULTISELECT = $00000200; OFN_EXTENSIONDIFFERENT = $00000400; OFN_PATHMUSTEXIST = $00000800; OFN_FILEMUSTEXIST = $00001000; OFN_CREATEPROMPT = $00002000; OFN_SHAREAWARE = $00004000; OFN_NOREADONLYRETURN = $00008000; OFN_NOTESTFILECREATE = $00010000; OFN_NONETWORKBUTTON = $00020000; OFN_NOLONGNAMES = $00040000; OFN_EXPLORER = $00080000; OFN_NODEREFERENCELINKS = $00100000; OFN_LONGNAMES = $00200000; OFN_ENABLEINCLUDENOTIFY = $00400000; OFN_ENABLESIZING = $00800000; OFN_DONTADDTORECENT = $02000000; OFN_FORCESHOWHIDDEN = $10000000; OFN_EX_NOPLACESBAR = $00000001;
Delphi-Quellcode:
Das alles auch mal, falls jemand darin noch einen Fehler entdecken kann, denn ausserhalb der Kompo, nur unter Verwendung dieser Deklarationen funktioniert's ja auch nicht :?
function GetOpenFileNameA(const lpofn : PcsOPENFILENAME) : Boolean; stdcall; external 'comdlg32.dll';
function GetSaveFileNameA(const lpofn : PcsOPENFILENAME) : Boolean; stdcall; external 'comdlg32.dll'; function GetOpenFileNamePreviewA(const lpofn : PcsOPENFILENAME) : Boolean; stdcall; external 'msvfw32.dll'; function GetSaveFileNamePreviewA(const lpofn : PcsOPENFILENAME) : Boolean; stdcall; external 'msvfw32.dll'; |
Also, ich bin auch irgendwie nicht auf den rechten Weg gekommen. Ich habe das Gefühl, diese Preview-Dialogbox liegt nur in dem "alten" Stil vor. Sobald man ein (in dem Fall) unpassendes Flag benutzt, wird wohl automatisch zum bekannten Öffnen/Speichern-Dialog umgeschaltet.
Und das PSDK schweigt sich über das Design wohl auch aus; zumindest habe ich bisher noch nichts gefunden, was diese Frage klären würde. Und noch mal kurz zur Aussage, dass "TOpenFileName" unter NT eine andere Größe hat. Unter allen älteren Versionen ist das so. Wie ist das bei ME; gibt´s da die Placesbar auch schon eingebaut im System? Zumindest bei Win98 ist es nötig, die alte Größe zu initialisieren, sonst wird der Dialog gar nicht erst aufgerufen:
Code:
Ich wollte nur darauf hinweisen, auch wenn ich davon ausgehe, dass du es sowieso berücksichtigt hättest, Christian. In dem Zusammenhang fiel mir nämlich das TNA-Icon ein. Da war´s egal, und man konnte die erweiterte Struktur von Win 2000 und XP auch unter 98 initialisieren. Natürlich wurde nur benutzt, was vom OS bereitgestellt wurde, aber zumindest erschien das Icon.
if(Win2k) then ofn.lStructSize := SizeOf(TOpenFileName)
else ofn.lStructSize := OPENFILENAME_SIZE_VERSION_400; Hier -bei den Dialogen!- passiert nichts, wenn du eine falsche Größe angibst, mit der das OS nichts anfangen kann. Will sagen: der Dialog erscheint gar nicht erst. (Win98 getestet!) |
Moin Mathias,
lass Dir doch mal bei nicht Erscheinen (if not Get...) den CommDlgExtendedError mal anzeigen. Ich bin nämlich gestern noch unter W2K darüber gestolpert, dass mir ein simples Beispiel immer den Fehler 3002 (ungültiger Dateiname) brachte statt den Dialog aufzurufen. Da der übergebene Dateiname einfach ein leerer Buffer war, konnte das nur nicht so ganz angehen. Als ich dann mal im Single Step da durchgegangen bin, um mir die Werte der Struktur anzusehen, wurde der Dialog aufgerufen :shock: Als nächstes habe ich dann einfach mal versucht die Funktion dynamisch zu importieren und nicht statisch: Gleicher Fehler. Als ich dann statt der ANSI Version die UNICODE Version benutzt habe gings (dann müssen natürlich auch die PChar in der Struktur angepasst werden). Das einzige was an Test noch aussteht: Bei der ANSI Version hatte ich den Filenamebuffer auf MAX_PATH initialisiert. Ich werd's nochmal mit MAX_PATH+1 versuchen. Fazit: Ich werde wohl die Funktionen dynamisch importieren müssen, und dann, abhängig vom OS die ANSI (9x/ME) oder die UNICODE (NTff) Variante verwenden müssen. :? Ob der Fehler auch bei den "normalen" Dateidialogen auftritt weiss ich noch nicht, aber um die Kompo nicht unnötig aufwändig zu machen (bislang eine Basiskompo für alle vier Dialoge) werde ich die Änderung beim Aufruf auch bei diesen machen. BTW: Ich hatte über das CPU Fenster schon mal nachgeschaut, von wo der Dialog gestartet wird: Es war die msvfw32.dll. Aber ich werd's nochmal genauer verfolgen. Ausserdem habe ich auch schon Screenshots eines New Style Preview Dialoges im Internet gefunden. Wenn die nicht gefakt waren, müsste es wohl doch irgendwie gehen. |
Zeig doch mal ein paar Screenshots. Ich will endlich mal sehen, wo von ihr redet. :?
|
Zitat:
Das Problem hatte ich auch schon mal und es lag daran, dass der leere Puffer als erstes Zeichen ein Nullbyte haben muss. Vielleicht hast du das vergessen? ;c) Dazu würde passen, dass im Debugmodus die Variable korrekt initialisiert wird (wenn das in Delphi so ist (c; ). |
Moin Oregon Ghost,
ich bin ja wohl so .... :oops: :oops: Das der Speicher mit einem Nullbyte anfangen muss war mir zwar schon klar, aber.... aus irgendeinem Grunde hatte es sich bei mir festgesetzt, das StrAlloc den Speicher auf null initialisiert, was ja gar nicht der Fall ist :oops: :oops: Bei der Wide Version hab' ich ihn dann mit AllocMem reserviert... das initialisiert auf 0.... :? DANKE!!! BTW: Womit sich das eigentliche Problem allerdings leider immer noch nicht gelöst hat ;-) |
Moin Luckie,
wenn Du's mal sehen möchtest, kannst Du das hier mal laufen lassen (die Deklarationen stehen ja weiter oben, uses Commdlg nicht vergessen):
Delphi-Quellcode:
Wenn Du jetzt OFN_EXPLORER mal durch 0 ersetzt und dann, sobald der Dialog da ist, auf eine AVI Datei klickst, siehst Du im Old Style Dialog das, was im anderen auch da sein müsste.
procedure TfrmMAIN.Button1Click(Sender: TObject);
var ofnStruct : TcsOPENFILENAME; sError : string; begin FillChar(ofnStruct,SizeOf(TcsOPENFILENAME),0); ofnStruct.lStructSize := SizeOf(TcsOPENFILENAME); ofnStruct.lpstrFilter := PChar('AVI'#00'*.avi'#00#00); ofnStruct.lpstrFile := AllocMem(MAX_PATH+1); ofnStruct.nMaxFile := MAX_PATH; ofnStruct.Flags := OFN_EXPLORER; ofnStruct.FlagsEx := OFN_EX_NOPLACESBAR; try if not GetOpenFileNamePreviewA(@ofnStruct) then begin sError := IntToHex(CommDlgExtendedError,8); if sError <> '00000000' then begin ShowMessage(sError); end; end; finally FreeMem(ofnStruct.lpstrFile,MAX_PATH+1); end; end; |
Mal so rum gefragt, Christian:
Ist dir unter Win 2k oder XP schon eine Anwendung begegnet, die den neuen Dialogstil + Vorschau benutzt? Ich hätte z.B. auf den MediaPlayer getippt, bin aber eines besseren belehrt worden. Aber die Screenshots, die du angesprochen hast, würde ich gern mal sehen. Weißt du die Seite noch, auf der sie waren? |
Moin Mathias,
nein, mir ist, wissentlich, noch keine Anwendung untergekommen, bei der ich das gesehen hätte, die Idee diesen Dialog mit zu Benutzen kam mir aber auch erst als ich sie im PSDK sah. Ich hab' jetzt nochmal bei Hotbot gesucht (da hatte ich den Screenshot her) ![]() Ziemlich in der Mitte ist dann ein Link zum Screenshot: ![]() Das ist kein Old-Style Dialog :? Ich hab' mir jetzt auch mal alle Dialogresourcen aus der comdlg32.dll und ocx, shell32.dll, msvfw32.dll, mmsys.cpl angesehen. Nirgendes auch nur einer der beiden Dialoge mit Preview zu sehen. Die Comdlg32.dll enthält die hingegen alle Dialogresourcen ohne :shock: Ich kann also, zumindest so ohne weiteres, nichts finden, wo auch nur der Old-Style Dialog mit Preview herkommt. |
Hi Christian.
Frag nicht warum, aber wenn ich das Beispiel von der URL nachvollziehe, die du angegeben hast, dann funktioniert es. Das Original fix in Delphi nachgebaut (mal ohne dynamischen Schnickschnack, usw.):
Delphi-Quellcode:
Ergebnis: der Dialog hat den neuen Stil, und zeigt bei der Auswahl einer AVI rechts die Preview an. Getestet habe ich´s mit D5-Pro unter Win98.
uses
CommDlg; function GetOpenFileNamePreview(var OpenFile: TOpenFileNameA): Bool; stdcall; external 'msvfw32.dll' name 'GetOpenFileNamePreviewA'; procedure TForm1.Button1Click(Sender: TObject); var ofn : TOpenFileName; begin ZeroMemory(@ofn,sizeof(TOpenFileName)); ofn.lStructSize := sizeof(ofn); ofn.lpstrFilter := 'AVIs'#0'*.avi'#0#0; GetOpenFileNamePreview(ofn); end; Gruß, Mathias. PS: Unter WinXP wird bei obigem Code nur der alte Stil angezeigt. Wie das unter Win 2000 ist, weiß ich nicht. Aber wäre es nicht möglich, dass Microsoft diesen Dialog dort nur im alten Stil untergebracht hat? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:44 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