AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Seltsame Pfadbearbeitung

Ein Thema von Delbor · begonnen am 26. Nov 2019 · letzter Beitrag vom 27. Nov 2019
Antwort Antwort
Seite 1 von 2  1 2      
Delbor

Registriert seit: 8. Okt 2006
Ort: St.Gallen/Schweiz
1.186 Beiträge
 
Delphi 11 Alexandria
 
#1

Seltsame Pfadbearbeitung

  Alt 26. Nov 2019, 12:19
Delphi-Version: 10.3 Rio
Hi zusammen
Mit folgender Prozedur will ich eine Inidatei erstellen:
Delphi-Quellcode:
function TOpenFileFrame.ChangeFolderIcon(LDeskIniPath, LBmpFile: String; IconIndex: Integer): Boolean;
  var desktopini: TIniFile; LDesktopIniParent : String;
begin
  LDeskIniPath := IncludeTrailingPathDelimiter(LDeskIniPath);
  [B]LDesktopIniParent := ExtractFilePath(LDeskIniPath);[/B]
  ShowMessage('LDeskIniPath := ' + LDeskIniPath +sLineBreak+
              'LDesktopIniParent := ' + LDesktopIniParent +sLineBreak+
              '**************************************');
  try
    if DirectoryExists(LDesktopIniParent) then
    begin
      desktopini := TIniFile.Create(LDeskIniPath);
      try
        desktopini.WriteString('.ShellClassInfo', 'IconFile', LBmpFile);
        desktopini.WriteInteger('.ShellClassInfo', 'IconIndex', IconIndex);
      finally
        desktopini.Free;
        Result := true;
      end;
    end
    else
    begin
      Application.MessageBox('Error: The Foldericon could not change!' + #13#10 + 'Directory doesn''t exist!', 'Error', 16 + 0); // Warnkreuz + OK-Button
      Result := false;
      exit;
    end;
  except
    Application.MessageBox('Error: The Foldericon could not change!', 'Error', 16 + 0); // Warnkreuz + OK-Button
    Result := false;
    exit;
  end;
end;
Dabei liefert mir mein ShowMessage:
Delphi-Quellcode:
  ShowMessage('LDeskIniPath := ' + LDeskIniPath +sLineBreak+
              'LDesktopIniParent := ' + LDesktopIniParent +sLineBreak+
              '**************************************');
folgendes:
Zitat:
[Window Title]
HilfeTest-Projekt

[Content]
LDeskIniPath := F:\Embarcadero Project Corner\Delphi Tokio TestCorner\HTML-HelpCorner\HelpTestApp\desctop.ini\
LDesktopIniParent := F:\Embarcadero Project Corner\Delphi Tokio TestCorner\HTML-HelpCorner\HelpTestApp\desctop.ini\
**************************************

[OK]
Die erste Zeile ist korrekt, nicht aber die zweite. Denn die soll lediglich den Ordner angeben, in dem die Inidatei erzeugt werden soll/enthalten ist.

Diese Zeile:

LDesktopIniParent := ExtractFilePath(LDeskIniPath);

sollte, wenn ich die Help nicht komplett falsch verstanden habe, den Inhalt von LDesktopIniParent so setzen:
Zitat:
F:\Embarcadero Project Corner\Delphi Tokio TestCorner\HTML-HelpCorner\HelpTestApp\
Macht sie aber offensichtlich nicht. Was mache ich falsch?

Gruss
Delbor

PS: Die Funktion entstand aufgrund dieses Beispiels.
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht.
Frei nach Albert Einstein
http://roase.ch

Geändert von Delbor (26. Nov 2019 um 12:32 Uhr) Grund: Quelle hinzugefügt
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.771 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Seltsame Pfadbearbeitung

  Alt 26. Nov 2019, 12:25
.. was steht denn in dem Parameter/Argument LDeskIniPath?

Dem Parameter fügst Du noch ein "\" am Ende hinzu.
ExtractFilePath gibt Dir alles bis zum letzten "\" zurück.

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.771 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Seltsame Pfadbearbeitung

  Alt 26. Nov 2019, 12:49
Delphi-Quellcode:
function TOpenFileFrame.ChangeFolderIcon(LDeskIniPath, LBmpFile: String; IconIndex: Integer): Boolean;
  var desktopini: TIniFile; LDesktopIniParent : String;
begin
  LDesktopIniParent := ExtractFilePath(LDeskIniPath);
  LDeskIniPath := IncludeTrailingPathDelimiter(LDeskIniPath);
  ShowMessage('LDeskIniPath := ' + LDeskIniPath +sLineBreak+
              'LDesktopIniParent := ' + LDesktopIniParent +sLineBreak+
              '**************************************');
  try
    if DirectoryExists(LDesktopIniParent) then
    begin
      desktopini := TIniFile.Create(LDeskIniPath+'deskptop.ini');
      try
.. schaumal ob es so funktioniert.
Das von Dir verlinkte Beispiel weicht von Deiner Implementierung ab.

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
Delbor

Registriert seit: 8. Okt 2006
Ort: St.Gallen/Schweiz
1.186 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Seltsame Pfadbearbeitung

  Alt 26. Nov 2019, 12:51
Hi Klaus01

LDeskIniPath wird in der aufrufenden Prozedur initialisiert:
Delphi-Quellcode:
  LDeskIniPath := MainPage.ProjectPath + 'desctop.ini';
    ShowMessage('LDeskIniPath := ' + LDeskIniPath +sLineBreak+
                'LDeskIniPath := ' + ExtractFilePath(LDeskIniPath) +sLineBreak+
                '**************************************');

  LBmpFile:= LDeskIniPath + 'desctop.bmp';
  LBitmap.SaveToFile(LBmpFile);
  LiconIndex := 0;
  ChangeFolderIcon(LDeskIniPath, LBmpFile, LiconIndex);
Gruss
Delbor
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht.
Frei nach Albert Einstein
http://roase.ch
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.771 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Seltsame Pfadbearbeitung

  Alt 26. Nov 2019, 12:55
.. gut was dann passiert:

Pfad +'desktop.ini'
hier trailingPathDelimiter anfügen
Pfad+'desktop.ini\' hier ist also eine Pfad aus dem Dateinamen geworden.
extractFilePath(Pfad+'desktop.ini\') -> Pfad+'desktop.ini\'

Grüße
Klaus
Klaus

Geändert von Klaus01 (26. Nov 2019 um 12:58 Uhr)
  Mit Zitat antworten Zitat
Delbor

Registriert seit: 8. Okt 2006
Ort: St.Gallen/Schweiz
1.186 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Seltsame Pfadbearbeitung

  Alt 26. Nov 2019, 13:18
Hi Klaus01

Showmessage liefert jetzt korrekt:
[Window Title]
HilfeTest-Projekt

[Content]
LDeskIniPath := F:\Embarcadero Project Corner\Delphi Tokio TestCorner\HTML-HelpCorner\HelpTestApp\desctop.ini\
LDesktopIniParent := F:\Embarcadero Project Corner\Delphi Tokio TestCorner\HTML-HelpCorner\HelpTestApp\
**************************************

[OK]
Entsprechend deinem Beispiel habe ich lediglich zwei Codezeilen vertauscht.

Danke für deine Info:
Zitat:
.. gut was dann passiert:

Pfad +'desktop.ini'
hier trailingPathDelimiter anfügen
Pfad+'desktop.ini\' hier ist also eine Pfad aus dem Dateinamen geworden.
extractFilePath(Pfad+'desktop.ini\') -> Pfad+'desktop.ini\'
Vielen Dank für deine Hilfe!

Gruss
Delbor
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht.
Frei nach Albert Einstein
http://roase.ch
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.648 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Seltsame Pfadbearbeitung

  Alt 26. Nov 2019, 13:26
Deshalb benutzen wir immer const Parameter. Da kann man dann nicht aus Versehen einen der übergebenen Parameter ändern, nur um sich dann zu wundern, dass er irgendwo in der Methode nicht mehr seinen Wert hat.
(Und nebenbei ist es in einigen Fällen schneller.)

Sprich:
Delphi-Quellcode:
function TOpenFileFrame.ChangeFolderIcon(const ADeskIniPath, ABmpFile: String; const AIconIndex: Integer): Boolean;
  var ADesktopIni: TIniFile; const ADesktopIniParent: String;
Wobei wir auch keine Objektreferenzen als var-Parameter verwenden würden.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Delbor

Registriert seit: 8. Okt 2006
Ort: St.Gallen/Schweiz
1.186 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Seltsame Pfadbearbeitung

  Alt 26. Nov 2019, 13:55
Hi jaenicke

Auch dir vielen Dank - die Sache mit den Const-Parametern sollte ich mir wohl angewöhnen.

Delphi-Quellcode:
function TOpenFileFrame.ChangeFolderIcon(const ADeskIniPath, ABmpFile: String; const AIconIndex: Integer): Boolean;
  var ADesktopIni: TIniFile; const ADesktopIniParent: String;
Wobei wir auch keine Objektreferenzen als var-Parameter verwenden würden.
Die Untere Zeile deklariert allerdings lokale Variablen, wobei ich da gleich mehrere Vorgaben des Styleguids verletze:
Delphi-Quellcode:
function TOpenFileFrame.ChangeFolderIcon(LDeskIniPath, LBmpFile: String; IconIndex: Integer): Boolean;
  var desktopini: TIniFile; LDesktopIniParent : String;
Die Parameter heissen hier genau gleich wie die lokalen Vaiablen in der aufrufenden Methode, in dem sie mit einem 'L' beginnen anstatt mit einem 'A'.
Vom Styleguid abweichend ist auch mein Umgang mit der Deklaration lokaler Variablen: das einleitende 'var' befindet sich immer eingerückt in der ersten Zeile der lokalen Deklarationen, während die Parameterliste mit der abschliesseden Klammer und bei Funktionen der Typangabe(hier Boolean) sich auch schon mal auf 2 Zeilen erstrecken kann.
Das, was du als Var-Parameter gelesen hast, ist also eigentlichschon eine lokkale Varable.
Das ist sozusagen mein 'Erbe' aus Delphi-1-Tagen, macht meines Erachtens aber durchaus Sinn, da dadurch oft etliche Zeilen eingespart werden können.
Andrerseits kann ich mit Konstrukten wie:

procedure foo; begin if x mod 2 = 0 then y:= a+b;end;

herzlich wenig anfangen, auch wenn dies in Pascal (noch?) möglich ist.


Gruss
Delbor
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht.
Frei nach Albert Einstein
http://roase.ch

Geändert von Delbor (26. Nov 2019 um 14:45 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.648 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: Seltsame Pfadbearbeitung

  Alt 26. Nov 2019, 19:38
Oh, ja, ich sollte nicht ganz so schnell lesen. Die Einrückung ist eigentlich für zu lange Zeilen mit Parametern üblich, so dass ich die Klammerung glatt übersehen habe.

Das ist sozusagen mein 'Erbe' aus Delphi-1-Tagen, macht meines Erachtens aber durchaus Sinn, da dadurch oft etliche Zeilen eingespart werden können.
Das Einsparen von Zeilen ist aber genau nicht sinnvoll, unter anderem weil man so Diffs in der Versionsverwaltung viel schlechter lesen kann, von Merges ganz zu schweigen.

Wir halten uns schlicht an den Styleguide, dann gibt es auch keine Unklarheiten, der Code ist sauber strukturiert und wir können jederzeit den Codeformatter ausführen (in den aktuellen Quelltexten meistens ohne Änderungen).
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Delbor

Registriert seit: 8. Okt 2006
Ort: St.Gallen/Schweiz
1.186 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: Seltsame Pfadbearbeitung

  Alt 26. Nov 2019, 22:48
Hi jaenicke

Wir halten uns schlicht an den Styleguide, dann gibt es auch keine Unklarheiten, der Code ist sauber strukturiert und wir können jederzeit den Codeformatter ausführen (in den aktuellen Quelltexten meistens ohne Änderungen).
In einem Team mit Bestimmtheit unverzichtbar. 12 Mitarbeiter und 13 Formatierungen - schlicht fürchterlich...

Oh, ja, ich sollte nicht ganz so schnell lesen. Die Einrückung ist eigentlich für zu lange Zeilen mit Parametern üblich, so dass ich die Klammerung glatt übersehen habe.
Lokale Deklarationszeilen sollten meines Erachtens aber immer kürzer und deutlich von Kopfzeilen unterscheidbar sein. Hier hab ich das offenbar zuwenig beachtet.

Das ist sozusagen mein 'Erbe' aus Delphi-1-Tagen, macht meines Erachtens aber durchaus Sinn, da dadurch oft etliche Zeilen eingespart werden können.
Das Einsparen von Zeilen ist aber genau nicht sinnvoll, unter anderem weil man so Diffs in der Versionsverwaltung viel schlechter lesen kann, von Merges ganz zu schweigen.
An die Versionsverwaltung hab ich dabei nicht gedacht. Auch wenn ich sowas noch korrigiere, wärs in Sachen 'Zeilenverschwendung' nicht ganz so tragisch:
Delphi-Quellcode:
[Prozedurkopf]
var
  desktopini: TIniFile; LDesktopIniParent : String;
begin
Auf der andern Seite der Akzeptanzskala steht zB. solches:
Delphi-Quellcode:
procedure TOpenFileFrame.TVFilesExplorerEdited(Sender: TObject; Node: TTreeNode;
  var S: string);
var
  NameRec: PNameRec;
  LBitMap: TBitmap;
  LiconIndex :Integer;
  LIsdirectory,
  LIsDB: Boolean;
  ImageList : TDataObjectlist<TBitmap>;
  LCaption,
  LBmpFile,
  LRealName,
  LDeskIniPath: string;
begin
Da geschieht noch rein gar nichts, trotzdem ist ein durchschnittlicher Bildschirm schon zu einem guten Teil 'zugemüllt'.

Gruss
Delbor
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht.
Frei nach Albert Einstein
http://roase.ch

Geändert von Delbor (26. Nov 2019 um 22:50 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:13 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