Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Can not find unit ShellAPI (https://www.delphipraxis.net/177840-can-not-find-unit-shellapi.html)

dl8aax 30. Nov 2013 17:04

Can not find unit ShellAPI
 
Hi,

Ich habe mir die Lazarus IDE Installiert und mache nun erste gehversucht. Ich habe ein einfaches Programm erstellt welchen eine einfache Berechnung ausfürt.

Nun will ich einen button erstellen wo bei einen Klick der Standartbrowser eine URL öffnet.
Leider bekomme ich folgende Fehlermeldung:

stabkalk2.pas(10,12) Fatal: Can not find unit ShellAPI used by stabkalk2.


mein Programm sieht so aus:

Delphi-Quellcode:
unit stabkalk2;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, IpHtml, Forms, Controls, Graphics, Dialogs,
  StdCtrls, ShellAPI;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Image1: TImage;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Label7: TLabel;
    Label8: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Label1Click(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  Form1        : TForm1;
  stabzahl    : Integer;
  stabzahlalt : Integer;
  abstandmax  : integer;
  abstand     : Real;
  abstandalt  : Real;
   lichtemass : integer;
   stabstaerke : integer;


implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
begin
    // Berechnung
  label5.caption:='Berechnung laeuft';
  abstandmax :=  Strtoint(edit3.Text);
  lichtemass :=  StrToInt(edit2.text);
  stabstaerke :=  Strtoint(edit1.Text);

   stabzahl := round(StrToInt(edit2.text)/120); //Anzahl Stäbe zu anfang
   label5.caption:= IntToStr(stabzahl);
repeat
  // Befehlsfolge, die öfters ausgeführt werden soll
     stabzahlalt := stabzahl;
     abstandalt := Abstand;
     abstand:= (lichtemass - (stabzahl * stabstaerke)) / (stabzahl + 1);
     label5.caption:= IntToStr(stabzahlalt)+' Stäbe mit einen Abstand von ' +FloattoStrF(abstandalt,ffFixed,8,1)+'mm';
     stabzahl := stabzahl -1;

until abstand>abstandmax;
   // FloatToStrF(myFloat, ffFixed, 8, 2);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
       ShellExecute(Handle, '', PChar('http://www.dl8aax.de.vu'), '', '', 0);
end;



end.


hat jemand nen Tipp ?


mfg Dirk

Bernhard Geyer 30. Nov 2013 17:08

AW: Can not find unit ShellAPI
 
Wenn man ein IDE/Framework für Plattformunabhängige Lösungen verwenden will sollte man auch nur APIs verwenden die Plattformunabhängig implementiert sind.
Für deine benötigte Funktionalität wird das bei FreePascal unter http://wiki.freepascal.org/Executing_External_Programs beschrieben.

Aphton 30. Nov 2013 17:18

AW: Can not find unit ShellAPI
 
Falls du ein kompletter Neuling bist, dürfte die vorige Erklärung nicht allzu verständlich sein:

Eine API ist eine Schnittstelle.. Du kannst sie einfach als eine Funktion sehen, die von einem bestimmten System (in dem Fall Betriebssystem) bereitgestellt wird

Platformunabhängig:
Jedes System ist eigenartig - das Ausführen von Programmen in System A kann sich von System B unterscheiden (und das ist eig. meist immer der Fall bei APIs).
ShellExecute ist eine Windows API (funktioniert nur unter "Windows"). Lazarus setzt aber auf platformunabhängige Lösung - sie verwendet kein ShellExecute.
Ich weiß nicht, wie die äquivalenten APIs für andere Systeme heißen, aber die müsstest du verwenden, falls du für ein spezielles System entwickelst.

Ich glaub, dass es bei Lazarus so ist, dass da einfach eine Schicht drüber gepackt wird - apiA (System A), apiB (System B), apiC (System C), ..
es wird eine eigene Funktion geschrieben, nennen wirs es X, die dann zur Compilezeit rausfindet, auf welchem bzw. für welches System kompiliert wird und dann die richtige api drinnen ausführt (also entweder apiA oder apiB oder ..)
Du rufst dann im Grunde nur X auf. Lazarus kümmert sich um den Rest!

<Edit>
Recherchiere, was nun X in diesem Fall ist :P
</Edit>
Sollte verständlicher sein xD

dl8aax 30. Nov 2013 20:10

AW: Can not find unit ShellAPI
 
Hi,
Danke für die Antworten.

Ich habe nun ShellExecute(...) gegen OpenURL(...) ausgetauscht und nun funktioniert es.

mfg Dirk

himitsu 1. Dez 2013 08:14

AW: Can not find unit ShellAPI
 
Und dann noch was Anderes:

ShellExecute wird es bestimmt auch im Lazarus irgendwo geben.
Ich weiß nun nicht wie und wo du auf das ShellExecute gekommen bist, aber man kann nicht immer einfach so "Delphi"-Quellcodes 1:1 in Lazarus verwenden.
Denn nicht nur, daß es dort andere Units gibt ... die heißen manchmal anders oder es gibt sie erst garnicht oder die gwünschte Funktion steckt dort in einer anderen Unit.



Und Nochetwas:

Was um Himmels Willen suchen diese globalen Variablen dort?



PS: Die ersten Beiden
Delphi-Quellcode:
label5.caption:=...
können weg und die letzte Zuweisung kann hinter die Schleife,
denn du läßt dem Label eh keine Zeit sich neu zu zeichnen, weswegen man eh nur die letzte Zuweisung sehen sollte.


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:20 Uhr.

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