AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi GetOpenFileNamePreview - unerwartetes Verhalten
Thema durchsuchen
Ansicht
Themen-Optionen

GetOpenFileNamePreview - unerwartetes Verhalten

Ein Thema von Christian Seehase · begonnen am 11. Dez 2002 · letzter Beitrag vom 14. Dez 2002
Antwort Antwort
Seite 2 von 3     12 3      
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.117 Beiträge
 
Delphi 11 Alexandria
 
#11
  Alt 11. Dez 2002, 23:30
Moin Mathias,

bei mir sieht die OPENFILENAME Struktur so aus

Delphi-Quellcode:
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;
die erforderlichen Konstanten so

Delphi-Quellcode:
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;
und die Funktionsdeklarationen so

Delphi-Quellcode:
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';
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
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
MathiasSimmack
(Gast)

n/a Beiträge
 
#12
  Alt 12. Dez 2002, 09:50
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:
if(Win2k) then ofn.lStructSize := SizeOf(TOpenFileName)
  else ofn.lStructSize := OPENFILENAME_SIZE_VERSION_400;
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.

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!)
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.117 Beiträge
 
Delphi 11 Alexandria
 
#13
  Alt 12. Dez 2002, 12:40
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
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.
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 Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#14
  Alt 12. Dez 2002, 12:54
Zeig doch mal ein paar Screenshots. Ich will endlich mal sehen, wo von ihr redet.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
OregonGhost

Registriert seit: 8. Jun 2002
Ort: Lübeck
1.216 Beiträge
 
Delphi 3 Professional
 
#15
  Alt 12. Dez 2002, 17:09
Zitat von Christian Seehase:
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
Falls ich das richtig verstanden habe:

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; ).
Oregon Ghost
---
Wenn NULL besonders groß ist, ist es fast schon wie ein bisschen eins.
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.117 Beiträge
 
Delphi 11 Alexandria
 
#16
  Alt 12. Dez 2002, 18:30
Moin Oregon Ghost,

ich bin ja wohl so ....

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

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
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
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.117 Beiträge
 
Delphi 11 Alexandria
 
#17
  Alt 12. Dez 2002, 18:57
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:
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 <> '00000000then
      begin
        ShowMessage(sError);
      end;
    end;
  finally
    FreeMem(ofnStruct.lpstrFile,MAX_PATH+1);
  end;
end;
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.
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
MathiasSimmack
(Gast)

n/a Beiträge
 
#18
  Alt 12. Dez 2002, 21:09
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?
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.117 Beiträge
 
Delphi 11 Alexandria
 
#19
  Alt 12. Dez 2002, 21:51
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)

http://cad.ntu-kpi.kiev.ua/~netlib/b...le/vcu37fi.htm

Ziemlich in der Mitte ist dann ein Link zum Screenshot:

http://cad.ntu-kpi.kiev.ua/~netlib/b...le/37vcu04.gif

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

Ich kann also, zumindest so ohne weiteres, nichts finden, wo auch nur der Old-Style Dialog mit Preview herkommt.
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
MathiasSimmack
(Gast)

n/a Beiträge
 
#20
  Alt 13. Dez 2002, 20:24
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:
uses
  CommDlg;

function GetOpenFileNamePreview(var OpenFile: TOpenFileNameA): Bool; stdcall;
  external 'msvfw32.dllname '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;
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.

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?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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 18:24 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