Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Software-Projekte der Mitglieder (https://www.delphipraxis.net/26-software-projekte-der-mitglieder/)
-   -   Ferby-Fall II (https://www.delphipraxis.net/59221-ferby-fall-ii.html)

ferby 19. Dez 2005 17:37

Re: Ferby-Fall II
 
Hallo,

also bei mir kann mann das nicht ????

Ich weiß nicht einmal wie mann auf die Registry mit Delphi zugreift, da ich das noch nie gebraucht habe.
Und ich weiß was in meiner Programmierung steht, und da ist 100% nichts was in irgendeiner weiße die Registry verändert!



Wegen der Bildschirmfrequenz:

Ich verwende diese Procedure um die auflösung zu ändern, wiederherzustellen und um die Symbole am Desktop wieder zu richten.

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);
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;
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;



Ich habe diese Procedure nicht ganz alleine geschrieben, wo wird hier die Bildschirmfrequent verändert? Wie kann ich das verhindern, bzw wie kann ich die alte Bildschirmfrequenz wieder herstellen???


Danke für jede Hilfe,

Ferby



PS

Zitat:

Ich starte gerne das Spiel zum testen aus der ZIP heraus. Wenn es mir gefällt entzippe ich es in einen Ordner, wenn nicht versinkt der ZIP Ordner halt im TEMP-Ordner der periodisch gelöscht wird.
Ok, dass ergibt für mich Sinn, sorry, werde das nächste mal gleich eine ZIP bereitstellen,

mfg,
Ferby

ichbins 19. Dez 2005 17:41

Re: Ferby-Fall II
 
Wie schon gesagt, du solltest das Problem mit den 60 Hz noch lösen. Du könntest z.B. vor dem Start die Frequenz auslesen und beim beenden wieder setzen. Ich halte dieses 60-Hz-Geflimmere nicht aus... :?

Und mach UM GOTTES WILLEN den Timer etwas schneller...
Damit richtige Reaktionsgeschwindigkeit gefragt ist.

Ein Setup schreibt IMMER was in die Registry, selbst wenn du ihm ausdrücklich befiehlst, es nicht zu tun.
Ich denke, du verwendest Inno Setup. Wenn du dein eigenes Setup schreibst, könntest du dich drumherummanövrieren.

ferby 19. Dez 2005 17:49

Re: Ferby-Fall II
 
Hallo,

ich habe mein Setup Programm (falls es ein Setup ist, ich weiß nicht wie Setup definiert ist) selbst mit Delphi geschrieben,
der hauptteil dieses Programmes besteht daraus:

Delphi-Quellcode:
procedure Tform1.daten;
var
i: byte;
Datei:TResourceStream;
begin

  for i:=1 to 2 do
  begin
    Datei:=TResourceStream.Create(hInstance,'wav' + inttostr(i),'EXEDATA');
    Datei.SaveToFile(pfadtmp + inttostr(i) + '.wav');
  end;

  progress.position:=50;
  progress.Refresh;

  for i:=1 to 8 do
  begin
    Datei:=TResourceStream.Create(hInstance,'mid' + inttostr(i),'EXEDATA');
    Datei.SaveToFile(pfadtmp + inttostr(i) + '.mid');
  end;

  progress.position:=70;
  progress.Refresh;

  Datei:=TResourceStream.Create(hInstance,'optionen','EXEDATA');
  Datei.SaveToFile(pfadtmp + 'optionen.ini');

  progress.position:=80;
  progress.Refresh;

  Datei:=TResourceStream.Create(hInstance,'score','EXEDATA');
  Datei.SaveToFile(pfadtmp + 'score.ini');



end;
Mein Installationsprogramm schreibt NICHTS in die Registry!


Und sonst steht darin nichts mehr was mit den Dateientpacken (Installation) zu tun hat.




Zitat:

Du könntest z.B. vor dem Start die Frequenz auslesen
Wie lese ich die Frequenz ab und stelle sie wieder her?
Ferby

Nils_13 19. Dez 2005 18:02

Re: Ferby-Fall II
 
Also du hast noch viel zu tun ...

Zur Frequenz: Verurasacht das, so dass man sich total besoffen fühlt und man, egal ob zurück geändert immer noch was nicht ganz stimmr ?

ichbins 19. Dez 2005 18:14

Re: Ferby-Fall II
 
Hier eine Funktion zum Verändern der Bildschirmauflösung (auch nicht ganz selber geschrieben ;) (bzw. garnicht)):

Delphi-Quellcode:
function ChangeResolution(XResolution, YResolution, Depth: DWORD): BOOL;
var
  DevMode: TDeviceMode;
  i: Integer;
begin
  Result := False;
  i     := 0;
  while EnumDisplaySettings(nil, i, DevMode) do
    with DevMode do
    begin
      if (dmPelsWidth = XResolution) and
        (dmPelsHeight = YResolution) and
        (dmBitsPerPel = Depth) then        
        if ChangeDisplaySettings(DevMode, [CDS_FULLSCREEN]) =
          DISP_CHANGE_SUCCESSFUL then
        begin
          Result := True;
          SendMessage(HWND_BROADCAST, WM_DISPLAYCHANGE, SPI_SETNONCLIENTMETRICS, 0);
          Break;
        end;
      Inc(i);
    end;
end;
vllt geht es ja damit

Luckie 19. Dez 2005 18:18

Re: Ferby-Fall II
 
Zitat:

Zitat von Luckie
Nimm ein Zip-archiv und schreibndazu, ob irgendetwas im System geändert wiord oder wo anders als im Programmverzeichnis gespeichert wird.

Wenn du schon mein Programm umbenennst und so dessen Herkunft etwas verschleierst, dann sag wemfalls, wo mein Programm die Einstellungen speichert oder wird das von deinem Setup auch wieder gelöscht?

ferby 20. Dez 2005 06:12

Re: Ferby-Fall II
 
Hallo,

ich habe das Programm umbennant damit ich sofort weiß was dieses Programm tut,
warum soll ich die Herkunft verschleiern???
Mann braucht ja nur dein Programm zu öffnen und schon weiß mann wo es her kommt.
Nachdem du es Openscource gemacht hast würde ich, wenn ich es verschleiern würde,
einfach alles auf der Form löschen und neu compilen......

Nein der Ordner wird nicht gelöscht,
weil mein "Setup Programm" keine "Reinstallt" hat,
ich werde sobald ich Zeit habe ein Reinstallt Programm schreiben,

mfg,
Ferby

alzaimar 20. Dez 2005 07:56

Re: Ferby-Fall II
 
Zitat:

Zitat von ferby
...
Ich bitte um Testen des Programmes und Verbesserungsvorschläge.

@ferby: Deinen Umgang erwünschter Kritik, die freundlich und sachlich vorgetragen wurde, solltest Du überdenken. Durch Kritik wird immer Dein Horizont erweitert. Es gibt Leute, die zahlen dafür (Schulungen, Training, Lehrgänge, etc.) und Du bekommst das hier umsonst. Anstatt einfach 'Danke' zu sagen, lamentierst Du hier rum.

Denk nächstes Mal daran, wenn Dir jemand auf Dein Bitten hin was erzählt.

Ich persönlich teste übrigens keine EXEn ohne Source, denn es sind in Foren wie Diesem auch schon Trojaner als vermeidlich zu testende Tools gepostet worden. Zumindest der Source sollte mitgeliefert werden. Deinem Tool nach zu urteilen stecken sowieso keine Geheimnisse drin.

Muetze1 20. Dez 2005 08:40

Re: Ferby-Fall II
 
Delphi-Quellcode:
Uses
  ShellAPI,
  registry;         // auch wenn du es nicht wolltest, nun hast doch ein wenig Registry mit drinne - aber nur lesen...

....

Var
  ScreenAlt: TPoint;             // diese solltest du schon haben
  ScreenAltFrequenz : Integer;   // diese kommt neu hinzu

Function ChangeScreen(AWidth, AHeight: Word; AFrequenz: Integer; Const APfad: string): Boolean;
  // modified by Muetze1
Const
  ENUM_CURRENT_SETTINGS : Cardinal = Cardinal(-1);//$ffffffff; // = -1
Var
  lpDevMode: TDeviceMode;
  saveiconherstellen: boolean;
  lRegInfo : TRegistry;
Begin
  saveiconherstellen := false;

  If ( AWidth <> 0 ) Then
  Begin
    ScreenAlt.x := Screen.Width;
    ScreenAlt.y := Screen.Height;
    ScreenAltFrequenz := 0;            // diese Variable noch definieren

    If ( EnumDisplaySettings(Nil, ENUM_CURRENT_SETTINGS, lpDevMode) ) Then
    Begin
      If ( ( lpDevMode.dmFields And DM_PELSWIDTH ) > 0 ) Then
        ScreenAlt.x := lpDevMode.dmPelsWidth;
      If ( ( lpDevMode.dmFields And DM_PELSHEIGHT ) > 0 ) Then
        ScreenAlt.y := lpDevMode.dmPelsHeight;
      If ( ( lpDevMode.dmFields And DM_DISPLAYFREQUENCY ) > 0 ) Then
        ScreenAltFrequenz := 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
            ScreenAltFrequenz := StrToIntDef(lRegInfo.ReadString('RefreshRate'), 0);
          End;
        Finally
          lRegInfo.CloseKey;
          lRegInfo.Free;
        End;
      End;
    End;

    ShellExecute(0, 'open', PChar(APfad + 'saveicon.exe'),'"\s"', nil, SW_Show);
    Sleep(1000);
  End
  Else
  Begin
    saveiconherstellen:=true;
    AWidth   := ScreenAlt.X;
    AHeight  := ScreenAlt.Y;
    AFrequenz := ScreenAltFrequenz;
  End;

  lpDevMode.dmFields    := DM_PELSWIDTH Or DM_PELSHEIGHT;
  lpDevMode.dmPelsWidth := AWidth;
  lpDevMode.dmPelsHeight := AHeight;
  If ( AFrequenz > 20 ) Then // valid?
  Begin
    lpDevMode.dmDisplayFrequency := AFrequenz;
    lpDevMode.dmFields          := lpDevMode.dmFields Or DM_DISPLAYFREQUENCY;
  End;
  Result := ChangeDisplaySettings(lpDevMode, CDS_UPDATEREGISTRY) = DISP_CHANGE_SUCCESSFUL;

  If saveiconherstellen Then
    ShellExecute(0,'open', PChar(APfad + 'saveicon.exe'),'"\r"', nil, SW_Show);

  If Not Result Then
  Begin
    MessageBeep(MB_ICONERROR);
    MessageDlg('Fehler1' +#10#10+ 'Das Programm konnte die Auflösung nicht auf '+inttostr(AWidth)+'x'+inttostr(AHeight)+ ' 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;
So, damit sollte es klappen mit der Frequenz. MultiMon unter 98 und ME werden dabei nciht sauber unterstützt - diese Leutchen werden dann auch weiterhin die falsche Frequenz haben. Grundsätzlich könnte man da noch mit dem CDS_UPDATEREGISTRY rumspielen und deine Spieleauflösung nicht gleich fest abspeichern und dadurch die Wiederholfrequenz behalten.
Ansonsten kannst du nun auch eine Wiederholfrequenz für deine Spielauflösung angeben - da ist wieder die Frage, ob es der Monitor unterstützt. Die nicht vom Monitor unterstützten Auflösungen werden zwar beim EnumDisplaySettings() ausgeblendet (ab NT), aber beim setzen kann man auch nicht unterstützte setzen. Wenn die 60 Hz auf deiner Spielauflösung bisher nicht störten, dann gebe bei dem Frequenzparameter eine 0 an beim Aufruf.
Die Registry wird nun doch gebraucht für die Wiederholfrequenz unter 9x/ME - aber es wird nur gelesen...

Und grundsätzlich gilt meine Signatur!

Daniel G 20. Dez 2005 11:00

Re: Ferby-Fall II
 
Zitat:

Zitat von alzaimar
Ich persönlich teste übrigens keine EXEn ohne Source, denn es sind in Foren wie Diesem auch schon Trojaner als vermeidlich zu testende Tools gepostet worden.

Da sehe ich eigentlich kein Problem, denn wenn ein Programm ins Netz will meckert meine Firewall eigentlich regelmäßig. Und nebenbei läuft NetworkActiv. Man kann ja schließlich nicht von jedem verlangen, dass er sein komplettes Programm offenlegt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:05 Uhr.
Seite 2 von 3     12 3      

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