![]() |
Funktion erstellen
Hi,
ich habe eine Funktion erstellt:
Delphi-Quellcode:
Einfach so als Spaß.
function happy(app : String; icon : String; destfile : String;): String;
begin ShowMessage('Anwendung = '+app+#10#13+'Icon = '+icon'+#10#13+'Ausgabedatei = '+destfile); end; Das ganze rufe ich mit einen Button klick so auf:
Delphi-Quellcode:
Was muss ich jezt machen damit ich das programm kompilieren kann??
procedure TForm1.Button1Click(Sender: TObject);
begin happy('Test.exe','test.ico','C:\test'); end; 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 |
Re: Funktion erstellen
Zitat:
Spaß beiseite, was für ein Fehler kommt denn? |
Re: Funktion erstellen
Zitat:
Greetz und thx |
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; |
Re: Funktion erstellen
Da es eine Funktion ist, brauchst du auch ein Result, was du initialisieren musst, ansonsten empfehle ich dir das:
Delphi-Quellcode:
edit: außerdem hast du in der Titelzeile ein ; zuviel...
procedure happy(app : String; icon : String; destfile : String);
begin ShowMessage('Anwendung = '+app+#10#13+'Icon = '+icon+#10#13+'Ausgabedatei = '+destfile); end; edit2: außerdem fängst du nach der icon-Variable einen neuen String an, der da nicht hingehört.. |
Re: Funktion erstellen
Ob Prozedur oder Funktion ist erstmnal egal. Sie muss nur vor deiner Button Klick Routine irgend wo unter Implementation stehen.
|
Re: Funktion erstellen
Auch wenn ich ne procedure draus mach kommt der gleiche Compiler-Fehler (siehe oben) ;-)
Greetz |
Re: Funktion erstellen
Zitat:
Die Delphi-Hilfe hilft mir auch nicht weiter. :-( |
Re: Funktion erstellen
Delphi-Quellcode:
So stimmt's!
procedure happy(app, icon, destfile: String);
begin ShowMessage('Anwendung = ' + app + #10#13 + 'Icon = ' + icon + #10#13 + 'Ausgabedatei = ' + destfile); end; Edit: :wall: :mrgreen: Edit2: Matzes Idee! :mrgreen: |
Re: Funktion erstellen
Nur mal aus Neugier: Bist du nicht auch das mit dem HTML Editor:
![]() |
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. |
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. |
Re: Funktion erstellen
Zitat:
Ä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. |
Re: Funktion erstellen
Hi!
Zitat:
So müsste es (eigentlich) heißen:
Delphi-Quellcode:
Bernhard :hi:
function happy(app : String; icon : String; destfile : String;): String;
begin ShowMessage('Anwendung = '+app+#10#13+'Icon = '+icon+#10#13+'Ausgabedatei = '+destfile); end; [edit]:shock: :wall: Da lässt man sich beim Antworten mal bischen mehr Zeit... :mrgreen: :roll: [/edit] |
Re: Funktion erstellen
@onlinehome: Siehe Luckie's oder mein Code oben. ;)
|
Re: Funktion erstellen
Zitat:
Nebenbei habe ich die richtige Funktion schon lange oben gepostet! |
Re: Funktion erstellen
Habs geschafft:
Delphi-Quellcode:
Meint ihr meine kleine Procedure soll in die CodeLib. Net wirklich, oder?
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. |
Re: Funktion erstellen
Zitat:
|
Re: Funktion erstellen
Delphi-Quellcode:
So kommt es besser...
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. |
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! |
Re: Funktion erstellen
Delphi-Quellcode:
So besser?
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. |
Re: Funktion erstellen
Delphi-Quellcode:
Gefällt mir so besser:
if copy(destfile,length(destfile-4),4)<>'.inf' then destfile:=destfile+'.inf';
Delphi-Quellcode:
Aber das spielt ja auch keine große Rolle. ;)
if not Pos('.inf', destfile) > 0 then destfile := destfile + '.inf';
Edit: Unde du solltest es irgendwie so machen:
Delphi-Quellcode:
...
try ... finally sl.Free; |
Re: Funktion erstellen
geht das nich auf ohne stringliste ??? inifiles ???
der aufbau is ja eigentlich der selbe oder ? |
Re: Funktion erstellen
Klar geht das mit ini-Dateien! 8)
|
Re: Funktion erstellen
Zitat:
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; |
Re: Funktion erstellen
Hmm, stimmt, an so einen "Sonderfall" habe ich nicht gedacht.
Nur sollte man noch die Resourcenschutzblöcke einbauen:
Delphi-Quellcode:
Ich hab auch noch den ein oder anderen Fehler verbessert, dein Code lies sich nicht kompilieren. ;)
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; 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. |
Re: Funktion erstellen
Zitat:
Delphi-Quellcode:
Und "den einen oder anderen Fehler" kann ich auch nicht erkennen, nur dass du da noch Leerzeichen reingeklatscht hast...
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; EDIT: und das -4, aber wo ist "der andere Fehler"? ;) PS: Wie ich diese ganze Leerzeichensetzung hasse... |
Re: Funktion erstellen
Hi,
wie wärs hiermit?
Delphi-Quellcode:
mfG
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; mirage228 |
Re: Funktion erstellen
@Rackergen2: Jo, des war glaub der einzige Fehler. :wink:
@Mirage: Cool! :thumb: |
Re: Funktion erstellen
Zitat:
Delphi-Quellcode:
Aber das käme sowas von das gleiche raus... dann doch lieber meine Funtion oben... ;)
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; |
Re: Funktion erstellen
Also deine von oben sicher net, die Resourcenschutzblöcke müssen rein!
|
Re: Funktion erstellen
Dann erzähl mir mal, wo hier ein Fehler auftreten soll, der s1.free überspringt?
Delphi-Quellcode:
Weil:
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;
Delphi-Quellcode:
Hier KANN nichts passieren und das Schreiben ist schon durch ein try abgesichert...
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'; |
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... |
Re: Funktion erstellen
Es ist ja schön, dass du das machst, aber in diesem Fall ist es einfach UNNÖTIG!
|
Re: Funktion erstellen
Nein
|
Re: Funktion erstellen
Dann erzähl mir, wie du es schaffen willst, diese Funktion zum crashen zu bringen... Da bin ich ja mal gespannt...
|
Re: Funktion erstellen
Zitat:
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 |
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...
|
Re: Funktion erstellen
Na ihr könnt Zufälle absichern, die gibt es gar nicht ;)
|
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 01:03 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