Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Lazarus (IDE) (https://www.delphipraxis.net/81-lazarus-ide/)
-   -   problem mit ini erstellen (https://www.delphipraxis.net/167392-problem-mit-ini-erstellen.html)

Markus 27. Mär 2012 17:23

problem mit ini erstellen
 
Ich hab ein kleines Problem... ich habe ein Programm, dass eine text datei (.iim format) erstellt. damit die datei erstell werden kann muss man erst das outputverzeichnis anlegen.. soweit sogut.. hat alles prima geklappt bis jetzt.. ich will das programm aber später kostenlos zum download zur verfügung stellen und dann soll das outputverzeichnis automatisch in einem ordner gespeichert werden (C:\User\Username\Documents\iMacros\Macros) da ich ja nicht den Usernamen von jedem der sich das runterlädt weiß, lass ich den einfach durch eine funktion herausfinde, das klappt auch immernoch..
ich poste hier jetzt erstmal den code

Code:
unit Unit2;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
  StdCtrls, IniFiles, Windows;

type

  { TForm2 }

  TForm2 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    procedure Button1Click(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  Form2: TForm2;
  output, iniout: string;
  ini : TIniFile;
  Result : string;

implementation

{ TForm2 }

function GetCurrentUserName: string;
const
  cnMaxUserNameLen = 254;
var
  sUserName: string;
  dwUserNameLen: DWORD;
begin
  dwUserNameLen := cnMaxUserNameLen - 1;
  SetLength(sUserName, cnMaxUserNameLen);
  GetUserName(PChar(sUserName), dwUserNameLen);
  SetLength(sUserName, dwUserNameLen);
  Result := sUserName;
end;

procedure TForm2.Button1Click(Sender: TObject);
begin
  Result := (GetCurrentUserName);
  output := edit1.Text;
  form2.visible := false;
  ini := TIniFile.Create ('C:\Users\'+Result+'\Documents\iMacros\Macros\DS.ini');
  try
  ini.WriteString ('Einstellung', 'output', output);
  finally
  ini.Free;
  end;
end;
so wenn ich das ganze ohne das Result mache, also einfach den Usernamen, also in meinem fall markus dahinschreib dann speichert der das da auch ganz normal, aber so versucht der das bei mir jetzt nur unter C:\Users\Markus zu speichern, lässt also den ganzen rest einfach weg...
so kann mir dabei irgendjemand helfen?

ps: wenn das hier falsch ist wäre ich sehr dankbar wenn es an die richtige stelle verschoben wird

danke schonmal im vorraus

DeddyH 27. Mär 2012 17:38

AW: problem mit ini erstellen
 
Du solltest Deine globale Variable nicht unbedingt Result nennen, oder noch besser: sie gleich ganz weglassen. Was Du suchst, findest Du in der Unit SHFolder, damit bekommst Du den gewünschten Pfad heraus und musst Dich nicht auf C:\ festlegen. Such am Besten in der DP mal nach Hier im Forum suchenSHGetFolderPath, da solltest Du einige Beispiele finden.

P.S.: Willkommen in der DP :dp:

Popov 27. Mär 2012 18:00

AW: problem mit ini erstellen
 
@Markus

Hier ein Link zu einer von drei Units: http://www.delphi-forum.de/viewtopic...=247902#247902 . Diese (dritte) Unit speichert die Ini im Anwendungsdatenordner. Ändert man die Konstante CSIDL_APPDATA in CSIDL_PERSONAL, kann man auch in Dokumente Verzeichnis speichern. Du mußt die Unit nicht nutzen, aber das was du brauchst steht drin.

Dalai 27. Mär 2012 18:02

AW: problem mit ini erstellen
 
Autsch! Ich dachte, die Zeit hartkodierter Pfade wäre vorbei...:shock:

Erstens wird der Code nur auf Vista+ das "richtige" Verzeichnis finden und zweitens wird das auf Vista+ auch nur dann funktionieren, wenn der Nutzername exakt mit dem Namen des Verzeichnisses übereinstimmt. Punkt 1 sollte klar sein, denn das Profilverzeichnis liegt bei den versch. Windows-Versionen woanders. Bei Win2k/XP ist es sogar noch lokalisiert = an die Landessprache angepasst und vom Laufwerk C: will ich jetzt nicht auch noch anfangen...

Punkt 2 erkläre ich mal etwas näher: Ich erstelle ein Benutzerkonto "Willi", das es bisher noch nicht gab. Die erste Anmeldung dieses Benutzers erstellt das Verzeichnis "Willi" im Profilverzeichnis. Später fällt mir ein, dass der Benutzername doch nicht so toll ist und ich benenne ihn um in "Hans". Ergebnis: Das Benutzerkonto bleibt liegen in "Willi", deine Funktion wird aber "Hans" als Nutzername ermitteln und versucht, dort zu speichern, was natürlich nicht funktionieren kann (es sei denn, das Programm läuft als Admin = böse).

Also bitte unbedingt entsprechende API-Funktionen wie SHGetFolderPath oder SHGetKnownFolderPath (erst ab Vista verfügbar!) benutzen, um die gewünschten Verzeichnisnamen zu ermitteln.

MfG Dalai


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