Delphi-PRAXiS
Seite 3 von 3     123   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Auflösung,Frequenz,Icons wiederherstellen ? (https://www.delphipraxis.net/59657-aufloesung-frequenz-icons-wiederherstellen.html)

ferby 4. Jan 2006 14:21

Re: Auflösung,Frequenz,Icons wiederherstellen ?
 
Hallo,

exisitiert bei dir auch die Datei APfad + 'saveicon.exe' ???

Bei mir war der Pfad falsch, aber es kam keine Fehlermeldung, so bin ich auch erst relativ spät drauf gekommen das der Pfad gar nicht richtig war...


Ferby

ferby 5. Jan 2006 13:07

Re: Auflösung,Frequenz,Icons wiederherstellen ?
 
Hallo,

@ Vader

Das kann ich erklären.

Bei der Setup datei istdie Variabel pfad als Constante ss definiert:

const
pfad='C:\Programme\Ferby\Ferby-Fall_II\data\';

aber bei der Zip datei habe ich die exe neu gemacht mit einen anderen pfad, und zwar so:

const
pfad='data\';

deshalb funktionierts, egal wo du das Spiel entpackst.

-------
Noch was zur Auflösung ändern und zur Frquenz wieder herstellen,
Ich habe jetzt meinen eigenen Quellcode erweitert, er ändert die Auflösung und nacher stellt er die alte Auflösung, Bildschirmfrequenz und Desktopsymbole wieder her:

Delphi-Quellcode:
// ------------------------------------------------------------------------------ // Screen // ---------------------------------
function changescreen(Width, Height: Word; pfad: string): Boolean;
var
lpDevMode: TDeviceMode;
saveiconherstellen: boolean;
begin
  saveiconherstellen:=false;

  if width<>0 then
  begin
    ScreenAlt.x:=(screen.width);
    ScreenAlt.y:=(screen.height);
    refreshalt:=getrefresH;
    ShellExecute(0,'open', PChar(pfad + 'saveicon.exe'),'"\s"', nil, SW_Show);
    sleep(1000);
  end
  else
  begin
    saveiconherstellen:=true;
    width:=ScreenAlt.X;
    height:=ScreenAlt.Y;
  end;

  Result := EnumDisplaySettings(nil, 0, lpDevMode);
  if Result then
  begin
    lpDevMode.dmFields := DM_PELSWIDTH Or DM_PELSHEIGHT;
    lpDevMode.dmPelsWidth := Width;
    lpDevMode.dmPelsHeight := Height;
    lpDevMode.dmDisplayFrequency := refreshAlt;
    lpDevMode.dmFields          := lpDevMode.dmFields Or DM_DISPLAYFREQUENCY;
    Result := ChangeDisplaySettings(lpDevMode,
    CDS_UPDATEREGISTRY) = DISP_CHANGE_SUCCESSFUL;
    if saveiconherstellen then ShellExecute(0,'open', PChar(pfad + 'saveicon.exe'),'"\r"', nil, SW_Show);
  end;

  if not Result then
  begin
    MessageBeep(MB_ICONERROR);
    MessageDlg('Fehler1' +#10#10+ 'Das Programm konnte die Auflösung nicht auf '+inttostr(width)+'x'+inttostr(height)+ ' umstellen.' +#10+ 'Es könnte sein das der Computer diese Auflösung nicht unterstützt' +#10+ 'Sollte der Computer diese Auflösung doch unterstüzen,' +#10+  'dann stelle bitte die Auflösung manuel ein und starte das Spiel erneut.', mtError, [mbOK], 0);
    Application.Terminate;
  end;

end;

function GetRefresh : Integer;
var
  hDC : Cardinal;
begin
  hDC := GetDC(0);
  Result := GetDeviceCaps(hDC, VREFRESH);
  ReleaseDC(0, hDC);
end;
Danke an alle die mir geholfen haben diesen Quellcode Fertig zu stellen!!


mfg,
Ferby

Muetze1 5. Jan 2006 13:25

Re: Auflösung,Frequenz,Icons wiederherstellen ?
 
Von der Methode mit dem GetDeviceCaps() kann ich dir nur abraten, da er vielmals einen falschen Wert bzw. 0 zurück liefert.

ferby 5. Jan 2006 13:33

Re: Auflösung,Frequenz,Icons wiederherstellen ?
 
Hallo,

ich habe das auf 3 Laptops und 1 Computer mit Windows XP und 2000 getestet und es hat funktioniert.
Wieso sollte es falsche Werte zurückliefern????



Ferby

Muetze1 5. Jan 2006 13:41

Re: Auflösung,Frequenz,Icons wiederherstellen ?
 
Probier es z.B. mal unter Windows 9x und vor allem auch mal mit SiS Grafikkartentreibern und bei alten ATI Grafikkarten und deren Treiber (Rage Pro z.B.).

/EDIT:
Ansonsten nochmal dazu die MSDN:
Zitat:

Zitat von MSDN GetDeviceCaps(VREFRESH)
Windows NT/2000/XP: For display devices: the current vertical refresh rate of the device, in cycles per second (Hz).

A vertical refresh rate value of 0 or 1 represents the display hardware's default refresh rate. This default rate is typically set by switches on a display card or computer motherboard, or by a configuration program that does not use display functions such as ChangeDisplaySettings.

Mit anderen Worten:

a) Windows 9x ist komplett aussen vor, funktioniert also gar nicht.
b) Eine Rückgabe von 0 oder 1 für die "default refresh rate" würde ChangeDisplaySettings() beim zurücksetzen nicht akzeptieren.

EnumDisplaySettings() selber kann dabei auch 0 bzw. 1 für die "default refresh rate" zurück liefern, aber beim setzen aktzeptiert es ChangeDisplaySettings() nicht - bzw. es ist nicht dokumentiert. Daher kann es dir ein Treiber von einem Hersteller leicht um die Ohren hauen.

ferby 5. Jan 2006 15:22

Re: Auflösung,Frequenz,Icons wiederherstellen ?
 
Hallo,

wie würdest du die Bildschirmfrequenz rausbekommen??
Ich habe mir deinen verbesserten Quellcode von mir schon angesehen, leider durchschau ich ihn nicht ganz.
Kannst du mir die Bereiche Isolieren die nur zum Auslesen der Bildschirmfrequenz verwendet werden??


Ferby

Muetze1 5. Jan 2006 22:00

Re: Auflösung,Frequenz,Icons wiederherstellen ?
 
Delphi-Quellcode:
Function GetVRefresh: Integer;
Const
  ENUM_CURRENT_SETTINGS : Cardinal = Cardinal(-1);//$ffffffff; // = -1
Var
  lpDevMode: TDeviceMode;
  lRegInfo : TRegistry;
  lRefresh : Integer;
  lDesktop : HDC;
Begin
  lRefresh := 0;

  FillChar(lpDevMode, SizeOf(lpDevMode), 0);
  lpDevMode.dwSize := SizeOf(lpDevMode);

  If ( EnumDisplaySettings(Nil, ENUM_CURRENT_SETTINGS, lpDevMode) ) Then
  Begin
    If ( ( lpDevMode.dmFields And DM_DISPLAYFREQUENCY ) > 0 ) Then
      lRefresh := lpDevMode.dmDisplayFrequency
    Else If ( Win32Platform = VER_PLATFORM_WIN32_WINDOWS ) Then // Win9x/ME
    Begin
      lRegInfo := TRegistry.Create(KEY_READ);
      lRegInfo.RootKey := HKEY_CURRENT_CONFIG;
      Try
        If lRegInfo.OpenKey('\Display\Settings', False) Then
        Begin
          lRefresh := StrToIntDef(lRegInfo.ReadString('RefreshRate'), 0);
        End;
      Finally
        lRegInfo.CloseKey;
        lRegInfo.Free;
      End;
    End;
  End;

  If ( lRefresh In [0,1] ) Then // hardware default versuchen zu umgehen
  Begin
    lDesktop := GetDC(0);
    Try
      lRefresh := GetDeviceCaps(lDesktop, VREFRESH);
    Finally
      ReleaseDC(0, lDesktop);
    End;
  End;

  Result := lRefresh;
End;

ferby 6. Jan 2006 11:57

Re: Auflösung,Frequenz,Icons wiederherstellen ?
 
Hi,


Ich schau mir deine Funktion später mal ein wenig an und probier sie aus,
danke,



Ferby

ferby 6. Jan 2006 22:34

Re: Auflösung,Frequenz,Icons wiederherstellen ?
 
Hallo,

bei mir kommt der Fehler zur Zeile

lpDevMode.dwSize := SizeOf(lpDevMode);


[Fehler] Ferby.pas(77): Undefinierter Bezeichner: 'dwSize'

Muetze1 6. Jan 2006 22:47

Re: Auflösung,Frequenz,Icons wiederherstellen ?
 
Wenn man einmal was aus'm Kopf schreibt....

... es heisst natürlich nicht "dwSize" sondern "dmSize" - aber das kann ich nun nach 24 Stunden nicht mehr korrigeren...


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:44 Uhr.
Seite 3 von 3     123   

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