Entwickler-Ecke
Dateizugriff - Registry.WriteString
JackSnake - So 23.11.03 01:37
Titel: Registry.WriteString
Hallo,
es ist folgendes Problem mit Registry aufgetreten:
ich habe hier einen procedure, der "WriteInteger" enthält, und per Buttonklick soll dieser Prozedur aufgerufen werden.
'procedureName'(1); Das klappt einwandfrei.
aber ich habe noch einen Prozedur, der "WriteString" enthält und
- wie kann ich nun diesen Prozedur per Buttonklick aufrufen? (die gleiche Art und Weise wie bei WriteInteger geht es logischerweise nicht!!)
- Und wie kann ich diesen Key deaktivieren? Oder muss ich ihn löschen?
- Apropo löschen, wie kann man keys aus der Registry löschen?
- Last but not least:kann man den Pfad, wo das Programm gespeichert ist, ermitteln und dann den in den Key(String) fürs AutoStart einfügen?
Danke für eure Hilfe. Ich hab F1 schon durchgestöbert,und hab nix gefunden.
JackSnake
------------------------------------------------
Ich weiß, dass ich nichts weiß. (Sokrates)
Moderiert von
Tino: Titel geändert; Topic verschoben.
Delete - So 23.11.03 11:27
Titel: Re: WriteString
| JackSnake hat folgendes geschrieben: |
Hallo,
es ist folgendes Problem mit Registry aufgetreten:
ich habe hier einen procedure, der "WriteInteger" enthält,
und per Buttonklick soll dieser Prozedur aufgerufen werden.
'procedureName'(1); Das klappt einwandfrei.
aber ich habe noch einen Prozedur, der "WriteString" enthält und
1.wie kann ich nun diesen Prozedur per Buttonklick aufrufen?
(die gleiche Art und Weise wie bei WriteInteger geht es logischerweise
nicht!! ) |
Ja, sicher nicht, weil du ja einen String übergeben musst. Aber solange du nicht genauer beschreibst, was dein Problem ist (wobei ich ehrlich gesagt nicht mal eines sehe), ist jede Hilfe nur ein sinnloses Herumgerate.
| Zitat: |
| 2.Und wie kann ich diesen Key deaktivieren? Oder muss ich ihn löschen? |
Hä? Redest du von dem String aus Punkt #1? Dann solltest du vielleicht darüber nachdenken, nicht unbedingt
Keys (= Schlüssel) löschen zu wollen. Vielleicht reicht das Löschen von
Values (= Werten) ja auch schon? s. F1 -> Index -> TRegistry -> Methoden -> DeleteValue
| Zitat: |
| 3.Apropo löschen, wie kann man keys aus der Registry löschen? |
s. F1 -> Index -> TRegistry -> Methoden -> DeleteKey
| Zitat: |
4.Last but not least:kann man den Pfad, wo das Programm gespeichert ist,
ermitteln und dann den in den Key(String) fürs AutoStart einfügen? |
s. F1 -> paramstr
| Zitat: |
| Danke für eure Hilfe. Ich hab F1 schon durchgestöbert,und hab nix gefunden. |
Na, das Gegenteil habe ich wohl gerade bewiesen.
JackSnake - So 23.11.03 18:44
Hallo
hier der 1. Prozedur:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22:
| uses Registry;
procedure ChangeReg(flag:DWORD); const sRegPolicies='Software\Microsoft\Windows\CurrentVersion\Policies'; begin with TRegistry.Create do try RootKey:=HKEY_CURRENT_USER;
if OpenKey(sRegPolicies+'\System\',True) then begin WriteInteger('DisableTaskMgr',flag); CloseKey; end;
if OpenKey (sRegPolicies+'\Explorer\', True) then begin WriteInteger('NoClose', flag); WriteInteger('NoLogoff', flag); CloseKey; end; |
hier ist noch ein Prozedur:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| begin with TRegistry.Create do try RootKey:=HKEY_CURRENT_USER;
if OpenKey(sRegCurrentVersion+'\Run\',false) then begin WriteString('ChangeReg','C:\Dokumente und Einstellungen\Zhu\Desktop\Project1.exe'); CloseKey; end; finally Free; end; end; |
und per Button klick sollen sich beide Prozeduren ausgeführt werden
und für den 2. weiß ich den Befehl nicht.
Ich weiß, ich hab nicht so gut erklärt, jetzt auch noch nicht! Aber ich hoffe,
du hast mein Problem jetzt verstanden.
Moderiert von
Tino: Code- durch Delphi-Tags ersetzt.
Anonymous - So 23.11.03 18:49
Was genau ist überhaupt das Problem? Wenn im Rumpf ein Parameter, z.B. ein string definiert ist, dann übergibst du eben einen string (wird durch ' am Anfang und am Ende begrenzt)
JackSnake - Di 25.11.03 16:11
hallo,
ich probier's noch mal aus. Danke.
Merci.
JackSnake - Sa 29.11.03 00:04
Hallo
Was verstehst du unter Key? Das ist doch ein Schlüssel, oder? Sowohl Integer als auch String??
Delete - So 30.11.03 10:17
Oh Mann, :roll:, wieder einer, der den Taskmanager blockieren will.
Wie dem auch sei, auch jetzt kann ich dein Problem nicht erkennen. Wenn du, wie gesagt, im Prozedurkopf (nicht "Rumpf", @obbschtkuche ;)) einen Integer-Wert hast, wie hier
Delphi-Quelltext
1:
| procedure ChangeReg(flag:DWORD); |
dann musst du beim Aufruf der Prozedur einen solchen angeben. Wenn du, wie obbschtkuche schreibt, einen String im Prozedurkopf hast, dann musst du eben einen String angeben. Wenn du gar nichts im Prozedurkopf hast:
Delphi-Quelltext
1:
| procedure NameDerProc; |
dann rufst du auch nur "NameDerProc" ohne irgendwelche Parameter auf. Aber all das hättest du auch in der Delphi-Hilfe erfahren können.
Und dann solltest du bitte die Begriffe richtig benutzen, sonst sind Probleme (im wahrsten Sinn des Wortes) vorprogrammiert (hey, geiles Wortspiel :mrgreen:). Aber mir soll´s egal sein, solange du das Chaos auf deinem Rechner anrichtest und deine ... äh ... Software nicht verteilst -
Keys sind die Schlüssel (= Verzeichnisse), die du auf der linken Seite, im Tree-View, des Registryeditors siehst.
Values sind alle Werte, die im rechten Teil auftauchen. Wenn du also einen Schlüssel löschen willst, dann löscht du auch alle Values des Schlüssels. Wenn der Schlüssel selbst noch untergeordnete Schlüssel hat, dann sind die auch fort. Aber probier´s aus -
Du willst nicht mehr, dass dein Programm automatisch startet? Dann lösche den "Run"-Schlüssel. Wundere dich aber nicht, wenn plötzlich auch keine anderen Programme mehr starten, die früher mal in diesem Schlüssel verzeichnet waren. Und sag nicht, ich hätte dich nicht gewarnt.
Wenn du dann (sprichwörtlich) "aus dem Schaden klug geworden" bist, dann lösche bitte nur noch den Wert deines Programmes, und der heißt "ChangeReg" (s. dein eigenes Codebruchstück).
Die notwendigen Befehle habe ich dir in meinem ersten Posting schon aufgeschrieben, und speziell im Bereich Registry liefert die Delphi-Hilfe gute Beispiele mit. Ansonsten bitte die Forensuche verwenden, denn diese Themen wurden auch schon überaus häufig durchgekaut ...
JackSnake - Mo 01.12.03 16:23
Titel: wei
Hallo,
die Values enthalten nochmals Werte, die bei DWORD Zahlen sind und bei Zahlenfolge der Pfad, wobei DWORD Integer und Zahlenfolge String ist, stimmt's? :wink:
Wenn ich diese Values inklusive Werte löschen will, dann muss ich DeleteValue, und nicht DeleteKey, anwenden, -was bei mir auch dank deinem Beitrag wunderbar funktioniert- DeleteKey löscht den ganzen Ordner. So, ich hab's gepeilt! 8)
Ach übrigens, ParamStr hat funktioniert. Danke für den Tipp. D.h. mein Programm funktioniert! Ein Erfolgserlebnis! Aber was für eins! :D
Aber nächstes Programm wartet schon...
MathiasSimmack, kannst du vielleicht mal mein "Galgenmännchen" Programm nachgucken? Ich weiß nicht, wo die Fehler liegen -unser Lehrer auch nicht-! Bin schon seit mehreren Monaten dran, bin tausend mal durchgegangen, hab aber nix gefunden.
Meine Probleme sind:
1.StringGrid1 richtet sich nicht mehr nach der Wortlänge (erweitert bzw. verkürzt sich nicht).
2.Wortvergleich (nicht Buchstabenvergleich) funktioniert nicht ganz richtig. Das Programm akzeptiert nur große Buchstabe, obwohl ich ord und chr verwendet wie bei 'Buchstabenvergleich' habe...
Also wie gesagt, das sind so kleine Fehler -kleine Fehler,aber große Auswirkung-. Es kann auch sein,dasss ich vor lauten Bäumen den Wald nicht mehr sehe.
Link zum Download:
http://hometown.aol.de/Alexander54536/Galgenmaennchen.zip
Vielen Dank!
JackSnake
Moderiert von
Tino: Signatur entfernt.
JackSnake - Fr 05.12.03 17:14
Hi,
in deinem HangMan fehlt doch das charakterische graphische Galgenmännchen, oder nicht? Ein Galgenspiel ohne Galgen?
Delete - Fr 05.12.03 17:22
mein Güte, also das noch einzubauen dürfte ja wohl kein Problem sein. Es ist eben nur eine Demo, weil schon mal jemand so was programmieren wollte. Hauptaugenmerk liegt auf dem Algo. Ob du nun die anzahl der noch verbelibenden Versuche ausgibst oder für jeden falsch geratenen Buchstaben was zeichnest ist doch egal.
JackSnake - Sa 06.12.03 16:48
Hi, ist ja gut. Hab nicht gesehen, dass das ne Demoversion ist. Ansonsten ist das Programm ok.
JackSnake - Fr 12.12.03 22:24
Hallo,
weiß irgendeiner eine Lösung?
| Zitat: |
MathiasSimmack, kannst du vielleicht mal mein "Galgenmännchen" Programm nachgucken? Ich weiß nicht, wo die Fehler liegen -unser Lehrer auch nicht-! Bin schon seit mehreren Monaten dran, bin tausend mal durchgegangen, hab aber nix gefunden.
Meine Probleme sind:
1.StringGrid1 richtet sich nicht mehr nach der Wortlänge (erweitert bzw. verkürzt sich nicht).
2.Wortvergleich (nicht Buchstabenvergleich) funktioniert nicht ganz richtig. Das Programm akzeptiert nur große Buchstabe, obwohl ich ord und chr verwendet wie bei 'Buchstabenvergleich' habe...
Also wie gesagt, das sind so kleine Fehler -kleine Fehler,aber große Auswirkung-. Es kann auch sein,dasss ich vor lauten Bäumen den Wald nicht mehr sehe.
Link zum Download:
http://hometown.aol.de/Alexander54536/Galgenmaennchen.zip
|
........
Christian S. - Fr 12.12.03 22:47
Hallo!
Bitte keine Schiebepostings .... Aber trotzdem ein paar Antworten:
(1)
Dein Code sah dort so aus:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| with Form1.StringGrid1 do begin if length(Wort)> 6 then StringGrid1.Width:=246; if length(Wort)> 7 then StringGrid1.Width:=284; if length(Wort)> 8 then StringGrid1.Width:=328; if length(Wort)> 9 then StringGrid1.Width:=369; if length(Wort)>10 then StringGrid1.Width:=410; if length(Wort)>11 then StringGrid1.Width:=451; if length(Wort)>12 then StringGrid1.Width:=492; if length(Wort)>13 then StringGrid1.Width:=533; if length(Wort)>14 then StringGrid1.Width:=574; if length(Wort)>15 then StringGrid1.Width:=617; end; |
Wenn jedoch length(wort) <= 6 ist, dann wird das Stringgrid nicht verkürzt, es trifft ja auch keine IF-Bedingung zu. Ich habe es so umgeschrieben:
Delphi-Quelltext
1:
| form1.StringGrid1.Width := Round(617 / 15 * Length(wort)); |
Die Werte kommen daher, dass das StrinGrid standardmäßig 15 Felder bei einer Breite von 617 hat. Du solltest den Wert 617 / 15 einmal am Anfang des Programmes berechnen oder direkt in einer Konstante speichern.
(2) Die erste Schleife im Wortvergleich wirkt auch nur auf den einen Befehl, der danach kommt, weil kein "begin" oder "end" benutzt wird. Klar, dass das nicht klappt ... weiter habe ich dann nicht geguckt.
Komischen Lehrer hast Du, wenn der das nicht sieht!
MfG
Peter
//Edit: ach ja, bevor ich es vergesse ... demnächst bitte: neue Frage - neuer Thread!
JackSnake - Sa 27.12.03 22:35
@ Peter Lustig
hallo, der Fehler mit dem StringGrid war offentsichtlich. Ich hab das dämlicherweise übersehen: muss nur anstatt ">" "=" setzen.
aber der zweite Fehler existiert immer noch. das mit dem Begin und End hab ich versucht.
JackSnake
Christian S. - Sa 27.12.03 23:11
Hallo!
zu (1): wenn Du es so machst, wie ich geschrieben habe, kannst Du das ganze ohne eine Abfrage mit ">" oder "=" oder sonst was machen. Ist kürzer und übersichtlicher. Und funktioniert bei jeder Wortlänge.
zu (2): bitte poste da mal Deinen Code.
MfG
Peter
JackSnake - So 28.12.03 18:35
hier ist der Code
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61:
| procedure TForm1.BitBtn4Click(Sender: TObject); begin if length(Edit1.Text)=1 then begin Raten:=Edit1.Text; Buchstabe:=Raten[1]; Wortlaenge:=length(Wort); for i:=1 to wortlaenge do m:= m + [Wort[i]];
a:=ord(Buchstabe); if ord(Buchstabe)>=97 then a:=a-32; Buchstabe:=chr(a);
if Buchstabe IN m then begin for i:=1 to Wortlaenge do if Buchstabe=Wort[i] then Schreiben(i,Buchstabe) end else begin Label6.Caption:=Label6.Caption+Buchstabe+' '; zaehler:=Zaehler+1; Zeichnen; end; end;
if length(Edit1.Text)>1 then begin Loesung:=Edit1.Text; Loesungslaenge:=length(Loesung); for j:=1 to Loesungslaenge do b:=ord(Loesung[j]); if ord(Loesung[j])>=97 then b:=b-32 else b:=ord(Loesung[i]); Loesung[j]:=chr(b); for j:=1 to Loesungslaenge do n:=n+[Loesung[j]];
Wortlaenge:=length(Wort); for i:=1 to wortlaenge do m:= m + [Wort[i]];
if n=m then begin for i:=1 to Loesungslaenge do begin x:=Loesung[i]; Schreiben(i,x); end; Form2.ShowModal; end else begin Zaehler:=Zaehler+1; Zeichnen; end; end;
Edit1.SetFocus; end; |
Wenn du noch etwas anderes brauchst, hier ist noch mal der Link zum Download:
http://hometown.aol.de/Alexander54536/Galgenmaennchen.zip
Moderiert von
Peter Lustig: Code- durch Delphi-Tags ersetzt
Christian S. - So 28.12.03 18:53
Hallo!
Du hast die Stelle, von der ich sagte, dass dort ein Fehler liegt, ja gar nicht ausgebessert! :x
Hier nochmal die Stelle, die ich meine:
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| for j:=1 to Loesungslaenge do b:=ord(Loesung[j]); if ord(Loesung[j])>=97 then b:=b-32 else b:=ord(Loesung[i]); Loesung[j]:=chr(b); for j:=1 to Loesungslaenge do n:=n+[Loesung[j]]; |
In der ersten Schleife wird ausschließlich der Befehl "b:=ord(Loesung[j])" ausgeführt, alle Befehle, die danach kommen, werden nicht ausgeführt! Du musst mit "begin" und "end" arbeiten.
Außerdem verstehe ich nicht ganz, was das i (ganz am Ende) in dieser Zeile zu suchen hat:
if ord(Loesung[j])>=97 then b:=b-32 else b:=ord(Loesung[i]);Ich glaube, das ist falsch. Der ganze else-Zweig kommt mir komisch vor.
Dann stehen da zwei identische Schleifen direkt nacheinander, die kann man bestimmt zusammenfassen.
MfG
Peter
JackSnake - Sa 03.01.04 16:09
Hallo!
| Zitat: |
Du hast die Stelle, von der ich sagte, dass dort ein Fehler liegt, ja gar nicht ausgebessert!
|
Sei nicht böse. Das hab ich schon probiert. :( Der Quelltext ist noch von dem noch nicht korrigierten Text.
Aber leider funktioniert es bei dir immer noch nicht, trotz der Korrigierung. Läuft es bei dir etwa?
| Zitat: |
Außerdem verstehe ich nicht ganz, was das i (ganz am Ende) in dieser Zeile zu suchen hat:
:
if ord(Loesung[j])>=97 then b:=b-32 else b:=ord(Loesung[i]);
|
Das i soll j sein.
| Zitat: |
Ich glaube, das ist falsch. Der ganze else-Zweig kommt mir komisch vor. |
Wo du jetzt sagst, fällt mir das auch auf. Der else Teil kann man theoretisch weglassen, oder?
JackSnake
Christian S. - Sa 03.01.04 16:31
Hallo!
Um dieses Debakel jetzt mal zu beenden, wenn Du den von mir beanstandeten Teil durch Folgendes ersetzt, dann läuft es:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7:
| for j:=1 to Loesungslaenge do begin b:=ord(Loesung[j]); if ord(Loesung[j])>=97 then b:=b-32; Loesung[j]:=chr(b); n:=n+[Loesung[j]]; end; |
MfG
Peter
JackSnake - Mo 12.01.04 16:34
Hallo Peter Lustig,
das funktioniert wirklich. Ich hatte in dem Wordfeld aber nur das Wort 'Matrix' gewählt, und es funktionierte nicht und funktioniert immer noch nicht.
| Zitat: |
Um dieses Debakel jetzt mal zu beenden, wenn Du den von mir beanstandeten Teil durch Folgendes ersetzt, dann läuft es:
|
hast ja gemeint, bei dir läuft es. Dann hab ich mit einem anderen Wort ausprobiert und es ging in der Tat.
Vielleicht hängt es mit der Matrix zu tun, mit der Anomalie... 8)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!