Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Funktion erstellen (https://www.delphipraxis.net/26182-funktion-erstellen.html)

Andreas L. 19. Jul 2004 19:32


Funktion erstellen
 
Hi,
ich habe eine Funktion erstellt:

Delphi-Quellcode:
function happy(app : String; icon : String; destfile : String;): String;
begin
   ShowMessage('Anwendung = '+app+#10#13+'Icon = '+icon'+#10#13+'Ausgabedatei = '+destfile);
end;
Einfach so als Spaß.

Das ganze rufe ich mit einen Button klick so auf:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
 happy('Test.exe','test.ico','C:\test');
end;
Was muss ich jezt machen damit ich das programm kompilieren kann??

Ist da oben irgendwo ein fehler oder muss ich die Function noch irgendwo deklarieren?

Ich weiß schon, ist ne dumme Frage aber mir fehlt die Antwort ;-)

Greetz und thx

Matze 19. Jul 2004 19:33

Re: Funktion erstellen
 
Zitat:

Zitat von onlinehome
Was muss ich jezt machen damit ich das programm kompilieren kann??

Strg + F9 :mrgreen:

Spaß beiseite, was für ein Fehler kommt denn?

Andreas L. 19. Jul 2004 19:35

Re: Funktion erstellen
 
Zitat:

Zitat von Compiler
Undefinierter Bezeichner: Happy

Muss die function nicht noch bei den types (wo auch die procedures stehen) mit rein? Wenn ja, wie muss der Code lauten für den types-Block?

Greetz und thx

djmasi 19. Jul 2004 19:35

Re: Funktion erstellen
 
1. Mach daraus ne Prozedur, dann gehts. Funktionen liefern dir immer etwas zurück (meist berechnete Sachen).

2. Schreib die dann in die Deklaration von Form1 (private oder public).

Delphi-Quellcode:
procedure TForm1.happy(app : String; icon : String; destfile : String;);
begin
   ShowMessage('Anwendung = '+app+#10#13+'Icon = '+icon'+#10#13+'Ausgabedatei = '+destfile);
end;

Rackergen2 19. Jul 2004 19:36

Re: Funktion erstellen
 
Da es eine Funktion ist, brauchst du auch ein Result, was du initialisieren musst, ansonsten empfehle ich dir das:

Delphi-Quellcode:
procedure happy(app : String; icon : String; destfile : String);
begin
  ShowMessage('Anwendung = '+app+#10#13+'Icon = '+icon+#10#13+'Ausgabedatei = '+destfile);
end;
edit: außerdem hast du in der Titelzeile ein ; zuviel...
edit2: außerdem fängst du nach der icon-Variable einen neuen String an, der da nicht hingehört..

Luckie 19. Jul 2004 19:38

Re: Funktion erstellen
 
Ob Prozedur oder Funktion ist erstmnal egal. Sie muss nur vor deiner Button Klick Routine irgend wo unter Implementation stehen.

Andreas L. 19. Jul 2004 19:38

Re: Funktion erstellen
 
Auch wenn ich ne procedure draus mach kommt der gleiche Compiler-Fehler (siehe oben) ;-)

Greetz

Andreas L. 19. Jul 2004 19:39

Re: Funktion erstellen
 
Zitat:

Zitat von Luckie
Ob Prozedur oder Funktion ist erstmnal egal. Sie muss nur vor deiner Button Klick Routine irgend wo unter Implementation stehen.

Aha, und was genau muss ich bei Implementation hin schreiben.

Die Delphi-Hilfe hilft mir auch nicht weiter.

:-(

S2B 19. Jul 2004 19:39

Re: Funktion erstellen
 
Delphi-Quellcode:
procedure happy(app, icon, destfile: String);
begin
   ShowMessage('Anwendung = ' + app + #10#13 + 'Icon = ' + icon + #10#13 + 'Ausgabedatei = ' + destfile);
end;
So stimmt's!

Edit: :wall: :mrgreen:

Edit2: Matzes Idee! :mrgreen:

Luckie 19. Jul 2004 19:40

Re: Funktion erstellen
 
Nur mal aus Neugier: Bist du nicht auch das mit dem HTML Editor: http://www.delphipraxis.net/internal...ct.php?t=30150 ? Wenn ja, kannst du mir mal verraten, wie du das geschafft hast ohne zu wissen wie man Funktionen implementiert und aufruft? :gruebel:

Matze 19. Jul 2004 19:41

Re: Funktion erstellen
 
Probier's mal so:

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
    procedure happy(app, icon, destfile: String);
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.happy(app, icon, destfile: String);
begin
   ShowMessage('Anwendung = ' + app + #10#13 + 'Icon = ' + icon + #10#13 + 'Ausgabedatei = ' + destfile);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  happy('Test.exe', 'test.ico', 'c:\test');
end;

end.

Luckie 19. Jul 2004 19:41

Re: Funktion erstellen
 
Komplette Unit:
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure ShowText(s: String);
begin
  ShowMessage(s);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowText('Foobar');
end;

end.

Andreas L. 19. Jul 2004 19:42

Re: Funktion erstellen
 
Zitat:

Zitat von Luckie
Nur mal aus Neugier: Bist du nicht auch das mit dem HTML Editor: http://www.delphipraxis.net/internal...ct.php?t=30150 ? Wenn ja, kannst du mir mal verraten, wie du das geschafft hast ohne zu wissen wie man Funktionen implementiert und aufruft? :gruebel:

Hää???

Ähn ja, ich habe immer ne UNit eingebunden und dann zum Beispiel das hier verwendet: ForceDirectories(blabla);

Aber bei mir befindet sich die selbstgemachte Funktion in der selben Unit.

---Bernhard--- 19. Jul 2004 19:42

Re: Funktion erstellen
 
Hi!
Zitat:

Zitat von onlinehome
Delphi-Quellcode:
function happy(app : String; icon : String; destfile : String;): String;
begin
   ShowMessage('Anwendung = '+app+#10#13+'Icon = '+icon'+#10#13+'Ausgabedatei = '+destfile);
end;

Da ist ein kleiner Fehler drinn und zwar ein nicht abgeschlossener String!
So müsste es (eigentlich) heißen:
Delphi-Quellcode:
function happy(app : String; icon : String; destfile : String;): String;
begin
  ShowMessage('Anwendung = '+app+#10#13+'Icon = '+icon+#10#13+'Ausgabedatei = '+destfile);
end;
Bernhard :hi:

[edit]:shock: :wall: Da lässt man sich beim Antworten mal bischen mehr Zeit... :mrgreen: :roll: [/edit]

Matze 19. Jul 2004 19:43

Re: Funktion erstellen
 
@onlinehome: Siehe Luckie's oder mein Code oben. ;)

Rackergen2 19. Jul 2004 19:47

Re: Funktion erstellen
 
Zitat:

Zitat von onlinehome
Zitat:

Zitat von Luckie
Ob Prozedur oder Funktion ist erstmnal egal. Sie muss nur vor deiner Button Klick Routine irgend wo unter Implementation stehen.

Aha, und was genau muss ich bei Implementation hin schreiben.

Die Delphi-Hilfe hilft mir auch nicht weiter.

:-(

nirgends, wenn du sie nur happy nennst
Nebenbei habe ich die richtige Funktion schon lange oben gepostet!

Andreas L. 19. Jul 2004 19:48

Re: Funktion erstellen
 
Habs geschafft:

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
    procedure createautorunfile(app : String; icon : String; destfile : String);
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
 createautorunfile('Test.exe','test.ico','C:\test');
end;

procedure TForm1.createautorunfile(app : String; icon : String; destfile : String);
var
 sl : TStringList;
begin
   sl:=TStringList.create;
   sl.add('[autorun]');
   sl.add('OPEN=' + app);
   sl.add('ICON=' + icon);
   sl.SaveToFile(destfile+'.inf');
   ShowMessage('Finished!');
end;

end.
Meint ihr meine kleine Procedure soll in die CodeLib. Net wirklich, oder?

Matze 19. Jul 2004 19:51

Re: Funktion erstellen
 
Zitat:

Zitat von onlinehome
Delphi-Quellcode:
procedure TForm1.createautorunfile(app : String; icon : String; destfile : String);
var
 sl : TStringList;
begin
   sl:=TStringList.create;
   sl.add('[autorun]');
   sl.add('OPEN=' + app);
   sl.add('ICON=' + icon);
   sl.SaveToFile(destfile+'.inf');
   ShowMessage('Finished!');
end;
Meint ihr meine kleine Procedure soll in die CodeLib. Net wirklich, oder?

Ähm, nö, net wirkluich. ;)

Rackergen2 19. Jul 2004 19:52

Re: Funktion erstellen
 
Delphi-Quellcode:
function TForm1.createautorunfile(app : String; icon : String; destfile : String):boolean;
var
 sl : TStringList;
begin
  result:=true;
  try
    sl:=TStringList.create;
    sl.add('[autorun]');
    sl.add('OPEN=' + app);
    sl.add('ICON=' + icon);
    sl.SaveToFile(destfile+'.inf');
  except
    result:=false;
  end;
end;

end.
So kommt es besser...

Matze 19. Jul 2004 19:53

Re: Funktion erstellen
 
Wenn dann noch mit Pos überprüfen, ob eine dateiendung bereits vorhanden ist...

So ist er nicht gut. ;)
Edit: Und s1 wieder freigeben!

Rackergen2 19. Jul 2004 19:56

Re: Funktion erstellen
 
Delphi-Quellcode:
function TForm1.createautorunfile(app : String; icon : String; destfile : String):boolean;
var
 sl : TStringList;
begin
  result:=true;
  try
    sl:=TStringList.create;
    sl.add('[autorun]');
    sl.add('OPEN=' + app);
    sl.add('ICON=' + icon);
    if copy(destfile,length(destfile-4),4)<>'.inf' then destfile:=destfile+'.inf';
    sl.SaveToFile(destfile);
    s1.free;
  except
    result:=false;
  end;
end;

end.
So besser?

Matze 19. Jul 2004 20:44

Re: Funktion erstellen
 
Delphi-Quellcode:
if copy(destfile,length(destfile-4),4)<>'.inf' then destfile:=destfile+'.inf';
Gefällt mir so besser:

Delphi-Quellcode:
if not Pos('.inf', destfile) > 0 then destfile := destfile + '.inf';
Aber das spielt ja auch keine große Rolle. ;)

Edit:

Unde du solltest es irgendwie so machen:

Delphi-Quellcode:
...

try

  ...

finally
  sl.Free;

p0w3r5tr34m3r 19. Jul 2004 20:56

Re: Funktion erstellen
 
geht das nich auf ohne stringliste ??? inifiles ???

der aufbau is ja eigentlich der selbe oder ?

S2B 19. Jul 2004 21:24

Re: Funktion erstellen
 
Klar geht das mit ini-Dateien! 8)

Rackergen2 19. Jul 2004 22:49

Re: Funktion erstellen
 
Zitat:

Zitat von Matze
Delphi-Quellcode:
if copy(destfile,length(destfile-4),4)<>'.inf' then destfile:=destfile+'.inf';
Gefällt mir so besser:

Delphi-Quellcode:
if not Pos('.inf', destfile) > 0 then destfile := destfile + '.inf';
Aber das spielt ja auch keine große Rolle. ;)

Denkste! Lass mal die Datei so heißen: 'C:\test\test.inf.txt' Du musst schon dafür sorgen, dass das .inf hinten ist... höchstens so:

Delphi-Quellcode:
if Pos('.inf', destfile)<length(destfile)-4 then destfile:=destfile+'.inf';


Delphi-Quellcode:
function TForm1.createautorunfile(app : String; icon : String; destfile : String):boolean;
var
sl : TStringList;
begin
  result:=true;
  sl:=TStringList.create;
  sl.add('[autorun]');
  sl.add('OPEN=' + app);
  sl.add('ICON=' + icon);
  if copy(destfile,length(destfile-4),4)<>'.inf' then destfile:=destfile+'.inf';

  try
    sl.SaveToFile(destfile);
  except
    result:=false;
  end;

  s1.free;
end;

Matze 20. Jul 2004 08:27

Re: Funktion erstellen
 
Hmm, stimmt, an so einen "Sonderfall" habe ich nicht gedacht.

Nur sollte man noch die Resourcenschutzblöcke einbauen:

Delphi-Quellcode:
function TForm1.CreateAutorunFile(app, icon, destfile: String): boolean;
var
  sl: TStringList;
begin
  result := true;
  sl := TStringList.create;
  try
    sl.add('[autorun]');
    sl.add('OPEN=' + app);
    sl.add('ICON=' + icon);
    if copy(destfile, length(destfile) - 4, 4) <> '.inf' then destfile := destfile + '.inf';
    try
      sl.SaveToFile(destfile);
    except
      result:=false;
    end;
  finally
    sl.free;
  end;
end;
Ich hab auch noch den ein oder anderen Fehler verbessert, dein Code lies sich nicht kompilieren. ;)

Eines darf man nicht vergessen:
Wenn ich nun den Pfad und das Icon angebe, so habe ich den kompletten Pfad beider in der Ini, was natürlich Mist ist.
Nacher befinden sich die Anwendung und das Icon (im Normalfall) auf der CD, somit stimmen die Pfade nicht mehr!
Man musste Icon und Anwendung in den Projektordner geben und dann die relativen Pfade (Anwendung + ggf. Ordnername) in die inf-Datei eintragen.

Rackergen2 20. Jul 2004 10:45

Re: Funktion erstellen
 
Zitat:

Zitat von Matze
Delphi-Quellcode:
...
  sl.add('[autorun]');
  sl.add('OPEN=' + app);
  sl.add('ICON=' + icon);
  if copy(destfile, length(destfile) - 4, 4) <> '.inf' then destfile := destfile + '.inf';
  ...

Warum hast du das in einer try-Klausel? Daran kann doch nix schief gehen...

Delphi-Quellcode:
function TForm1.CreateAutorunFile(app, icon, destfile: String): boolean;
var
  sl: TStringList;
begin
  result:=true;
  sl:=TStringList.create;
  sl.add('[autorun]');
  sl.add('OPEN='+app);
  sl.add('ICON='+icon);
  if copy(destfile, length(destfile)-4, 4)<>'.inf' then destfile:=destfile+'.inf';

  try
    sl.SaveToFile(destfile);
  except
    result:=false;
  end;

  sl.free;
end;
Und "den einen oder anderen Fehler" kann ich auch nicht erkennen, nur dass du da noch Leerzeichen reingeklatscht hast...

EDIT: und das -4, aber wo ist "der andere Fehler"? ;)

PS: Wie ich diese ganze Leerzeichensetzung hasse...

mirage228 20. Jul 2004 11:15

Re: Funktion erstellen
 
Hi,

wie wärs hiermit?

Delphi-Quellcode:
function TForm1.CreateAutorunFile(const App, Icon, DestFile: String): Boolean;
var
  sl: TStringList;
begin
  Result := False;
  sl := TStringList.create;
  try
    sl.add('[autorun]');
    sl.add('OPEN=' + App);
    sl.add('ICON=' + Icon);
    sl.SaveToFile(ChangeFileExt(DestFile, '.inf'));
    Result := True;
  finally
    sl.Free;
  end;
end;
mfG
mirage228

Matze 20. Jul 2004 11:21

Re: Funktion erstellen
 
@Rackergen2: Jo, des war glaub der einzige Fehler. :wink:

@Mirage: Cool! :thumb:

Rackergen2 20. Jul 2004 15:31

Re: Funktion erstellen
 
Zitat:

Zitat von mirage228
wie wärs hiermit?

Delphi-Quellcode:
function TForm1.CreateAutorunFile(const App, Icon, DestFile: String): Boolean;
var
  sl: TStringList;
begin
  Result := False;
  sl := TStringList.create;
  try
    sl.add('[autorun]');
    sl.add('OPEN=' + App);
    sl.add('ICON=' + Icon);
    sl.SaveToFile(ChangeFileExt(DestFile, '.inf'));
    Result := True;
  finally
    sl.Free;
  end;
end;

Das ist doch Schwachsinn. Was sollen die ersten 3 Zeilen in einem try? Wenn, dann so:
Delphi-Quellcode:
function TForm1.CreateAutorunFile(const App, Icon, DestFile: String): Boolean;
var
  sl: TStringList;
begin
  Result := False;
  sl := TStringList.create;
  sl.add('[autorun]');
  sl.add('OPEN=' + App);
  sl.add('ICON=' + Icon);
  try
    sl.SaveToFile(ChangeFileExt(DestFile, '.inf'));
    Result := True;
  finally
    sl.Free;
  end;
end;
Aber das käme sowas von das gleiche raus... dann doch lieber meine Funtion oben... ;)

Matze 20. Jul 2004 15:35

Re: Funktion erstellen
 
Also deine von oben sicher net, die Resourcenschutzblöcke müssen rein!

Rackergen2 20. Jul 2004 16:01

Re: Funktion erstellen
 
Dann erzähl mir mal, wo hier ein Fehler auftreten soll, der s1.free überspringt?

Delphi-Quellcode:
function TForm1.CreateAutorunFile(app, icon, destfile: String): boolean;
var
  sl: TStringList;
begin
  result:=true;
  sl:=TStringList.create;
  sl.add('[autorun]');
  sl.add('OPEN='+app);
  sl.add('ICON='+icon);
  if copy(destfile, length(destfile)-4, 4)<>'.inf' then destfile:=destfile+'.inf';

  try
    sl.SaveToFile(destfile);
  except
    result:=false;
  end;

  sl.free;
end;
Weil:
Delphi-Quellcode:
result:=true;
sl:=TStringList.create;
sl.add('[autorun]');
sl.add('OPEN=' + app);
sl.add('ICON=' + icon);
if copy(destfile, length(destfile) - 4, 4) <> '.inf' then destfile := destfile + '.inf';
Hier KANN nichts passieren und das Schreiben ist schon durch ein try abgesichert...

Matze 20. Jul 2004 16:04

Re: Funktion erstellen
 
Es ist immer so, dass man die Dinge, die man ganz sicher freigeben möchte in einen finally-Abschnitt gibt.

Ob du nun mit der Registry arbeitest oder mit Inis, oder auch mit Stringlists...

Rackergen2 20. Jul 2004 16:09

Re: Funktion erstellen
 
Es ist ja schön, dass du das machst, aber in diesem Fall ist es einfach UNNÖTIG!

Matze 20. Jul 2004 16:12

Re: Funktion erstellen
 
Nein

Rackergen2 20. Jul 2004 16:15

Re: Funktion erstellen
 
Dann erzähl mir, wie du es schaffen willst, diese Funktion zum crashen zu bringen... Da bin ich ja mal gespannt...

mirage228 20. Jul 2004 16:30

Re: Funktion erstellen
 
Zitat:

Zitat von Rackergen2
Dann erzähl mir, wie du es schaffen willst, diese Funktion zum crashen zu bringen... Da bin ich ja mal gespannt...

Hi,

im Normallfall dürfte es bei einem TStringList.Add() keine Schwierigkeiten geben.
Aber: Sollte es mal zu irgendwelchen Störungen im System kommen (defekter Speicher, Speicher voll, etc...). Dann wird diese Operation IMHO eventuell eine Zugriffsverletzung (oder Ähnliches) auslösen und somit sollte es allein schon sicherheitshalber komplett vom try...finally umschlossen werden. Man hat dann (fast) die absolute Sicherheit und ein mehraufwand ist es auch nicht ;)

mfG
mirage228

Matze 20. Jul 2004 16:32

Re: Funktion erstellen
 
Da braucht nur nen Schreibfehler im Speicher auftreten oder ein anderes Programm greift unerwartet auf die Speicheradresse zu, was bei mir schon vorkam...

Rackergen2 20. Jul 2004 16:49

Re: Funktion erstellen
 
Na ihr könnt Zufälle absichern, die gibt es gar nicht ;)

Matze 20. Jul 2004 16:52

Re: Funktion erstellen
 
Es ist auf jedenfall ratsam, Resourcenschutzblöcke zu verwenden. Wie der Name schon sagt, sollen diese die Resourcen, sprich den Speicher, schützen.


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