AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi ParamStr ParamStr(0), Bildschirmschoner und lange Dateinamen

ParamStr ParamStr(0), Bildschirmschoner und lange Dateinamen

Ein Thema von Delphi-Laie · begonnen am 27. Mai 2012 · letzter Beitrag vom 28. Mai 2012
Antwort Antwort
Seite 1 von 2  1 2   
Delphi-Laie

Registriert seit: 25. Nov 2005
1.474 Beiträge
 
Delphi 10.1 Berlin Starter
 
#1

AW: IniFile TIniFile und lange Dateinamen

  Alt 27. Mai 2012, 22:51
Sind Leerzeichen im Pfad? Und wenn ja, was passiert, wenn du ihn in Anführungszeichen setzt?
Leerzeichen nicht, auch nicht im Dateinamen. Allerdings lautet das Verzeichnis C:\Winnt.0, ob das schon zuviel ist? Was Du mit Anführungszeichen meinst, weiß ich nicht, ich arbeite ja mit Paramstr(0) und nicht mit in Anführungszeichen gesetzten Strings, die man an Stringvariablen übergibt.

Leerzeichen wäre(n) auch kein Argument dagegen, denn lange Dateinamen erlauben ja auch Leerzeichen in den Verzeichnis-/Dateinamen (was ja im weiteren Sinne dasselbe ist), auch mehrere Punkte usw. Die Konvention wird doch damit nicht verletzt (alles andere ließe Windows ja auch nicht zu). Wenn langnamentauglich, dann richtig oder eben gar nicht.

Ist doch jetzt auch nicht mehr wichtig. Paramstr(0) lieferte nur den kurzen Dateinamen zurück, warum auch immer, aber mit der Funktion in der verlinkten Diskussion ließ sich dieses (Fehl-?)Verhalten heilen.

Edit: Die Verliebtheit des ParamStr mit kurzen Dateinamen scheint auch andere vor Probleme gestellt zu haben, s. hier (dort wird allerdings ParamStr(1) verwendet, n.m.W. der Abruf des ersten Übergabeparameters).

Geändert von Delphi-Laie (27. Mai 2012 um 22:55 Uhr)
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#2

AW: IniFile TIniFile und lange Dateinamen

  Alt 27. Mai 2012, 23:07
Also lange oder kurze Dateinamen, das interessiert die Ini nicht. Ob du dem Ident als Wert einen langen Dateinamen oder ein Banane zuweist, ist ihm egal, solange die Zeile unter 1024 Zeichen bleibt. Auch interessieren ihn keine Leerzeichen. Das einzige ist, dass Anführungszeichen beim auslesen entfernt werden.

Zitat:
Paramstr(0) lieferte nur den kurzen Dateinamen zurück
Bei mir nicht.

Wenn du Lust hast, ich habe hier paar Units, z. B. EasyIniAppExe speichert alles in der Ini am Programm, wechselt man die Ini aus, wird alles in der Reg gespeichert, usw.
  Mit Zitat antworten Zitat
Delphi-Laie

Registriert seit: 25. Nov 2005
1.474 Beiträge
 
Delphi 10.1 Berlin Starter
 
#3

AW: IniFile TIniFile und lange Dateinamen

  Alt 27. Mai 2012, 23:21
Also lange oder kurze Dateinamen, das interessiert die Ini nicht. Ob du dem Ident als Wert einen langen Dateinamen oder ein Banane zuweist, ist ihm egal, solange die Zeile unter 1024 Zeichen bleibt. Auch interessieren ihn keine Leerzeichen. Das einzige ist, dass Anführungszeichen beim auslesen entfernt werden.

Zitat:
Paramstr(0) lieferte nur den kurzen Dateinamen zurück
Bei mir nicht.
Bei mir leider schon. Ich reduzierte das Problem auf das Minimale. Leg den beigelegten Bildschirmschoner bitte mal in ein relevantes Verzeichnis und starte ihn über das Fenster "Eigenschaften von Anzeige". Er gibt den Paramstr(0)-Dateinamen zurück, einmal vor, einmal nach Application.Run. In jedem Falle bei mir mit den heißgeliebten Tilden.

Danke, den Rest schaue ich mir an, wenn der Tag wieder heller ist.
Angehängte Dateien
Dateityp: zip Paramstrtest.zip (111,2 KB, 4x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#4

AW: IniFile TIniFile und lange Dateinamen

  Alt 27. Mai 2012, 23:22
Was ist ein relevantes Verzeichnis?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.374 Beiträge
 
Delphi 12 Athens
 
#5

AW: IniFile TIniFile und lange Dateinamen

  Alt 28. Mai 2012, 08:54
Besitzt du die Quellcodes deines Delphis?

Wie sieht der Code von ParamStr aus?
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Delphi-Laie

Registriert seit: 25. Nov 2005
1.474 Beiträge
 
Delphi 10.1 Berlin Starter
 
#6

AW: IniFile TIniFile und lange Dateinamen

  Alt 28. Mai 2012, 09:37
Mit "relevantem Verzeichnis" meinte ich eines für die Bildschirmschoner, also Windows (wie immer es auch benannt ist, früher gab es da ja noch Wahlfreiheit) oder sein Unterverzeichnis "System32". Die beiden kenne ich dafür. Also: Ein für die Bildschirmschoner relevantes Verzeichnis.

Bei mir liefert ParamStr(0), wenn (m)ein Bildschirmschonerprogramm aufgerufen wird, eben nur den kurzen Dateinamen (angehängtes Bild), der Grund liegt weiterhin im dunkeln. An einer fehlenden Path-Variable auf diese Verzeichnisse liegt es auch nicht. Hat jemand eine Idee? Falls nein, GetLongPahtName (bzw. dessen Kapselung) sind in der Lage, ParamStr(0)s Teilversagen auszugleichen.

Es muß jetzt mal heraus: Ich möchte nur mal ein größeres Programmierprojekt erleben, bei dem man nicht mit solchen unverhergesehenen Problemen, Widrigkeiten, ja Lästigkeiten zu kämpfen hat. Gibt es wahrscheinlich nicht, liegt wohl im Wesen der Programmiererei. Wenn ich so etwas beruflich täte, liefe ich Gefahr, irgendwann vor Frustration bis Wut einen Rappel zu bekommen.

Moderation: Soll ich den Titel dieser Diskussion umbenennen, z.B. in der Art: "ParamStr(0) liefert nur kurzen Dateinamen"?

himitsu: Habe ich, liegt in der System.pas, sieht so:

Delphi-Quellcode:
function ParamStr(Index: Integer): string;
var
  P: PChar;
  Buffer: array[0..260] of Char;
begin
  if Index = 0 then
    SetString(Result, Buffer, GetModuleFileName(0, Buffer, SizeOf(Buffer)))
  else
  begin
    P := GetCommandLine;
    while True do
    begin
      P := GetParamStr(P, Result);
      if (Index = 0) or (Result = '') then Break;
      Dec(Index);
    end;
  end;
end;
und scheint sich zumindest bis Delphi-Version 4 auch nicht zu verändern.
Angehängte Grafiken
Dateityp: jpg Paramstrtest.jpg (18,8 KB, 13x aufgerufen)

Geändert von Delphi-Laie (28. Mai 2012 um 10:02 Uhr)
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#7

AW: IniFile TIniFile und lange Dateinamen

  Alt 28. Mai 2012, 09:47
Jetzt mal nur eine dumme Frage, was ist an dem kurzen Pfad falsch, wieso stört es?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.374 Beiträge
 
Delphi 12 Athens
 
#8

AW: IniFile TIniFile und lange Dateinamen

  Alt 28. Mai 2012, 09:47
Schade, dann scheint das ein Problem bei MSDN-Library durchsuchenGetModuleFileName in dem alten Windows zu sein.
Hätte ja sein können, daß es bei dir noch nicht verbaut wurde.

Der erste Wert (0. Parameter) von MSDN-Library durchsuchenGetCommandLine ist nämlich noch schlimmer, da er genau dem Entspricht, wie der Aufruf passierte.
z.B. über die Konsole oder via ShellExecute mit relativem Pfad aufgerufen "meinprogramm" (ohne .exe), dann steht genau das "meinprogramm" darin.

Delphi-Referenz durchsuchenExpandFileName oder MSDN-Library durchsuchenGetFullPathName

[edit]
Wenn du es benutzt, um z.B. auf eine INI zuzugreifen ChangeFileExt(ParamStr(0), '.ini') , dann gibt es ein Problem, wenn es die INI noch nicht gibt und sie erstellt werden soll.
(OK, wobei es eh keine gute Idee ist, die INI nach C:\Windows oder ins Programmeverzeichnis legen zu wollen )

Außerdem ist der Kurzname der gleichnamigen INI nicht unbedingt identisch mit dem Kurznamen der EXE, selbst wenn die langen Namen übereinstimmen.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (28. Mai 2012 um 09:51 Uhr)
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#9

AW: IniFile TIniFile und lange Dateinamen

  Alt 27. Mai 2012, 23:27
Leg den beigelegten Bildschirmschoner bitte mal in ein relevantes Verzeichnis und starte ihn über ...
Hab ich, beide lang.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#10

AW: IniFile TIniFile und lange Dateinamen

  Alt 27. Mai 2012, 23:18
Leerzeichen nicht, auch nicht im Dateinamen. Allerdings lautet das Verzeichnis C:\Winnt.0, ob das schon zuviel ist? Was Du mit Anführungszeichen meinst, weiß ich nicht, ich arbeite ja mit Paramstr(0) und nicht mit in Anführungszeichen gesetzten Strings, die man an Stringvariablen übergibt.
meine.exe C:\Dies ist ein langer Pfad mit Leerzeichen\meine.ini Das sind für ParamStr 7 Parameter.
meine.exe "C:\Dies ist ein langer Pfad mit Leerzeichen\meine.ini" Das sind für ParamStr ein Parameter.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 09:14 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz