Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Konstantenobjekt kann nicht als VarParameter übergeben werde (https://www.delphipraxis.net/103925-konstantenobjekt-kann-nicht-als-varparameter-uebergeben-werde.html)

Aurelius 24. Nov 2007 13:57


Konstantenobjekt kann nicht als VarParameter übergeben werde
 
Hallo DP'ler :hi:

Ich nutze diesen Code um beim Drag&Drop die Dateien in eine Listbox zu übernehmen. Das Ganze will ich auch mit einem ordnermachen, d.h. der ordner wird gescannt und die Dateien so:llen eingefügt werden.
Delphi-Quellcode:
procedure FindAllFiles(var FileList: tstrings;RootFolder: string; Mask: string =
  BassDllPlayerFileFilter; Recurse: Boolean = True);
var
  SR: TSearchRec;
begin
  RootFolder := IncludeTrailingPathDelimiter(RootFolder);

  if Recurse then
    if FindFirst(RootFolder + '*.*', faAnyFile, SR) = 0 then
    try
      repeat
        if SR.Attr and faDirectory = faDirectory then
            // --> ein Verzeichnis wurde gefunden
            //   der Verzeichnisname steht in SR.Name
            //   der vollständige Verzeichnisname (inkl. darüberliegender Pfade) ist
            //       RootFolder + SR.Name
          if (SR.Name <> '.') and (SR.Name <> '..') then
            FindAllFiles(FileList, RootFolder + SR.Name, Mask, Recurse);
      until FindNext(SR) <> 0;
    finally
      FindClose(SR);
    end;
  if FindFirst(RootFolder + Mask, faAnyFile, SR) = 0 then
  try
    repeat
      if SR.Attr and faDirectory <> faDirectory then
      begin
          // --> eine Datei wurde gefunden
          //   der Dateiname steht in SR.Name
          //   der vollständige Dateiname (inkl. Pfadangabe) ist
          //       RootFolder + SR.Name
        FileList.Add(RootFolder + SR.Name);
      end;
    until FindNext(SR) <> 0;
  finally
    FindClose(SR);
  end;
end;

procedure TfrmMain.WMDROPFILES(var Msg: TMessage);
var
  i, Counts, Size: Integer;
  PCharFileName: Pchar;
  Ordner: string;
begin
  inherited;
...
    If FileGetAttr(String(PCharFileName)) = faDirectory then
      begin
        Ordner := String(PcharFileName);
        FindAllFiles(frmMain.lsbPlaylist.Items,Ordner,BassDllPlayerFileFilter,TRUE);
      end
      else lsbPlaylist.Items.Add(String(PCharFileName));
    StrDispose(PCharFileName);
  end;
...
end;
Beim FindAllFiles sagt mir der Compiler aber:
Konstantenobjekt kann nicht als Var-Parameter übergeben werden

Wie kann ich das Problem lösen? Und wieso ist Ordner eine Konstante?

Apollonius 24. Nov 2007 14:06

Re: Konstantenobjekt kann nicht als VarParameter übergeben w
 
Das Problem liegt bei der Stringliste - du kannst Eigenschaften (hier Items) nicht als var-Parameter übergeben, da sie ja möglicherweise über einen Getter gelesen werden und Funktionsergebnisse nicht geändert werden können.
Du brauchst aber auch gar keinen var-Parameter, da TStrings eine Klasse ist und Klassen immer per Referenz übergeben werden. Du kannst also ohne Probleme aus dem var ein const machen.

Christian Seehase 24. Nov 2007 14:09

Re: Konstantenobjekt kann nicht als VarParameter übergeben w
 
Moin Zusammen,

dazu noch eine kleine Anmerkung:
Das nicht als const-Parameter zu übergeben halte ich für sträflichen Leichtsinn, denn man will ja, i.d.R., mit der übergebenen Instanz etwas machen, und nicht den Zugriff auf diese zerstören, was bei einem var-Parameter leicht passieren kann (zumindest wird man nicht gewarnt, wenn man es tut)


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:08 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 by Thomas Breitkreuz