Autor Beitrag
Whynot
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Mi 10.08.11 11:44 
So erstmal hallo :)
Ich habe mich jetzt in den letzten Tagen ein bisschen mit Delphi auseinandern gesetzt und habe schon Grundwissen von Python und Html ^^
Zudem benutze ich ein Ubuntu 11.04 mit Lazarus , was mit alles sehr gut gefällt ;)

Aber irgendwie haperts an der ShellApi mit dem zugehörigen Befehl Shellexecute . Irgendwie bekomme ich immer den Fehler :

unit1.pas(9,13) Fatal: Can't find unit ShellApi used by Unit1

das sagt mir irgendwie , dass er probleme hat die ShellApi lib oder wie das heißt einzubinden .
Aber mein eintrag lautet :

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
unit Unit1; 

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
  StdCtrls, ShellApi;



Was mache ich falsch ? Muss ich die Shellapi vllt erst nachinstallieren oder wie funktioniert das ?

Moderiert von user profile iconMartok: Delphi-Tags hinzugefügt
Xion
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
Beiträge: 1952
Erhaltene Danke: 128

Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
BeitragVerfasst: Mi 10.08.11 12:01 
:welcome:

Ich hätte jetzt vermutet, dass die ShellAPI nur bei Windows funktioniert

www.mail-archive.com...ec.com/msg20755.html hat folgendes geschrieben:

The shell commands are windows only and will be found in the windows unit.


Weiter unten habe ich diesen Link gefunden:
wiki.lazarus.freepas...ng_External_Programs

_________________
a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
Whynot Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Mi 10.08.11 12:32 
danke schonmal !
Dachte shellapi ist linux :)

So habe mal das exampel ding reingehauen
ausblenden Delphi-Quelltext
1:
SysUtils.ExecuteProcess( UTF8ToSys( '/full/path/to/binary'), '''' '', []);					

und zu :
ausblenden Delphi-Quelltext
1:
SysUtils.ExecuteProcess( UTF8ToSys( '/home/leon/Downloads/OpenSplit/split.sh'), '''' );					

umgeändert.
In der shell steht eig. nur mkdir 'works' was auch funzt :)
Aber lazarus will nicht so recht , er spuckt mir nen Fehler 127 aus ?!

Moderiert von user profile iconMartok: Delphi-Tags hinzugefügt
Moderiert von user profile iconMartok: Fullquote des letzten Beitrags entfernt
Xion
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
Beiträge: 1952
Erhaltene Danke: 128

Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
BeitragVerfasst: Mi 10.08.11 13:31 
Die Doku dazu:
www.freepascal.org/d.../executeprocess.html


Da ich keine Ahnung von Linux und wenig Ahnung von Lazarus hab, kann ich zu dem Fehler nur raten:
:arrow: Es ist der in der Doku angegebene Fehler (also ein Betriebssystem-Fehlercode).
:arrow: Du hast die SysUtils nicht eingebunden
:arrow: Du musst \ statt / verwenden.

_________________
a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
LexXis
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 170
Erhaltene Danke: 3



BeitragVerfasst: Mi 10.08.11 21:02 
Hallo Whynot und :welcome: im Delphiforum!

ExecuteProcess artet meistens in ziemliches Gefrickel aus. Tu dir selbst den Gefallen, für deine Zwecke TProcess zu verwenden. Das ist IMHO einfacher zu handhaben und nötigenfalls auch cross platform ;)

Aber aufgepasst:
Zitat:

Note: TProcess is not a terminal/shell! You cannot directly execute scripts or redirect output using operators like "|", ">", "<", "&" etc. It is possible to obtain the same results with TProcess using pascal, some examples are below..

Important: You must specify the full path to the executable. For example '/bin/cp' instead of 'cp'. If the program is in the standard PATH then you can use the function FindDefaultExecutablePath from the FileUtil unit of the LCL.

Ergo kannst du damit damit dein Shellscript nur über Umwege verwenden. Aber solange diese nicht vom Benutzer verändert werden, sollte das ja kein größeres Problem darstellen und du kannst die Befehle hardcoden.

Gruß
Whynot Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Mi 10.08.11 21:08 
Hmm komisch ... ich kann .jar files oder vorkompillierte dateien damit starten : Shell nicht ?!
LexXis
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 170
Erhaltene Danke: 3



BeitragVerfasst: Mi 10.08.11 21:42 
Das interpretiere ich mal in das obige Zitat hinein ;)
Was geht (man beachte die Von-hinten-durch-die-Brust-ins-Auge-Methodik) wäre:
ausblenden Quelltext
1:
SysUtils.ExecuteProcess('/usr/bin/gnome-terminal', '-e "pfad/zum/shellscript.sh"');					


Damit hätte sich dann allerdings cross platform erledigt, genauso wie jeder andere Linux-Nutzer der nicht Gnome verwendet.
Also sehr sehr unsauber, die ganze Geschichte.
Vieleicht erklärst du kurz, warum du unbedingt ein Shellscript öffnen möchtest? Evtl lässt sich ja noch eine andere Lösung finden.

Gruß
Jakob_Ullmann
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1747
Erhaltene Danke: 15

Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
BeitragVerfasst: Fr 12.08.11 14:54 
user profile iconLexXis hat folgendes geschrieben Zum zitierten Posting springen:
Damit hätte sich dann allerdings cross platform erledigt, genauso wie jeder andere Linux-Nutzer der nicht Gnome verwendet.


Dann kann ich immer noch xterm statt gnome-terminal oder konsole verwenden. Das dürfte ja bei allen Desktops gehen... (vorausgesetzt, X.org wird verwendet)

Abgesehen davon: gnome-terminal/konsole/xterm sind doch nur die Emulatoren. Warum nicht einfach /usr/bin/sh zum Ausführen verwenden? (EDIT: afaik ein Link auf die eigentliche Shell wie /usr/bin/bash)
LexXis
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 170
Erhaltene Danke: 3



BeitragVerfasst: Fr 12.08.11 19:09 
Oh, fein! Funktioniert tatsächlich. Wieder was gelernt :)

user profile iconJakob_Ullmann hat folgendes geschrieben Zum zitierten Posting springen:
afaik ein Link auf die eigentliche Shell wie /usr/bin/bash

Kurz nachgeschaut: Korrekt.
Jakob_Ullmann
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1747
Erhaltene Danke: 15

Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
BeitragVerfasst: Sa 13.08.11 17:15 
Ich finde es trotzdem verwunderlich, dass man Shellscripts nicht einfach so ausführen kann. Normalerweise sagt doch der Shebang am Anfang einer Datei, z. B.

ausblenden Quelltext
1:
2:
3:
#!/bin/bash
  -- oder --
#!/bin/python


genau aus, mit welchem Programm es ausgeführt werden soll. :nixweiss:
LexXis
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 170
Erhaltene Danke: 3



BeitragVerfasst: So 14.08.11 10:15 
:oops:
Na jetzt rate mal, was bei meinen Test-scripts immer gefehlt hat.. Mit vorausgehendem shebang klappt´s ohne Probleme :roll:
Jakob_Ullmann
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1747
Erhaltene Danke: 15

Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
BeitragVerfasst: So 14.08.11 17:20 
:angel:

Und ich hab schon gedacht, evtl. liegts am vergessenen chmod u+x.
Whynot Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Do 18.08.11 11:38 
user profile iconLexXis hat folgendes geschrieben Zum zitierten Posting springen:
Das interpretiere ich mal in das obige Zitat hinein ;)
Was geht (man beachte die Von-hinten-durch-die-Brust-ins-Auge-Methodik) wäre:
ausblenden Quelltext
1:
SysUtils.ExecuteProcess('/usr/bin/gnome-terminal', '-e "pfad/zum/shellscript.sh"');					


Damit hätte sich dann allerdings cross platform erledigt, genauso wie jeder andere Linux-Nutzer der nicht Gnome verwendet.
Also sehr sehr unsauber, die ganze Geschichte.
Vieleicht erklärst du kurz, warum du unbedingt ein Shellscript öffnen möchtest? Evtl lässt sich ja noch eine andere Lösung finden.

Gruß


Das mit Crossplatform ist mir bewusst :)
Bin aber nur Linux user und will für ein shell skript ein Gui mit delphi basteln , als "einsteiger projekt".
Dafür brauche ich einen Durchsuchen button bzw etw. in der art , wodurch dann der pfad in einer variable gespeichert wird und später dann mit dem execute command ausgeführt werden soll . Das heißt , ich müsste die variable in den execute process bekommen :) Schätze , das wird kompliziert o.O . Auf jeden fall schonmal ein großes danke , an alle die mir hier helfen ;) . Werde noch ein bisschen rumbasteln . Über hilfe freue ich mich natürlich weiter , der thread hier ist noch lange nicht tod ;)
Rocketeer
Hält's aus hier
Beiträge: 8



BeitragVerfasst: Mi 24.10.12 09:50 
Bin leider auch nicht ganz der Linuxinsider, aber wenn ich mal nicht weiterkomme dann schau ich hier: linuxwiki.de/LinuxProgrammierung- Vielleicht hilft es dir..Viel Erfolg jedenfalls