Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Funktion aufrufen (https://www.delphipraxis.net/164438-funktion-aufrufen.html)

ByTheTime 12. Nov 2011 17:45

Funktion aufrufen
 
Sorry, das ist mir jetzt echt peinlich, habe aber werder mit der SuFu, noch mit google etwas gefunden...

Ich habe folgende Funktion (StringReplace):

Delphi-Quellcode:
function TFormSettings.StringReplace(S: string; OldPattern: string; NewPattern: string; Flags: TReplaceFlags): string;
begin
 Profil := StringReplace(Profil, 'guten', 'Schönen', [rfReplaceAll, rfIgnoreCase]);
 ShowMessage(Profil);
end;
Ich habe sie global deklariert:

Delphi-Quellcode:
 public
    function StringReplace(S, OldPattern, NewPattern: string; Flags: TReplaceFlags): string;
  end;
Aber wie rufe ich sie woanders wieder auf? Mit proceduren ist das ja einfach:

Delphi-Quellcode:
procedure Rechnen; //Muss näturlich deklariert sein...
begin
 a + b;
end;

//[anderer Code]

procedure IrgendWas; //Muss näturlich auch deklariert sein...
begin
 a := 1;
 b := 4;
 Rechnen;
end;
Aber mit einer Funktion funzt das nicht :(

Bitte helft mir !

Luckie 12. Nov 2011 17:56

AW: Funktion aufrufen
 
Zitat:

Zitat von ByTheTime (Beitrag 1135901)
Aber mit einer Funktion funzt das nicht :(

Rat mal was uns da jetzt noch an Informationen fehlt. :roll:

Aber warum deklarierst du die Funktion? Sie ist doch schon in der Unit SysUtils enthalten. Oder ist das eine eigene Implementierung?

ByTheTime 12. Nov 2011 18:00

AW: Funktion aufrufen
 
Zitat:

Rat mal was uns da jetzt noch an Informationen fehlt.
- Äh :P Wie man sie aufruft, das würde ich gerne wissen (sowie bei meinem Bsp. mit der procedure).

Eigene Implementierung (Copy&Paste - schau dir meinen Link an :P)

Luckie 12. Nov 2011 18:04

AW: Funktion aufrufen
 
Zitat:

Zitat von ByTheTime (Beitrag 1135903)
Zitat:

Rat mal was uns da jetzt noch an Informationen fehlt.
- Äh :P Wie man sie aufruft, das würde ich gerne wissen (sowie bei meinem Bsp. mit der procedure).

Wie wäre es mit der Fehlermeldung? :roll: Und wie man sie aufruft ist doch in deinem Link beschrieben. Noch mal, warum deklarierst du die Funktion? Und wenn du sie deklarierst, wo ist die Implementation? Ich weiße dich noch mal darauf hin, dass diese Funktion schon deklariert und auch implementiert ist in der Unit SysUtils. Einfach die Unit einbinden und die Funktion aufrufen.

mkinzler 12. Nov 2011 18:05

AW: Funktion aufrufen
 
Methoden ruft man ausserhalb der Klasse über eine ihrer Instanzen auf ( Objekt)
Delphi-Quellcode:
FormSettings.StringReplace(Profil, 'guten', 'Schönen', [rfReplaceAll, rfIgnoreCase]);

Sir Rufo 12. Nov 2011 18:07

AW: Funktion aufrufen
 
Deine "procedure" ist eine Methode und die hast du nicht global sondern öffentlich in einer Klasse deklariert (public).

Dies ist ein klassisches Birnen und Äpfel vergleichen.

Luckie 12. Nov 2011 18:08

AW: Funktion aufrufen
 
Sein Problem ist aber, dass er eine Methode deklariert hat, die es als Funktion schon in der SysUtils gibt. Deswegen wollte ich ihm ja auch die Fehlermeldung entlocken, damit man eventuell mal einen Anhaltspunkt bekommt, was er da eigentlich macht.

Sir Rufo 12. Nov 2011 18:14

AW: Funktion aufrufen
 
Zitat:

Zitat von Luckie (Beitrag 1135907)
Sein Problem ist aber, dass er eine Methode deklariert hat, die es als Funktion schon in der SysUtils gibt. Deswegen wollte ich ihm ja auch die Fehlermeldung entlocken, damit man eventuell mal einen Anhaltspunkt bekommt, was er da eigentlich macht.

Jo, er wirft da einiges durcheinander ;)

ByTheTime 12. Nov 2011 18:34

AW: Funktion aufrufen
 
Okay,
um jegliche Missverständnise zu vermeiden, mein Ziel:
Ich habe eine Art "Profilmanager", man gibt Daten in verschiedene EditFelder ein, z.B.: Zeit, Name, etc. Die Daten werden in ein Memo kopiert und als Textdatei gespeichert, unter einem Dateinamen, den man auch angegeben hat (MeinDateiname.txt). Möchte man dieses Profil später bearbeiten, wählt man in in der ComboBox das Profil aus. Damit das Profil in der ComboBox angezeigt wird, verwende ich beim FormCreate folgendes:

Delphi-Quellcode:
procedure TFormSettings.GetProfils;
var
  lDir: String;
  lSearchRecord: TSearchRec;
begin
  ComboProfil.Clear;
  lDir := AppDataPath + 'Profiles\';

  if FindFirst(lDir + '*.txt', faAnyFile, lSearchRecord) = 0 then
  begin
    repeat
      if (lSearchRecord.Attr <> faDirectory) then
       begin
         ComboProfil.Items.Add(lSearchRecord.Name);
       end;
    until
      FindNext(lSearchRecord) <> 0;
      FindClose(lSearchRecord);
  end;
end;
Allerdings lädt er auch die Endung, also ".txt" mit in die ComboBox. Das finde ich aber ziemlich unschön, deshalb möchte ich mit StringReplace die Endung suchen und entfernen (ersetzten gegen '').

Wie im Link zu sehen, ist dort eine Funktion, die muss ich ja wohl global deklarieren (da selbst implementiert):

Delphi-Quellcode:
public
 function StringReplace(S, OldPattern, NewPattern: string; Flags: TReplaceFlags): string; //Fehler: "[DCC Fehler] Settings.pas(47): E2065 Ungenügende Forward- oder External-Deklaration: 'TFormSettings.StringReplace'"
end;
Im Implementationteil steht dann folgendes:

Delphi-Quellcode:
function StringReplace(S, OldPattern, NewPattern: string; Flags: TReplaceFlags): string;
begin
s := StringReplace(s, '.txt', '', [rfReplaceAll, rfIgnoreCase]);
ShowMessage(s); //zum testen
end;
Jetzt möchte ich die Funktion aufrufen, wie folgt ('.txt' entfernen bevor das Element der ComboBox hinzugefügt wird):

Delphi-Quellcode:
procedure TFormSettings.GetProfils;
var
  lDir: String;
  lSearchRecord: TSearchRec;
begin
  ComboProfil.Clear;
  lDir := AppDataPath + 'Profiles\';

  if FindFirst(lDir + '*.txt', faAnyFile, lSearchRecord) = 0 then
  begin
    repeat
      if (lSearchRecord.Attr <> faDirectory) then
       begin
         //hier der Variable noch lSearchRecord.Name zuweisen, damit StringReplace ihn verwenden kann
         StringReplace; //hier der Fehler, wo ich es aufrufen möchte: "[DCC Fehler] Settings.pas(306): E2035 Nicht genügend wirkliche Parameter"
         ComboProfil.Items.Add(lSearchRecord.Name);
       end;
    until
      FindNext(lSearchRecord) <> 0;
      FindClose(lSearchRecord);
  end;
end;
So, ausführlich, jetzt erwarte ich auch unterstützung :P

Sir Rufo 12. Nov 2011 18:40

AW: Funktion aufrufen
 
ChangeFileExt ;)

ByTheTime 12. Nov 2011 18:53

AW: Funktion aufrufen
 
DANKE!! Es funktioniert!!!

Luckie 12. Nov 2011 19:06

AW: Funktion aufrufen
 
Zitat:

Zitat von ByTheTime (Beitrag 1135910)
So, ausführlich, jetzt erwarte ich auch unterstützung :P

Und ich erwarte endlich mal die Fehlermeldung!!!

OK. Zum einen ist die Bezeichnung deiner Methode mehr als unglücklich, da sie genauso heißt, wie die Funktion, die du in ihr aufrufst. Hinzukommt, dass die Bezeichnung völlig nichts sagend ist, was die Methode überhaupt macht. RemoveFileExtension wäre wesentlich besser. Zum Anderen gehört vor die Implementation der Methode noch der Klassenname:

Delphi-Quellcode:
function TFormSetting.RemoveFileExtension(Filename: string): string;
begin
  Result := ChangeFileExt(Filename, '')
end;

himitsu 12. Nov 2011 20:59

AW: Funktion aufrufen
 
Zitat:

Delphi-Quellcode:
function TFormSettings.StringReplace(S: string; OldPattern: string; NewPattern: string; Flags: TReplaceFlags): string;
begin
 Profil := StringReplace(Profil, 'guten', 'Schönen', [rfReplaceAll, rfIgnoreCase]);
 ShowMessage(Profil);
end;

Seh ich das grade falsch, oder sollte das nicht eigentlich in einerm Endlosschleife Stacküberlauf enden, da sich diese Methode immer wieder selber aufruft?


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