Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Datei finden führt zu abstraktem Fehler (https://www.delphipraxis.net/134595-datei-finden-fuehrt-zu-abstraktem-fehler.html)

BAMatze 25. Mai 2009 14:33


Datei finden führt zu abstraktem Fehler
 
Hallo nochmal an alle,

Ich möchte eine Datei auf meiner Festplatte finden. Dazu verwende ich folgenden Quellcode aus der CodeLibrary (ich weiß ist nicht der Link zur Library sondern in einen Threat, wo schonmal Fehler dazu aufgetreten sind)

hier mein Quellcode:
Delphi-Quellcode:
procedure TDateiArbeit.FindAllFiles(var FileList: TStrings; RootFolder: string; Mask: string = '*.*'; 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
          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
        FileList.Add(RootFolder + SR.Name);
      end;
    until FindNext(SR) <> 0;
  finally
    FindClose(SR);
  end;
end;
und der Aufruf im Constructor:
Delphi-Quellcode:
constructor TDateiArbeit.create(const sText: string);
begin
  inherited create;
  FsDateiname := sText;
  if IsFileName then //IsFileName ist eine Überprüfung der Gültigkeit des übergebenden Strings als Dateiname (auch hier aus der DP)
    begin
      FtsPfad := TStrings.Create;
      FindAllFiles(FtsPfad,'d:',FsDateiname, true);
    end;
end;
Die Fehlermeldung lautet einfach nur: "Abstrakter Fehler" in einer MessageBox bevor die Form erscheint. Weis jemand, was dort falsch ist?

Vielen Dank
BAMatze

jaenicke 25. Mai 2009 14:37

Re: Datei finden führt zu abstraktem Fehler
 
Du versuchst eine Instanz von TStrings zu erstellen, das geht aber nicht. Nimm TStringList. TStrings ist nur die abstrakte Elternklasse.

Eine entsprechende Warnung sollte der Compiler auch anzeigen... :roll:

BAMatze 25. Mai 2009 14:43

Re: Datei finden führt zu abstraktem Fehler
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von jaenicke
Du versuchst eine Instanz von TStrings zu erstellen, das geht aber nicht. Nimm TStringList. TStrings ist nur die abstrakte Elternklasse.

Eine entsprechende Warnung sollte der Compiler auch anzeigen... :roll:

Hab mal die Warnungsliste angehängt, hab dort nämlich eigentlich keine Warnungen gesehen, die zu einem Fehler führen könnten. oder sind die Warnungen #2-#6, welche ich falsch interpretiert habe?

Ps.: Änderung in TStringList ist die Lösung Danke @jeanicke nochmal

jaenicke 25. Mai 2009 14:43

Re: Datei finden führt zu abstraktem Fehler
 
Da steht ja, dass du eine Instanz einer Klasse mit abstrakten Methoden erstellst. Und das geht eben nicht. ;-)

BAMatze 25. Mai 2009 14:44

Re: Datei finden führt zu abstraktem Fehler
 
Zitat:

Zitat von jaenicke
Da steht ja, dass du eine Instanz einer Klasse mit abstrakten Methoden erstellst. Und das geht eben nicht. ;-)

Thx

jaenicke 25. Mai 2009 14:46

Re: Datei finden führt zu abstraktem Fehler
 
Warnungen sollte man schon beachten, dazu sollte auch in der Hilfe stehen was die bedeuten.

Hinweise sind oft nur Hinweise. Dass z.B. eine Variable deklariert, aber nicht verwendet wird, ist z.B. nicht weiter schlimm. Die kann man ggf. ignorieren. Bei Warnungen ist das fast immer nicht so gut.

// EDIT:
Ich hoffe dir ist klar was abstrakt bedeutet?

BAMatze 25. Mai 2009 14:59

Re: Datei finden führt zu abstraktem Fehler
 
Zitat:

Zitat von jaenicke
// EDIT:
Ich hoffe dir ist klar was abstrakt bedeutet?

Hmm das muss ich leider verneinen. Bei solchen Problemen stehe ich meistens noch ziemlich dumm da und weiß nicht weiter. Probiere zwar dann immer etwas rum und schaue hier in der DP und Google, ob das Problem schonmal aufgetaucht ist und ne Lösung vorhanden, aber leider entziehen sich solche Fehler immer noch meinem Verständnis ohne Erklärung.

jaenicke 25. Mai 2009 15:03

Re: Datei finden führt zu abstraktem Fehler
 
Abstrakt bedeutet, dass du nur den Methodenrumpf schreibst mit "virtual; abstract;" dahinter. In dieser Klasse schreibst du dazu dann keinen Code. In einer abgeleiteten Klasse (wie TStringList) werden diese Methoden dann überschrieben und "mit Leben gefüllt". Erst da ist also der Code dazu vorhanden.

Da die alle von TStrings abgeleitet sind, kannst du sie auch als TStrings verwenden und auch in Variablen von Dem Typ packen. Aber eine Instanz von TStrings selbst enthielte nicht allen notwendigen Code zu den Methoden.

Namenloser 25. Mai 2009 15:07

Re: Datei finden führt zu abstraktem Fehler
 
Abstrakt bedeutet grob, dass die Methodne (zumindest manche) einer Klasse nur deklariert wurden, aber nicht implementiert. Diese Methoden sind dafür da, von Nachfahren überschrieben zu werden. So kann das TImage z.B. um beliebige Bildformate erweitert werden, ohne dass das TImage selbst verändert werden muss. Denn TImage kennt nur die abstrakte Klasse TGraphic, weiß also welche Methoden es gibt, und welche Parameter sie erwarten. Erst wenn man der Graphic des TImage z.B. ein TBitmap zuweist beinhalten diese Methoden auch tatsächlich Code. Wenn man jedoch die abstrakte Basisklasse TGraühic direkt verwenden würde, würden die Methoden ins Nirvana zeigen -> abstrakter Fehler.

Phoenix 25. Mai 2009 15:08

Re: Datei finden führt zu abstraktem Fehler
 
Eine abstrakte Klasse ist eine Klasse, die dazu designed wurde, dass man von ihr ableiten muss. Sie definiert bestimmte Methoden als abstrakt - sie sind definiert, aber nicht implementiert. Eine Klasse die man instanzieren will und die von dieser Basisklasse ableitet, muss diese abstrakten Methoden auch alle implementieren. Erst dann ist die Klasse komplett und kann wirklich benutzt werden.

Die Idee hinter dem Konzept ist, dass man in seinem Code zwar auf einer Variablen vom Typ TStrings arbeiten kann (solange man TStrings nicht direkt instanziert), sich dahinter aber eine TStringList, TMyStringList oder auch TWrdlbrmpftStrings verstecken kann, ohne dass man deren Implementierungsdetails kennen müsste.


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:45 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