Mehrere Parametertypen in function. (möglich?) [Gelöst]

Für Fragen von Einsteigern und Programmieranfängern...
mark332
Beiträge: 202
Registriert: Do 16. Mai 2013, 13:49
OS, Lazarus, FPC: Windows 10 H.P. (x64) / Ubuntu 14.04.X
CPU-Target: AMD Octacore 4.0GHz

Mehrere Parametertypen in function. (möglich?) [Gelöst]

Beitrag von mark332 »

Hi Leute,

Meine Frage ist, ob man einer function mehrere Parametertypen als Startparameter geben kann....?
Also sowas in der Art:

Code: Alles auswählen

 
function test( test1 : PWideChar or String): Boolean;
begin
(...)
Result:=true;
end;
 
Die Function soll die Variable 'test1' annehmen, egal ob sie string oder PWideChar ist, geht das, oder muss ich mir da was ausdenken?


MfG

mark332
Zuletzt geändert von mark332 am So 16. Jun 2013, 21:31, insgesamt 1-mal geändert.

Komoluna
Beiträge: 565
Registriert: So 26. Aug 2012, 09:03
OS, Lazarus, FPC: Windows(10), Linux(Arch)
CPU-Target: 64Bit

Re: Mehrere Parametertypen in function. (möglich?)

Beitrag von Komoluna »

Probiers mal so:

Code: Alles auswählen

function test(test1: PWideChar; test2: String);
begin
(...)
end;
MFG Komoluna
Programmer: A device to convert coffee into software.

Rekursion: siehe Rekursion.

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: Mehrere Parametertypen in function. (möglich?)

Beitrag von Michl »

Evtl. suchst Du eher sowas?! Möglich ist auch eine Function mit unterschiedlichen Parametern zu nutzen:

Code: Alles auswählen

function test(test1: PWideChar):boolean; overload;
function test(test1: String):boolean; overload; 
Der Compiler nutzt dann die Function, die dem übergebenen Wert entspricht. Siehe: http://www.delphi-treff.de/object-pasca ... nen/#c4926
Zuletzt geändert von Michl am Do 13. Jun 2013, 13:42, insgesamt 1-mal geändert.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2817
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Mehrere Parametertypen in function. (möglich?)

Beitrag von m.fuchs »

In dem von dir geschilderten Fall, reicht es die Variante mit String als Typ anzugeben. Da wird ein PWideChar automatisch konvertiert.
Aber es ist auch für andere Typen möglich und nennt sich Überladung.

Ein Beispiel:

Code: Alles auswählen

program Project1;
{$mode objfpc}{$H+}
 
uses
  SysUtils;
 
function Test(Test1: String): Boolean; overload;
begin
  WriteLn(Test1);
  //...
  Result := True;
end;
 
function Test(var Test1: Integer): Boolean; overload;
begin
  Result := Test(IntToStr(Test1));
end;
 
var
  X: String = 'X';
  Y: Integer = 12;
 
begin
  Test(X);
  Test(Y);
  ReadLn;
end. 
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

mark332
Beiträge: 202
Registriert: Do 16. Mai 2013, 13:49
OS, Lazarus, FPC: Windows 10 H.P. (x64) / Ubuntu 14.04.X
CPU-Target: AMD Octacore 4.0GHz

Re: Mehrere Parametertypen in function. (möglich?)

Beitrag von mark332 »

Okay, das mit dem Overload hat geklappt, Danke :D


Jetzt brauche ich aber eine Möglichkeit, einen Char (egal ob 'Char' oder 'PWideChar') in einen String und andersherum konvertiere (um pfadvariablen in ShellExecute nutzen zu können...)

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2817
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Mehrere Parametertypen in function. (möglich?)

Beitrag von m.fuchs »

mark332 hat geschrieben:Jetzt brauche ich aber eine Möglichkeit, einen Char (egal ob 'Char' oder 'PWideChar') in einen String und andersherum konvertiere (um pfadvariablen in ShellExecute nutzen zu können...)

Code: Alles auswählen

var
  c: Char;
  p: PWideChar;
  s: String;
 
begin
  s := c;             // Char -> String
  s := p;             // PWideChar -> String
  p := PWideChar(s);  // String -> PWideChar
  c := s[1];          // erstes Zeichen des Strings -> Char
end.
Egal ob Char oder PWideChar ist übrigens eine seltsame Aussage. Das sind nämlich völlig verschiedene Dinge. Ein Char enthält immer nur ein einziges Zeichen. Ein PWideChar ist hingegen ein Zeiger auf den Anfang einer Zeichenkette.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

mark332
Beiträge: 202
Registriert: Do 16. Mai 2013, 13:49
OS, Lazarus, FPC: Windows 10 H.P. (x64) / Ubuntu 14.04.X
CPU-Target: AMD Octacore 4.0GHz

Re: Mehrere Parametertypen in function. (möglich?)

Beitrag von mark332 »

Dass ein Char nur ein Zeichen ist, weiß ich, was ich mit 'Char' meinte sind die anderen Char-Typen die es noch für Ketten aus Chars gibt ... war aber vmtl. ein wenig falsch formuliert ;)


Übrigens:

Mein Problem ist, dass er anscheinend Iwas aus dem PWideChar zerpflückt:
Code:

Code: Alles auswählen

 
// InstalDir entspricht z.B.: 'C:\Programme\Minecraft Multilauncher' (Ein Ordner)
// (...)
  if CheckBox_start.Checked=true then
   begin
       stDir:=PWideChar(InstalDir+'\Minecraft_Multilauncher.exe') // Füge die .exe dem Pfad hinzu;
       ShowMessage(stDir); // Nur zur überprüfung, wird später nicht drinn' sein
       ShellExecute(handle,'open',stDir,nil,nil,sw_shownormal); // starte den Pfad zur Datei (String geht hier nicht, er will bei Variablen einen oder mehrere Chars haben...)
   end; 
// (...) 
 
Bei der Überprüfung, die ich eingebaut habe, weil es immer nicht gestartet wurde, zeigt er immer etwas in der Art:
"?????????????????üöo????"
oder
z.B.: "C:\Programme\Minecraft Multilauncher\Minecraft_Multilauncher.exe????????????????"

Hat einer von euch vllcht eine Idee, wie ich das Problem lösen könnte ?

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Mehrere Parametertypen in function. (möglich?)

Beitrag von Socke »

mark332 hat geschrieben:Hat einer von euch vllcht eine Idee, wie ich das Problem lösen könnte ?
  • Zeichenkodierung des Quelltextes auf UTF-8 ändern (Rechtsklick in den Editor und dort suchen)
  • http://wiki.freepascal.org/LCL_Unicode_Support/de#Widestrings_und_Ansistrings
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

mark332
Beiträge: 202
Registriert: Do 16. Mai 2013, 13:49
OS, Lazarus, FPC: Windows 10 H.P. (x64) / Ubuntu 14.04.X
CPU-Target: AMD Octacore 4.0GHz

Re: Mehrere Parametertypen in function. (möglich?)

Beitrag von mark332 »

Socke hat geschrieben:
mark332 hat geschrieben:Hat einer von euch vllcht eine Idee, wie ich das Problem lösen könnte ?
  • Zeichenkodierung des Quelltextes auf UTF-8 ändern (Rechtsklick in den Editor und dort suchen)
  • http://wiki.freepascal.org/LCL_Unicode_Support/de#Widestrings_und_Ansistrings
Die Zeichenkodierung ist UTF-8.... :oops:

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2817
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Mehrere Parametertypen in function. (möglich?)

Beitrag von m.fuchs »

Schmeiß ShellExecute weg und benutze TProcess (http://wiki.freepascal.org/Executing_Ex ... s#TProcess) bzw. TUtf8Process.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

mark332
Beiträge: 202
Registriert: Do 16. Mai 2013, 13:49
OS, Lazarus, FPC: Windows 10 H.P. (x64) / Ubuntu 14.04.X
CPU-Target: AMD Octacore 4.0GHz

Re: Mehrere Parametertypen in function. (möglich?)

Beitrag von mark332 »

Ookaay, ich werd's mal versuchen, kann aber sein, dass ich da Hilfe brauch :oops: :?
------------------------------------------------------------
Warum gibt es hier eigentlich kein [SPOILER][/SPOILER] ?

mark332
Beiträge: 202
Registriert: Do 16. Mai 2013, 13:49
OS, Lazarus, FPC: Windows 10 H.P. (x64) / Ubuntu 14.04.X
CPU-Target: AMD Octacore 4.0GHz

Re: Mehrere Parametertypen in function. (möglich?)

Beitrag von mark332 »

Ok, bei TProcess scheint das Problem zu sein, dass das Programm aus dem Ordner, in dem sich das ausführende Programm befindet, gestartet wird, was wiederum dafür sorgt, dass das ausgeführte Programm, lokale Pfade, wie z.B.: 'Skin.jpg', aus dem falschen (dem ausführendem) Ordner lesen will, was natürlich nicht funktioniert.

Ich bastle gerade an einer möglichkeit das zuumgehen, würde mich aber über Vorschläge von euch freuen ;)

MfG
mark332

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2817
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Mehrere Parametertypen in function. (möglich?)

Beitrag von m.fuchs »

Den Ordner kannst du ändern. TProcess.CurrentDirectory ist da dein Freund.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

mark332
Beiträge: 202
Registriert: Do 16. Mai 2013, 13:49
OS, Lazarus, FPC: Windows 10 H.P. (x64) / Ubuntu 14.04.X
CPU-Target: AMD Octacore 4.0GHz

Re: Mehrere Parametertypen in function. (möglich?)

Beitrag von mark332 »

Ok, Danke an Alle, die hier geantwortet haben. :D ;)

--------------------------------------------------------------------------------------------------------------------------------------------

Ich hab' das ganze jetzt mal als Funktion geschrieben, sieht zwar bestimmt nicht so toll aus, tut aber seinen Zweck :D

Code: Alles auswählen

 
function run(prog, attrib, PUseDir:String; waitOnClose:Boolean):Boolean;
var
  AProcess: TProcess;
begin
Result:= false;
if (prog <> ' ') and (prog <> '') then
begin
AProcess:= TProcess.create(nil);
AProcess.Executable:= prog;
 
if (attrib <> ' ') and (attrib <> '') then
begin
AProcess.Parameters.Add(attrib);
end;
 
if (PUseDir <> ' ') and (PUSeDir <> '') then
begin
AProcess.CurrentDirectory:=PUseDir;
end;
 
if (waitOnClose=true) then
begin
AProcess.Options:= AProcess.Options + [poWaitOnExit];
end;
 
AProcess.Execute;
Result:=true;
AProcess.Free;
 
end
else
begin
Result:=false;
end;
end;
 
Falls einer von euch evtl. Dinge findet, die iwann mal Probleme bereiten könnten, bin ich offen ;)

MfG mark332

Edit: Wie kann man mit TProcess eine anderes Dateiformat als .exe öffnen (z.b.: Test.txt) ?
------------------------------------------------------------
Warum gibt es hier eigentlich kein [SPOILER][/SPOILER] ?

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2817
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Mehrere Parametertypen in function. (möglich?)

Beitrag von m.fuchs »

Du hast viele solcher Prüfungen:

Code: Alles auswählen

if (PUseDir <> ' ') and (PUSeDir <> '')
Das solltest du auslagern.


Und überarbeite mal deine Formatierung. Falls dein Quellcode im Editor genauso wenig Einrückungen hat wie hier.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Antworten