funktionen

smaresh

Mitglied
Man glaubt es kaum aber ich hab mich bisher ohne Funktionen durchgeschlagen. Da mein Script aber langsam meterlang wird und das ändern der Datei einfach viel simpler ist hab ich mich jetzt endlich durchgerungen das zu lernen.
Google und die Delphi-Hilfe helfen aber leider nur bedingt!

einfache mathematische Funktionen inder Zahlen z.B multipliziert werden sollen
oder einfache Funktionen in der Strings zusammengeführt werden sind kein Problem aber ich bin auf der Suche nach einer Funktion in der ich z.B ne shellapi ausführen oder verschiedene labels ansprechen kann. Im Momment ist da bei mir ein rießiges Fragezeichen über meinem Kopf

hier einfache mathematische funkt.
Code:
Function bla(x: String; y: integer) : integer;
  begin
    result:=x+y;
  end;

so wie es mir mein Verstand saen würde was aber leider nicht funktioniert:
Code:
Function bla(x: String) : string;
  begin
    result:= ShellExecute(Handle, 'open', PChar(x), nil, nil, SW_NORMAL);
  end;
oder noch falscher ^^
Code:
Function bla(x: integer) : integer;
  begin
    result:= labelx.caption:='texttext';
  end;

würd mich freuen wenn Einer von euch mir ein bisschen auf die Sprünge helfen könnte.
gruß, smaresh
 
Warum willst du hier Funktionen nutzen und keine eigenen Prozeduren? Ist für mich nicht ersichtlich...
 
weil ich z.b. bei der shellapi 12 programme öffnen will und das wären dann 12 mal platz für script und 12 mal ändern, besser wäre es doch wenn ich die funktion oben einmal definieren könnte und unten dann nur den pfad habe und die shellapi aufrufe.
und das mit den labels war nur ein Beispiel um es zu lernen

gruß
 
Hm, ich kann dir grad irgendwie nicht folgen. Aber wenn du die gleichen Prozeduren häufiger mit unterschiedlichen Parametern ausführen willst (zB den Pfad zurechtstutzen und dann ein Programm öffnen), kannst du ja eine eigene Prozedur schreiben und die nötigen Werte als Parameter übergeben lassen.
Wenn du aber nur einen String auf ähnliche Art und Weise bearbeiten willst, dann nimmst du die Funktion, und der fertig bearbeitete String wird dann als Result zurückgegeben.

Die beiden letzten Beispiele, die du anbringst, sollten ja eigentlich Prozeduren sein, weil ja nichts zurückgegeben werden muss.

Liebe Grüße
Hellie
 
Hi,

für ShellExecute brauchst Du die ShellAPI in der Uses-Clause. Hast Du die drin?

Ach ja, Dein unterstes Beispiel zeigt ja gar keine Funktion. Was willst Du denn damit erreichen?

@Hellie:
Bei der ShellExecute-Geschichte könnte ich das verstehen, wenn in der aufrufenden Prozedur eine Fehlerabfrage erfolgen würde, denn "result" enthält ja den Fehlercode, wenn der Aufruf schiefgegangen ist.
 
Zuletzt bearbeitet:
Bei der ShellExecute-Geschichte könnte ich das verstehen, wenn in der aufrufenden Prozedur eine Fehlerabfrage erfolgen würde, denn "result" enthält ja den Fehlercode, wenn der Aufruf schiefgegangen ist.

Was unterscheidet denn dann die eigentliche ShellExecute-Funktion von dieser hier? Das wären unnötige Schritte, höchstens wichtig, wenn man es übersichtlich haben möchte und nicht immer die ShellExecute-Funktion mit den vielen Parametern. Aber eigentlich extremst ineffektiv.

Hab mir das Programm mal angeschaut, mir erscheint es wirklich so als bräuchtest du hier keine Funktionen, sondern nur Prozeduren, die dann mit Klick auf einen Button aufgerufen werden, und als Parameter den Pfad, den Index oder sonstwas übergeben.

Grüße
Hellie
 
Ja Hellie du hast Recht, wenn du mir das mit den Prozeduren die bestimmte Parameter übergeben erklären würdest...

gruß smaresh
 
Kein Problem. Im Prinzip ist es wie bei den Funktionen, nur, dass es keinen Rückgabewert gibt. Um das mittlere Beispiel aufzugreifen, könnte die Prozedur zB

Procedure bla(x: String);
begin
ShellExecute(Handle, 'open', PChar(x), nil, nil, SW_NORMAL);
end;

heißen. Nun könntest du zB über die Anweisung

bla('C:\meineanwendung.exe');

genau dieses Programm aufrufen. Wichtig ist nur, dass in der Prozedur alles so abstrakt geschrieben und mit Parametern beschrieben ist, dass die für alle Anwendungsfälle funktioniert.
Du kannst natürlich nicht nur den Pfad selbst als Parameter übergeben, sondern auch den Namen des Buttons oder woher du auch immer den Pfad dann nimmst, und in dieser von dir geschriebenen Prozedur dann den übergebenen Parameter zum Pfad "umarbeiten".
Bin ich zu verstehen :confused:

Liebe Grüße
Hellie
 
geht leider nicht hab das gleiche Problem wie mit den Funktionen

der meldet ein Fehler wenn ichs unter den vars reinschreib:

[Error] Unit1.pas(25): Statements not allowed in interface part
[Error] Unit1.pas(26): Undeclared identifier: 'Handle'
[Error] Unit1.pas(24): Unsatisfied forward or external declaration: 'bla'
[Fatal Error] Project1.dpr(5): Could not compile used unit 'Unit1.pas'

das wenn ichs unter implementation schreib
[Error] Unit1.pas(33): Undeclared identifier: 'Handle'
[Error] Unit1.pas(13): Unsatisfied forward or external declaration: 'TForm1.Button1Click'
[Fatal Error] Project1.dpr(5): Could not compile used unit 'Unit1.pas'

hoffe ihr könnt was damit anfangen
 
Zuletzt bearbeitet:
Entweder schreibst du's im Interface-Teil, aber nicht in den Typ TForm1:

Code:
unit Unit1;

interface

uses ...

type
  TForm1 = class(TForm)
    ...
  end;

procedure bla(x:string);

var
  Form1: TForm1;

oder mit zum Typ TForm1:

Code:
type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure bla(x:string);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

Dann muss die Prozedur selbst aber auch
Code:
procedure TForm1.bla(x:string);

heißen.

Was das Handle angeht, versuch's mal mit ShellExecute(Application.Handle, 'open', PChar(x), nil, nil, SW_NORMAL); stattdessen.

Hoffe, ich konnte ein Bisschen helfen.
Grüße
Hellie
 
Zurück