23. juli 2003 - 00:39Der er
8 kommentarer og 2 løsninger
Windows XP åbn/gem standarddialogbokse med Delphi 4 Standard
Når jeg bruger TOpenDialog og TSaveDialog i Delphi 4 Standard og kører mit program i Windows XP, så er det ikke dialogbokse i Windows XP/Windows 2000-style, men dialogbokse i Windows 9x-style.
Det jeg søger er en måde at bruge åbn/gem-dialogbokse, der ser ud som de skal i både Windows XP (med de der ikoner i venstre side) og Windows 9x (den klassiske).
Eventuelle komponenter skal være gratis, helst med kode. Jeg søger ikke nødvendigvis en komponent, hvis der er noget Windows-API der kan klare det på en tilfredsstillende måde, er det fint :-)
Støv, fibre og metalliske partikler kan påvirke både uptime, levetid og driftssikkerhed. Derfor arbejder flere datacentre systematisk med contamination control.
type TWin2000OpenDialog = class(TOpenDialog) protected FShowPlacesBar: Boolean; // shows the left bar FInterceptor: Pointer; // pointer to intercepting function function IsWin2000: Boolean; // are we on Windows2000 or WinME? public constructor Create(AOwner: TComponent); override; function Execute: Boolean; override; published property ShowPlacesBar: Boolean read FShowPlacesBar write FShowPlacesBar; end;
TWin2000SaveDialog = class(TWin2000OpenDialog) public constructor Create(AOwner: TComponent); override; function Execute: Boolean; override; end;
function GetOpenFileNameEx(var OpenFile: TOpenFilenameEx): Bool; stdcall; function GetSaveFileNameEx(var OpenFile: TOpenFilenameEx): Bool; stdcall;
implementation
function GetOpenFileNameEx; external 'comdlg32.dll' name 'GetOpenFileNameA'; function GetSaveFileNameEx; external 'comdlg32.dll' name 'GetSaveFileNameA';
var CurInstanceShowPlacesBar: Boolean;
function OpenInterceptor(var DialogData: TOpenFileName): Bool; stdcall; var DialogDataEx: TOpenFileNameEx; begin Move(DialogData, DialogDataEx, sizeof(DialogData));
if CurInstanceShowPlacesBar then DialogDataEx.FlagsEx := 0 else DialogDataEx.FlagsEx := OFN_EX_NOPLACESBAR;
DialogDataEx.lStructSize := sizeof(TOpenFileNameEx); // size of new structure Result := GetOpenFileNameEx(DialogDataEx); end;
function SaveInterceptor(var DialogData: TOpenFileName): Bool; stdcall; var DialogDataEx: TOpenFileNameEx; begin Move(DialogData, DialogDataEx, sizeof(DialogData));
if CurInstanceShowPlacesBar then DialogDataEx.FlagsEx := 0 else DialogDataEx.FlagsEx := 1;
DialogDataEx.lStructSize := sizeof(TOpenFileNameEx); // size of new structure Result := GetSaveFileNameEx(DialogDataEx); end;
function TWin2000OpenDialog.Execute: Boolean; begin if IsWin2000 then begin CurInstanceShowPlacesBar := FShowPlacesBar; Result := DoExecute(FInterceptor); end else Result := inherited Execute; end;
function TWin2000OpenDialog.IsWin2000: Boolean; var OSVersionInfo : TOSVersionInfo; begin Result := False; OSVersionInfo.dwOSVersionInfoSize := SizeOf(TOSVersionInfo);
if not GetVersionEx(OSVersionInfo) then exit;
Result := ((OSVersionInfo.dwPlatformId = VER_PLATFORM_WIN32_NT) and (OSVersionInfo.dwMajorVersion >= 5)) //Windows 2000 or ((OSVersionInfo.dwPlatformId = VER_PLATFORM_WIN32_WINDOWS) and (OSVersionInfo.dwMajorVersion >= 4) and (OSVersionInfo.dwMinorVersion >= 90)); //Windows ME (* if (OSVersionInfo.dwPlatformId = VER_PLATFORM_WIN32_NT) and (OSVersionInfo.dwMajorVersion >= 5) then // Detect Windows 2000 Result := True else if ((OSVersionInfo.dwPlatformId = VER_PLATFORM_WIN32_WINDOWS) and (OSVersionInfo.dwMajorVersion >= 4) and (OSVersionInfo.dwMinorVersion >= 90)) then // Detect Windows ME Result := True; *) end;
{ TWin2000SaveDialog }
constructor TWin2000SaveDialog.Create(AOwner: TComponent); begin inherited; FInterceptor := @SaveInterceptor; end;
function TWin2000SaveDialog.Execute: Boolean; begin if IsWin2000 then Result := inherited Execute // TWin2000OpenDialog has the functionality else Result := DoExecute(@GetSaveFileName); // can't call inherited because it will call opendialogs DoExecute end;
Stone -> Den komponent du har fundet ser ud til at gøre, så hele WinXP-themes bliver understøttet (jeg har ikke prøvet komponenten endnu). Men: Virker det også i dialogboksene?
Jeg har nu prøvet Stones løsning, og den retter heldigvis op på den lille skønhedsfejl :-) Den kan dog ikke stå på ejne ben, så en kombination af jeres løsninger bliver den endelige løsning :-)
Stone -> Det er ellers en simpel komponent, det eneste den gør er jo at tilføje lidt xml i programmets resourcer! Men det er åbenbart på den måde MS har valgt at gøre det.
Og nu er der også næsten fuld understøttelse af WindowsXP-themes. Det er en fed sidegevinst (selvom jeg normalt bruger Win2K-look, og ikke det der plastik) :-)
Dog mangler jeg fuld undestøttelse af Cleartype-visning (skrifttypeudjævning), men det spørgsmål hører vist hjemme i et nyt spørgsmål...
Det som er et lille minus er at det ikke virker i dbdatedit, her må man selv indsætte et billede, men så har man ikke mouseover effekt - som i dbcombobox.
Stone -> Se http://www.ebruger.dk/img/dote/athlon-pascal_Dialogbokse.JPG . Den øverste er med Jens' komponent alene, den nederste er ned både din og Jens' komponenter. Hvis jeg kun bruger din komponent, så er der ikke det der panel med genvejs-placeringer-halløj til venstre. Det er derfor jeg fordelte pointene som jeg gjorde :-)
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.