Announcement

Collapse
No announcement yet.

REGISTRY

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • REGISTRY

    Hallo miteinander !

    Hallo zusammen

    Ich bastel grad an einem Registry eintrag rum ..

    Alsoooo *g* wenn ein angemeldeter User das Prog beendet soll er beim nächsten Login das Prog genauso vorfinden wie er es verlassen hat, sprich panels geöffnet TabSheet usw.

    Hab das ganze schon mit TFormStorage schon versucht .. aber auch das funktioniert nicht ..

    hat irgendwer eine idee? Bin über jede antwort froh!
    Danke XEN

  • #2
    uuuuups doppelt gepostet *g

    Comment


    • #3
      Hallo Xenon,

      falls Du ein paar $ augeben kanst würde ich dir TElFormPersist aus dem <a href="http://www.eldos.org/elpack/custom.html">ElPack</a> empfehlen.

      Beschreibung dazu:<br>
      ElFormPersist component allows to save and restore form's properties (state, size, position, active control, TopMost state) and components' properties in the ElIniFile (and in Registry). It may be also used to prevent form resize, and to make the form TopMost. The data is stored when the form is being hidden or destroyed. The data is restored when the form is being shown. Components properties list to save and restore can be defined in design-time using a hierarchical editor (yes, ElTree is here too . When the data is saved or restored, events are fired so you can adjust your program's properties if needed

      Comment


      • #4
        Hallo,

        also ich verwende für das Lesen/Speichern von Programmeinstellungen in der Registry normalerweise das sehr flexible Object TRegistryIniFile, so dass ich mit einem Compiler-Schalter einfach zwischen Registry und Ini-Datei hinundherschalten kann. Ich gehe folgendermaßen vor:

        (1) <B>Ini-Datei oder Registry-Objekt erzeugen:</B>
        <PRE>
        {$DEFINE USE_REGISTRY}
        // deaktivieren für Zugriff auf Ini-Datei!

        const
        RegAppPath = 'SOFTWARE\<author>\<prog>';
        // <author> und <prog> anpassen!

        function CreateIni : TCustomIniFile;
        begin
        {$IFDEF USE_REGISTRY}
        result := TRegistryIniFile.Create(RegAppPath);
        {$ELSE}
        result := TIniFile.Create(ChangeFileExt(Application.ExeName) , '.ini');
        // Ini-Datei im selben Verzeichnis wie die
        // Exe-Datei
        {$ENDIF}
        end;
        </PRE>

        (2) <B> Routine zum Speichern in Registry/Ini-Datei schreiben </B>
        <PRE>
        procedure TMainForm.SaveToIni;
        var
        ini : TCustomIniFile;
        begin
        ini := CreateIni;
        try
        // Als Beispiel:
        // Koordinaten der linken oberen MainForm-
        // Ecke speichern
        ini.WriteInteger('MainForm', 'Top', MainForm.Top);
        ini.WriteInteger('MainForm', 'Left',
        MainForm.Left);
        // usw.
        finally
        ini.Free;
        end;
        end;
        </PRE>

        (3) <B>Die Speicher-Routine aufrufen </B>
        <P>
        In der Regel verwende ich dafür das OnCloseQuery-Event des Hauptformulars; meiner Erfahrung nach wird OnClose nicht immer aufgerufen, und OnDestroy kommt manchmal zu spät, wenn nicht mehr alle Eigenschaften zur Verfügung stehen. Falls eine Ini-Datei verwendet wird und das Programm von CD-ROM laufen soll, muss man mit try/except dafür Sorge tragen, dass die Ini-Datei nicht geschrieben werden kann (sonst kann das Programm nicht beendet werden...):
        <PRE>
        procedure TMainForm.FormCloseQuery(Sender:TObject; var CanClose:boolean);
        begin
        try
        SaveToIni;
        except
        MessageDlg('Die Programmeinstellungen konnten nicht in der Ini-Datei gespeichert werden.',
        mtError, [mbOK], 0);
        end;
        end;
        </PRE>

        (4) <B>Eine Methode zum Lesen der Registry/Ini-Datei schreiben</B>
        <PRE>
        procedure TMainForm.LoadFromIni;
        var
        ini : TCustomIniFile;
        begin
        ini := CreateIni;
        try
        // Als Beispiel:
        // Position der linken/oberen Formularecke
        // einlesen. Dazu Property "Position" auf
        // poDesigned setzen, sonst funktioniert's
        // nicht!
        MainForm.Position := poDesigned;
        MainForm.Top := ini.ReadInteger('MainForm', 'Top', MainForm.Top);
        MainForm.Left := ini.ReadInteger('MainForm', 'Left', MainForm.Left);
        // usw.
        finally
        ini.Free;
        end;
        end;
        </PRE>

        (5) <B>Lese-Routine aufrufen</B>
        <P>
        Dies erledige ich in der Regel im OnCreate-Event des Formulars. Manchmal ist dies zu früh, dann schreibe ich für MainForm eine öffentliche "BeforeRun"-Methode, die ich von der Projekt-Datei aus vor "Application.Run" aufrufe.

        <PRE>
        procedure TMainForm.FormCreate(Sender:TObject);
        begin
        LoadFromIni;
        end;
        </PRE>
        <P>
        Zugegebenermaßen, etwas Schreibarbeit, aber das hat bisher immer funktioniert...
        <P>
        Gruß, Werne

        Comment

        Working...
        X