![]() |
TStringList Max String länge
Vielleicht hat jemand eine Idee.
Wenn ich ca 100 Dateien zu einer TStringList addieren möchte bei dem der Pfad zu diesen extrem lang ist kracht es in Delphi gewaltig beim Debugen. Was ich dann machen muss ist soviele Dateien entfernen so das die maximale stringlänge nicht überschritten wird. Irgendwo kann es das aber nicht sein. Hab mir überlegt nur den Dateinamen zu übergeben dann hab ich aber das problem das ich dann keine recursive suche mehr durchführen kann da in diesen Fall der Pfad nicht mehr bekannt ist. Habe da schon so viel versucht scheitere aber immer an der länge des Pfads(string) Also die Frage wie würdet ihr das lösen ? gruss Emil |
Re: TStringList Max String länge
Anderer Vorschlag:
TList mit PChar statt TStringList. |
Re: TStringList Max String länge
Hallo,
beim Debuggen oder auch zur Laufzeit. was heisst "krachen" Heiko |
Re: TStringList Max String länge
Ich tippe eher darauf das das "Krachen" in der Stringlist durch einen anderen Fehler verursacht wird.
Kannst du ein Minimalbeispiel posten wo dieses Verhalten auftritt? |
Re: TStringList Max String länge
Beispiel:
Zitat:
Das ist einer. Zitat:
Zitat:
Nun kann man sich vorstellen wie lang der String wird wenn ich 100 Ordner addiere. Zitat:
Beim Debugen Wenn die Exe Kompiliert ist also außerhalb der IDE gestarte wird funktioniert es. Das ist der aufruf
Delphi-Quellcode:
function GlobalFindPlugins(Kind: TBASSVIS_KIND_T;
Vispath: PAnsiChar; flags: DWord; Delimiter: AnsiChar = ','): PAnsiChar; Zitat:
Was ich noch dabei sagen muss die liste wird aus einer DLL übergeben gruss Emil |
Re: TStringList Max String länge
Zitat:
Kann das nur beseitigen indem ich einige Ordner entferne. Der Code... Beispiele ist schlecht da aus DLL changed kein code problem Gruss EMil |
Re: TStringList Max String länge
Kann es eher sein das hier eine Windows-Eigenheit zuschlägt das Dateinamen/Pfad nur aufgelöst werden können wenn sie < 255 Zeichen sind bzw. weniger als 255 Zeichen vom aktuellen pfad entfernt sind?
|
Re: TStringList Max String länge
Zitat:
Deshalb meine Frage wie ich das anderes lösen kann. Am Code liegt es nicht .. der ist in Ordnung da ändert auch nichts dran wenn ich TList verwende. Wie gesagt wenn ich nur das Plugin übergeben hätte ich kein problem mehr mit der länge des String Kann aber dann den Pfad nicht übergeben was bedeute das recursive suchen wäre dann sinnlos. gruss Emil |
Re: TStringList Max String länge
Hallo Emil,
wie es ausschaut, wirst Du wohl nicht viel anderes übrigbleiben als Dir Dein eigenes ExtractFilePath zu schreiben. Die Routinen könnten in etwa so aussehen:
Delphi-Quellcode:
Kann man sicherlich noch eleganter machen ...
function extractFileName(s:string):String;
var i: Integer; begin i:= length(s); while (i > 0) and (s[i] <> '\') do begin dec(i); end; result := copy(s,i+1,length(s)-i+1); end; function extractFilePath(s:string):String; var i: Integer; begin i:= length(s); while (i > 0) and (s[i] <> '\') do begin dec(i); end; result := copy(s,1,i-1); end; Grüße Klaus |
Re: TStringList Max String länge
(sorry)
|
Re: TStringList Max String länge
Zitat:
gruss Emil |
Re: TStringList Max String länge
Ich übergebe den Pfad nun mit GetShortName ist das einzigste was mir einfällt.
Kann aber nicht sagen ob das jetzt wieder mit anderen Sprachen probleme macht. Was mir noch aufgefallen ist und ebenfalls mit zu dem Problem beiträgt ist das diese DLL "CosmicBelt.svp" ein exception auslößt. Wie kann man bei LoadLibrary das exception abfangen ohne das es zum crash kommt ?
Delphi-Quellcode:
hilft nix kracht trotzdem.
try
dll := LoadLibrary(PAnsiChar(APlugin)); except exit; end; gruss Emil |
Re: TStringList Max String länge
Zu deinem Problem mit dem Pfad:
Zitat:
![]() Zu deiner letzten Frage (eigentlich nur eine Frage pro Thread :roll: ) Versuch mal GetLastError auszulesen. Kann natürlich sein, das die DLL Fehler in ihrer DllMain()-Procedur hat und dort die Exception auftritt. Diese kannst du dann natürlich nicht abfangen. |
Re: TStringList Max String länge
Zu 1. Danke das ist gelößt mit GetShortName. Mehr kann ich da eh nicht machen :)
Zu 2. Die DLL wurde gepackt daher kam es zum Exception. Hab sie gelöscht und mir einen vermerk gemacht. Vielen Dank. gruss Emil |
Re: TStringList Max String länge
|
Re: TStringList Max String länge
Zitat:
Zitat:
|
Re: TStringList Max String länge
Zitat:
Denke das müßte reichen.
Delphi-Quellcode:
@Mutze1
procedure SearchFiles(PluginType: byte;
path: string; recurse: BOOL; var List :TStrings); var sr : TSearchrec; tmpPath: string; begin if (Path[length(path)] <> '\') then path := path + '\'; try tmpPath := GetShortName(Path); except if GetlastError = ERROR_INVALID_PARAMETER then tmpPath := Path; end; 1. da war ich schon daher auch die Idee mit GetShortName 2. Habe es mal mit SafeLoadLibrary() versucht das gleiche problem Die DLL ist mit Petite Kompremiert ![]() dieser scheint die Datei zerschossen zu haben oder es ist einfach nicht möglich diese dann mit LoadLibrary zu laden. trotzdem danke muss halt alles versuchen. gruss Emil |
Re: TStringList Max String länge
Denk aber daran, dass API-Funktionen keine Exception werfen, sondenr einen Fehlercode zurückgeben. Deine Funktion GetShortName muss also im Fehlerfall eine Exception werfen.
|
Re: TStringList Max String länge
Zitat:
Ist was falsch an meiner Error prüfung ? EDIT: Ach so verstehe jetzt was du meinst Hier mal die Funktion aus dem Forum hier...
Delphi-Quellcode:
var
ErrorCode: DWord;
Delphi-Quellcode:
gruss Emil
function GetShortName(sLongName: string): string;
var sShortName: string; nShortNameLen: Integer; begin SetLength(sShortName, MAX_PATH); nShortNameLen := GetShortPathName(PChar(sLongName), PChar(sShortName), MAX_PATH - 1); if (0 = nShortNameLen) then begin ErrorCode := ERROR_INVALID_PARAMETER; // Du meinst das hier in etwa ? Exit; end; SetLength(sShortName, nShortNameLen); Result := sShortName; end; |
Re: TStringList Max String länge
Zitat:
Zitat:
|
Re: TStringList Max String länge
@Muetze
Delphi-Quellcode:
Weil ich zu meiner schande gestehen muss das ich nur die hälfte von dem verstehe was da steht.
Und warum nutzt du dann nicht die im Text angegebene Möglichkeit über UNC Angaben um wenigstens auf eine Pfadtiefe von 32767 Zeichen zu kommen?
Habe nie English gelernt das einzige was ich verstehe ist Denglish aus der Werbung und (Computer English) oder wie man es sonst nennen will. gruss Emil |
Re: TStringList Max String länge
Guten Morgen Emil,
eingentlich brauchst Du nur \\?\ vor die PfadStrings schreiben, denn dann weiß Windows dass ein langer Pfadname folgt.
Delphi-Quellcode:
Grüße
s:=extractFileExt('\\?\'+Aplugin);
Klaus |
Re: TStringList Max String länge
Zitat:
Danke für die Info.. Und dann verkürzt Window den Pfad ? gruss Emil |
Re: TStringList Max String länge
Zitat:
Nö, die ExctractFileExt ruft eine Win-Api auf und die kommt dann mit den langen Pfadnamen zurecht. Grüße Klaus |
Re: TStringList Max String länge
Zitat:
Delphi-Quellcode:
überflüssig.
try
tmpPath := GetShortName(Path); except if GetlastError = ERROR_INVALID_PARAMETER then tmpPath := Path; end; Aber ich würde in der Funktion GetShortName eine Exception werfen. |
Re: TStringList Max String länge
Zitat:
Warum wäre dieser Block dann ungültig ?. Edit: Grmm .. glaube du meinst lediglich den Block nicht die abfrage.
Delphi-Quellcode:
das wäre es dann.tmpPath := GetShortName(Path); if GetlastError = ERROR_INVALID_PARAMETER then tmpPath := Path; end Edit Zitat:
Hab ich noch nichts mit zu tun gehabt Wie geht das ? @Klaus01 Zitat:
Hab jetzt verschiedene möglichkeiten. Die frage ist was nun am besten verwenden. gruss Emil |
Re: TStringList Max String länge
So könnte es zum Beispiel gehen:
Delphi-Quellcode:
Ich habe eine eigene Exceptionklasse abgeleitet, weil ich keine passende, fertige Exception gefunden habe.
resourcestring
rsEInvalidParameter = 'Der Parameter %s ist ungültig'; type EInvalidParameter = class(Exception) public constructor CreateFmt(Parameter: string); end; { EInvalidParameter } constructor EInvalidParameter.CreateFmt(Parameter: string); begin inherited CreateFmt(rsEInvalidParameter, [Parameter]); end; procedure TForm1.RaiseDemoException; begin Raise EInvalidParameter.CreateFmt('Foobar'); end; procedure TForm1.Button1Click(Sender: TObject); begin try RaiseDemoException; except on E: EInvalidParameter do ShowMessage(E.Message); end; end; |
Re: TStringList Max String länge
@Luckie
Danke schön .. Dann kann ich die noch ausbauen für etwaige andere überprüfungen. gruss Emil |
Re: TStringList Max String länge
Richtig du kannst dir da dann weitere Exceptions für deine speziellen Fälle deklarieren. Habe ich bei meiner Adress-Datenbank auch gemacht. Da habe ich zum Beispiel die Exeptions:
Delphi-Quellcode:
type
EArgumentNull = class(Exception) public constructor CreateFmt(const MethodeName: String; const Parameter: String); end; EXMLError = class(Exception) public constructor CreateFmt(const MethodeName: String; const Msg: String; const Parameter: String); end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:00 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