Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Seltsame Pfadbearbeitung (https://www.delphipraxis.net/202667-seltsame-pfadbearbeitung.html)

Delbor 26. Nov 2019 11:19

Delphi-Version: 10.3 Rio

Seltsame Pfadbearbeitung
 
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:

Delphi-Quellcode:
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.

Klaus01 26. Nov 2019 11:25

AW: Seltsame Pfadbearbeitung
 
.. 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

Klaus01 26. Nov 2019 11:49

AW: Seltsame Pfadbearbeitung
 
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

Delbor 26. Nov 2019 11:51

AW: Seltsame Pfadbearbeitung
 
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

Klaus01 26. Nov 2019 11:55

AW: Seltsame Pfadbearbeitung
 
.. 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

Delbor 26. Nov 2019 12:18

AW: Seltsame Pfadbearbeitung
 
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

jaenicke 26. Nov 2019 12:26

AW: Seltsame Pfadbearbeitung
 
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.

Delbor 26. Nov 2019 12:55

AW: Seltsame Pfadbearbeitung
 
Hi jaenicke

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

Zitat:

Zitat von jaenicke (Beitrag 1452185)
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:

Delphi-Quellcode:
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

jaenicke 26. Nov 2019 18:38

AW: Seltsame Pfadbearbeitung
 
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.

Zitat:

Zitat von Delbor (Beitrag 1452190)
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).

Delbor 26. Nov 2019 21:48

AW: Seltsame Pfadbearbeitung
 
Hi jaenicke

Zitat:

Zitat von jaenicke (Beitrag 1452230)
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...

Zitat:

Zitat von jaenicke (Beitrag 1452230)
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.

Zitat:

Zitat von jaenicke (Beitrag 1452230)
Zitat:

Zitat von Delbor (Beitrag 1452190)
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


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:00 Uhr.
Seite 1 von 2  1 2      

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