Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Konstantenausdruck erwartet in Funktionsdekleration (https://www.delphipraxis.net/114205-konstantenausdruck-erwartet-funktionsdekleration.html)

Darko 21. Mai 2008 12:13


Konstantenausdruck erwartet in Funktionsdekleration
 
Hallo!
Ich verwende bei mir im Programm die Funktion 'FindAllFiles'. Nun habe ich diese etwas abgeändert, weil ich bei verschiedenen Sachen verschiedene Memos brauche. Dazu habe ich die Dekleration folgendermaßen geändert:

Delphi-Quellcode:
procedure FindAllFiles(RootFolder: string; Mask: string = '*.*'; Recurse: Boolean = True; const MemoName: TMemo = Hauptform.Memo_Monitorfiles);
(...)
Fehlermeldung:
Zitat:

[Fehler] Unit2.pas(906): Konstantenausdruck erwartet

tomsel 21. Mai 2008 12:16

Re: Konstantenausdruck erwartet in Funktionsdekleration
 
so what?

Darko 21. Mai 2008 12:17

Re: Konstantenausdruck erwartet in Funktionsdekleration
 
Bin ich konfusiert. :P

Angel4585 21. Mai 2008 12:17

Re: Konstantenausdruck erwartet in Funktionsdekleration
 
MemoName weist du eine Variable zu, die akzeptiert aber nur Konstanten.

SirThornberry 21. Mai 2008 12:17

Re: Konstantenausdruck erwartet in Funktionsdekleration
 
als Standardwerte kannst du nur Konstanten verwenden. Du verwendest aber eine Variable (Instanz einer Klasse). Das geht nicht weil zum Zeitpunkt des compilierens die Werte schon benötigt werden und zu diesem Zeitpunkt ist deine Instanz ja noch nicht erzeugt weil noch nix ausgeführt wird.

@tomsel: Was willst du uns damit sagen? :gruebel:

hoika 21. Mai 2008 12:20

Re: Konstantenausdruck erwartet in Funktionsdekleration
 
Hallo,

const MemoName: TMemo = Hauptform.Memo_Monitorfiles

1. Der Compiler ermittelt zur Compile-Zeit den Namen.
Das kann er aber bei dir nicht, weil eine Variable / property ist.

2. MemoName -> TMemo ?
Wieso ist ein Memo-Name ein TMemo ?


Kurz: So wie du das hier machen willst, geht es nicht.


Heiko

Darko 21. Mai 2008 12:39

Re: Konstantenausdruck erwartet in Funktionsdekleration
 
OK, hab das Ganze jetzt als String deklariert und funktioniert auch soweit.
Nun wollte ich das jeweilige Memo über FindComponent suchen lassen, allerdings kennt Delphi FindComponent nun nicht. :/

Delphi-Quellcode:
TMemo(FindComponent(MemoName)).Lines.Add(RootFolder + SR.Name);
Zitat:

[Fehler] Unit2.pas(952): Undefinierter Bezeichner: 'FindComponent'

shmia 21. Mai 2008 12:42

Re: Konstantenausdruck erwartet in Funktionsdekleration
 
Zitat:

Zitat von Darko
Ich verwende bei mir im Programm die Funktion 'FindAllFiles'. Nun habe ich diese etwas abgeändert, weil ich bei verschiedenen Sachen verschiedene Memos brauche.

Das war keine gute Idee!
Du hast damit aus einer universell verwendbaren Procedure eine speziell angepasste Procedure gemacht, die aber keinerlei Vorteile hat.

Es ist doch kein Problem, die Procedure so aufzurufen:
Delphi-Quellcode:
// mir feht jetzt die Deklaration der Orginal-Funktion und kann deshalb nur raten,
// dass noch ein Argument vom Typ TStrings da sein muss
FindAllFiles('C:\', '*.*', True, Memo_Monitorfiles.Lines);
Und wenn dir das zu viel Schreibarbeit ist, dann gibt es immer noch die Möglichkeit die orginale Prozedure
über eine eigene Procedure zu schleusen:
Delphi-Quellcode:
procedure THauptform.FindAllFiles2(RootFolder: string; Mask: string = '*.*'; Recurse: Boolean = True);
begin
  // einfache Weiterleitung
  FindAllFiles(RootFolder, Mask, Recurse, Memo_Monitorfiles.Lines);
end;
Merke: universelle einsetzbare Funktionen (z.B. aus Code-Library) nicht verändern, sondern höchstens ein Hülle drum bauen.

Darko 21. Mai 2008 12:54

Re: Konstantenausdruck erwartet in Funktionsdekleration
 
Ne, leider nicht.

Hier mal die Funktion:


Delphi-Quellcode:
procedure FindAllFiles(RootFolder: string; Mask: string = '*.*'; Recurse: Boolean = True);
var
  SR: TSearchRec;
begin
  // Implementation bis einschließlich Delphi 4
  if RootFolder = '' then
    Exit;
  if AnsiLastChar(RootFolder)^ <> '\' then
    RootFolder := RootFolder + '\';

  // Implementation ab Delphi 5
  RootFolder := IncludeTrailingPathDelimiter(RootFolder);

  // * * * * *
  // nur bis einschließlich Delphi 4 benötigt
  if Mask = '' then
    Mask := '*.*';
  // * * * * *

  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(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

          // folgende Zeile schreibt den vollständigen Namen in eine Memo Feld des
          // Formulars Form1
          Hauptform.Memo_Monitorfiles.Lines.Add(RootFolder + SR.Name);
        end;
      until FindNext(SR) <> 0;
    finally
      FindClose(SR);
    end;
end;

shmia 21. Mai 2008 13:05

Re: Konstantenausdruck erwartet in Funktionsdekleration
 
Zitat:

Zitat von Darko
Hier mal die Funktion:
Delphi-Quellcode:
procedure FindAllFiles(RootFolder: string; Mask: string = '*.*'; Recurse: Boolean = True);
var
  SR: TSearchRec;
begin
....
        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

          // folgende Zeile schreibt den vollständigen Namen in eine Memo Feld des
          // Formulars Form1
          Hauptform.Memo_Monitorfiles.Lines.Add(RootFolder + SR.Name);
        end;
....

Aha, ich seh' schon, die Prozedure ist doch nicht so toll universell einsetzbar, wie ich gedacht habe.
Hier die Korrekturen:

Delphi-Quellcode:
procedure FindAllFiles(RootFolder: string; list:TStrings; Mask: string = '*.*'; Recurse: Boolean = True);
var
  SR: TSearchRec;
begin
  list.Clear; // Ergebnisliste löschen
....
        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

          // folgende Zeile schreibt den vollständigen Namen in ein TStrings-Objekt
          list.Add(RootFolder + SR.Name);
        end;
....
Mit dem TStrings-Objekt als zusätzlicher Parameter kannst du die Dateien in jedem Memo, Listbox oder Combobox laden:
Delphi-Quellcode:
FindAllFiles('D:\Test', Memo2.lines);
// oder so
FindAllFiles('D:\delphi', ComboboxPascal.Items, '*.pas');


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:54 Uhr.
Seite 1 von 2  1 2      

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