Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Ändern der Einstellung "Dialog zu Bestätigung anzeigen" (https://www.delphipraxis.net/31163-aendern-der-einstellung-dialog-zu-bestaetigung-anzeigen.html)

Sliver 5. Okt 2004 13:29


Ändern der Einstellung "Dialog zu Bestätigung anzeigen&
 
hi

Über einen Rechtsklick auf den Papierkorb auf dem Dekstop --> Eigenschaften kann man die Option "Dialog zur Bestätigung des Löschvorgangs anzeigen" deaktivieren oder aktivieren. Mein Ziel ist es jetzt, diese Option in meine Delphi Projekt zu übernehmen.

Bei einer Änderung dieser Option wird folgender Registryeintrag geändert:
HKEY_CURRENT_USER\Software\Microsoft\Windows\Curre ntVersion\Explorer\ShellState

Bei dem Eintrag ShellState handelt sich um einen REG_BINARY Wert. Da in diesem Wert mehrere Optionen abgespeichert werden, hole ich jeweils den ganzen Wert, ändere die fünfte Stelle von #23 auf #27(dort befindet sich die Änderung für den Löschdialog) und speichere den Wert wieder ab. Dies funktioniert auch wunderbar, nur beim testen auf verschiedenen Computer musste ich feststellen, das sich nicht immer nur der Wert an der fünften Stelle ändert. Zudem sind die Werte nicht immer 23 und 27. Ich vermute nun, das es sicher eine WINDOWS API Funktion gibt oder eine andere Möglichkeit um dies zu realisieren, leider habe ich noch nichts gefunden und hoffe ihr habt mir eine Idee.

(Der API Befehl müsste nur auf Windows 2k/XP funktionieren.)

cu Sliver

Steve 5. Okt 2004 14:33

Re: Ändern der Einstellung "Dialog zu Bestätigung anzei
 
Hi,

diese Einstellung kann zwar über MSDN-Library durchsuchenSHGetSettings gelesen, scheinbar aber nicht gesetzt werden:
Zitat:

Zitat von MSDN
The settings correspond more or less to the options in the View | Folder Options | View tab in Windows® Explorer (see Figure 4). Alas, there's no corresponding set function. Maybe that's because it would have to be called SHSetSettings, which sounds stupid.

Zitat, SHGetSettings

Gruß
Stephan :dance:

Christian Seehase 5. Okt 2004 16:17

Re: Ändern der Einstellung "Dialog zu Bestätigung anzei
 
Moin Zusammen,

die gesuchte Funktion heisst

MSDN-Library durchsuchenSHGetSetSettings

(ob GetSet nun weniger "stupid" klingt als Set alleine sei jetzt mal dahingestellt ;-) )

Sliver 6. Okt 2004 10:15

Re: Ändern der Einstellung "Dialog zu Bestätigung anzei
 
Nach dieser Homepage sollte doch die Funktion SHGetSetSettings in der Shlobj Uses vorhanden sein. Leider finde ich dort nur die Funktion SHGetSettings.

Was ich auch noch komisch finde, ist, wenn ich SHGetSettings aufrufe und danach z. B. einen Dialog öffne, erscheint folgende Fehlermeldung

Code:
---------------------------
Benachrichtigung über Debugger-Problem
---------------------------
In Projekt Project1.exe trat ein Problem mit folgender Meldung auf: 'Zugriffsverletzung bei 0x00432f2c: Lesen von Adresse 0x00120000'. Prozess angehalten. Mit Einzelne Anweisung oder Start fortsetzen.
---------------------------
Wenn ich jetzt aber nur den Aufruf SHGetSettings ausklammere läuft alles normal.

mumu 6. Okt 2004 12:36

Re: Ändern der Einstellung "Dialog zu Bestätigung anzei
 
in dem REG_BINARY wert wird alles immer bitweise (und nicht byteweise) gespeichert. du musst also genau wissen, welches bit für diese funktion verantwortlich ist und dieses dann entweder setzen oder nicht setzen...

Sliver 6. Okt 2004 12:43

Re: Ändern der Einstellung "Dialog zu Bestätigung anzei
 
Delphi-Quellcode:
function regReadBinary(RootKey:Cardinal;OpenKey,ValueName:String;CanCreate:Boolean=False):String;
var
  Reg:TRegistry;
  s:String;
  i:Integer;
begin
  Reg:=TRegistry.Create;
  try
    Reg.RootKey:=RootKey;
    Reg.OpenKey(OpenKey,CanCreate);
    i:=Reg.GetDataSize(ValueName);
    SetLength(s,i);
    Reg.ReadBinaryData(ValueName,s[1],i);
  finally
    Reg.Free;
  end;
  Result:=s;
end;
Mit dieser Funktion lese ich den Wert in einen String ein. Nach deiner Erläuterung wird hier der REG_BINARY Wert Byteweise eingelesen, was sicher gut sein kann. Wie ist es aber dann möglich, den Wert in eine Variable Bitweise einzulesen?

Christian Seehase 6. Okt 2004 15:33

Re: Ändern der Einstellung "Dialog zu Bestätigung anzei
 
Moin Sliver,

Zitat:

Zitat von Sliver
Nach dieser Homepage sollte doch die Funktion SHGetSetSettings in der Shlobj Uses vorhanden sein. Leider finde ich dort nur die Funktion SHGetSettings.

ich weiss jetzt nicht, welche Seite Du meinst, allerdings kann es durchaus sein, dass die Funktion nicht in der SHLOBJ Unit enthalten ist, da es sie erst ab Windows 2000 gibt.
ggf. selber importieren.

Zitat:

Zitat von Sliver
Wie ist es aber dann möglich, den Wert in eine Variable Bitweise einzulesen?

Direkt bitweise geht nicht, es müsste schon mindestens ein Byte sein, aber die Auswertung müsste u.U. bitweise erfolgen.

Sliver 26. Nov 2004 08:42

Re: Ändern der Einstellung "Dialog zu Bestätigung anzei
 
Hab endlich wieder Zeit gefunden, mich diesem Thema zu widmen. Hab auch eine Lösung gefunden, die geht wie folgt.

Ich lese die Binäre Einträge wie oben in Strings ein. Danach nehm ich den ordinalen Wert jedes Zeichen und rechne ihn ins Binärsystem um. Danach kann ich das Bit setzen das ich will und wieder zurück speichern in die Registry. Funktioniert einwandfrei, aber ist ein bisschen umständlich und es gibt sichere bessere Lösungen.

Christian Seehase 26. Nov 2004 18:02

Re: Ändern der Einstellung "Dialog zu Bestätigung anzei
 
Moin Sliver,

es empfiehlt sich allerdings meist den dokumentierten Weg zu gehen, da Du nicht wissen kannst, ob sich der Speicherort der Einstellung nicht ändert.
Schon mit einem Service Pack könnte das nämlich der Fall sein.

Sliver 29. Nov 2004 11:41

Re: Ändern der Einstellung "Dialog zu Bestätigung anzei
 
Bis jetzt hat es zumind. noch keine Veränderungen zwischen Windows 2000 ohne Service Pack bis zu WinXP SP2 bei den Einträgen gegeben, die ich benötigte. Aber ich werde die Dinge schon noch umprogrogrammieren, wenn ich dazu Zeit hab und wenn es dann auch endlich funktioniert. Ich hoffe in Delphi 2005 ist dann die ShlObj Version 5.0 drin, als bis jetzt nur die Version 4.71. Dann sollte dann auch die Funktion SHGetSetStettings implementiert sein.
Gruss Sliver

Christian Seehase 29. Nov 2004 17:56

Re: Ändern der Einstellung "Dialog zu Bestätigung anzei
 
Moin Sliver,

es hindert Dich niemand daran die Funktion SHGetSetStettings selber zu importieren ;-)

Sliver 29. Nov 2004 18:50

Re: Ändern der Einstellung "Dialog zu Bestätigung anzei
 
s. acht Posts weiter oben. Dann ergibt sich eben dieses Problem, dass ich bis jetzt nur über die Variante die ich jetzt brauche umgehen konnte.

Nogge 6. Feb 2005 08:46

Re: Ändern der Einstellung "Dialog zu Bestätigung anzei
 
Zitat:

Ich lese die Binäre Einträge wie oben in Strings ein. Danach nehm ich den ordinalen Wert jedes Zeichen und rechne ihn ins Binärsystem um. Danach kann ich das Bit setzen das ich will und wieder zurück speichern in die Registry. Funktioniert einwandfrei, aber ist ein bisschen umständlich und es gibt sichere bessere Lösungen.
@Silver: Kannste bitte mal deinen Source-Code für diese Routine posten?

Sliver 6. Feb 2005 15:58

Re: Ändern der Einstellung "Dialog zu Bestätigung anzei
 
Sind verschiedene Routinen
Delphi-Quellcode:
procedure regWriteBitinBinary(RootKey:Cardinal;OpenKey,ValueName:String;bit:Word;Value:Boolean);
var
  s,s2:String;
begin
  s:=regReadBinary(RootKey,OpenKey,ValueName);
  s2:=byteToBin(ord(s[((bit-1) div 8)+1]));
  s2[((bit-1) mod 8)+1]:=IntToStr(Integer(Value))[1];
  s[((bit-1) div 8)+1]:=Chr(binToByte(s2));
  regWriteBinary(RootKey,OpenKey,ValueName,s);
end;

function regReadBitinBinary(RootKey:Cardinal;OpenKey,ValueName:String;bit:Word):Boolean;
var
  s,s2:String;
begin
  s:=regReadBinary(RootKey,OpenKey,ValueName);
  s2:=byteToBin(ord(s[((bit-1) div 8)+1]));
  Result:=Boolean(StrToInt(s2[((bit-1) mod 8)+1]));
end;

procedure regWriteBinary(RootKey:Cardinal;OpenKey,ValueName,Value:String);
var
  Reg:TRegistry;
begin
  Reg:=TRegistry.Create;
  try
    Reg.RootKey:=RootKey;
    Reg.OpenKey(OpenKey,True);
    RegSetValueEx(Reg.CurrentKey,PChar(ValueName),0,REG_BINARY,PChar(Value),Length(Value));
    Reg.CloseKey;
  finally
    Reg.Free;
  end;
end;

function regReadBinary(RootKey:Cardinal;OpenKey,ValueName:String):String;
var
  Reg:TRegistry;
  s:String;
  i:Integer;
begin
  Reg:=TRegistry.Create;
  try
    Reg.RootKey:=RootKey;
    Reg.OpenKeyReadOnly(OpenKey);
    i:=Reg.GetDataSize(ValueName);
    SetLength(s,i);
    Reg.ReadBinaryData(ValueName,s[1],i);
    Reg.CloseKey;
  finally
    Reg.Free;
  end;
  Result:=s;
end;

function binToByte(s:String):Byte;
var
  i:Byte;
begin
  Result:=0;
  for i:=7 downto 0 do
    if s[8-i]='1' then
      Inc(Result,Trunc(Power(2,i)));
end;

function byteToBin(b:Byte):String;
var
  i:Word;
begin
  Result:='';
  for i:=7 downto 0 do
    if (b and(1 shl i))>0 then
      Result:=Result+'1'
    else
      Result:=Result+'0';
end;
Hab einfach mal alles rauskopiert, was wichtig sein könnte. Aber wie gesagt, gibt sicher bessere Lösungen. Bin momentan alle Einstellungen direkt über die Windows API am implementieren, was sicher auch die korrekte Lösung wäre. Muss mich da noch durch ein paar Probleme durchschlagen, hoffe aber ich bring es zum laufen.

cu Sliver

Nogge 6. Feb 2005 19:05

Re: Ändern der Einstellung "Dialog zu Bestätigung anzei
 
Wäre super, wenn du ne kürzere, einfachere Variante proggen könntest. Ich kenn mich zwar mit der Registry aus, aber die Umwandlung mit regWriteBitinBinary oder regReadBitinBinary ist mir doch ein wenig zu kompliziert. Es muss hier doch ein paar Freaks geben, die dieses Problem elegant gelöst haben^^
Weiter Viel Erfolg dabei!

mfg Nogge

Sliver 6. Feb 2005 19:12

Re: Ändern der Einstellung "Dialog zu Bestätigung anzei
 
Ich vermute nach der Theorie, die ich hatte, gibt es keine elegantere Lösung. Ich habe die Methoden von meinem Projekt übernommen, bei dem ich einzelne dieser Methoden mehrmals brauche. Darum macht es für mich so sehr viel Sinn. Aber ich denke, alles in eine Methode hineinpacken wirst du sicher fertig kriegen, danach den Code nach meiner Theorie weiter oben durchdenken. Die elgantere Lösung ist wie gesagt immer noch die über die Windows API.

Nogge 6. Feb 2005 20:48

Re: Ändern der Einstellung "Dialog zu Bestätigung anzei
 
Zitat:

Die elgantere Lösung ist wie gesagt immer noch die über die Windows API.
Wie sollte denn der Ansatz dafür aussehen? Ich habe gerade keine Ahnung, was du damit meinst. Ich würde das sonst vllt mal versuchen, wenns nicht zu komplex (= zu viel Arbeit^^) wird.

Sliver 7. Feb 2005 09:09

Re: Ändern der Einstellung "Dialog zu Bestätigung anzei
 
Ganz am Anfang dieses Thread haben wir über die Problematik diskutiert, bis ich auf die Variante (s. Code) gekommen bin. Das schwierige ist die Implementation der Win API, der Rest ist dann einfach. Mal den ganzen Thread durchlesen. Wenn es dann noch nicht klar ist meine jetzige Lösung nehmen oder sein lassen.

cu Sliver


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:52 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